diff --git a/.env b/.env index b3188f729..4d23e28c4 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 -VERSION=1.4.3 -VERSION_FULL=1.4.3 (177) -BUILD=177 +VERSION=1.5.0 +VERSION_FULL=1.5.0 (178) +BUILD=178 diff --git a/CHANGELOG.md b/CHANGELOG.md index c844c38d5..c0fedab31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +### 1.5.0 (178) +1️⃣ Introducing support for **Multiple Tabs** – a first for Telegram Web Apps – customizing how you browse Telegram to increase comfort and productivity. + +• Open several tabs or browser windows to view multiple chats or channels simultaneously. +• Organize your Telegram workflow on multiple monitors by moving tabs to different screens. +• Use `⌘/Ctrl + click` or `middle-click` on any conversation in your chat list to open it in a separate tab. + +All messages and content are seamlessly synced across the tabs. To use multiple tabs on Safari, kindly consider switching to another browser for the best experience. Due to Safari’s [technical limitations](https://t.me/WebK_en/5), the WebK app can still only be used there in a single tab. + +2️⃣ WebK gets even more stylish, adding: + +• Animated placeholders when loading the chat list. +• Scrolling profile pictures in groups that move up and down with their messages. +• Menu redesigns with beautiful new blur effects. +• Colored reply previews that match the color of your chat partners' names. + +This update also includes several bug fixes, removing issues with: +- Incorrect unread values +- Visual errors in placeholders +- Failing to mark messages as read +- Performance drops when returning to previous chats. +- and many more 🛠 + ### 1.4.2 (161) * The Video Player now supports **Picture-in-Picture** mode – keep messaging and switching chats while watching videos. Open a video, then click or tap the icon in the bottom right corner. * The **Audio Player** has been packed with two new features for music lovers: set your favorite song to **repeat** or change the **playback order** for playlists. It will also **remember** your playback settings __(volume, repeat, and speed)__. diff --git a/CHANGELOG_ru.md b/CHANGELOG_ru.md index 9b1035659..20c3b9332 100644 --- a/CHANGELOG_ru.md +++ b/CHANGELOG_ru.md @@ -1,3 +1,26 @@ +### 1.5.0 (178) +1️⃣ WebK представляет поддержку работы **нескольких вкладок одновременно** – первым среди веб-приложений Telegram. Исследуйте новые возможности за границами привычного Вам опыта: + +• Открывайте столько вкладок или окон браузера, сколько Вам нужно – для доступа к разным чатам и каналам в одно и то же время. +• Если вы пользуетесь несколькими дисплеями, разнесите вкладки по разным экранам – и организуйте процесс работы с Telegram так, как удобно Вам. +• Задействуйте `⌘/Ctrl + клик` или `кликните колесом мыши` по нужному чату в списке бесед – выбранный чат будет открыт в отдельной вкладке. + +Все сообщения, включая текст и медиа, а так же Ваш список чатов автоматически синхронизируются между всеми вкладками. Если Вы пользуетесь Safari и хотите насладиться одновременной работой нескольких вкладок, пожалуйста, смените браузер. Это к лучшему, поверьте. Из-за [технических ограничений Safari](https://t.me/WebK_en/5), на данный момент WebK будет работать там только в единственной вкладке. + +2️⃣ WebK продолжает привносить красоту, добавляя в этом обновлении: + +• Анимированные заглушки при загрузке Вашего списка чатов. +• Скользящие аватары. Когда Вы проматываете историю переписки в групповом чате, фотографии участников всегда будут видны рядом с сообщениями, чтобы было удобнее ориентироваться. +• Обновленные меню – теперь с красивым эффектом размытия. +• Цветовые плашки предпросмотра ответов – в которых цвет плашки совпадает с цветом имени собеседников. + +В приложении были так же устранены следущие недоработки: +- Проблемы со счётчиком непрочитанных сообщений; +- Резкая отрисовка заглушек в чатах; +- Невозможность прочесть сообщение в части случаев; +- Снижение производительности приложения по возвращению в предыдущие чаты; +- и многое другое 🛠 + ### 1.4.2 (161) * Видеопроигрыватель теперь поддерживает режим **«картинка в картинке»** – видео останется перед глазами, даже если Вы перейдёте в другую беседу. Для вызова режима откройте видео, далее кликните или коснитесь кнопки в правом нижнем углу проигрывателя. * Любителей слушать музыку в Telegram порадуют два нововведения музыкального проигрывателя – **режим повтора песни** и возможность воспроизводить плейлисты в **обратном порядке**. Кроме того, проигрыватель теперь **запоминает** Ваши предпочтения __(уровень громкости, режим повтора, а также скорость воспроизведения)__. diff --git a/public/0.61ba1feb637ecd90f834.chunk.js b/public/0.61ba1feb637ecd90f834.chunk.js deleted file mode 100644 index 2a365805b..000000000 --- a/public/0.61ba1feb637ecd90f834.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[0],{102:function(t,e,i){"use strict";i.d(e,"a",(function(){return h})),i.d(e,"b",(function(){return c}));var s=i(93),r=i(36),n=i(115),a=i(0),o=i(103);var h;function c(t){if(void 0===t.margin&&(t.margin=0),void 0===t.maxDistance&&(t.maxDistance=1500),void 0===t.axis&&(t.axis="y"),a.a.settings.animationsEnabled||(t.forceDirection=h.Static),t.forceDirection===h.Static)return t.forceDuration=0,l(t);const e=Object(r.d)().then(()=>l(t));return"y"===t.axis?Object(s.b)(e):e}function l(t){const{element:e,container:i,getNormalSize:s,axis:r,margin:a,position:h,forceDirection:c,maxDistance:m,forceDuration:p}=t;if(!Object(o.a)(e))return Object(n.c)(i),Promise.resolve();const f="y"===r?"top":"left",v="y"===r?"bottom":"right",g="y"===r?"height":"width",y="y"===r?"scrollHeight":"scrollWidth",b="y"===r?"scrollTop":"scrollLeft",w=e.getBoundingClientRect(),k=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),F=w[f]-k[f],L=e[y],E=s?s({rect:k}):k[g];let M=i[b];const O=i[y];let I;switch(h){case"start":I=F-a;break;case"end":I=w[v]-k[v]+a;break;case"nearest":case"center":if(Lm?(M=i.scrollTop+=I-m,I=m):I<-m&&(M=i.scrollTop+=I+m,I=-m)),I<0){const t=-M;I=Math.max(I,t)}else if(I>0){const t=O-(M+E);I=Math.min(I,t)}const D=i[b]+I,C=Math.abs(I),A=null!=p?p:250+C/1500*350,S=Date.now(),j=C<500?u:d,x=()=>{const t=A?Math.min((Date.now()-S)/A,1):1,e=I*(1-j(t));return i[b]=Math.round(D-e),t<1};if(!A||!I)return Object(n.c)(i),x(),Promise.resolve();if(t.startCallback){const e=O-Math.round(D+i["y"===r?"offsetHeight":"offsetWidth"]);t.startCallback({scrollSize:O,scrollPosition:M,distanceToEnd:e,path:I,duration:A,containerRect:k,elementRect:w})}return Object(n.b)(x,i)}function d(t){return 1-Math.pow(1-t,5)}function u(t){return 1-Math.pow(1-t,3.5)}!function(t){t[t.Up=0]="Up",t[t.Down=1]="Down",t[t.Static=2]="Static"}(h||(h={}))},103:function(t,e,i){"use strict";function s(t){return null==t?void 0:t.isConnected}i.d(e,"a",(function(){return s}))},104:function(t,e,i){"use strict";function s(t,e,i){return ti?i:t}i.d(e,"a",(function(){return s}))},115:function(t,e,i){"use strict";i.d(e,"c",(function(){return a})),i.d(e,"b",(function(){return o})),i.d(e,"a",(function(){return h}));var s=i(36),r=i(10);const n=new Map;function a(t){const e=function(t){return n.get(t)}(t);e&&(e.isCancelled=!0,e.deferred.resolve())}function o(t,e,i){return i||(i=function(t){a(t);const e={isCancelled:!1,deferred:Object(r.a)()};return n.set(t,e),e.deferred.then(()=>{n.delete(t)}),e}(e)),Object(s.b)(()=>{i.isCancelled||(t()?o(t,e,i):i.deferred.resolve())}),i.deferred}function h(t){Object(s.b)(()=>{t()&&h(t)})}},116:function(t,e,i){"use strict";function s(t,e){if(t.parentElement===e)return t;for(;t.parentElement;)if((t=t.parentElement).parentElement===e)return t;return null}i.d(e,"a",(function(){return s}))},130:function(t,e,i){"use strict";i.d(e,"a",(function(){return c}));var s=i(140),r=i(0),n=i(36),a=i(102),o=i(116),h=i(95);function c(t,e,i,c,l=250,d){const u=Object(s.a)(e,t||"tabs"===e.dataset.animation?"tabs":"navigation",l,c);if(t){const s=new Proxy(u,{apply:(e,i,s)=>{const r=+s[0],n=void 0===s[1]||s[1],a=t.querySelector(`[data-tab="${r}"]`)||t.children[r];c(a,r,n)}}),c=(s,o,h=!0)=>{const c=e.children[o];if(i){const t=i(o,c,h);if(void 0!==t&&!t)return}d&&d.scrollIntoViewNew({element:s.parentElement.children[o],position:"center",forceDirection:h?void 0:a.a.Static,forceDuration:l,axis:"x"}),r.a.settings.animationsEnabled||(h=!1);const f=u.prevId();if(s.classList.contains("active")||o===f)return!1;const v=t.querySelector(p.toLowerCase()+".active");Object(n.b)(()=>{v&&v.classList.remove("active")}),m&&-1!==f&&h&&Object(n.b)(()=>{const t=s.querySelector("i"),e=s.parentElement.children[f].querySelector("i");e.classList.remove("animate"),t.classList.remove("animate");const i=e.parentElement.parentElement.offsetLeft-t.parentElement.parentElement.offsetLeft,r=e.clientWidth/t.clientWidth;t.style.transform=`translate3d(${i}px, 0, 0) scale3d(${r}, 1, 1)`,requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})}),Object(n.b)(()=>{s.classList.add("active")}),u(o,h)},m=!t.classList.contains("no-stripe"),p=t.firstElementChild.tagName;return t.addEventListener("click",(function(e){let i,s=e.target;if(s=Object(o.a)(s,t),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=Object(h.a)(s);c(s,i)})),s}return u}},139:function(t,e,i){"use strict";i.d(e,"a",(function(){return r}));var s=i(62);function r(t,e,i,r,n=!0){if(ti/r?o=e*i/t|0:(a=t*r/e|0,a>i&&(o=o*i/a|0,a=i)),n&&a>=t&&o>=e&&(a=t,o=e),Object(s.c)(a,o)}i(1).a.calcImageInBox=r},140:function(t,e,i){"use strict";i.d(e,"a",(function(){return l}));var s=i(0),r=i(10),n=i(93),a=i(95),o=i(27);function h(t,e,i){const s=e.getBoundingClientRect().width,r=[t,e];return i&&r.reverse(),r[0].style.filter="brightness(80%)",r[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,r[1].style.transform=`translate3d(${s}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",t.style.filter="",()=>{e.style.transform=e.style.filter=""}}function c(t,e,i){const s=e.getBoundingClientRect().width,r=[t,e];return i&&r.reverse(),r[0].style.transform=`translate3d(${-s}px, 0, 0)`,r[1].style.transform=`translate3d(${s}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",()=>{e.style.transform=""}}const l=(t,e,i,s,r=!0)=>{let n=null;switch(e){case"tabs":n=c;break;case"navigation":n=h}return t.dataset.animation=e,d(t,n,i,s,r)},d=(t,e,i,h,c=!0,l=!1,d=!0)=>{const u=new Map;let m,p=null;if(d){const i=e?"transitionend":"animationend",s=e=>{if(Object(o.a)(e),e.target.parentElement!==t)return;const r=u.get(e.target);r&&r(),e.target===p&&(!m&&c||(m&&(m.resolve(),m=void 0),h&&h(f.prevId()),t.classList.remove("animating","backwards","disable-hover"),l&&(t.removeEventListener(i,s),p=m=void 0,u.clear())))};t.addEventListener(i,s)}function f(o,l=!0,v){v&&(p=v),o instanceof HTMLElement&&(o=Object(a.a)(o));const g=f.prevId();if(o===g)return!1;const y=t.children[o];if(s.a.settings.animationsEnabled&&-1!==g||(l=!1),!d){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!l){if(p)p.classList.remove("active","to","from");else if(y){const t=u.get(y);t&&t()}return y&&(y.classList.remove("to","from"),y.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),p=y,void(h&&h(o))}d||(t.dataset.timeout=""+window.setTimeout(()=>{y.classList.remove("to"),p&&p.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout},i)),p&&(p.classList.remove("to"),p.classList.add("from")),t.classList.add("animating");const b=g{y.classList.remove("to"),u.delete(y)}),p){const t=p,e=()=>{t.classList.remove("active","from"),w&&w(),u.delete(t)};if(y)u.set(t,e);else{const s=window.setTimeout(e,i);u.set(t,()=>{clearTimeout(s),u.delete(t)})}c&&(m||(m=Object(r.a)()),Object(n.b)(m,2*i))}p=y}return f.prevId=()=>p?Object(a.a)(p):-1,f}},188:function(t,e,i){"use strict";i.d(e,"a",(function(){return u}));var s=i(2);let r;if(s.g)try{r=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(t){r=!1}else r=!0;var n=r,a=i(15),o=i(62),h=i(104),c=i(71),l=function(t,e,i,s){return new(i||(i=Promise))((function(r,n){function a(t){try{h(s.next(t))}catch(t){n(t)}}function o(t){try{h(s.throw(t))}catch(t){n(t)}}function h(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}h((s=s.apply(t,e||[])).next())}))};const d=new class{constructor(){this.cache=new Map}getCache(t){let e=this.cache.get(t);return e||this.cache.set(t,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(t){const e=this.cache.get(t);e&&!--e.counter&&this.cache.delete(t)}getCacheCounter(t){const e=this.cache.get(t);return null==e?void 0:e.counter}generateName(t,e,i,s,r){return[t,e,i,s?"colored":"",r||""].filter(Boolean).join("-")}};class u extends a.a{constructor({el:t,worker:e,options:i}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.reqId=++u.reqId,this.el=t,this.worker=e;for(let t in i)this.hasOwnProperty(t)&&(this[t]=i[t]);let r;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,void 0!==i.skipRatio?r=i.skipRatio:(s.a||s.c||s.b&&!s.g)&&this.width<100&&this.height<100&&!i.needUpscale&&(r=.5),this.skipDelta=void 0!==r?1/r|0:1;const a=Object(h.a)(window.devicePixelRatio,1,2);a>1&&(i.needUpscale?(this.width=Math.round(this.width*a),this.height=Math.round(this.height*a)):a>1&&(this.width>100&&this.height>100?s.b||!o.b.isMobile?(this.width=Math.round(this.width*a),this.height=Math.round(this.height*a)):a>2.5&&(this.width=Math.round(this.width*(a-1.5)),this.height=Math.round(this.height*(a-1.5))):(this.width=Math.round(this.width*Math.max(1.5,a-1.5)),this.height=Math.round(this.height*Math.max(1.5,a-1.5))))),this.width=Math.round(this.width),this.height=Math.round(this.height),i.noCache||(s.b&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),n&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=d.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=d.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&d.getCacheCounter(this.cacheName)>1||this.frames.clear())}sendQuery(t,...e){this.worker.sendQuery(t,this.reqId,...e)}loadFromData(t){this.sendQuery("loadFromData",t,this.width,this.height,this.toneIndex)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(t=!0){this.paused||(this.paused=!0,t&&clearTimeout(this.rafId))}resetCurrentFrame(){var t;return this.curFrame=null!==(t=this.initFrame)&&void 0!==t?t:1===this.direction?this.minFrame:this.maxFrame}stop(t=!0){this.pause();const e=this.resetCurrentFrame();t&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(t){this.speed!==t&&(this.speed=t,this.paused||this.setMainLoop())}setDirection(t){this.direction!==t&&(this.direction=t,this.paused||this.setMainLoop())}remove(){c.a.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&d.releaseCache(this.cacheName),this.cleanup()}applyColor(t){const[e,i,s]=this.color;for(let r=0,n=t.length;r{this.renderFrame2(t,e)},this.frInterval>-i?-i%this.frInterval:this.frInterval)}this.renderFrame2(t,e)}requestFrame(t){const e=this.frames.get(t);e?this.renderFrame(e,t):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",t,this.clamped))}onLap(){return!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:t,maxFrame:e}=this,i=this.curFrame+t>e?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=t;return this.requestFrame(i),!(i+t>e)||this.onLap()}mainLoopBackwards(){const{skipDelta:t,minFrame:e}=this,i=this.curFrame-te?1:-1,callback:s})}playToFrame(t){this.pause();const{frame:e,speed:i,callback:s,direction:r}=t;this.setDirection(void 0===r?this.curFrame>e?-1:1:r),void 0!==i&&this.setSpeed(i);const n=[this.curFrame,e];-1===this.direction&&n.reverse(),this.loop=!1,this.setMinMax(n[0],n[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=t=>{t===e&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(t,e){this.color=t,e&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(t){this.inverseColor=t}setMinMax(t=0,e=this.frameCount-1){this.minFrame=t,this.maxFrame=e}onLoad(t,e){return l(this,void 0,void 0,(function*(){this.frameCount=t,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=Object(h.a)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const t=60/e;this.skipDelta=this.skipDelta/t|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const t=Date.now();this.frThen=t+this.frInterval;this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()},{once:!0})}))}}u.reqId=0},62:function(t,e,i){"use strict";i.d(e,"c",(function(){return h})),i.d(e,"a",(function(){return s}));var s,r=i(1),n=i(139),a=i(15);class o{constructor(t=0,e=t){this.width=t,this.height=e}aspect(t,e){return Object(n.a)(this.width,this.height,t.width,t.height,e)}aspectFitted(t){return this.aspect(t,!0)}aspectCovered(t){return this.aspect(t,!1)}}function h(t,e){return new o(t,e)}!function(t){t[t.mobile=0]="mobile",t[t.medium=1]="medium",t[t.large=2]="large"}(s||(s={}));class c extends a.a{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:h(270,270),webpage:h(270,200),album:h(270,0),esgSticker:h(68,68),animatedSticker:h(180,180),staticSticker:h(180,180),emojiSticker:h(112,112),poll:h(240,0),round:h(200,200),documentName:h(200,0)},desktop:{regular:h(420,340),webpage:h(420,340),album:h(420,0),esgSticker:h(80,80),animatedSticker:h(200,200),staticSticker:h(200,200),emojiSticker:h(112,112),poll:h(330,0),round:h(280,280),documentName:h(240,0)}},this.isMobile=!1,this.handleResize=()=>{const t=window.innerWidth;let e=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame(()=>{this.handleResize(),this.rAF=0})}),this.handleResize()}}const l=new c;r.a.mediaSizes=l,e.b=l},71:function(t,e,i){"use strict";function s(){return new Worker(i.p+"rlottie.worker.086dfed03cbca80766c6.bundle.worker.js")}var r=i(82),n=i(1),a=i(16),o=i(4),h=i(8),c=i(188),l=i(2),d=i(15);class u extends d.a{constructor(t){super(),this.worker=t,this.worker.onerror=t=>{try{this.dispatchEvent("workerError",t),this.cleanup(),this.terminate()}catch(t){}},this.worker.onmessage=t=>{this.dispatchEvent(t.data.queryMethodListener,...t.data.queryMethodArguments)}}postMessage(t){this.worker.postMessage(t)}terminate(){this.worker.terminate()}sendQuery(t,...e){if(l.g)this.worker.postMessage({queryMethod:t,queryMethodArguments:e});else{const i=[];e.forEach(t=>{t instanceof ArrayBuffer&&i.push(t),"object"==typeof t&&t.buffer instanceof ArrayBuffer&&i.push(t.buffer)}),this.worker.postMessage({queryMethod:t,queryMethodArguments:e},i)}}}var m=i(47),p=function(t,e,i,s){return new(i||(i=Promise))((function(r,n){function a(t){try{h(s.next(t))}catch(t){n(t)}}function o(t){try{h(s.throw(t))}catch(t){n(t)}}function h(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}h((s=s.apply(t,e||[])).next())}))};const f=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=Object(o.b)("LOTTIE",o.a.Error),this.onPlayerLoaded=(t,e,i)=>{const s=this.players[t];s?(this.log.debug("onPlayerLoaded"),s.onLoad(e,i)):this.log.warn("onPlayerLoaded on destroyed player:",t,e)},this.onFrame=(t,e,i)=>{const s=this.players[t];s?(void 0!==s.clamped&&(s.clamped=i),s.renderFrame(i,e)):this.log.warn("onFrame on destroyed player:",t,e)},this.onPlayerError=(t,e)=>{const i=this.players[t];if(i){r.a.getAnimations(i.el).forEach(t=>{r.a.checkAnimation(t,!0,!0)})}}}getAnimation(t){for(const e in this.players)if(this.players[e].el===t)return this.players[e];return null}setLoop(t){for(const e in this.players){const i=this.players[e];i.loop=t,i.autoplay=i._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise((t,e)=>{let i=this.workersLimit;for(let r=0;r{this.log("worker #"+r+" ready"),n.addEventListener("frame",this.onFrame),n.addEventListener("loaded",this.onPlayerLoaded),n.addEventListener("error",this.onPlayerError),--i,i||(this.log("workers ready"),t(),this.loaded=!0)},{once:!0}),n.addEventListener("workerError",t=>{e("rlottie load error: "+t.message),this.loaded=!1},{once:!0})}})}loadAnimationAsAsset(t,e){return t.name=e,this.loadAnimationFromURL(t,"assets/tgs/"+e+".json")}loadAnimationFromURL(t,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then(t=>t.headers&&"application/octet-stream"!==t.headers.get("content-type")?t.blob():t.arrayBuffer().then(t=>h.a.invokeCrypto("gzipUncompress",t)).then(t=>Object(m.a)(t,""))).then(i=>{const s=Object.assign(t,{animationData:i,needUpscale:!0});return s.name||(s.name=e),this.loadAnimationWorker(s)})):this.loadPromise}waitForFirstFrame(t){return Promise.race([new Promise(e=>{t.addEventListener("firstFrame",e,{once:!0})}),Object(a.a)(2500)]).then(()=>t)}loadAnimationWorker(t,e=t.group||"",i){return p(this,void 0,void 0,(function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),i&&!i())throw new Error("middleware");if(t.width&&t.height||(t.width=parseInt(t.container.style.width),t.height=parseInt(t.container.style.height)),!t.width||!t.height)throw new Error("No size for sticker!");t.group=e;const s=this.initPlayer(t.container,t);return"none"!==e&&r.a.addAnimation(s,e),s}))}onDestroy(t){delete this.players[t]}destroyWorkers(){this.workers.forEach((t,e)=>{t.terminate(),this.log("worker #"+e+" terminated")}),this.log("workers destroyed"),this.workers.length=0}initPlayer(t,e){const i=new c.a({el:t,worker:this.workers[this.curWorkerNum++],options:e});return this.players[i.reqId]=i,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),i.loadFromData(e.animationData),i}};n.a.lottieLoader=f;e.a=f},76:function(t,e,i){"use strict";function s(t,e){const i=t.indexOf(e),s=-1!==i&&t.splice(i,1);return s&&s[0]}i.d(e,"a",(function(){return s}))},78:function(t,e,i){"use strict";function s(t,e){for(let i=t.length-1;i>=0;--i)e(t[i],i,t)}i.d(e,"a",(function(){return s}))},82:function(t,e,i){"use strict";var s=i(0),r=i(2),n=i(1),a=i(103),o=i(188),h=i(76),c=i(78);const l=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver(t=>{for(const e of t){const t=e.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find(e=>e.el===t);if(s){if(e.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const t=s.animation;t instanceof o.a&&t.clearCache()}break}}}}),this.overrideIdleGroups=new Set,s.a.addEventListener("media_play",({doc:t})=>{"round"===t.type&&(this.videosLocked=!0,this.checkAnimations())}),s.a.addEventListener("media_pause",()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})}setOverrideIdleGroup(t,e){e?this.overrideIdleGroups.add(t):this.overrideIdleGroups.delete(t)}getAnimations(t){const e=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===t&&e.push(s);return e}removeAnimation(t){const{el:e,animation:i}=t;i.remove(),i instanceof HTMLVideoElement&&r.g&&setTimeout(()=>{i.src="",i.load()},1e3);const s=this.byGroups[t.group];s&&(Object(h.a)(s,t),s.length||delete this.byGroups[t.group]),this.observer.unobserve(e),this.visible.delete(t)}addAnimation(t,e=""){var i;const r={el:t instanceof o.a?t.el:t,animation:t,group:e};t instanceof o.a&&!s.a.settings.stickers.loop&&t.loop&&(t.loop=s.a.settings.stickers.loop),(null!==(i=this.byGroups[e])&&void 0!==i?i:this.byGroups[e]=[]).push(r),this.observer.observe(r.el)}checkAnimations(t,e,i=!1){if(void 0!==e&&!this.byGroups[e])return;const s=void 0!==e?[e]:Object.keys(this.byGroups);for(const e of s){const s=this.byGroups[e];Object(c.a)(s,e=>{this.checkAnimation(e,t,i)})}}checkAnimation(t,e=!1,i=!1){const{el:r,animation:n,group:o}=t;i||!Object(a.a)(r)&&!this.lockedGroups[o]?this.removeAnimation(t):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==o||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(t)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==o||s.a.idle.isIDLE&&!this.overrideIdleGroups.has(t.group)||n.play()}setOnlyOnePlayableGroup(t){this.onlyOnePlayableGroup=t}lockGroup(t){this.lockedGroups[t]=!0}unlockGroup(t){delete this.lockedGroups[t],this.checkAnimations(void 0,t)}refreshGroup(t){const e=this.byGroups[t];e&&e.length&&(e.forEach(t=>{this.observer.unobserve(t.el)}),window.requestAnimationFrame(()=>{e.forEach(t=>{this.observer.observe(t.el)})}))}lockIntersectionGroup(t){this.intersectionLockedGroups[t]=!0}unlockIntersectionGroup(t){delete this.intersectionLockedGroups[t],this.refreshGroup(t)}};n.a&&(n.a.animationIntersector=l),e.a=l},90:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var s=i(71),r=i(130),n=i(1),a=i(102),o=i(95);const h=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=Object(r.a)(null,this.scrollableDiv.querySelector(".tabs-container"),null,()=>{var t;(null===(t=this.page)||void 0===t?void 0:t.onShown)&&this.page.onShown()})}setPage(t){if(t.isAuthPage){this.pagesDiv.style.display="";let e=Object(o.a)(t.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&s.a.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&Object(a.b)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",t.pageEl.style.display="",this.pageId=-1;this.page=t}};n.a.pagesManager=h;var c=h,l=function(t,e,i,s){return new(i||(i=Promise))((function(r,n){function a(t){try{h(s.next(t))}catch(t){n(t)}}function o(t){try{h(s.throw(t))}catch(t){n(t)}}function h(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}h((s=s.apply(t,e||[])).next())}))};class d{constructor(t,e,i,s,r){this.isAuthPage=e,this.onFirstMount=i,this.onMount=s,this.onShown=r,this.installed=!1,this.pageEl=document.body.querySelector("."+t)}mount(...t){return l(this,void 0,void 0,(function*(){if(this.onMount&&this.onMount(...t),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...t);e instanceof Promise&&(yield e)}catch(t){console.error("PAGE MOUNT ERROR:",t)}this.installed=!0}c.setPage(this)}))}}},93:function(t,e,i){"use strict";i.d(e,"b",(function(){return d})),i.d(e,"d",(function(){return m})),i.d(e,"c",(function(){return p}));var s=i(10),r=i(0),n=i(1),a=i(16);let o=!1,h=Object(s.a)(),c=0;h.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function d(t,e){o||(h=Object(s.a)(),r.a.dispatchEvent("event-heavy-animation-start"),o=!0,n.b&&l("start")),++c,n.b&&l("attach promise, length:",c,e);const i=[void 0!==e?Object(a.a)(e):void 0,t.finally(()=>{})].filter(Boolean),d=performance.now(),m=h;return Promise.race(i).then(()=>{h!==m||h.isFulfilled||(--c,n.b&&l("promise end, length:",c,performance.now()-d),c<=0&&u())}),h}function u(){h.isFulfilled||(o=!1,c=0,r.a.dispatchEvent("event-heavy-animation-end"),h.resolve(),n.b&&l("end"))}function m(){u()}function p(){return h}e.a=function(t,e,i){o&&t();const s=i?i.add(r.a):r.a.addEventListener.bind(r.a),n=i?i.removeManual.bind(i,r.a):r.a.removeEventListener.bind(r.a);return s("event-heavy-animation-start",t),s("event-heavy-animation-end",e),()=>{n("event-heavy-animation-end",e),n("event-heavy-animation-start",t)}}},95:function(t,e,i){"use strict";function s(t){if(!t.parentNode)return-1;let e=0;for(;null!==(t=t.previousElementSibling);)++e;return e}i.d(e,"a",(function(){return s}))}}]); -//# sourceMappingURL=0.61ba1feb637ecd90f834.chunk.js.map \ No newline at end of file diff --git a/public/0.61ba1feb637ecd90f834.chunk.js.map b/public/0.61ba1feb637ecd90f834.chunk.js.map deleted file mode 100644 index 19188ee69..000000000 --- a/public/0.61ba1feb637ecd90f834.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/number/clamp.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/components/transition.ts","webpack:///./src/environment/canUseTransferables.ts","webpack:///./src/lib/rlottie/rlottiePlayer.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/rlottie/queryableWorker.ts","webpack:///./src/lib/rlottie/lottieLoader.ts","webpack:///./src/helpers/array/indexOfAndSplice.ts","webpack:///./src/helpers/array/forEachReverse.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/dom/whichChild.ts"],"names":["FocusDirection","fastSmoothScroll","options","undefined","margin","maxDistance","axis","settings","animationsEnabled","forceDirection","Static","forceDuration","scrollWithJs","promise","then","element","container","getNormalSize","position","Promise","resolve","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","getBoundingClientRect","containerRect","document","body","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","Math","abs","scrollTop","remainingPath","max","min","target","absPath","duration","startAt","Date","now","transition","shortTransition","longTransition","tick","t","currentPath","round","startCallback","distanceToEnd","isInDOM","isConnected","clamp","v","instances","Map","cancelAnimationByKey","key","instance","get","getAnimationInstance","isCancelled","deferred","animateSingle","set","delete","createAnimationInstance","animate","findUpAsChild","el","parent","parentElement","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","that","args","id","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","slideNavigation","prevTabContent","toRight","width","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","_from","CAN_USE_TRANSFERABLES","navigator","userAgent","match","err","cache","this","name","frames","counter","height","color","toneIndex","Boolean","join","worker","super","reqId","paused","direction","speed","autoplay","loop","group","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","initFrame","inverseColor","skipFirstFrameRendering","needUpscale","skipDelta","pixelRatio","devicePixelRatio","mediaSizes","isMobile","noCache","Infinity","canvas","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","cacheName","generateName","getCache","getCacheCounter","methodName","sendQuery","data","setMainLoop","clearPendingRAF","rafId","curFrame","minFrame","maxFrame","renderFirstFrame","pause","resetCurrentFrame","requestFrame","stop","play","lottieLoader","onDestroy","releaseCache","cleanup","frame","r","g","b","length","frameNo","applyColor","applyInversing","putImageData","console","error","dispatchEvent","has","frInterval","delta","frThen","renderFrame2","renderFrame","onLap","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","setDirection","setSpeed","bounds","setMinMax","playToFrameOnFrameCallback","renderIfPaused","frameCount","diff","parentNode","appendChild","time","ScreenSize","MediaSize","boxSize","fitted","aspect","makeMediaSize","MediaSizes","screenSizes","mobile","value","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","documentName","desktop","handleResize","innerWidth","activeScreen","wasScreen","active","rAF","cancelAnimationFrame","Worker_fn","Worker","onerror","terminate","onmessage","event","queryMethodListener","queryMethodArguments","message","postMessage","queryMethod","transfer","forEach","arg","ArrayBuffer","push","buffer","isWebAssemblySupported","loadPromise","reject","loaded","workersLimit","players","workers","curWorkerNum","log","logger","Error","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","params","loadAnimationFromURL","url","loadLottieWorkers","fetch","res","headers","blob","arrayBuffer","invokeCrypto","arr","blobConstruct","newParams","Object","assign","animationData","loadAnimationWorker","race","middleware","parseInt","initPlayer","addAnimation","idx","loadFromData","indexOfAndSplice","array","item","indexOf","spliced","splice","forEachReverse","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","entry","find","p","isIntersecting","clearCache","overrideIdleGroups","doc","checkAnimations","override","found","HTMLVideoElement","src","load","unobserve","stickers","observe","blurred","destroy","groups","keys","animations","removeAnimation","idle","isIDLE","refreshGroup","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","className","onFirstMount","onMount","installed","setPage","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promises","finally","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","elem","previousElementSibling"],"mappings":"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","file":"0.61ba1feb637ecd90f834.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf, fastRafPromise } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\nexport type ScrollStartCallbackDimensions = {\r\n scrollSize: number,\r\n scrollPosition: number,\r\n distanceToEnd: number,\r\n path: number,\r\n duration: number,\r\n containerRect: DOMRect,\r\n elementRect: DOMRect,\r\n};\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement,\r\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = fastRafPromise().then(() => scrollWithJs(options));\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n if(options.startCallback) {\r\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\r\n options.startCallback({\r\n scrollSize,\r\n scrollPosition,\r\n distanceToEnd,\r\n path,\r\n duration,\r\n containerRect,\r\n elementRect\r\n });\r\n }\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport deferredPromise, { CancellablePromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement, \r\n content: HTMLElement, \r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, \r\n onTransitionEnd?: () => void, \r\n transitionTime = 250, \r\n scrollableX?: ScrollableX\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport clamp from \"../../helpers/number/clamp\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: Blob, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n this.width = Math.round(this.width);\n this.height = Math.round(this.height);\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n \n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.cleanup();\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize,\r\n documentName: MediaSize\r\n};\r\n\r\nexport type MediaSizeType = keyof MediaTypeSizes;\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200),\r\n documentName: makeMediaSize(200, 0)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280),\r\n documentName: makeMediaSize(240, 0)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.086dfed03cbca80766c6.bundle.worker.js\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(typeof(arg) === 'object' && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as Transferable[]);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then(res => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data)).then(arr => blobConstruct(arr as Uint8Array, ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(blob => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', middleware?: () => boolean): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n \r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\n}\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport forEachReverse from \"../helpers/array/forEachReverse\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private overrideIdleGroups: Set;\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n \r\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\r\n animation.src = animation.dataset.src;\r\n animation.load();\r\n } */\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n \r\n const animation = player.animation;\r\n if(animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n animation.clearCache();\r\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\r\n animation.dataset.src = animation.src;\r\n animation.src = '';\r\n animation.load();\r\n } */\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n return;\r\n }\r\n \r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (player) => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!rootScope.idle.isIDLE || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport deferredPromise, { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport pause from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/1.7e25e358e50296502415.chunk.js b/public/1.7e25e358e50296502415.chunk.js deleted file mode 100644 index efea520aa..000000000 --- a/public/1.7e25e358e50296502415.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{114:function(t,e,n){"use strict";function i(t,e){const n=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(n)}n.d(e,"a",(function(){return i}))},141:function(t,e,n){"use strict";var i=n(36),s=n(10),o=n(1),a=n(103);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(t,e){let n=this.promises[t];return n||(this.scheduleFlush(),n=this.promises[t]=Object(s.a)()),void 0!==e&&n.then(()=>e()),n}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const n=Object(a.a)(t),i=n?this.mutate():Promise.resolve();return void 0!==e&&(n?e():i.then(()=>e())),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),e.a=r},169:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(2);function s(t){return i.f&&t instanceof TouchEvent&&t.touches[0].clientX<30}},57:function(t,e,n){"use strict";n.d(e,"a",(function(){return o})),n.d(e,"b",(function(){return a})),n.d(e,"c",(function(){return r})),n.d(e,"d",(function(){return c}));var i=n(14),s=n(114);const o=i.a?"mousedown":"click";function a(t,e,n={}){const i=n.listenerSetter?n.listenerSetter.add(t):t.addEventListener.bind(t);n.touchMouseDown=!0,i(o,e,n)}function r(t,e,n){t.removeEventListener(o,e,n)}function c(t){Object(s.a)(t,o)}},58:function(t,e,n){"use strict";var i=n(7),s=n(79);e.a=(t,e={})=>{const n=document.createElement(e.asDiv?"div":"button");return n.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&n.classList.add("rp-square"),Object(s.a)(n)),e.onlyMobile&&n.classList.add("only-handhelds"),e.disabled&&n.setAttribute("disabled","true"),e.text&&n.append(Object(i.d)(e.text)),n}},61:function(t,e,n){"use strict";n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return h})),n.d(e,"c",(function(){return v})),n.d(e,"d",(function(){return w})),n.d(e,"e",(function(){return L})),n.d(e,"b",(function(){return x})),n.d(e,"a",(function(){return T}));var i=n(1),s=n(27),o=n(57),a=n(62),r=n(14),c=n(2),d=n(0),l=n(86);function u(t,e=!1){const n='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=n,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",n),t.lastElementChild}function h(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,u(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}i.a.putPreloader=u;let m=t=>{let e=g.getBoundingClientRect(),{clientX:n,clientY:i}=t,s=n>=e.right?n-e.right:e.left-n,o=i>=e.bottom?i-e.bottom:e.top-i;(s>=100||o>=100)&&v()};const p=t=>{v()},v=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,d.a.dispatchEvent("context_menu_toggle",!1)),f&&(f(),f=null),r.a||(window.removeEventListener("mousemove",m),window.removeEventListener("contextmenu",p)),document.removeEventListener(o.a,p),c.f||l.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&v()});let g=null,f=null,b=null;function w(t,e){v(),c.f||l.a.pushItem({type:"menu",onPop:t=>{v()}}),g=t,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(o.a,t=>{Object(s.a)(t),p()})),g.parentElement.insertBefore(b,g),f=e,r.a||(window.addEventListener("mousemove",m),window.addEventListener("contextmenu",p,{once:!0})),document.addEventListener(o.a,p),d.a.dispatchEvent("context_menu_toggle",!0)}function L({pageX:t,pageY:e},n,i,s){const o=Array.from(n.children).find(t=>t.classList.contains("btn-menu-item")&&!t.classList.contains("hide"))||n;let{scrollWidth:r}=o,{scrollHeight:c}=n;const d=document.body.getBoundingClientRect(),l=d.width,u=d.height;let h=8,m=8,p=8,v=8;s&&(s.top&&(h+=s.top),s.right&&(m+=s.right),s.bottom&&(p+=s.bottom),s.left&&(v+=s.left)),i=a.b.isMobile?"right":"left";let g="top";const f=u-c-p,b=l-r-m,w=v,L={x:{left:t,right:Math.min(b,t-r)},intermediateX:"right"===i?w:b,y:{top:e,bottom:e-c},intermediateY:f},E={left:L.x.left+r+m<=l,right:L.x.right>=v},y={top:L.y.top+c+p<=u,bottom:L.y.bottom-p>=p};{let t;t=E[i]?L.x[i]:(i="center",L.intermediateX),n.style.left=t+"px"}{let t;t=y[g]?L.y[g]:(g="center",L.intermediateY),n.style.top=t+"px"}return n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===g?g:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:r,height:c}}let E=!1,y=0;function x(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,E=!1},400),E=!0}function T(t,e,n){const i=n?n.add(t):t.addEventListener.bind(t),o=n?n.removeManual.bind(n,t):t.removeEventListener.bind(t);if(c.b&&r.a){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{E?r():(e(o.touches[0]),r(),g&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.a?n=>{e(n),g&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},79:function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var i=n(34),s=n(141),o=n(14),a=n(0),r=n(116);let c=0;function d(t,e=(()=>Promise.resolve()),n=null,d=!1,l=t){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;t.classList.contains("rp-square")&&u.classList.add("is-square"),t[d?"prepend":"append"](u);const m=(t,i)=>{const a=Date.now(),r=document.createElement("div"),d=c++,l=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let t=Date.now()-a;const e=()=>{s.a.mutate(()=>{r.remove()}),n&&n(d)};if(tr.classList.add("hiding"),Math.max(n-l/2,0)),setTimeout(e,n)}else r.classList.add("hiding"),setTimeout(e,l/2);o.a||window.removeEventListener("contextmenu",h),h=null,v=!1},e&&e(d),window.requestAnimationFrame(()=>{const e=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=t-e.left,s=i-e.top,o=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(n-e.width/2)+e.width/2,2)),a=n-o/2,c=s-o/2;r.style.width=r.style.height=o+"px",r.style.left=a+"px",r.style.top=c+"px",u.append(r)})},p=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(i.a)(e.target,"c-ripple")!==u)&&(l===t||!Object(r.a)(e.target,l));let v=!1;if(o.a){let t=()=>{h&&h()};l.addEventListener("touchstart",e=>{if(!a.a.settings.animationsEnabled)return;if(e.touches.length>1||v||p(e))return;v=!0;let{clientX:n,clientY:i}=e.touches[0];m(n,i),l.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",e=>{e.cancelBubble=!0,e.stopPropagation(),t(),l.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else l.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!a.a.settings.animationsEnabled)return;if("0"===l.dataset.ripple||p(t))return;if(v)return void(v=!1);let{clientX:e,clientY:n}=t;m(e,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},86:function(t,e,n){"use strict";var i=n(1),s=n(2),o=n(4),a=n(38),r=n(27),c=n(169),d=n(76);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!t,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.f){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(a.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const n=this.navigations[e];if(n.type===t)return{item:n,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return void this.backByItem(e.item,e.index)}history.back()}backByItem(t,e=this.navigations.indexOf(t)){this.manual=!0,this.navigations.splice(e,1),this.handleItem(t)}onItemAdded(t){this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushItem(t){this.navigations.push(t),this.onItemAdded(t)}unshiftItem(t){this.navigations.unshift(t),this.onItemAdded(t)}spliceItems(t,e,...n){this.navigations.splice(t,e,...n),n.forEach(t=>{this.onItemAdded(t)})}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){t&&Object(d.a)(this.navigations,t)}removeByType(t,e=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===t&&(this.navigations.splice(n,1),e))break}}};i.a.appNavigationController=l,e.a=l}}]); -//# sourceMappingURL=1.7e25e358e50296502415.chunk.js.map \ No newline at end of file diff --git a/public/1.7e25e358e50296502415.chunk.js.map b/public/1.7e25e358e50296502415.chunk.js.map deleted file mode 100644 index 0ff89bdcd..000000000 --- a/public/1.7e25e358e50296502415.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/ripple.ts","webpack:///./src/components/appNavigationController.ts"],"names":["simulateEvent","elem","name","event","Event","bubbles","cancelable","dispatchEvent","sequentialDom","promises","raf","bind","scheduled","kind","callback","promise","this","scheduleFlush","undefined","then","do","element","isConnected","mutate","Promise","resolve","read","write","isSwipingBackSafari","e","TouchEvent","touches","clientX","CLICK_EVENT_NAME","attachClickEvent","options","add","listenerSetter","addEventListener","touchMouseDown","detachClickEvent","removeEventListener","simulateClickEvent","className","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","onlyMobile","disabled","setAttribute","text","append","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","onMouseMove","rect","openedMenu","getBoundingClientRect","clientY","diffX","right","left","diffY","bottom","top","closeBtnMenu","onClick","parentElement","menuOverlay","openedMenuOnClose","window","removeByType","openBtnMenu","menuElement","onClose","pushItem","type","onPop","canAnimate","insertBefore","once","positionMenu","pageX","pageY","side","additionalPadding","getScrollWidthFromElement","Array","from","children","find","contains","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","width","windowHeight","height","paddingTop","paddingRight","paddingBottom","paddingLeft","isMobile","verticalSide","maxTop","maxLeft","minLeft","sides","x","Math","min","intermediateX","y","intermediateY","possibleSides","style","replace","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","setTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","length","rippleClickId","ripple","onEnd","prepend","attachListenerTo","querySelector","r","handler","drawRipple","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","delay","max","touchStartFired","requestAnimationFrame","clickX","clickY","size","sqrt","abs","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","cancelBubble","stopPropagation","passive","dataset","appNavigationController","navigations","id","manual","log","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","state","pushState","item","pop","handleItem","key","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","noHistory","push","onItemAdded","unshift","items","forEach","origin","pathname","single"],"mappings":"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","file":"1.7e25e358e50296502415.chunk.js","sourcesContent":["export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nexport type MenuPositionPadding = {\r\n top?: number, \r\n right?: number, \r\n bottom?: number, \r\n left?: number\r\n};\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_BOTTOM = PADDING_TOP;\r\nconst PADDING_LEFT = 8;\r\nconst PADDING_RIGHT = PADDING_LEFT;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find(element => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\r\n\r\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\r\n let {scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\r\n if(additionalPadding) {\r\n if(additionalPadding.top) paddingTop += additionalPadding.top;\r\n if(additionalPadding.right) paddingRight += additionalPadding.right;\r\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\r\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\r\n }\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const maxTop = windowHeight - menuHeight - paddingBottom;\r\n const maxLeft = windowWidth - menuWidth - paddingRight;\r\n const minTop = paddingTop;\r\n const minLeft = paddingLeft;\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: Math.min(maxLeft, pageX - menuWidth)\r\n },\r\n intermediateX: side === 'right' ? minLeft : maxLeft,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\r\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\r\n intermediateY: maxTop,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\r\n right: sides.x.right >= paddingLeft\r\n },\r\n y: {\r\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\r\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n\r\n return {\r\n width: menuWidth,\r\n height: menuHeight\r\n };\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\r\n this.navigations.splice(index, length, ...items);\r\n items.forEach((item) => {\r\n this.onItemAdded(item);\r\n });\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/104.19c787168bced8f0f781.chunk.js b/public/104.19c787168bced8f0f781.chunk.js new file mode 100644 index 000000000..5c2223bd5 --- /dev/null +++ b/public/104.19c787168bced8f0f781.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","Deactivated.Version.Title":"WebK has updated...","Deactivated.Version.Subtitle":"Another tab is running a newer version of Telegram.\nClick anywhere to reload this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off",PrivacyPhoneInfo4:"This public link opens a chat with you:",ReportChatIllegalDrugs:"Illegal Drugs",ReportChatPersonalDetails:"Personal Details",VoipPeerIncompatible:"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.",TelegramFeaturesUrl:"https://t.me/TelegramTips",ScamMessage:"SCAM",FakeMessage:"FAKE",TextCopied:"Text copied to clipboard","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","UsernameSettings.ChangeDescription":"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); +//# sourceMappingURL=104.19c787168bced8f0f781.chunk.js.map \ No newline at end of file diff --git a/public/104.19c787168bced8f0f781.chunk.js.map b/public/104.19c787168bced8f0f781.chunk.js.map new file mode 100644 index 000000000..79c89cb64 --- /dev/null +++ b/public/104.19c787168bced8f0f781.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"104.19c787168bced8f0f781.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterMenuDelete\": \"Delete Folder\",\n \"FilterHeaderEdit\": \"Edit Folder\",\n \"FilterAllGroups\": \"All Groups\",\n \"FilterAllContacts\": \"All Contacts\",\n \"FilterAllNonContacts\": \"All Non-Contacts\",\n \"FilterAllChannels\": \"All Channels\",\n \"FilterAllBots\": \"All Bots\",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\"\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\"\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n \"Deactivated.Version.Title\": \"WebK has updated...\",\n \"Deactivated.Version.Subtitle\": \"Another tab is running a newer version of Telegram.\\nClick anywhere to reload this tab.\",\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.TimeFormat\": \"Time Format\",\n \"General.TimeFormat.h12\": \"12-hour\",\n \"General.TimeFormat.h23\": \"24-hour\",\n \"ChatBackground.UploadWallpaper\": \"Upload Wallpaper\",\n \"ChatBackground.Blur\": \"Blur Wallpaper Image\",\n \"Notifications.Sound\": \"Notification Sound\",\n \"NewPrivateChat\": \"New Private Chat\",\n \"NewPoll.OptionLabel\": \"Option %d\",\n \"Message.Context.Selection.Copy\": \"Copy selected\",\n \"Message.Context.Selection.Clear\": \"Clear selection\",\n \"Message.Context.Selection.Delete\": \"Delete selected\",\n \"Message.Context.Selection.Forward\": \"Forward selected\",\n \"Message.Context.Selection.SendNow\": \"Send Now selected\",\n \"Message.Unsupported.Desktop\": \"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__\",\n \"Message.Unsupported.Mobile\": \"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__\",\n \"Checkbox.Enabled\": \"Enabled\",\n \"Checkbox.Disabled\": \"Disabled\",\n \"Error.PreviewSender.CaptionTooLong\": \"Caption is too long.\",\n \"PreviewSender.GroupItems\": \"Group items\",\n \"PreviewSender.SendAlbum\": {\n \"one_value\": \"Send Album\",\n \"other_value\": \"Send %d Albums\"\n },\n \"Presence.YourChat\": \"chat with yourself\",\n \"Privacy.Devices\": {\n \"one_value\": \"%1$d device\",\n \"other_value\": \"%1$d devices\"\n },\n \"Privacy.SensitiveContent\": \"Sensitive Content\",\n \"PrivacyModal.Search.Placeholder\": \"Add Users or Groups...\",\n \"Permissions.NoExceptions\": \"No exceptions\",\n \"Permissions.ExceptionsCount\": {\n \"one_value\": \"%d exception\",\n \"other_value\": \"%d exceptions\"\n },\n \"Link.Available\": \"Link is available\",\n \"Link.Taken\": \"Link is already taken\",\n \"Link.Invalid\": \"Link is invalid\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n //it is from iOS\n \"VoiceChat.DiscussionGroup\": \"discussion group\",\n\n // * android\n \"AccDescrEditing\": \"Editing\",\n \"ActionCreateChannel\": \"Channel created\",\n \"ActionCreateGroup\": \"un1 created the group\",\n \"ActionChangedTitle\": \"un1 changed the group name to un2\",\n \"ActionRemovedPhoto\": \"un1 removed the group photo\",\n \"ActionChangedPhoto\": \"un1 changed the group photo\",\n \"ActionChangedVideo\": \"un1 changed the group video\",\n \"ActionAddUser\": \"un1 added un2\",\n \"ActionAddUserSelf\": \"un1 returned to the group\",\n \"ActionAddUserSelfYou\": \"You returned to the group\",\n \"ActionAddUserSelfMega\": \"un1 joined the group\",\n \"ActionLeftUser\": \"un1 left the group\",\n \"ActionKickUser\": \"un1 removed un2\",\n \"ActionInviteUser\": \"un1 joined the group via invite link\",\n \"ActionPinnedNoText\": \"un1 pinned a message\",\n \"ActionMigrateFromGroup\": \"This group was upgraded to a supergroup\",\n \"ActionYouScored\": \"You scored %1$s\",\n \"ActionUserScored\": \"un1 scored %1$s\",\n \"ActionYouScoredInGame\": \"You scored %1$s in un2\",\n \"ActionUserScoredInGame\": \"un1 scored %1$s in un2\",\n \"AndOther\": {\n \"one_value\": \"and %1$d other\",\n \"other_value\": \"and %1$d others\"\n },\n \"AttachPhoto\": \"Photo\",\n \"AttachVideo\": \"Video\",\n \"AttachGif\": \"GIF\",\n \"AttachLocation\": \"Location\",\n \"AttachLiveLocation\": \"Live Location\",\n \"AttachContact\": \"Contact\",\n //\"AttachDocument\": \"File\",\n \"AttachSticker\": \"Sticker\",\n \"AttachAudio\": \"Voice message\",\n \"AttachRound\": \"Video message\",\n \"AttachGame\": \"Game\",\n \"Bot\": \"bot\",\n //\"ChannelJoined\": \"You joined this channel\",\n \"ChannelMegaJoined\": \"You joined this group\",\n \"EnterChannelName\": \"Channel name\",\n \"DescriptionOptionalPlaceholder\": \"Description (optional)\",\n \"DescriptionPlaceholder\": \"Description\",\n \"DiscussionStarted\": \"Discussion started\",\n \"Draft\": \"Draft\",\n \"FilterAlwaysShow\": \"Include Chats\",\n \"FilterNeverShow\": \"Exclude Chats\",\n \"FilterInclude\": \"Included Chats\",\n \"FilterExclude\": \"Excluded Chats\",\n \"FilterChatTypes\": \"Chat types\",\n \"FilterChats\": \"Chats\",\n \"FilterNew\": \"New Folder\",\n \"Filters\": \"Folders\",\n \"FilterRecommended\": \"Recommended Folders\",\n \"FilterShowMoreChats\": {\n \"one_value\": \"Show %1$d More Chat\",\n \"other_value\": \"Show %1$d More Chats\"\n },\n \"ForwardedMessageCount\": {\n \"one_value\": \"Forwarded message\",\n \"other_value\": \"%1$d forwarded messages\"\n },\n \"FromYou\": \"You\",\n \"Add\": \"Add\",\n \"Chats\": {\n \"one_value\": \"%1$d chat\",\n \"other_value\": \"%1$d chats\"\n },\n \"Channels\": {\n \"one_value\": \"%1$d channel\",\n \"other_value\": \"%1$d channels\"\n },\n \"Comments\": {\n \"one_value\": \"%1$d Comment\",\n \"other_value\": \"%1$d Comments\"\n },\n \"Groups\": {\n \"one_value\": \"%1$d group\",\n \"other_value\": \"%1$d groups\"\n },\n \"Users\": {\n \"one_value\": \"%1$d user\",\n \"other_value\": \"%1$d users\"\n },\n \"Members\": {\n \"one_value\": \"%1$d member\",\n \"other_value\": \"%1$d members\"\n },\n \"messages\": {\n \"one_value\": \"%1$d message\",\n \"other_value\": \"%1$d messages\"\n },\n \"UsernameHelpLink\": \"This link opens a chat with you:\\n%1$s\",\n \"NewChannel\": \"New Channel\",\n \"NewGroup\": \"New Group\",\n \"Contacts\": \"Contacts\",\n \"SavedMessages\": \"Saved Messages\",\n \"Settings\": \"Settings\",\n \"SettingsHelp\": \"Help\",\n \"General\": \"General\",\n \"TextSize\": \"Message Text Size\",\n \"ChatBackground\": \"Chat Background\",\n \"EnableAnimations\": \"Enable Animations\",\n \"AutoDownloadMedia\": \"Auto-Download Media\",\n \"AutodownloadContacts\": \"Contacts\",\n \"AutodownloadPrivateChats\": \"Private Chats\",\n \"AutodownloadGroupChats\": \"Group Chats\",\n \"AutodownloadChannels\": \"Channels\",\n \"AutoplayGIF\": \"GIFs\",\n \"AutoplayVideo\": \"Videos\",\n \"NotificationsForGroups\": \"Notifications for groups\",\n \"NotificationsForPrivateChats\": \"Notifications for private chats\",\n \"NotificationsForChannels\": \"Notifications for channels\",\n \"NotificationsPrivateChats\": \"Private Chats\",\n \"NotificationsGroups\": \"Groups\",\n \"NotificationsChannels\": \"Channels\",\n \"NotificationsOther\": \"Other\",\n \"MarkAsUnread\": \"Mark as unread\",\n \"MarkAsRead\": \"Mark as read\",\n \"ContactJoined\": \"Contact joined Telegram\",\n \"Loading\": \"Loading...\",\n \"Unblock\": \"Unblock\",\n \"BlockedUsers\": \"Blocked Users\",\n \"BlockedUsersInfo\": \"Blocked users will not be able to contact you and will not see your Last Seen time.\",\n \"BlockedEmpty\": \"None\", \n \"TwoStepVerification\": \"Two-Step Verification\",\n \"TwoStepVerificationTitle\": \"Two-Step Verification\",\n \"PinnedMessage\": \"Pinned Message\",\n \"PinnedMessagesCount\": {\n \"one_value\": \"Pinned Message\",\n \"other_value\": \"%1$d Pinned Messages\"\n },\n //\"PreviousPinnedMessage\": \"Previous Message\",\n \"PrivacyExceptions\": \"Exceptions\",\n \"PrivacyLastSeen\": \"Last Seen & Online\",\n \"PrivacySettings\": \"Privacy and Security\",\n \"PrivacyTitle\": \"Privacy\",\n \"PrivacyPhone\": \"Phone Number\",\n \"PrivacyPhoneTitle\": \"Who can see my phone number?\",\n \"PrivacyPhoneTitle2\": \"Who can find me by my number?\",\n \"PrivacyPhoneInfo\": \"Users who have your number saved in their contacts will also see it on Telegram.\",\n \"PrivacyPhoneInfo3\": \"Users who add your number to their contacts will see it on Telegram only if they are your contacts.\",\n \"PrivacyProfilePhoto\": \"Profile Photos\",\n \"PrivacyProfilePhotoTitle\": \"Who can see my profile photos & videos?\",\n \"PrivacyP2PHeader\": \"Peer-to-Peer\",\n \"PrivacyForwardsTitle\": \"Who can add a link to my account when forwarding my messages?\",\n \"Reminders\": \"Reminders\",\n \"ScheduledMessages\": \"Scheduled Messages\",\n \"LastSeenTitle\": \"Who can see your Last Seen time?\",\n \"SessionsTitle\": \"Active Sessions\",\n \"CurrentSession\": \"This device\",\n \"TerminateAllSessions\": \"Terminate All Other Sessions\",\n \"TerminateSessionText\": \"Are you sure you want to terminate this session?\",\n \"OtherSessions\": \"Active sessions\",\n \"AreYouSureDeleteSingleMessage\": \"Are you sure you want to delete this message?\",\n \"AreYouSureDeleteFewMessages\": \"Are you sure you want to delete these messages?\",\n \"AreYouSureDeleteSingleMessageMega\": \"Are you sure you want to delete this message for everyone?\",\n \"AreYouSureDeleteFewMessagesMega\": \"Are you sure you want to delete these messages for everyone?\",\n \"AreYouSureDeleteAndExitName\": \"Are you sure you want to delete and leave the group **%1$s**?\",\n \"AreYouSureDeleteThisChatSavedMessages\": \"Are you sure you want to delete **Saved Messages**?\",\n \"AreYouSureDeleteThisChatWithUser\": \"Are you sure you want to delete the chat with **%1$s**?\",\n \"AreYouSureSessionTitle\": \"Terminate session\",\n \"AreYouSureSessionsTitle\": \"Terminate sessions\",\n \"AreYouSureSessions\": \"Are you sure you want to terminate all other sessions?\",\n \"Terminate\": \"Terminate\",\n \"WhoCanCallMe\": \"Who can call me?\",\n \"WhoCanAddMe\": \"Who can add me to group chats?\",\n \"ArchivedChats\": \"Archived Chats\",\n \"Cancel\": \"Cancel\",\n \"HistoryCleared\": \"History was cleared\",\n \"Archive\": \"Archive\",\n \"Unarchive\": \"Unarchive\",\n \"Delete\": \"Delete\",\n \"Reply\": \"Reply\",\n \"Edit\": \"Edit\",\n \"Forward\": \"Forward\",\n \"CopyLink\": \"Copy Link\",\n \"Copy\": \"Copy\",\n \"Search\": \"Search\",\n \"LinkCopied\": \"Link copied to clipboard\",\n \"LinkCopiedPrivateInfo\": \"This link will only work for members of this chat.\",\n \"GroupAddMembers\": \"Add Members\",\n \"SendMessageTo\": \"Add people...\",\n //\"SelectChat\": \"Select Chat\",\n \"JumpToDate\": \"Jump to Date\",\n \"Caption\": \"Caption\",\n \"Message\": \"Message\",\n \"Poll\": \"Poll\",\n \"SharedFilesTab2\": \"Files\",\n \"SharedMediaTab2\": \"Media\",\n //\"SharedMediaTabFull2\": \"Shared Media\",\n //\"SharedGroupsTab2\": \"Groups\",\n \"SharedLinksTab2\": \"Links\",\n \"SharedMusicTab2\": \"Music\",\n \"SharedVoiceTab2\": \"Voice\",\n //\"SharedGIFsTab2\": \"GIFs\",\n \"NewPoll\": \"New Poll\",\n \"PollOptions\": \"Poll options\",\n \"AskAQuestion\": \"Ask a Question\",\n \"AddAnExplanationInfo\": \"Users will see this text after choosing the wrong answer, good for educational purposes.\",\n \"AccDescrQuizExplanation\": \"Explanation\",\n \"PhoneCopied\": \"Phone copied to clipboard\",\n \"UsernameCopied\": \"Username copied to clipboard.\",\n //\"HashtagCopied\": \"Hashtag copied to clipboard.\",\n \"BioCopied\": \"Bio copied to clipboard.\",\n \"UserBio\": \"Bio\",\n \"Username\": \"Username\",\n \"Phone\": \"Phone\",\n \"Notifications\": \"Notifications\",\n \"AreYouSureDeleteContact\": \"Are you sure you want to delete this contact?\",\n \"AreYouSureDeleteAndExit\": \"Are you sure you want to delete and leave the group?\",\n \"AreYouSureDeleteAndExitChannel\": \"Do you want to delete and leave the channel?\",\n \"DeleteContact\": \"Delete contact\",\n \"GroupType\": \"Group Type\",\n \"ChannelType\": \"Channel Type\",\n \"TypePrivate\": \"Private\",\n \"TypePublic\": \"Public\",\n \"TypePrivateGroup\": \"Private\",\n \"TypePublicGroup\": \"Public\",\n \"GroupMembers\": \"Members\",\n \"DeleteMega\": \"Delete Group\",\n \"DeleteMegaMenu\": \"Delete group\",\n \"DeleteAndExitButton\": \"Delete and Leave Group\",\n \"ChannelDelete\": \"Delete Channel\",\n \"ChannelDeleteMenu\": \"Delete channel\",\n \"ChannelPermissions\": \"Permissions\",\n \"ChannelPermissionsHeader\": \"What can members of this group do?\",\n \"ChannelAddException\": \"Add Exception\",\n \"ChannelBlockedUsers\": \"Removed users\",\n \"NoBlockedUsers\": \"No removed users\",\n \"UserRestrictions\": \"User Permissions\",\n \"UserRestrictionsDisabled\": \"This option is disabled for all members in Group Permissions\",\n \"UserRestrictionsCanDo\": \"What can this user do?\",\n \"UserRestrictionsRead\": \"Read Messages\",\n \"UserRestrictionsSend\": \"Send Messages\",\n \"UserRestrictionsSendMedia\": \"Send Media\",\n \"UserRestrictionsSendPolls\": \"Send Polls\",\n \"UserRestrictionsSendStickers\": \"Send Stickers and GIFs\",\n \"UserRestrictionsEmbedLinks\": \"Embed Links\",\n \"UserRestrictionsChangeInfo\": \"Change Chat Info\",\n \"UserRestrictionsPinMessages\": \"Pin Messages\",\n \"UserRestrictionsInviteUsers\": \"Add Users\",\n //\"UserRestrictionsNoRead\": \"can't read\",\n \"UserRestrictionsNoSend\": \"can't send messages\",\n \"UserRestrictionsNoSendMedia\": \"no media\",\n \"UserRestrictionsNoSendPolls\": \"no polls\",\n \"UserRestrictionsNoSendStickers\": \"no stickers & GIFs\",\n \"UserRestrictionsNoEmbedLinks\": \"no embed links\",\n \"UserRestrictionsNoChangeInfo\": \"can't change Info\",\n \"UserRestrictionsNoPinMessages\": \"no pins\",\n \"UserRestrictionsNoInviteUsers\": \"can't add users\",\n \"UserRestrictionsBlock\": \"Ban and remove from group\",\n \"ChannelPublic\": \"Public Channel\",\n \"MegaPublic\": \"Public Group\",\n //\"MegaLocation\": \"Location-based Group\",\n \"ChannelPublicInfo\": \"Public channels can be found in search, anyone can join them.\",\n \"MegaPublicInfo\": \"Public groups can be found in search, chat history is available to everyone and anyone can join.\",\n \"ChannelPrivate\": \"Private Channel\",\n \"MegaPrivate\": \"Private Group\",\n \"ChannelPrivateInfo\": \"Private channels can only be joined via an invite link.\",\n \"MegaPrivateInfo\": \"Private groups can only be joined if you were invited or have an invite link.\",\n \"ChannelPrivateLinkHelp\": \"People can join your channel by following this link. You can revoke the link any time.\",\n \"MegaPrivateLinkHelp\": \"People can join your group by following this link. You can revoke the link any time.\",\n \"RevokeButton\": \"Revoke\",\n \"RevokeLink\": \"Revoke Link\",\n \"RevokeAlert\": \"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.\",\n \"SetUrlPlaceholder\": \"Link\",\n \"Subscribers\": {\n \"one_value\": \"%1$d subscriber\",\n \"other_value\": \"%1$d subscribers\"\n },\n \"SearchGifsTitle\": \"Search GIFs\",\n \"PinMessageAlert\": \"Pin this message in the group?\",\n \"PinMessageAlertTitle\": \"Pin message\",\n \"PinMessageAlertChannel\": \"Do you want to pin this message in this channel?\",\n \"PinMessageAlertChat\": \"Do you want to pin this message at the top of the chat?\",\n \"UnpinMessageAlertTitle\": \"Unpin message\",\n \"UnpinMessageAlert\": \"Do you want to unpin this message?\",\n \"PinNotify\": \"Notify all members\",\n \"PinMessage\": \"Pin\",\n \"UnpinMessage\": \"Unpin\",\n \"PinAlsoFor\": \"Also pin for %1$s\",\n \"DeleteMessagesTitle\": \"Delete %1$s\",\n \"DeleteSingleMessagesTitle\": \"Delete message\",\n \"DeleteMessagesOption\": \"Unsend My Messages\",\n \"DeleteMessagesOptionAlso\": \"Also delete for %1$s\",\n \"DeleteForAll\": \"Delete for all members\",\n \"DeleteMessagesTextGroup\": \"You can also delete the %1$s you sent from the inboxes of other group members by checking \\\"Unsend my messages\\\".\",\n \"LeaveChannel\": \"Leave Channel\",\n \"LeaveChannelMenu\": \"Leave channel\",\n \"ChannelLeaveAlertWithName\": \"Are you sure you want to leave **%1$s**?\",\n \"LeaveMegaMenu\": \"Leave group\",\n \"DeleteChatUser\": \"Delete chat\",\n \"PleaseEnterCurrentPassword\": \"Enter your password\",\n \"PleaseEnterFirstPassword\": \"Enter a password\",\n \"PleaseReEnterPassword\": \"Re-enter your password\",\n \"Continue\": \"Continue\",\n \"YourEmailSkip\": \"Skip\",\n \"YourEmailSkipWarning\": \"Warning\",\n \"YourEmailSkipWarningText\": \"No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.\",\n \"TurnPasswordOffQuestionTitle\": \"Disable password\",\n \"TurnPasswordOffQuestion\": \"Are you sure you want to disable your password?\",\n \"Disable\": \"Disable\",\n \"TwoStepVerificationSetPassword\": \"Set Password\",\n \"TwoStepVerificationPasswordSet\": \"Password Set!\",\n \"TwoStepVerificationPasswordSetInfo\": \"This password will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepVerificationPasswordReturnSettings\": \"Return to Settings\",\n \"RecoveryEmail\": \"Recovery email\",\n \"RecoveryEmailTitle\": \"Recovery Email\",\n \"ResendCode\": \"Resend code\",\n \"PasswordAsHintError\": \"Hint must be different from your password\",\n \"AddStickersCount\": \"ADD %1$s\",\n \"RemoveStickersCount\": \"REMOVE %1$s\",\n \"Stickers\": {\n \"one_value\": \"%1$d sticker\",\n \"other_value\": \"%1$d stickers\"\n },\n \"HidAccount\": \"The account was hidden by the user\",\n \"TelegramFeatures\": \"Telegram Features\",\n \"SetColor\": \"Set a color\",\n \"Open\": \"Open\",\n \"OpenUrlTitle\": \"Open Link\",\n \"OpenUrlAlert2\": \"Do you want to open %1$s?\",\n \"FilterNoChatsToDisplay\": \"Folder is empty\",\n \"FilterNoChatsToDisplayInfo\": \"No chats currently belong to this folder.\",\n \"SupportStatus\": \"support\",\n \"Lately\": \"last seen recently\",\n \"WithinAWeek\": \"last seen within a week\",\n \"WithinAMonth\": \"last seen within a month\",\n \"ALongTimeAgo\": \"last seen a long time ago\",\n \"Online\": \"online\",\n \"MessageScheduleSend\": \"Send Now\",\n \"MessageScheduleEditTime\": \"Reschedule\",\n \"YouLeft\": \"You left this group\",\n \"Recent\": \"Recent\",\n \"Of\": \"%1$d of %2$d\",\n \"NoResult\": \"No results\",\n \"Updating\": \"Updating...\",\n \"Emoji\": \"Emoji\",\n \"AddContactTitle\": \"Add Contact\",\n \"HiddenName\": \"Deleted Account\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can't add this user to groups because of user's privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can't add this user to channels because of user's privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can't pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n \"GlobalSearch\": \"Global search\",\n \"SearchMessages\": \"Messages\",\n \"SearchAllChatsShort\": \"Chats\",\n \"ClearButton\": \"Clear\",\n \"FilterAllChats\": \"All Chats\",\n \"FilterAllChatsShort\": \"All\",\n \"Call\": \"Call\",\n \"VideoCall\": \"Video Call\",\n \"CallMessageOutgoing\": \"Outgoing Call\",\n \"CallMessageIncoming\": \"Incoming Call\",\n \"CallMessageVideoOutgoing\": \"Outgoing Video Call\",\n \"CallMessageVideoIncoming\": \"Incoming Video Call\",\n \"VoipExchangingKeys\": \"Exchanging encryption keys\",\n \"VoipUnmute\": \"Unmute\",\n \"SavingContentTitle\": \"Saving content\",\n \"RestrictSavingContent\": \"Restrict saving content\",\n \"RestrictSavingContentInfoGroup\": \"Members won't be able to copy, save and forward content from this group.\",\n \"RestrictSavingContentInfoChannel\": \"Subscribers won't be able to copy, save and forward content from this channel.\",\n \"ClearOtherSessionsHelp\": \"Logs out all devices except for this one.\",\n \"SessionsListInfo\": \"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.\",\n \"SponsoredMessage\": \"sponsored\",\n \"OpenChannelPost\": \"VIEW POST\",\n \"FilterNameHint\": \"Folder name\",\n \"BotStart\": \"START\",\n \"BotUnblock\": \"RESTART\",\n \"BotStop\": \"Stop bot\",\n \"BotRestart\": \"Restart bot\",\n \"ShareYouPhoneNumberTitle\": \"Share your phone number?\",\n \"AreYouSureShareMyContactInfoBot\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n \"DistanceUnitsTitle\": \"Distance units\",\n \"DistanceUnitsKilometers\": \"Kilometers\",\n \"DistanceUnitsMiles\": \"Miles\",\n \"PeopleNearby\": \"People Nearby\",\n \"MakeMyselfVisible\": \"Make Myself Visible\",\n \"MakeMyselfVisibleTitle\": \"Show Your Profile?\",\n \"MakeMyselfVisibleInfo\": \"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.\",\n \"StopShowingMe\": \"Stop Showing Me\",\n \"PeopleNearbyInfo2\": \"Exchange contact info with people nearby and find new friends.\",\n \"NearbyCreateGroup\": \"Create a Local group\",\n \"AwayTo\": \"%1$s away\",\n \"MessagePreview\": \"Message Preview\",\n \"KMetersAway2\": \"%1$s km away\",\n \"MetersAway2\": \"%1$s m away\",\n \"MilesAway\": \"%1$s mi away\",\n \"FootsAway\": \"%1$s ft away\",\n \"PeopleNearbyHeader\": \"People nearby\",\n \"ChatsNearbyHeader\": \"Groups nearby\",\n \"ChatLocation\": \"Location\",\n \"RequestToJoinGroupDescription\": \"This group accepts new members only after they are approved by its admins.\",\n \"RequestToJoinChannelDescription\": \"This channel accepts new subscribers only after they are approved by its admins.\",\n \"RequestToJoinSent\": \"Join request sent\",\n \"RequestToJoinGroupApproved\": \"Your request to join the group was approved\",\n \"RequestToJoinChannelApproved\": \"Your request to join the channel was approved\",\n \"Update\": \"UPDATE\",\n \"Reactions\": \"Reactions\",\n \"DoubleTapSetting\": \"Quick Reaction\",\n \"EnableReactions\": \"Enable Reactions\",\n \"EnableReactionsChannelInfo\": \"Allow subscribers to react to channel posts.\",\n \"EnableReactionsGroupInfo\": \"Allow members to react to group messages.\",\n \"AvailableReactions\": \"Available reactions\",\n \"NobodyViewed\": \"Nobody viewed\",\n \"MessageSeen\": {\n \"one_value\": \"Seen\",\n \"other_value\": \"%1$d Seen\"\n },\n // \"Close\": \"Close\",\n \"DataSettings\": \"Data and Storage\",\n \"GroupsAndChannelsHelp\": \"Change who can add you to groups and channels.\",\n \"SessionsInfo\": \"Control your sessions on other devices.\",\n \"StickersBotInfo\": \"Artists are welcome to add their own sticker sets using our @stickers bot.\",\n \"AutomaticMediaDownload\": \"Automatic media download\",\n \"AutoDownloadPhotos\": \"Photos\",\n \"AutoDownloadVideos\": \"Videos\",\n \"AutoDownloadFiles\": \"Files\",\n \"AutoDownloadOnAllChats\": \"On in all chats\",\n \"AutoDownloadUpToOnAllChats\": \"Up to %1$s in all chats\",\n \"AutoDownloadOff\": \"Off\",\n \"AutoDownloadOnUpToFor\": \"Up to %1$s for %2$s\",\n \"AutoDownloadOnFor\": \"On for %1$s\",\n \"AutoDownloadContacts\": \"Contacts\",\n \"AutoDownloadPm\": \"PM\",\n \"AutoDownloadGroups\": \"Groups\",\n \"AutoDownloadChannels\": \"Channels\",\n \"AutoDownloadAudioInfo\": \"Voice messages are tiny, so they're always downloaded automatically.\",\n \"AutoplayMedia\": \"Auto-play media\",\n \"AutoDownloadPhotosTitle\": \"Auto-download photos\",\n \"AutoDownloadVideosTitle\": \"Auto-download videos and GIFs\",\n \"AutoDownloadFilesTitle\": \"Auto-download files and music\",\n \"AutoDownloadMaxFileSize\": \"Maximum file size\",\n \"AutodownloadSizeLimitUpTo\": \"up to %1$s\",\n \"ResetAutomaticMediaDownload\": \"Reset Auto-Download Settings\",\n \"ResetAutomaticMediaDownloadAlertTitle\": \"Reset settings\",\n \"ResetAutomaticMediaDownloadAlert\": \"Are you sure you want to reset auto-download settings?\",\n \"Reset\": \"Reset\",\n \"SendMessageAsTitle\": \"Send message as...\",\n \"Devices\": \"Devices\",\n \"LanguageName\": \"English\",\n \"EditCantEditPermissionsPublic\": \"This permission is not available in public groups.\",\n \"VoipUserMicrophoneIsOff\": \"%s\\'s microphone is off\",\n \"VoipUserCameraIsOff\": \"%s\\'s camera is off\",\n \"PrivacyPhoneInfo4\": \"This public link opens a chat with you:\",\n \"ReportChatIllegalDrugs\": \"Illegal Drugs\",\n \"ReportChatPersonalDetails\": \"Personal Details\",\n \"VoipPeerIncompatible\": \"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.\",\n \"TelegramFeaturesUrl\": \"https://t.me/TelegramTips\",\n \"ScamMessage\": \"SCAM\",\n \"FakeMessage\": \"FAKE\",\n \"TextCopied\": \"Text copied to clipboard\",\n\n // * macos\n \"AccountSettings.Filters\": \"Chat Folders\",\n \"AccountSettings.Notifications\": \"Notifications and Sounds\",\n \"AccountSettings.PrivacyAndSecurity\": \"Privacy and Security\",\n \"AccountSettings.Language\": \"Language\",\n \"Alert.UserDoesntExists\": \"Sorry, this user doesn't seem to exist.\",\n \"Alert.Confirm.Discard\": \"Discard\",\n \"Appearance.Reset\": \"Reset to Defaults\",\n \"AutoDownloadSettings.Delimeter\": \", \",\n \"AutoDownloadSettings.LastDelimeter\": \" and \",\n \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\n \"Call.Accept\": \"Accept\",\n \"Call.Decline\": \"Decline\",\n \"Call.End\": \"End\",\n \"Call.Camera\": \"Camera\",\n \"Call.Mute\": \"Mute\",\n \"Call.Recall\": \"Recall\",\n \"Call.Close\": \"Close\",\n \"Call.Screen\": \"Screen\",\n \"Call.Confirm.Discard.Voice.Header\": \"Video Chat in Progress\",\n \"Call.Confirm.Discard.Voice.ToVoice.Text\": \"Leave video chat in \\\"%1$@\\\" and start a new one in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Voice.ToCall.Text\": \"Leave video chat in \\\"%1$@\\\" and start a call with \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.Header\": \"Call in Progress\",\n \"Call.Confirm.Discard.Call.ToVoice.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.ToCall.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.PrivacyErrorMessage\": \"Sorry, you cannot call %@ because of their privacy settings.\",\n \"Call.StatusRequesting\": \"Contacting...\",\n \"Call.StatusRinging\": \"Ringing...\",\n \"Call.StatusConnecting\": \"Connecting...\",\n \"Call.StatusEnded\": \"Call Ended\",\n \"Call.StatusFailed\": \"Call Failed\",\n \"Call.StatusBusy\": \"Busy\",\n \"Call.StatusCalling\": \"is calling you...\",\n \"Contacts.PhoneNumber.NotRegistred\": \"The person with this phone number is not registered on Telegram yet.\",\n \"Channel.UsernameAboutChannel\": \"People can share this link with others and can find your channel using Telegram search.\",\n \"Channel.UsernameAboutGroup\": \"People can share this link with others and find your group using Telegram search.\",\n \"Chat.Accessory.Forward\": {\n \"one_value\": \"Forward Message\",\n \"other_value\": \"Forward %d Messages\"\n },\n \"Chat.Accessory.Forward.You\": \"You\",\n \"Chat.Accessory.Forward.From\": \"From\",\n \"Chat.Accessory.Hidden\": {\n \"one_value\": \"Forward Message (sender's name hidden)\",\n \"other_value\": \"Forward %d Messages (senders' names hidden)\"\n },\n \"Chat.Alert.Forward.Action.Another\": \"Forward to Another Chat\",\n \"Chat.Alert.Forward.Action.Hide1\": {\n \"one_value\": \"Hide Sender's Name\",\n \"other_value\": \"Hide Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.Show1\": {\n \"one_value\": \"Show Sender's Name\",\n \"other_value\": \"Show Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.ShowCaption\": {\n \"one_value\": \"Show Caption\",\n \"other_value\": \"Show Captions\"\n },\n \"Chat.Alert.Forward.Action.HideCaption\": {\n \"one_value\": \"Hide Caption\",\n \"other_value\": \"Hide Captions\"\n },\n \"Chat.CopySelectedText\": \"Copy Selected Text\",\n \"Chat.Confirm.Unpin\": \"Would you like to unpin this message?\",\n \"Chat.Context.Reacted\": \"%1$@/%2$@ Reacted\",\n \"Chat.Context.ReactedFast\": {\n \"other_value\": \"%d Reacted\"\n },\n \"Chat.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.Call.Cancelled\": \"Cancelled\",\n \"Chat.Service.Call.Missed\": \"Missed\",\n \"Chat.Service.PeerJoinedTelegram\": \"%@ joined Telegram\",\n \"Chat.Service.Channel.UpdatedTitle\": \"Channel renamed to \\\"%@\\\"\",\n \"Chat.Service.Channel.UpdatedPhoto\": \"Channel photo updated\",\n \"Chat.Service.Channel.RemovedPhoto\": \"Channel photo removed\",\n \"Chat.Service.Channel.UpdatedVideo\": \"Channel video updated\",\n \"Chat.Service.BotPermissionAllowed\": \"You allowed this bot to message you when you logged in on %@\",\n \"Chat.Service.Group.UpdatedPinnedMessage\": \"%@ pinned \\\"%@\\\"\",\n \"Chat.Service.VoiceChatStarted\": \"%1$@ started a [video chat](open)\",\n \"Chat.Service.VoiceChatStartedYou\": \"You started a [video chat](open)\",\n \"Chat.Service.VoiceChatStarted.Channel\": \"[Live Stream](open) started\",\n \"Chat.Service.VoiceChatFinished\": \"%1$@ ended the video chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the video chat (%@)\",\n \"Chat.Service.VoiceChatFinished.Channel\": \"Live Stream ended (%1$@)\",\n \"Chat.Service.VoiceChatInvitation\": \"%1$@ invited %2$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationByYou\": \"You invited %1$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationForYou\": \"%1$@ invited you to the [video chat](open)\",\n \"ChatService.UserJoinedGroupByRequest\": \"%@ was accepted to the group\",\n \"ChatService.UserJoinedChannelByRequest\": \"%@ joined the channel by request\",\n \"ChatList.Service.VoiceChatScheduled\": \"%1$@ scheduled a video chat for %2$@\",\n \"ChatList.Service.VoiceChatScheduledYou\": \"You scheduled a video chat for %2$@\",\n \"Chat.Poll.Unvote\": \"Retract Vote\",\n \"Chat.Poll.Stop\": \"Stop Poll\",\n \"Chat.Poll.ViewResults\": \"View Results\",\n \"Chat.Poll.SubmitVote\": \"Vote\",\n \"Chat.Poll.Type.Anonymous\": \"Anonymous Poll\",\n \"Chat.Poll.Type.Public\": \"Poll\",\n \"Chat.Poll.Type.AnonymousQuiz\": \"Anonymous Quiz\",\n \"Chat.Poll.Type.Quiz\": \"Quiz\",\n \"Chat.Poll.Type.Closed\": \"Final Results\",\n \"Chat.Poll.TotalVotes1\": {\n \"one_value\": \"%d vote\",\n \"other_value\": \"%d votes\"\n },\n \"Chat.Quiz.TotalVotes\": {\n \"one_value\": \"%d answer\",\n \"other_value\": \"%d answers\"\n },\n \"Chat.Poll.TotalVotesEmpty\": \"No votes yet\",\n \"Chat.Poll.TotalVotesResultEmpty\": \"No votes\",\n \"Chat.Quiz.TotalVotesEmpty\": \"No answers yet\",\n \"Chat.Quiz.TotalVotesResultEmpty\": \"No answers\",\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n \"Chat.Pinned.DontShow\": \"Don't Show Pinned Messages\",\n \"Chat.Title.Comments\": {\n \"one_value\": \"%d Comment\",\n \"other_value\": \"%d Comments\"\n },\n \"ChatTitle.ReportMessages\": \"Report Messages\",\n \"Chat.Send.WithoutSound\": \"Send Without Sound\",\n \"Chat.Send.SetReminder\": \"Set a Reminder\",\n \"Chat.Send.ScheduledMessage\": \"Schedule Message\",\n \"Chat.SendAs.PersonalAccount\": \"personal account\",\n \"Chat.UnpinAllMessagesConfirmation\": {\n \"one_value\": \"Do you want to unpin %d message in this chat?\",\n \"other_value\": \"Do you want to unpin all %d messages in this chat?\"\n },\n \"Chat.Message.Ad.Text\": \"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.\",\n \"Chat.Message.Ad.ReadMore\": \"Read More\",\n \"Chat.Message.ViewChannel\": \"VIEW CHANNEL\",\n \"Chat.Message.ViewBot\": \"VIEW BOT\",\n \"Chat.Message.ViewGroup\": \"VIEW GROUP\",\n \"Chat.Message.Sponsored.What\": \"What are sponsored messages?\",\n \"Chat.Message.Sponsored.Link\": \"https://promote.telegram.org\",\n \"ChatList.Context.Mute\": \"Mute\",\n \"ChatList.Context.Unmute\": \"Unmute\",\n \"ChatList.Context.Pin\": \"Pin\",\n \"ChatList.Context.Unpin\": \"Unpin\",\n \"ChatList.Context.DeleteChat\": \"Delete Chat\",\n \"ChatList.Context.DeleteAndExit\": \"Delete and Leave\",\n \"ChatList.Context.LeaveChannel\": \"Leave Channel\",\n \"ChatList.Context.LeaveGroup\": \"Leave Group\",\n \"ChatList.Service.Call.incoming\": \"Incoming Call (%@)\",\n \"ChatList.Service.Call.outgoing\": \"Outgoing Call (%@)\",\n \"ChatList.Service.VideoCall.incoming\": \"Incoming Video Call (%@)\",\n \"ChatList.Service.VideoCall.outgoing\": \"Outgoing Video Call (%@)\",\n \"ChatList.Service.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed Call\",\n \"ChatList.Service.VideoCall.Cancelled\": \"Cancelled Video Call\",\n \"ChatList.Service.VideoCall.Missed\": \"Missed Video Call\",\n \"ChatList.Service.VoiceChatScheduled.Channel\": \"Voice chat scheduled for %@\",\n \"ChatList.Filter.Header\": \"Create folders for different groups of chats and quickly switch between them.\",\n \"ChatList.Filter.NewTitle\": \"Create Folder\",\n \"ChatList.Filter.List.Title\": \"Chat Folders\",\n \"ChatList.Filter.Include.AddChat\": \"Add Chats\",\n \"ChatList.Filter.Exclude.AddChat\": \"Add Chats\",\n //\"ChatList.Filter.All\": \"All\",\n \"ChatList.Filter.Contacts\": \"Contacts\",\n \"ChatList.Filter.NonContacts\": \"Non-Contacts\",\n \"ChatList.Filter.Groups\": \"Groups\",\n \"ChatList.Filter.Channels\": \"Channels\",\n \"ChatList.Filter.Bots\": \"Bots\",\n \"ChatList.Filter.MutedChats\": \"Muted\",\n \"ChatList.Filter.ReadChats\": \"Read\",\n \"ChatList.Filter.Archive\": \"Archived\",\n \"ChatList.Filter.Include.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Exclude.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Confirm.Remove.Header\": \"Remove Folder\",\n \"ChatList.Filter.Confirm.Remove.Text\": \"Are you sure you want to remove this folder? Your chats will not be deleted.\",\n \"ChatList.Mute.1Hour\": \"For 1 Hour\",\n \"ChatList.Mute.4Hours\": \"For 4 Hours\",\n \"ChatList.Mute.8Hours\": \"For 8 Hours\",\n \"ChatList.Mute.1Day\": \"For 1 Day\",\n \"ChatList.Mute.3Days\": \"For 3 Days\",\n \"ChatList.Mute.Forever\": \"Forever\",\n \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"FileSize.B\": \"%@ B\",\n \"FileSize.KB\": \"%@ KB\",\n \"FileSize.MB\": \"%@ MB\",\n \"FileSize.GB\": \"%@ GB\",\n \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\n \"LastSeen.HoursAgo\": {\n \"one_value\": \"last seen %d hour ago\",\n \"other_value\": \"last seen %d hours ago\"\n },\n \"Login.Register.LastName.Placeholder\": \"Last Name\",\n \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"Modal.Send\": \"Send\",\n \"NewPoll.Anonymous\": \"Anonymous Voting\",\n \"NewPoll.Explanation.Placeholder\": \"Add a Comment (Optional)\",\n \"NewPoll.OptionsAddOption\": \"Add an Option\",\n \"NewPoll.MultipleChoice\": \"Multiple Answers\",\n \"NewPoll.Quiz\": \"Quiz Mode\",\n \"Notification.Contact.Reacted\": \"%1$@ to your \\\"%2$@\\\"\",\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \\\"%3$@\\\"\",\n \"Peer.Activity.User.PlayingGame\": \"playing a game\",\n \"Peer.Activity.User.TypingText\": \"typing\",\n \"Peer.Activity.User.SendingPhoto\": \"sending a photo\",\n \"Peer.Activity.User.RecordingVideo\": \"recording video\",\n \"Peer.Activity.User.SendingVideo\": \"sending a video\",\n \"Peer.Activity.User.RecordingAudio\": \"recording voice\",\n \"Peer.Activity.User.SendingFile\": \"sending file\",\n \"Peer.Activity.User.ChoosingSticker\": \"choosing a sticker\",\n \"Peer.Activity.User.EnjoyingAnimations\": \"watching %@\",\n \"Peer.Activity.Chat.PlayingGame\": \"%@ is playing a game\",\n \"Peer.Activity.Chat.TypingText\": \"%@ is typing\",\n \"Peer.Activity.Chat.SendingPhoto\": \"%@ is sending a photo\",\n \"Peer.Activity.Chat.RecordingVideo\": \"%@ is recording video\",\n \"Peer.Activity.Chat.SendingVideo\": \"%@ is sending a video\",\n \"Peer.Activity.Chat.RecordingAudio\": \"%@ is recording voice\",\n \"Peer.Activity.Chat.SendingFile\": \"%@ is sending a file\",\n \"Peer.Activity.Chat.ChoosingSticker\": \"%@ is choosing a sticker\",\n \"Peer.Activity.Chat.EnjoyingAnimations\": \"%@ is watching %@\",\n \"Peer.Activity.Chat.Multi.PlayingGame1\": \"%@ and %d others are playing a game\",\n \"Peer.Activity.Chat.Multi.TypingText1\": \"%@ and %d others are typing\",\n \"Peer.Activity.Chat.Multi.SendingPhoto1\": \"%@ and %d others are sending photos\",\n \"Peer.Activity.Chat.Multi.RecordingVideo1\": \"%@ and %d others are recording video\",\n \"Peer.Activity.Chat.Multi.SendingVideo1\": \"%@ and %d others are sending videos\",\n \"Peer.Activity.Chat.Multi.RecordingAudio1\": \"%@ and %d others are recording voice\",\n //\"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n \"Peer.Activity.Chat.Multi.SendingFile1\": \"%@ and %d others are sending files\",\n \"Peer.Activity.Chat.Multi.ChoosingSticker1\": \"%@ and %d others are choosing stickers\",\n \"Peer.ServiceNotifications\": \"service notifications\",\n \"Peer.RepliesNotifications\": \"Reply Notifications\",\n \"Peer.Status.justNow\": \"last seen just now\",\n \"Peer.Status.Today\": \"today\",\n \"Peer.Status.Yesterday\": \"yesterday\",\n \"Peer.Status.LastSeenAt\": \"last seen %@ at %@\",\n \"Peer.Status.minAgo\": {\n \"one_value\": \"last seen %d minute ago\",\n \"other_value\": \"last seen %d minutes ago\"\n },\n \"Peer.Status.Member\": {\n \"one_value\": \"%d member\",\n \"other_value\": \"%d members\"\n },\n \"Peer.Status.Subscribers\": {\n \"one_value\": \"%d subscriber\",\n \"other_value\": \"%d subscribers\"\n },\n \"PeerInfo.Administrators\": \"Administrators\",\n \"PeerInfo.DeleteChannel\": \"Delete Channel\",\n \"PeerInfo.Discussion\": \"Discussion\",\n \"PeerInfo.Discussion.Add\": \"Add\",\n \"PeerInfo.SignMessages\": \"Sign Messages\",\n \"PeerInfo.SharedMedia\": \"Shared Media\",\n \"PeerInfo.Subscribers\": \"Subscribers\",\n \"PeerInfo.DeleteContact\": \"Delete Contact\",\n //\"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n \"PeerInfo.Action.VoiceChat\": \"Video Chat\",\n \"PeerInfo.Action.LiveStream\": \"Live Stream\",\n \"PeerMedia.Members\": \"Members\",\n \"PollResults.Title.Poll\": \"Poll Results\",\n \"PollResults.Title.Quiz\": \"Quiz Results\",\n \"PollResults.LoadMore\": {\n \"other_value\": \"Show More (%d)\"\n },\n //\"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n \"Preview.Dragging.AddItems\": {\n \"one_value\": \"Add Item\",\n \"other_value\": \"Add Items\"\n },\n \"PreviewSender.CaptionPlaceholder\": \"Add a caption...\",\n \"PreviewSender.CompressFile\": \"Send compressed\",\n \"PreviewSender.SendFile\": {\n \"one_value\": \"Send File\",\n \"other_value\": \"Send %d Files\"\n },\n \"PreviewSender.SendPhoto\": {\n \"one_value\": \"Send Photo\",\n \"other_value\": \"Send %d Photos\"\n },\n \"PreviewSender.SendVideo\": {\n \"one_value\": \"Send Video\",\n \"other_value\": \"Send %d Videos\"\n },\n \"PrivacyAndSecurity.Item.On\": \"On\",\n \"PrivacyAndSecurity.Item.Off\": \"Off\",\n \"PrivacyAndSecurity.SensitiveText\": \"Disable filtering\",\n \"PrivacyAndSecurity.SensitiveDesc\": \"Display sensitive media in public channels on all your Telegram devices.\",\n \"PrivacySettings.VoiceCalls\": \"Calls\",\n \"PrivacySettings.Forwards\": \"Forwarded Messages\",\n \"PrivacySettings.Groups\": \"Groups and Channels\",\n \"PrivacySettingsController.AddUsers\": \"Add Users\",\n \"PrivacySettingsController.GroupDescription\": \"You can restrict who can add you to groups and channels with granular precision.\",\n \"PrivacySettingsController.Forwards.CustomHelp\": \"You can restrict who can add a link to your account when forwarding your messages.\",\n \"PrivacySettingsController.P2p.Desc\": \"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.\",\n \"PrivacySettingsController.PhoneCallDescription\": \"You can restrict who can call you with granular precision.\",\n \"PrivacySettingsController.ProfilePhoto.CustomHelp\": \"You can restrict who can see your profile photo with granular precision.\",\n \"PrivacySettingsController.LastSeenDescription\": \"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).\",\n \"PrivacySettingsController.PeerInfo\": \"You can add users or entire groups as exceptions that will override the settings above.\",\n \"PrivacySettingsController.Everbody\": \"Everybody\",\n \"PrivacySettingsController.MyContacts\": \"My Contacts\",\n \"PrivacySettingsController.Nobody\": \"Nobody\",\n \"PrivacySettingsController.NeverShare\": \"Never Share With\",\n \"PrivacySettingsController.AlwaysShare\": \"Always Share With\",\n \"PrivacySettingsController.NeverAllow\": \"Never Allow\",\n \"PrivacySettingsController.AlwaysAllow\": \"Always Allow\",\n \"PrivacySettingsController.UserCount\": {\n \"one_value\": \"%d user\",\n \"other_value\": \"%d users\"\n },\n \"RecentSessions.Error.FreshReset\": \"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.\",\n \"RequestJoin.Button\": \"Request to Join\",\n \"Stickers.SearchAdd\": \"Add\",\n \"Stickers.SearchAdded\": \"Added\",\n \"Stickers.SuggestStickers\": \"Suggest Stickers by Emoji\",\n \"ShareModal.Search.Placeholder\": \"Share to...\",\n \"ShareModal.Search.ForwardPlaceholder\": \"Forward to...\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\n \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"Search.Confirm.ClearHistory\": \"Are you sure you want to clear your search history?\",\n \"Separator.ShowMore\": \"show more\",\n \"Separator.ShowLess\": \"show less\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"StickerSet.DontExist\": \"Sorry, this sticker set doesn't seem to exist.\",\n \"Text.Context.Copy.Username\": \"Copy Username\",\n \"Text.Context.Copy.Hashtag\": \"Copy Hashtag\",\n \"Time.TomorrowAt\": \"tomorrow at %@\",\n \"TwoStepAuth.SetPasswordHelp\": \"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepAuth.GenericHelp\": \"You have enabled Two-Step verification.\\nYou'll need the password you set up here to log in to your Telegram account.\",\n \"TwoStepAuth.ChangePassword\": \"Change Password\",\n \"TwoStepAuth.RemovePassword\": \"Turn Password Off\",\n \"TwoStepAuth.SetupEmail\": \"Set Recovery Email\",\n \"TwoStepAuth.ChangeEmail\": \"Change Recovery Email\",\n \"TwoStepAuth.ConfirmEmailCodeDesc\": \"Please enter the code we've just emailed to %@.\",\n \"TwoStepAuth.RecoveryTitle\": \"Email Code\",\n \"TwoStepAuth.RecoveryCode\": \"Code\",\n \"TwoStepAuth.RecoveryCodeInvalid\": \"Invalid code. Please try again.\",\n \"TwoStepAuth.RecoveryCodeExpired\": \"Code Expired\",\n \"TwoStepAuth.SetupHintTitle\": \"Password Hint\",\n \"TwoStepAuth.SetupHintPlaceholder\": \"Hint\",\n \"UsernameSettings.ChangeDescription\": \"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\",\n \"VoiceChat.Chat.StartNew\": \"Video chat ended. Start a new one?\",\n \"VoiceChat.Chat.StartNew.OK\": \"Start\",\n \"VoiceChat.Chat.Ended\": \"Video chat ended.\",\n \"VoiceChat.Invite.InviteMembers\": \"Invite members\",\n \"VoiceChat.Status.Connecting\": \"Connecting...\",\n \"VoiceChat.Status.Members\": {\n \"one_value\": \"%d participant\",\n \"other_value\": \"%d participants\"\n },\n \"VoiceChat.Status.MutedForYou\": \"muted for you\",\n \"VoiceChat.Status.Speaking\": \"speaking\",\n \"VoiceChat.Status.Listening\": \"listening\",\n \"VoiceChat.Status.WantsSpeak\": \"wants to speak\",\n \"VoiceChat.Status.Muted\": \"muted\",\n \"VoiceChat.Status.You\": \"This is you\",\n \"VoiceChat.Video.Stream.Video\": \"video\",\n \"VoiceChat.Video.Stream.Screencast\": \"screen\",\n \"VoiceChat.Video.Stream.More\": \"more\",\n \"VoiceChat.Leave\": \"Leave\",\n \"VoiceChat.End.Title\": \"Leave video chat\",\n \"VoiceChat.End.Text\": \"Are you sure you want to leave this video chat?\",\n \"VoiceChat.End.Third\": \"End Video Chat\",\n \"VoiceChat.End.OK\": \"Leave\",\n \"VoiceChat.MutePeer\": \"Mute\",\n \"VoiceChat.UnmutePeer\": \"Allow To Speak\",\n \"VoiceChat.RemovePeer\": \"Remove\",\n \"VoiceChat.OpenProfile\": \"Open Profile\",\n \"VoiceChat.MuteForMe\": \"Mute For Me\",\n \"VoiceChat.UnmuteForMe\": \"Unmute For Me\",\n \"VoiceChat.RemovePeer.Confirm.Channel\": \"Do you want to remove %1$@ from the channel?\",\n \"VoiceChat.RemovePeer.Confirm\": \"Are you sure you want to remove %1$@ from the group?\",\n \"VoiceChat.RemovePeer.Confirm.OK\": \"Remove\"\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/106.074bf17aad93c3a097a5.chunk.js b/public/106.074bf17aad93c3a097a5.chunk.js new file mode 100644 index 000000000..f7f87bc2b --- /dev/null +++ b/public/106.074bf17aad93c3a097a5.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[106,810,392,53],{4489:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(503);class i extends a.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const a=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(a);const i=this.value.length;if(i===e.length)e.onFill(this.value);else if(i===n)return;n=i}))}}},3083:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(2384);class i{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([a.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),a.Z.waitForFirstFrame(e)))),a.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),a.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4755),i=n(4874),s=n(810),o=n(3083),r=n(4489),l=n(2325),d=n(144),c=n(5565),u=n(3512);let h,p=null,m=null,g=null;const v=new i.Z("page-authCode",!0,(()=>{const e=p.type.length,t=new r.Z({label:"Code",name:(0,d.a)(),length:e,onFill:e=>{m(e)}});h=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container),v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return s.default.mount()}));const i=()=>{setTimeout((()=>{f.remove()}),300)},m=e=>{h.setAttribute("disabled","true");const a={phone_number:p.phone_number,phone_code_hash:p.phone_code_hash,phone_code:e};u.Z.managers.apiManager.invokeApi("auth.signIn",a,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":u.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),i();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(813)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:p.phone_number,phone_code_hash:p.phone_code_hash})})),i()}})).catch((e=>{return a=void 0,i=void 0,o=function*(){let a=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":a=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{h.value=""}),300);break;case"PHONE_CODE_EXPIRED":h.classList.add("error"),(0,c.Z)(t.label,(0,l.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":h.classList.add("error"),(0,c.Z)(t.label,(0,l.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}a||t.select(),h.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(n,r)}l((o=o.apply(a,i||[])).next())}));var a,i,s,o}))},g=v.pageEl.querySelector(".auth-image"),y=a.Z.isMobile?100:166,f=new o.Z(t,y);return g.append(f.container),f.load()}),(e=>{if(p=e,m){h.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),h.dispatchEvent(e)}else m=v.pageEl.getElementsByClassName("phone")[0],g=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(m.innerText=p.phone_number,p.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[p.type._]}(0,c.Z)(g,(0,l.ag)(t,n)),u.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{h.focus()})),y=v},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>z});var a=n(279),i=n(8805),s=n(4874),o=n(503),r=n(9807),l=n(4494),d=n(4789),c=n(5432),u=n(4159),h=n(2325),p=n(2384),m=n(1405),g=n(4668),v=n(8497),y=n(144),f=n(9709),E=n(9638),b=n(3910),Z=n(2738),_=n(5565),L=n(1656),w=n(7487),S=n(2398),k=n(671),A=n(6669),C=n(7922),T=n(3512),x=n(709),P=n(9976),F=n(130),N=n(8115),M=n(3789);let D,I=null;const O=new s.Z("page-sign",!0,(()=>{const e=()=>{t=h.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let t;e(),T.Z.addEventListener("language_change",(()=>{e()}));const s=new Map;let m,z;const q=document.createElement("div");q.classList.add("input-wrapper");const H=new o.Z({label:"Login.CountrySelectorLabel",name:(0,y.a)()});H.container.classList.add("input-select");const R=H.input,V=document.createElement("div");V.classList.add("select-wrapper","z-depth-3","hide");const B=document.createElement("span");B.classList.add("arrow","arrow-down"),H.container.append(B);const U=document.createElement("ul");V.appendChild(U),new i.ZP(V);let W=()=>{W=null,t.forEach((e=>{const t=(0,k.Ml)(e.iso2),n=[];e.country_codes.forEach((a=>{const i=document.createElement("li");let s=(0,N.Z)(t);if(P.Z){const e=document.createElement("span");(0,F.Z)(e,s),i.append(e)}else(0,F.Z)(i,s);const o=(0,h.ag)(e.default_name);o.dataset.defaultName=e.default_name,i.append(o);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+a.country_code,i.appendChild(r),n.push(i),U.append(i)})),s.set(e.iso2,n)})),U.addEventListener("mousedown",(e=>{if(0!==e.button)return;const t=(0,g.Z)(e.target,"LI");j(t)})),H.container.appendChild(V)};const j=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,i=a.replace(/\D/g,"");(0,_.Z)(R,(0,h.ag)(n)),(0,A.Z)(R,"input"),m=t.find((e=>e.default_name===n)),z=m.country_codes.find((e=>e.country_code===i)),Y.value=Y.lastValue=a,Q(),setTimeout((()=>{G.focus(),(0,S.Z)(G,!0)}),0)};let $;W(),R.addEventListener("focus",(function(e){W?W():t.forEach((e=>{s.get(e.iso2).forEach((e=>e.style.display=""))})),clearTimeout($),$=void 0,V.classList.remove("hide"),V.offsetWidth,V.classList.add("active"),H.select(),(0,d.Z)({container:O.pageEl.parentElement.parentElement,element:R,position:"start",margin:4}),setTimeout((()=>{K||(document.addEventListener("mousedown",X,{capture:!0}),K=!0)}),0)}));let K=!1;const X=e=>{(0,v.Z)(e.target,"input-select")||e.target!==R&&(Q(),document.removeEventListener("mousedown",X,{capture:!0}),K=!1)},Q=()=>{void 0===$&&(V.classList.remove("active"),$=window.setTimeout((()=>{V.classList.add("hide"),$=void 0}),200))};R.addEventListener("keyup",(e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=H.value.toLowerCase(),i=[];t.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const n=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");n.length>1&&t.push(n)}));let n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(a)));s.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&i.push(e)})),0===i.length?t.forEach((e=>{s.get(e.iso2).forEach((e=>e.style.display=""))})):1===i.length&&"Enter"===n&&j(s.get(i[0].iso2)[0])})),B.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),R.matches(":focus")?R.blur():R.focus()}));const Y=new x.Z({onInput:e=>{p.Z.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===H.value||m&&t&&n&&(m===t||z.country_code===n.country_code)||((0,_.Z)(R,t?(0,h.ag)(t.default_name):a),m=t,z=n),t||Y.value.length-1>1?I.style.visibility="":I.style.visibility="hidden"}}),G=Y.input;G.addEventListener("keypress",(e=>{if(!I.style.visibility&&"Enter"===e.key)return ee()}));const J=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});J.input.addEventListener("change",(()=>{const e=J.checked;T.Z.managers.appStateManager.pushToState("keepSigned",e),M.Z.toggleStorages(e,!0)})),M.Z.getState().then((e=>{C.Z.isAvailable()?J.checked=e.keepSigned:(J.checked=!1,J.label.classList.add("checkbox-disabled"))})),I=(0,l.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),I.style.visibility="hidden";const ee=e=>{e&&(0,b.Z)(e);const t=(0,L.Z)([I,D],!0);(0,_.Z)(I,(0,h.ag)("PleaseWait")),(0,a.y)(I);let i=Y.value;T.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:u.Z.id,api_hash:u.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(Y.setError(),(0,_.Z)(Y.label,(0,h.ag)("Login.PhoneLabelInvalid")),G.classList.add("error"),(0,_.Z)(I,(0,h.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),I.innerText=e.type)}))};(0,Z.fc)(I,ee),D=(0,l.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),D.addEventListener("click",(()=>{f.default.mount()})),q.append(H.container,Y.container,J.label,I,D);const te=document.createElement("h4");te.classList.add("text-center"),(0,h.$d)(te,"Login.Title");const ne=document.createElement("div");ne.classList.add("subtitle","text-center"),(0,h.$d)(ne,"Login.StartText"),O.pageEl.querySelector(".container").append(te,ne,q),c.Z||setTimeout((()=>{G.focus()}),0),(0,E.Z)(q),T.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=C.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&h.ZP.getLangPack(n.lang_code).then((()=>{(0,A.Z)(G,"input")}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=T.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(s||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,s=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield w.Z.get(a))return t();setTimeout((()=>{T.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{l(s.next(e))}catch(e){t(e)}}function r(e){try{l(s.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,r)}l((s=s.apply(n,a||[])).next())}));var n,a,i,s};t()})),e})).then((e=>{H.value.length||Y.value.length||j(s.get(e.country)[0])}))}),(()=>{I&&((0,_.Z)(I,(0,h.ag)("Login.Next")),(0,m.Z)(I,void 0,void 0,!0),I.removeAttribute("disabled")),D&&D.removeAttribute("disabled"),T.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),z=O}}]); +//# sourceMappingURL=106.074bf17aad93c3a097a5.chunk.js.map \ No newline at end of file diff --git a/public/106.074bf17aad93c3a097a5.chunk.js.map b/public/106.074bf17aad93c3a097a5.chunk.js.map new file mode 100644 index 000000000..342aaf940 --- /dev/null +++ b/public/106.074bf17aad93c3a097a5.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"106.074bf17aad93c3a097a5.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/pages/pageAuthCode.ts","webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/putPreloader\";\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter((country) => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n setInnerHTML(spanEmoji, wrapped);\r\n li.append(spanEmoji);\r\n } else {\r\n setInnerHTML(li, wrapped);\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find((c) => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach((li) => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach((name) => {\r\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach((li) => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach((li) => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","Promise","all","loop","autoplay","width","height","then","_animation","currentFrame","pause","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus","btnQr","btnNext","setCountries","countries","country","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","spanEmoji","el","dataset","defaultName","span","country_code","push","set","button","target","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","lastValue","hidePicker","telEl","hideTimeout","get","clearTimeout","undefined","offsetWidth","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","window","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","str","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","state","toggle","api_id","api_hash","settings","Object","assign","setError","console","error","h4","subtitle","nearestDcResult","langPack","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally"],"sourceRoot":""} \ No newline at end of file diff --git a/public/11.b9f918fab02af4357c63.chunk.js b/public/11.b9f918fab02af4357c63.chunk.js deleted file mode 100644 index 7663d33c5..000000000 --- a/public/11.b9f918fab02af4357c63.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[11,12,15],{105:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(31);function s(t){return Array.from(t.childNodes).map(t=>3===t.nodeType?Object(n.a)(t.textContent):t.outerHTML).join("")}},106:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},107:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return a}));const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,o,r,l,c={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),l&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:e.length}))}}return void(c.offset+=e.length)}if(1!==t.nodeType)return;const u=o===t,d=s.has(t.tagName);if(d&&i.length)e.push(i.join("")),i.splice(0,i.length),++c.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),c.offset+=e.length)}u&&!r&&i.push("");const h=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,i,o,r,l,c),m=m.nextSibling;if(u&&r&&i.push(""),h&&t.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let t=p,e=l.length;t{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},109:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return"string"==typeof t?e.innerHTML=t:e.append(t),e}i.d(e,"a",(function(){return n}))},117:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(96);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},122:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(71);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},142:function(t,e,i){"use strict";i.r(e);var n=i(61),s=i(62),a=i(35),o=i(94),r=i(90),l=i(58),c=i(108),u=i(122),d=i(28),h=i(7),p=i(97),m=i(27),g=i(57),b=i(109),f=i(59),v=i(77);let y;const w=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.c.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let w;y=r.input,t.inputWrapper.append(r.container,e);let E,L=()=>(w||(w=window.setInterval(L,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(f.a)(r.label,Object(b.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const k=t=>{if(t&&Object(m.a)(t),!y.value.length)return void y.classList.add("error");const s=Object(v.a)([y,e],!0);let l=y.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.setValueSilently(""+Math.random()),r.setValueSilently(l),o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(w),i.e(3).then(i.bind(null,110)).then(t=>{t.default.mount()}),T&&T.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),y.select(),c.remove(),L()})};Object(g.b)(e,k),y.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return k()}));const S=s.b.isMobile?100:166,T=new u.a(r,S);return t.imageDiv.append(T.container),Promise.all([T.load(),L()])},null,()=>{y.focus(),a.c.pushToState("authState",{_:"authStatePassword"})});e.default=w},59:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},65:function(t,e,i){"use strict";i.d(e,"a",(function(){return p}));var n=i(114),s=i(105),a=i(106),o=i(96),r=i(117);var l=i(66),c=i(7),u=i(28),d=i(74);let h=()=>{document.addEventListener("paste",t=>{if(!Object(a.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),r=!0,l=(t.originalEvent||t).clipboardData.getData("text/html");if(l.trim()){l=l.replace(//,""),l=l.replace(//,"");const t=l.match(/([\s\S]*)<\/body>/);t&&(l=t[1].trim());let s=document.createElement("span");s.innerHTML=l;let a=s.firstChild;for(;a;){let t=a.nextSibling;3===a.nodeType&&(a.nodeValue.trim()||a.remove()),a=t}const c=Object(o.a)(s,!0);if(c.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=c.value,i=c.entities,r=!1;let t=u.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),u.b.mergeEntities(i,t)}}r&&(e=n,i=u.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._));const c=u.b.wrapDraftText(e,{entities:i});e=Object(s.a)(c),window.document.execCommand("insertHTML",!1,e)}),h=null};var p;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(p||(p={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:a,canBeEdited:l=!0}=t;let u,d,p=t.label||t.labelText;if(a)this.container.innerHTML=`\n \n `,u=this.container.firstElementChild;else{h&&h(),this.container.innerHTML=`\n
\n `,u=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});u.addEventListener("input",()=>{Object(r.a)(u)&&(u.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=u.innerHTML,this.onFakeInput())}),e.observe(u,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(u.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=u.className+" input-field-input-fake")}if(u.setAttribute("dir","auto"),e&&(Object(c.b)(u,e,void 0,"placeholder"),this.inputFake&&Object(c.b)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=u.classList.contains("error"),r=a?u.value.length:[...Object(o.a)(u,!1).value].length,l=i-r,c=l<0;u.classList.toggle("error",c),c||l<=n?(this.setLabel(),t.append(` (${i-r})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},u.addEventListener("input",d)}this.input=u}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?Object(l.a)(this.label,this.options.labelText):this.label.append(Object(c.d)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(d.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(o.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(r.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=Object(s.a)(u.b.wrapDraftText(t))),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(c.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&p.Error)),this.input.classList.toggle("valid",!!(t&p.Valid))}setError(t){this.setState(p.Error,t)}}},66:function(t,e,i){"use strict";function n(t,e){t.setAttribute("dir","auto"),"string"==typeof e?e?t.innerHTML=e:t.textContent="":(t.textContent="",t.append(e))}i.d(e,"a",(function(){return n}))},74:function(t,e,i){"use strict";var n=i(0);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.a.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.a.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},77:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},94:function(t,e,i){"use strict";var n=i(1),s=i(8);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return function(t){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");crypto.getRandomValues(t)}(r),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a;e.a=a},96:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(28),a=i(107);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}n.a.getRichValue=o},97:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(7);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.d)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.d)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=11.b9f918fab02af4357c63.chunk.js.map \ No newline at end of file diff --git a/public/11.b9f918fab02af4357c63.chunk.js.map b/public/11.b9f918fab02af4357c63.chunk.js.map deleted file mode 100644 index 1b1fc2953..000000000 --- a/public/11.b9f918fab02af4357c63.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/documentFragmentToHTML.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/array/randomize.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/pages/loginPage.ts"],"names":["documentFragmentToHTML","fragment","Array","from","childNodes","map","node","nodeType","textContent","outerHTML","join","findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","entities","offset","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","curChild","firstChild","nextSibling","undefined","i","wasLength","PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","prepend","insertBefore","cloneNode","container","append","addEventListener","htmlToSpan","html","span","innerHTML","isInputEmpty","element","hasAttribute","value","trim","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","label","getStateInterval","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","update","preloader","setValueSilently","Math","random","check","response","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","lastChild","replaceWith","init","target","text","preventDefault","originalEvent","clipboardData","getData","usePlainText","replace","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","transitionDuration","log","abs","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","timeout","raf","clearTimeout","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","setTimeout","toggleDisability","elements","disable","forEach","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","arr","crypto","getRandomValues","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","field","withEntities","combineSameEntities","sortEntities","LoginPage","body","querySelector","title","subtitle"],"mappings":"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","file":"11.b9f918fab02af4357c63.chunk.js","sourcesContent":["import encodeEntities from \"../string/encodeEntities\";\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport documentFragmentToHTML from \"../helpers/dom/documentFragmentToHTML\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n const fragment = RichTextProcessor.wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(RichTextProcessor.wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\nimport randomize from '../../helpers/array/randomize';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/12.b4eb3274ce5b3c321958.chunk.js b/public/12.b4eb3274ce5b3c321958.chunk.js deleted file mode 100644 index 908aea14f..000000000 --- a/public/12.b4eb3274ce5b3c321958.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[12,11,15],{105:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(31);function s(t){return Array.from(t.childNodes).map(t=>3===t.nodeType?Object(n.a)(t.textContent):t.outerHTML).join("")}},106:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},107:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return a}));const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,o,r,l,c={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),l&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:e.length}))}}return void(c.offset+=e.length)}if(1!==t.nodeType)return;const u=o===t,d=s.has(t.tagName);if(d&&i.length)e.push(i.join("")),i.splice(0,i.length),++c.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),c.offset+=e.length)}u&&!r&&i.push("");const h=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,i,o,r,l,c),m=m.nextSibling;if(u&&r&&i.push(""),h&&t.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let t=p,e=l.length;t{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},109:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return"string"==typeof t?e.innerHTML=t:e.append(t),e}i.d(e,"a",(function(){return n}))},117:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(96);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},122:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(71);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},142:function(t,e,i){"use strict";i.r(e);var n=i(61),s=i(62),a=i(35),o=i(94),r=i(90),l=i(58),c=i(108),u=i(122),d=i(28),h=i(7),p=i(97),m=i(27),g=i(57),b=i(109),f=i(59),v=i(77);let y;const w=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.c.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let w;y=r.input,t.inputWrapper.append(r.container,e);let E,L=()=>(w||(w=window.setInterval(L,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(f.a)(r.label,Object(b.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const k=t=>{if(t&&Object(m.a)(t),!y.value.length)return void y.classList.add("error");const s=Object(v.a)([y,e],!0);let l=y.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.setValueSilently(""+Math.random()),r.setValueSilently(l),o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(w),i.e(3).then(i.bind(null,110)).then(t=>{t.default.mount()}),T&&T.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),y.select(),c.remove(),L()})};Object(g.b)(e,k),y.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return k()}));const S=s.b.isMobile?100:166,T=new u.a(r,S);return t.imageDiv.append(T.container),Promise.all([T.load(),L()])},null,()=>{y.focus(),a.c.pushToState("authState",{_:"authStatePassword"})});e.default=w},59:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},65:function(t,e,i){"use strict";i.d(e,"a",(function(){return p}));var n=i(114),s=i(105),a=i(106),o=i(96),r=i(117);var l=i(66),c=i(7),u=i(28),d=i(74);let h=()=>{document.addEventListener("paste",t=>{if(!Object(a.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),r=!0,l=(t.originalEvent||t).clipboardData.getData("text/html");if(l.trim()){l=l.replace(//,""),l=l.replace(//,"");const t=l.match(/([\s\S]*)<\/body>/);t&&(l=t[1].trim());let s=document.createElement("span");s.innerHTML=l;let a=s.firstChild;for(;a;){let t=a.nextSibling;3===a.nodeType&&(a.nodeValue.trim()||a.remove()),a=t}const c=Object(o.a)(s,!0);if(c.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=c.value,i=c.entities,r=!1;let t=u.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),u.b.mergeEntities(i,t)}}r&&(e=n,i=u.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._));const c=u.b.wrapDraftText(e,{entities:i});e=Object(s.a)(c),window.document.execCommand("insertHTML",!1,e)}),h=null};var p;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(p||(p={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:a,canBeEdited:l=!0}=t;let u,d,p=t.label||t.labelText;if(a)this.container.innerHTML=`\n \n `,u=this.container.firstElementChild;else{h&&h(),this.container.innerHTML=`\n
\n `,u=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});u.addEventListener("input",()=>{Object(r.a)(u)&&(u.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=u.innerHTML,this.onFakeInput())}),e.observe(u,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(u.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=u.className+" input-field-input-fake")}if(u.setAttribute("dir","auto"),e&&(Object(c.b)(u,e,void 0,"placeholder"),this.inputFake&&Object(c.b)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=u.classList.contains("error"),r=a?u.value.length:[...Object(o.a)(u,!1).value].length,l=i-r,c=l<0;u.classList.toggle("error",c),c||l<=n?(this.setLabel(),t.append(` (${i-r})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},u.addEventListener("input",d)}this.input=u}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?Object(l.a)(this.label,this.options.labelText):this.label.append(Object(c.d)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(d.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(o.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(r.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=Object(s.a)(u.b.wrapDraftText(t))),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(c.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&p.Error)),this.input.classList.toggle("valid",!!(t&p.Valid))}setError(t){this.setState(p.Error,t)}}},66:function(t,e,i){"use strict";function n(t,e){t.setAttribute("dir","auto"),"string"==typeof e?e?t.innerHTML=e:t.textContent="":(t.textContent="",t.append(e))}i.d(e,"a",(function(){return n}))},74:function(t,e,i){"use strict";var n=i(0);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.a.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.a.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},77:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},94:function(t,e,i){"use strict";var n=i(1),s=i(8);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return function(t){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");crypto.getRandomValues(t)}(r),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a;e.a=a},96:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(28),a=i(107);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}n.a.getRichValue=o},97:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(7);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.d)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.d)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=12.b4eb3274ce5b3c321958.chunk.js.map \ No newline at end of file diff --git a/public/12.b4eb3274ce5b3c321958.chunk.js.map b/public/12.b4eb3274ce5b3c321958.chunk.js.map deleted file mode 100644 index 6429ed526..000000000 --- a/public/12.b4eb3274ce5b3c321958.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/documentFragmentToHTML.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/array/randomize.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/pages/loginPage.ts"],"names":["documentFragmentToHTML","fragment","Array","from","childNodes","map","node","nodeType","textContent","outerHTML","join","findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","entities","offset","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","curChild","firstChild","nextSibling","undefined","i","wasLength","PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","prepend","insertBefore","cloneNode","container","append","addEventListener","htmlToSpan","html","span","innerHTML","isInputEmpty","element","hasAttribute","value","trim","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","label","getStateInterval","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","update","preloader","setValueSilently","Math","random","check","response","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","lastChild","replaceWith","init","target","text","preventDefault","originalEvent","clipboardData","getData","usePlainText","replace","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","transitionDuration","log","abs","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","timeout","raf","clearTimeout","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","setTimeout","toggleDisability","elements","disable","forEach","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","arr","crypto","getRandomValues","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","field","withEntities","combineSameEntities","sortEntities","LoginPage","body","querySelector","title","subtitle"],"mappings":"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","file":"12.b4eb3274ce5b3c321958.chunk.js","sourcesContent":["import encodeEntities from \"../string/encodeEntities\";\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport documentFragmentToHTML from \"../helpers/dom/documentFragmentToHTML\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n const fragment = RichTextProcessor.wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(RichTextProcessor.wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\nimport randomize from '../../helpers/array/randomize';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/13.f5538912196e125de757.chunk.js b/public/13.f5538912196e125de757.chunk.js deleted file mode 100644 index 3f75ca867..000000000 --- a/public/13.f5538912196e125de757.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[13],{108:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(27),n=s(65);class a extends n.b{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{Object(i.a)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const s=document.createElement("input");s.classList.add("stealthy"),s.tabIndex=-1,s.type="password",t.parentElement.prepend(s),t.parentElement.insertBefore(s.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},119:function(e,t,s){"use strict";function i(e,t){const s=e.length;if(s!==t.length)return!1;for(let i=0;i(this.animation=e,this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},i.a.waitForFirstFrame(e)))}remove(){this.animation&&this.animation.remove()}}},131:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(71);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const s=e.input;s.addEventListener("blur",()=>{this.playAnimation(0)}),s.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const s=this.needFrame>t?-1:1;this.animation.setDirection(s),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},132:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(65);class n extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let s=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===s)return;s=n})}}},154:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(120),n=s(121),a=s(2),o=s(65);class r extends o.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let s;a.b?s=-.16*e:a.a&&(s=0),t.style.setProperty("--letter-spacing",s+"px")}const s=this.setValueSilently.bind(this);this.setValueSilently=e=>{s(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const s=this.value;let i;Math.abs(s.length-this.lastValue.length)>1&&!this.pasted&&a.c&&this.setValueSilently(this.lastValue+s),this.pasted=!1,this.setLabel();let o,r,l,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(n.a)(this.value),o=i.formatted,r=i.country,c=i.leftPattern,l=i.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=c,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},184:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return Oc}));var i=s(64),n=s(75),a=s(0),o=s(63),r=s(72),l=s(57),c=s(27),d=s(127),h=s(178),p=s(191);const u=[...h.a].concat([...p.a]);var g=new Set(u),m=s(66),b=s(62),v=s(98),f=s(78);function y(e){Object(f.a)(e.history,(t,s,i)=>{t.action.photo||(i.splice(s,1),void 0!==e.count&&--e.count)})}var w=s(18);class S{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,Object(w.a)(this,e)}setTargets(e,t,s){this.previous=e,this.next=t,this.reverse=s}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,e),this.setLoaded(!1,e)}go(e,t=!0){let s,i;if(e>0){if(s=this.next.splice(0,e),i=s.pop(),!i)return;void 0!==this.current&&s.unshift(this.current),this.previous.push(...s)}else{if(s=this.previous.splice(Math.max(0,this.previous.length+e),-e),i=s.shift(),!i)return;void 0!==this.current&&s.push(this.current),this.next.unshift(...s)}return this.next.length0),this.current}unsetCurrent(e){e?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(e,t){const s=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),i=this.go(e,!s&&t);return{item:s?void 0:i,leftLength:s}}setLoaded(e,t){return(e?this.loadedAllDown:this.loadedAllUp)!==t&&(e?this.loadedAllDown=t:this.loadedAllUp=t,t||(e?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(e){if(e?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let t,s=e?this.loadPromiseDown:this.loadPromiseUp;return s||(t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=t||(t=this.current),s=this.loadMore(t,e,this.loadCount).then(t=>{if((e?this.loadPromiseDown:this.loadPromiseUp)!==s)return;t.items.length{const s=this.processItem?this.processItem(t):t;s&&(e?this.reverse?this.previous.unshift(s):this.next.push(s):this.reverse?this.next.push(s):this.previous.unshift(s))}),this.onLoadedMore&&this.onLoadedMore()},()=>{}).then(()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null}),e?this.loadPromiseDown=s:this.loadPromiseUp=s,s)}}class C extends S{constructor(e={}){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{const n=t?0:s;let a=null==e?void 0:e.mid;return void 0===a&&(a=this.searchContext.maxId),t||(a=v.a.incrementMessageId(a,1)),i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:a,limit:n?0:s,backLimit:n})).then(e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&y(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history}))},processItem:t=>{if(this.filterMids([t.mid]).length)return e.processItem(t)}})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const s=s=>s.peerId===e&&t.has(s.mid),i=(e,t,i)=>{s(e)&&i.splice(t,1)};Object(f.a)(this.previous,i),Object(f.a)(this.next,i),this.current&&s(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>{if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const t=e[this.searchContext.peerId];if(!t)return;const s=Array.from(t).sort((e,t)=>e-t),i=this.filterMids(s).map(e=>this.processItem(e)).filter(Boolean);i.length&&(this.current?this.next.push(...i):this.previous.push(...i))},this.onMessageSent=({message:e})=>{this.onHistoryMultiappend({[e.peerId]:new Set([e.mid])})},a.a.addEventListener("history_delete",this.onHistoryDelete),a.a.addEventListener("history_multiappend",this.onHistoryMultiappend),a.a.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new C(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){const t=this.searchContext.isScheduled?i.a.getScheduledMessagesStorage(this.searchContext.peerId):i.a.getMessagesStorage(this.searchContext.peerId);return i.a.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,e,t,e.length)}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(e)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(){let e=this.previous;return this.otherSideLoader&&(e=e.concat(this.otherSideLoader.previous)),e}getNext(){let e=this.next;return this.otherSideLoader&&(e=e.concat(this.otherSideLoader.next)),e}getCurrent(){var e;return this.current||(null===(e=this.otherSideLoader)||void 0===e?void 0:e.current)}goToOtherEnd(e){return e>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(e,t){var s;let i;if(null===(s=this.otherSideLoader)||void 0===s?void 0:s.current){if(i=this.otherSideLoader.goUnsafe(e,t),i.item)return i.item;if(!((e=i.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(e>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(e>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||e<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(e);this.otherSideLoader.unsetCurrent(e>0)}}if(i=this.goUnsafe(e,t),!i.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=i.leftLength,i=this.otherSideLoader.goUnsafe(e,t),i.item&&this.unsetCurrent(e>0))}return null==i?void 0:i.item}setLoaded(e,t){var s;const i=super.setLoaded(e,t);if(i&&this.otherSideLoader&&t&&!1!==(null===(s=this.searchContext)||void 0===s?void 0:s.useSearch)){const e=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:e?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(e,!0),this.otherSideLoader.load(!e)}return i}cleanup(){this.reset(),a.a.removeEventListener("history_delete",this.onHistoryDelete),a.a.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.a.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}var L=s(84),I=s(82),M=s(35),E=s(60),P=s(67),k=s(59),T=s(7);class x{constructor(e,t,s=!0,i,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=s,this.autonomous=a,this.onFound=o,this.list=_c.createChatList(),this.container=document.createElement("div"),i&&(this.container.className=i),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append(Object(T.d)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&_c.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class A{constructor(e,t,s,i){this.container=e,this.searchInput=t,this.searchGroups=s,this.onSearch=i,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new P.b(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout(()=>{this.searchMore(),this.searchTimeout=0},0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,s=""){this.peerId=e,this.threadId=t,this.query!==s&&(this.searchInput.inputField.value=s),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=i.a.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then(t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:s,history:i}=t;i.length&&i[0].mid===this.minMsgId&&i.shift();const n=this.searchGroups.messages;i.forEach(t=>{try{const s=this.peerId?t.fromId:t.peerId;_c.addDialogAndSetLastMessage({peerId:s,container:this.scrollable,drawStatus:!1,avatarSize:54,meAsSaved:!1,message:t,query:e})}catch(e){console.error("[appSearch] render search result",e)}}),n.toggle(),this.minMsgId=i.length&&i[i.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=i.length,-1===this.foundCount&&(this.foundCount=s,n.nameEl&&Object(k.a)(n.nameEl,Object(T.d)(s?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[s])),this.onSearch&&this.onSearch(this.foundCount))}).catch(e=>{console.error("search error",e),this.searchPromise=null})}}var O=s(65);class j{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.onChange(e)},200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new O.b({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const s=document.createElement("i");s.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(s,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var _=s(140),F=s(86),D=s(15),R=s(83),B=s(58);var N=(e,t={})=>Object(B.a)("btn-icon",Object.assign({icon:e||void 0},t)),U=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class H{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=N("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new P.b(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider.addTab(this),this.listenerSetter=new R.a}close(){return this.slider.closeTab(this)}open(...e){return U(this,void 0,void 0,(function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)}))}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append(Object(T.d)(e))}}class z extends H{constructor(e){super(e),this.eventListener=new D.a}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}var V=s(76);class K{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{F.a.findItemByType(this.navigationType)?F.a.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,s)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const i=this.historyTabIds.pop();this.onCloseTab(i,t,s);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof H?n.container:n:this.canHideFirst?-1:0,t),!0},Object(w.a)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=Object(_.a)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach(e=>{Object(l.b)(e,this.onCloseBtnClick)})}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof H?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout(()=>{t.onOpenAfterTimeout()},250)),F.a.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof H?e.container:e),!0}removeTabFromHistory(e){Object(V.a)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let s=this.historyTabIds.length-1;s>=0;--s){const i=this.historyTabIds[s];if(i!==t){if(i instanceof e)break;this.removeTabFromHistory(i)}}}getTab(e){return this.historyTabIds.find(t=>t instanceof e)}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,s){s||F.a.removeByType(this.navigationType,!0);const i=e instanceof H?e:this.tabs.get(e);i&&(i.onClose&&i.onClose(),i.onCloseAfterTimeout&&setTimeout(()=>{i.onCloseAfterTimeout()},250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}}var G=s(68),W=s(152);class q{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),Object(l.b)(this.container,()=>{(new W.a).open(this.canvas,e)})}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}var Q=(e={})=>Object(B.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class $ extends H{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(){this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new Kn({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new O.b({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new O.b({label:"ChatLocation",name:"location",canBeEdited:!1}),t.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.groupNameInputField.input.addEventListener("input",()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)}),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.groupNameInputField.value;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;G.a.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),this.peerIds.length&&G.a.inviteToChannel(e,this.peerIds),$n.removeTabFromHistory(this),$n.selectTab(0)})}else this.nextBtn.disabled=!0,G.a.createChat(e,this.peerIds.map(e=>e.toUserId())).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),$n.removeTabFromHistory(this),$n.selectTab(0)})});const s=new Kn({name:"Members",nameArgs:[this.peerIds.length]}),i=this.list=_c.createChatList({new:!0});s.content.append(i),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,s.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const s=super.open();return s.then(()=>{t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(T.c.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),this.peerIds.forEach(e=>{const{dom:t}=_c.addDialogNew({dialog:e,container:this.list,drawStatus:!1,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(E.a.getUserStatusString(e))})}),s}startLocating(){navigator.geolocation.getCurrentPosition(e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then(e=>e.json()).then(e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)})},e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")})}}var Y=s(4),X=s(28),J=s(130),Z=s(92),ee=s(61),te=s(79),se=s(29),ie=s(10),ne=s(37),ae=s(2),oe=s(71),re=s(53),le=s(1),ce=s(91),de=s(114),he=s(14),pe=s(112),ue=s(3),ge=s(41),me=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const be=(()=>{try{return ae.g&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();const ve=new class{constructor(){if(this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=(e,t=this.playingMedia)=>{t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=L.a.getDoc(t.docId);"audio"===s.type&&s.supportsStreaming&&be&&this.handleSafariStreamable(e);const i=ce.a.getCacheContext(s);e.src=i.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===s.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[s.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[s.id])},this.onPlay=e=>{const t=e.target,s=this.mediaDetails.get(t),{peerId:i,mid:n}=s,o=this.pip;o&&o.pause();const r=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,r);const e=e=>e.mid===n&&e.peerId===i,s=this.listLoader,a=s.getCurrent();if(!a||!e(a)){const t=s.getPrevious();let a,o=t.findIndex(e);-1!==o?a=-(t.length-o):(o=s.getNext().findIndex(e),-1!==o&&(a=o+1)),-1!==o?a&&this.go(a,!1):this.setTargets({peerId:i,mid:n})}}setTimeout(()=>{this.playingMedia===t&&a.a.dispatchEvent("media_play",this.getPlayingDetails())},0)},this.onPause=e=>{a.a.dispatchEvent("media_pause")},this.onEnded=e=>{if(!e.isTrusted)return;this.onPause(e);const t=this.listLoader;!this.lockedSwitchers&&(this.round||!t.current||t.next.length)&&t.getNext().length&&this.next()||(this.stop(),a.a.dispatchEvent("media_stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(e=this.playingMedia)=>{if(!e)return!1;if(e.paused||e.pause(),e.currentTime=0,Object(de.a)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const s=t.peerId,i=t.isScheduled?this.scheduled:this.media,n=i.get(s);n&&(n.delete(t.mid),n.size||i.delete(s)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:s}=e,i=this.searchContext.isScheduled;this.getMedia(t,s,i).play(),setTimeout(()=>{this.resolveWaitingForLoadMedia(t,s,i)},0)},this.go=(e,t)=>{const s=this.listLoader;if(!this.lockedSwitchers&&s)return"audio"===this.playingMediaType?s.goRound(e,t):s.go(e,t)},this.browserPlay=this.bindBrowserCallback(e=>this.toggle(!0,e)),this.browserPause=this.bindBrowserCallback(e=>this.toggle(!1,e)),this.browserStop=this.bindBrowserCallback(e=>this.stop(e)),this.browserSeekBackward=this.bindBrowserCallback((e,t)=>this.seekBackward(t,e)),this.browserSeekForward=this.bindBrowserCallback((e,t)=>this.seekForward(t,e)),this.browserSeekTo=this.bindBrowserCallback((e,t)=>this.seekTo(t,e)),this.browserNext=this.bindBrowserCallback(e=>e||this.next()),this.browserPrevious=this.bindBrowserCallback(e=>e?this.seekToStart(e):this.previous()),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)},this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}a.a.addEventListener("document_downloaded",e=>{const t=this.waitingDocumentsForLoad[e.id];if(t)for(const e of t)this.onMediaDocumentLoad(e)});const e={};["volume","muted","playbackRate","loop","round"].forEach(t=>{const s="_"+t;e[t]={get:()=>this[s],set:e=>{this[s]!==e&&(this[s]=e,!this.playingMedia||"loop"===t&&"audio"!==this.playingMediaType||"round"===t||(this.playingMedia[t]=e),"playbackRate"===t&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=e),this.dispatchPlaybackParams())}}}),Object.defineProperties(this,e)}dispatchPlaybackParams(){a.a.dispatchEvent("media_playback_params",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:s,playbackRates:i,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:s,playbackRates:i,loop:n,round:a}}setPlaybackParams(e){this.playbackRates=e.playbackRates,this._volume=e.volume,this._muted=e.muted,this._playbackRate=e.playbackRate,this._loop=e.loop,this._round=e.round}addMedia(e,t,s){const{peerId:n,mid:o}=e,r=!!e.pFlags.is_scheduled?this.scheduled:this.media;let l=r.get(e.peerId);l||r.set(e.peerId,l=new Map);let c=l.get(o);if(c)return c;const d=i.a.getMediaFromMessage(e);l.set(o,c=document.createElement("round"===d.type||"video"===d.type?"video":"audio")),"round"===d.type&&c.setAttribute("playsinline","true");const h={peerId:n,mid:o,docId:d.id,clean:s,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(c,h),c.volume=1,this.container.append(c),c.addEventListener("play",this.onPlay),c.addEventListener("pause",this.onPause),c.addEventListener("ended",this.onEnded),"audio"!==d.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==a.a.myId&&c.addEventListener("timeupdate",()=>{i.a.readMessages(n,[o])},{once:!0});const p=Object(ie.a)();if(t)p.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let s=t.get(n);s||t.set(n,s=new Map),s.set(o,p)}return p.then(()=>{const e=ce.a.getCacheContext(d);if(d.supportsStreaming||e.url)this.onMediaDocumentLoad(c);else{let e=this.waitingDocumentsForLoad[d.id];e||(e=this.waitingDocumentsForLoad[d.id]=new Set),e.add(c),L.a.downloadDoc(d)}}),c}getMedia(e,t,s){const i=(s?this.scheduled:this.media).get(e);return null==i?void 0:i.get(t)}handleSafariStreamable(e){e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",()=>{e.currentTime=e.duration-1,e.addEventListener("progress",()=>{e.currentTime=t,e.paused||e.play()},{once:!0})},{once:!0})})}resolveWaitingForLoadMedia(e,t,s){const i=s?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=i.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||i.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var s,n;return me(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield Object(pe.e)(t,void 0,!1);const a=i.a.getMediaFromMessage(e),l=[],c="voice"===a.type||"round"===a.type;let h="",p="";if(null===(s=a.thumbs)||void 0===s?void 0:s.length){const s=a.thumbs[a.thumbs.length-1];if(!s.bytes){const i=ce.a.getCacheContext(a,s.type);if(i.url)l.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(a,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(c){const s=e.fromId||e.peerId,i=o.a.getPeerPhoto(s);if(i){const n=d.a.loadAvatar(s,i,"photo_small");if(n.cached){const e=yield n.loadPromise;l.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}h=o.a.getPeerTitle(s,!0,!1),p=T.c.format("voice"===a.type?"AttachAudio":"AttachRound",!0)}if(!c){const e=a.attributes.find(e=>"documentAttributeAudio"===e._);h=null!==(n=null==e?void 0:e.title)&&void 0!==n?n:a.file_name,p=null==e?void 0:e.performer}l.length||(ae.b?he.a?l.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):l.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach(e=>{const t=`${e}x${e}`;l.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const u=new MediaMetadata({title:h,artist:p,artwork:l});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){const t=this.mediaDetails.get(e),{peerId:s,mid:n}=t;return t.isScheduled?i.a.getScheduledMessageByPeer(s,n):i.a.getMessageByPeer(s,n)}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:i.a.getMediaFromMessage(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}toggle(e,t=this.playingMedia){return!!t&&(void 0===e&&(e=t.paused),t.paused===e&&(e?t.play():t.pause(),!0))}bindBrowserCallback(e){return t=>{e(this.pip,t)}}seekToStart(e){return(null==e?void 0:e.currentTime)>5&&(e.currentTime=0,this.toggle(!0,e),!0)}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!Object(ge.a)(this.searchContext,e)&&(this.searchContext=Object(ue.a)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,s){let i=this.listLoader;i?i.reset():i=this.listLoader=new C({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{a.a.dispatchEvent("media_stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?i.setTargets(t,s,n):i.reverse=n,i.setSearchContext(this.searchContext),i.current=e,i.load(!0),i.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=i.a.getMediaFromMessage(e);let s="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?s="voice":"video"===t.type&&(s="video")),s}setMedia(e,t){const s=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[s],this.playingMedia=e,this.playingMediaType=s,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===s&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const s=this.playingMedia,i=this.pause();let n;return e&&(n=()=>{const e=this.pip;e&&e.pause()},e.paused||n(),e.addEventListener("play",n)),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=i)=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new R.a;t.add(e)("leavepictureinpicture",()=>{this.pip===e&&(this.pip=void 0,t.removeAll())},{once:!0}),t.add(e)("play",t=>{this.playingMedia!==e&&this.pause()})}};le.a.appMediaPlaybackController=ve;var fe=ve,ye=s(124),we=s(137),Se=s(40),Ce=s(34),Le=s(36);function Ie(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(Le.b,e)}var Me=s(20);function Ee(e,t=2){if(0===e)return Object(T.d)("FileSize.B",[0]);const s=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1024));return Object(T.d)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][i],[parseFloat((e/Math.pow(1024,i)).toFixed(s))])}var Pe=s(115),ke=s(104);function Te(e,t=!1){const s=parseInt(e+"",10),i=Math.floor(s/3600);let n=Math.floor((s-3600*i)/60),a=s-3600*i-60*n;return i&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(i?i+":":"")+n+":"+a}function xe(e,t,s,i){const n=e=>{s({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),i&&i({x:t.pageX,y:t.pageY,event:t})},o=s=>{0===s.button?(t({x:s.pageX,y:s.pageY,event:s}),n(s),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),s({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),i&&i({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}class Ae{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},Object(w.a)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const s=this.seek=document.createElement("input");s.classList.add("progress-line__seek"),s.type="range",s.step=""+this.step,s.min=""+this.min,s.max=""+this.max,s.value=""+t,t&&this.setProgress(t);const i=""+this.step,n=i.indexOf(".");this.decimals=-1===n?0:i.length-n-1,this.container.append(this.filled,s)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=xe(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=Object(ke.a)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const s=this.vertical?this.rect.height:this.rect.width,i=Object(ke.a)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,s);let n=this.min+i/s*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=Object(ke.a)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}class Oe extends Ae{constructor(e,t,s,i){super({step:1e3/60/1e3,min:0,max:1,withTransition:s,useTransform:i},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let s=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{s=!this.media.paused,s&&this.media.pause()},onMouseUp:e=>{s&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,s=this.media.currentTime;let i=0,n=0;for(let a=0;a=t&&t>=i&&(i=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}function je(e){e.classList.add("is-voice");const t=e.message,s=i.a.getMediaFromMessage(t);t.pFlags.out&&e.classList.add("is-out");let n=s.attributes.find(e=>"documentAttributeAudio"===e._).waveform||new Uint8Array([]);n=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let s;try{const i=new DataView(e.buffer);s=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){s=new Uint8Array([])}return s}(n.slice(0,63));const{svg:a,container:o,availW:r}=function(e,t){const s=b.b.isMobile?16:23,i=b.b.isMobile?152:190,n=b.b.isMobile?190:256,a=Object(ke.a)(t/60*n,i,n),o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.classList.add("audio-waveform-bars"),o.setAttributeNS(null,"width",""+a),o.setAttributeNS(null,"height",""+s),o.setAttributeNS(null,"viewBox",`0 0 ${a} ${s}`);const r=Math.max(...e),l=e.length?e.length:100,c=Math.min(a/4|0,l);let d=0;const h=s-4;let p="";for(let t=0,i=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&d\n `,i+=4,d=n<(c+1)/2?0:a}else d{let t=e.audio;const s=()=>{d.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&s();const i=Ie(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.addAudioListener("play",()=>{Object(Pe.b)(()=>!!t&&(s(),!t.paused),e)}),e.readyPromise.then(()=>{let e=!1,s=!1;function i(e){let s;if(e instanceof MouseEvent)s=e.offsetX;else{const t=e.target.getBoundingClientRect();s=e.targetTouches[0].pageX-t.left}const i=s/r*t.duration;t.currentTime=i}u.addEventListener("mouseleave",i=>{e&&(t.play(),e=!1),s=!1}),u.addEventListener("mousemove",t=>{s=!0,e&&i(t)}),u.addEventListener("mousedown",s=>{s.preventDefault(),0===s.button&&(t.paused||t.pause(),i(s),e=!0)}),u.addEventListener("mouseup",i=>{s&&e&&(t.play(),e=!1)}),Object(l.b)(u,e=>{Object(c.a)(e),t.paused||i(e)})},Se.a),()=>{u.remove(),u=null,t=null}}}function _e(e=!0){const t=new ye.a({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}a.a.addEventListener("messages_media_read",({mids:e,peerId:t})=>{e.forEach(e=>{const s=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${s}, .media-round.is-unread${s}`)).forEach(e=>{e.classList.remove("is-unread")})})});const Fe=(e,t)=>{let s,i;const n=!e.classList.contains("search-super-item"),a=Object(Ce.a)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=".audio:not(.is-voice)"+t;let r;if(r=e.matches(o)?[o]:[".audio.is-voice"+t,".media-round"+t],n){const e=".bubble:not(.webpage) ";r=r.map(t=>e+t)}const l=r.join(", "),c=Array.from(a.querySelectorAll(l)),d=c.indexOf(e),h=c.map(e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid}));s=h.slice(0,d),i=h.slice(d+1)}return(i.length&&i[0].midt)&&([s,i]=[i.reverse(),s.reverse()]),[s,i]};class De extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new R.a}render(){var e,t;this.classList.add("audio"),this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=i.a.getMediaFromMessage(this.message),n="voice"===s.type,a=!this.voiceAsMusic&&n,o=this.message.pFlags.is_outgoing,r=o&&this.preloader,d=Te(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const h=this.firstElementChild,p=document.createElement("div");p.classList.add("audio-download");"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),r&&(this.classList.add("is-outgoing"),this.append(p));const u=a?je(this):function(e){var t;const s=e.withTime,n=e.message,a=i.a.getMediaFromMessage(n),o="voice"===a.type||"round"===a.type,r=document.createElement("div");r.classList.add("audio-description");const l=a.attributes.find(e=>"documentAttributeAudio"===e._);if(!o){const t=[];(null==l?void 0:l.performer)&&t.push(X.b.wrapEmojiText(l.performer)),s?t.push(Object(ne.d)(n.date)):t.length||t.push(Ee(a.size)),e.showSender&&t.push(i.a.wrapSenderToPeer(n)),r.append(...Object(T.g)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const c=e.querySelector(".audio-title"),d=new we.a;d.dataset.fontWeight=e.dataset.fontWeight,d.dataset.sizeType=e.dataset.sizeType,o?d.append(i.a.wrapSenderToPeer(n)):Object(m.a)(d,X.b.wrapEmojiText(null!==(t=null==l?void 0:l.title)&&void 0!==t?t:a.file_name)),c.append(d),e.showSender&&c.append(i.a.wrapSentTime(n));const h=e.querySelector(".audio-subtitle");return h.append(r),()=>{let t=!1,s=new Oe(e.audio,a.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),h.lastChild.replaceWith(r),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&h.lastChild.replaceWith(s.container))};return e.addAudioListener("play",i),(!e.audio.paused||e.audio.currentTime>0)&&i(),()=>{s.removeListeners(),s.container.remove(),s=null}}}(this),g=this.querySelector(".audio-time");g.innerHTML=d;const b=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=fe.addMedia(this.message,e),s=this.readyPromise=Object(ie.a)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?s.resolve():this.addAudioListener("canplay",()=>s.resolve(),{once:!0}),this.onTypeDisconnect=u();const i=()=>Te(0|t.currentTime)+(a?" / "+d:""),n=()=>{g.innerText=i(),h.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&n();const o=(e,s=t.paused)=>{if(e&&Object(c.a)(e),s){const e=!!this.searchContext;if(fe.setSearchContext(this.searchContext||{peerId:Me.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?Fe(this,this.message.mid):[];fe.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,s)}t.play().catch(()=>{})}else t.pause()};return Object(l.b)(h,e=>o(e),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",()=>{h.classList.remove("playing"),g.innerText=d}),this.addAudioListener("timeupdate",()=>{!t.currentTime&&t.paused||fe.isSafariBuffering(t)||(g.innerText=i())}),this.addAudioListener("pause",()=>{h.classList.remove("playing")}),this.addAudioListener("play",n),o};if(null===(e=s.thumbs)||void 0===e?void 0:e.length){const e=[],t=Ps({photo:s,message:null,container:h,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});h.style.width=h.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach(e=>e.classList.add("audio-thumb"))}if(o)r&&(this.dataset.isOutgoing="1",this.preloader.attach(p,!1));else{let e=this.preloader;const i="audio"!==s.type;b(i);const n=t=>{if(this.audio.src)return;fe.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(fe.willBePlayed(this.audio),ae.g&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=_e(!1),s=Object(ie.a)();s.notifyAll({done:75,total:100}),s.catch(()=>{this.audio.pause(),fe.willBePlayed(void 0)}),s.cancel=()=>{s.cancel=Se.a;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(p,!1,s),e=this.addAudioListener("pause",()=>{s.cancel()},{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then(()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)})}else{e=_e(),t||(this.readyPromise=Object(ie.a)());const n=()=>{i();const n=L.a.downloadDoc(s);return t||n.then(()=>{this.readyPromise.resolve()}),e.attach(p,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?h.append(p):this.append(p),this.classList.add("downloading"),this.readyPromise.then(()=>{this.classList.remove("downloading"),p.classList.add("downloaded"),setTimeout(()=>{p.remove()},200),fe.willBePlayedMedia===this.audio&&(this.audio.play(),fe.willBePlayed(void 0))})};(null===(t=this.audio)||void 0===t?void 0:t.src)||(i?n(!1):Object(l.b)(h,()=>{n(!0)},{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",De);var Re=s(133);class Be{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function Ne(e){var t,s;let{title:n,titleEl:a,subtitle:o,subtitleEl:l,mediaEl:c,message:d,loadPromises:h}=e;void 0!==n&&("string"==typeof n&&(n=Object(Re.a)(n,140),n=X.a.wrapEmojiText(n)),Object(k.a)(a,n)),h||(h=[]);let p=d&&d.media,u=!1,g=!1;const m=c?Array.from(c.children).slice():[];let b;if(p&&c){if(l.textContent="",l.append(i.a.wrapMessageForReply(d,void 0,void 0,void 0,void 0,!0)),p.webpage&&(p=p.webpage),p.photo||p.document&&(null===(t=p.document.thumbs)||void 0===t?void 0:t.length)){b=nc.chat.bubbles.getMiddleware();const e=nc.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,xs({doc:p.document,div:c,lazyLoadQueue:e,group:tc,width:32,height:32,middleware:b,loadPromises:h});else{const t=p.photo||p.document;g="round"===t.type;try{Ps({photo:t,container:c,boxWidth:32,boxHeight:32,size:r.a.choosePhotoSize(t,32,32),middleware:b,lazyLoadQueue:e,noBlur:!0,withoutPreloader:!0,loadPromises:h}),u=!0}catch(e){}}}}else d?(l.textContent="",l.append(i.a.wrapMessageForReply(d))):("string"==typeof o&&(o=Object(Re.a)(o,140),o=X.a.wrapEmojiText(o)),Object(k.a)(l,o||""));return Promise.all(h).then(()=>{b&&!b()||(m.forEach(e=>e.remove()),c&&c.classList.toggle("is-round",g))}),u}class Ue extends Be{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=Ne({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s});this.container.classList.toggle("is-media",i),i?this.content.prepend(this.mediaEl):this.mediaEl.remove()}),this.className=e}}function He(e,t){return e.reduce((e,t)=>e+t,t)}const ze=0,Ve=1,Ke=2,Ge=4,We=8;class qe{constructor(e,t,s,i,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=s,this.spacing=i,this.maxHeight=n,this.count=e.length,this.ratios=qe.countRatios(e),this.proportions=qe.countProportions(this.ratios),this.averageRatio=He(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find(e=>e>2)?new Qe(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:We|Ve|Ke},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:We|Ge|Ke}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:Ve|We|Ge},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:Ve|Ke|Ge}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),s=this.maxWidth-t-this.spacing,i=Math.min(this.maxHeight,Math.round(Math.min(s/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:s,height:i},sides:Ve|We|Ge},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:Ve|Ke|Ge}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),s=e-t-this.spacing,i=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],s*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-i);return[{geometry:{x:0,y:0,width:n,height:e},sides:Ve|We|Ge},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:Ve|Ke},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:Ge|Ke}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=(this.maxWidth-this.spacing)/2,i=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(s/this.ratios[1],s/this.ratios[2]))),n=e-s-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:We|Ve|Ke},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:Ge|We},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:Ge|Ke}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),i=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),s*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),s*this.ratios[3])),a=e-i-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,s);return[{geometry:{x:0,y:0,width:e,height:t},sides:We|Ve|Ke},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:Ge|We},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:Ge},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:Ke|Ge}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),s=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),i=Math.round(s/this.ratios[1]),n=Math.round(s/this.ratios[2]),a=e-i-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,s));return[{geometry:{x:0,y:0,width:t,height:e},sides:Ve|We|Ge},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:Ve|Ke},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:Ke},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:Ge|Ke}]}static countRatios(e){return e.map(e=>e.w/e.h)}static countProportions(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}}class Qe{constructor(e,t,s,i,n,a=4*s/3){this.averageRatio=t,this.maxWidth=s,this.minWidth=i,this.spacing=n,this.maxHeight=a,this.ratios=Qe.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map(e=>t>1.1?Object(ke.a)(e,1,2.75):Object(ke.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=He(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/s},i=e=>{let i=[],n=0;for(let t of e)i.push(s(n,t)),n+=t;t.push({lineCounts:e,heights:i})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||i([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const s=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||s>3||i([e,t,s])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let s=1;s!==this.count-e-t;++s){const n=this.count-e-t-s;e>3||t>3||s>3||n>3||i([e,t,s,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:s}=e,i=s.length,o=He(t,0)+this.spacing*(i-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==i;++e)if(s[e-1]>s[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d{if(this.uploadAvatar)return!0;let e=0,t=0,s=0;return this.inputFields.forEach(i=>{i.isValid()&&(i.isChanged()&&++e,i.required&&++s),i.required&&++t}),t===s&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},Object(w.a)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=Q({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new q(e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach(e=>{this.listenerSetter.add(e.input)("input",this.handleChange)}),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach(t=>t.input.toggleAttribute("disabled",e)),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then(()=>{t&&(this.disabled=!1)},()=>{this.disabled=!1})}}function Je(e,t){const s=document.createElement("form");return e.forEach(e=>{const{container:i,input:n}=e;s.append(i),n.addEventListener("change",e=>{n.checked&&t(n.value,e)})}),s}class Ze{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?Object(m.a)(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append(Object(T.d)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),t=!0),e.checkboxField){this.checkboxField=e.checkboxField;const s=e.checkboxField.label.classList.contains("checkbox-field-toggle");s?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(t=!0,this.container.append(this.checkboxField.label)),e.noCheckboxSubtitle||s||this.checkboxField.input.addEventListener("change",()=>{Object(k.a)(this.subtitle,Object(T.d)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))})}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const s=e.titleRight||e.titleRightSecondary;if(s?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?"string"==typeof e.title?this.title.innerHTML=e.title:this.title.append(e.title):this.title.append(Object(T.d)(e.titleLangKey)),t.append(this.title),s){const i=this.titleRight=document.createElement("div");i.classList.add("row-title","row-title-right"),e.titleRightSecondary&&i.classList.add("row-title-right-secondary"),"string"==typeof s?i.innerHTML=s:i.append(s),t.append(i)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",t=>{this.freezed||e.clickable(t)}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||Object(te.a)(this.container,void 0,void 0,!0))}createMedia(e){this.container.classList.add("row-with-padding");const t=this.media=document.createElement("div");return t.classList.add("row-media"),e&&t.classList.add("row-media-"+e),this.container.append(t),t}}const et=(e,t)=>Je(e.map(e=>({container:e.container,input:e.radioField.input})),t);function tt(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var st=s(21),it=s(45);class nt{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const s=this.input=document.createElement("input");s.type="radio",s.name="input-radio-"+e.name,e.value&&(s.value=e.value,e.stateKey&&(M.c.getState().then(t=>{s.checked=Object(it.a)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{M.c.setByKey(e.stateKey,e.value)})));const i=this.main=document.createElement("div");i.classList.add("radio-field-main"),e.text?i.innerHTML=e.text:e.langKey&&Object(T.b)(i,e.langKey),t.append(s,i)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const at=document.createElement("div");function ot(e){Object(k.a)(at,e),document.body.append(at),at.dataset.timeout&&clearTimeout(+at.dataset.timeout),at.dataset.timeout=""+setTimeout(()=>{at.remove(),delete at.dataset.timeout},3e3)}function rt(e){ot(Object(T.d)(e.langPackKey,e.langPackArguments))}at.classList.add("toast");var lt=s(89),ct=s(8);class dt extends O.b{constructor(e){super(e),this.checkUsernameDebounced=Object(lt.a)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(O.a.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());X.b.isUsernameValid(e)?this.setState(O.a.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)})}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=ct.a.invokeApi("channels.checkUsername",{channel:G.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=ct.a.invokeApi("account.checkUsername",{username:e}),this.checkUsernamePromise.then(t=>{this.getValue()===e&&(t?this.setState(O.a.Valid,this.options.availableText):this.setError(this.options.takenText))},t=>{if(this.getValue()===e)switch(t.type){case"USERNAME_INVALID":this.setError(this.options.invalidText)}}).then(()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&X.b.isUsernameValid(t)&&this.checkUsername(t)}))}}var ht=s(73),pt=s(70);class ut extends ht.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(ht.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){const e=new fc;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append(Object(T.d)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const s=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append(Object(T.d)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&Object(m.a)(e,t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new pt.a(e);e.checkboxField=t,s.append(t.label)}),t.buttons.forEach(e=>{if(e.callback){const s=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach(t=>{t.checkboxField.checked&&e.add(t.text)}),s(e)}}})),this.container.insertBefore(s,this.header.nextElementSibling)}}var gt=s(77);class mt extends z{init(){this.container.classList.add("edit-peer-container","group-type-container");const e=G.a.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new Kn({name:e?"ChannelType":"GroupType"}),s=Object(st.b)(),i=new Ze({radioField:new nt({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new Ze({radioField:new nt({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=et([i,o],e=>{const t=[d,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),m()}),c=G.a.getChat(this.chatId);t.content.append(r);const d=new Kn({}),h=new Ze({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{tt(this.chatFull.exported_invite.link),ot(T.c.format("LinkCopied",!0))}}),p=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(p,()=>{new ut("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(gt.a)([p],!0);n.default.getChatInviteLink(this.chatId,!0).then(t=>{e(),h.title.innerHTML=t})}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()},{listenerSetter:this.listenerSetter}),d.content.append(h.container,p);const u=new Kn({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),g=document.createElement("div");g.classList.add("input-wrapper");const m=()=>{const e=i.radioField.checked&&"t.me/"!==v||b.isValidToChange()&&b.input.classList.contains("valid");f.classList.toggle("is-visible",e)},b=new dt({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:m,peerId:this.chatId.toPeerId(!0),head:"t.me/"}),v="t.me/"+(c.username||"");g.append(b.container),u.content.append(g);const f=Q({icon:"check",className:"is-visible"});this.content.append(f),Object(l.b)(f,()=>{Object(ee.g)(f);const e=o.radioField.checked?b.getValue():"";G.a.migrateChat(this.chatId).then(t=>G.a.updateUsername(t,e)).then(()=>{this.close()})},{listenerSetter:this.listenerSetter}),("t.me/"!==v?o:i).radioField.checked=!0,b.setOriginalValue(v),this.scrollable.append(t.container,d.container,u.container);{const t=new Kn({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),s=new pt.a({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);G.a.toggleNoForwards(this.chatId,s.checked).then(()=>{e()})});const i=()=>{s.setValueSilently(!!c.pFlags.noforwards)};this.listenerSetter.add(a.a)("chat_update",e=>{this.chatId===e&&i()}),i(),t.content.append(s.label),this.scrollable.append(t.container)}}}var bt=s(85);class vt{constructor(e){this.loading=!1,this.loaded=!1,Object(w.a)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then(e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()},()=>{this.promise=void 0,this.loading=!1})))}}var ft=s(102),yt=s(106),wt=s(69),St=s(100),Ct=s(157),Lt=s(39),It=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Mt{constructor(e){this.container=document.createElement("div"),this.list=_c.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=_c.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},Object(w.a)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>(this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter(e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t}),this.filterPeerTypeBy&&(e=e.filter(e=>{if(e.isPeerId()){if(!o.a.getPeer(e).deleted)return this.filterPeerTypeBy.find(t=>o.a[t](e))}return!0})),t(e)),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?Object(T.b)(this.input,this.placeholder,void 0,"placeholder"):Object(T.b)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new Kn({});e.innerContainer.classList.add("selector-search-section");let t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new P.b(t),Object(l.b)(this.selectedContainer,e=>{if(this.freezed)return;let t=e.target;if(t=Object(Ce.a)(t,"selector-user"),!t)return;const s=t.dataset.key,i=this.chatsContainer.querySelector('[data-peer-id="'+s+'"]');i?i.click():this.remove(s.toPeerId())}),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const s=new Kn({name:this.sectionNameLangPackKey,noShadow:!0});s.content.append(this.list),this.chatsContainer.append(s.container),this.scrollable=new P.b(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),Object(l.b)(this.chatsContainer,e=>{const t=Object(yt.a)(e.target,"data-peer-id");if(Object(c.a)(e),!t)return;if(this.freezed)return;let s=t.dataset.peerId;if(s=s.isPeerId()?s.toPeerId():s,!this.multiSelect)return void this.add(s);this.selected.has(s)?this.remove(s):this.add(s);const i=t.querySelector("input");i.checked=!i.checked});const i=Object(lt.a)(this.onInput,200,!1,!0);this.input.addEventListener("input",i),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(Wn()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout(()=>{let t=this.getMoreResults();e.onFirstRender&&t.then(()=>{e.onFirstRender()})},0)}renderSaved(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!E.a.testSelfSearch(this.query)||this.renderResultsFunc([a.a.myId])}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return It(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=St.a.height/72*1.25|0,t=this.getTempId("dialogs"),s=i.a.getConversations(this.query,this.offsetIndex,e,this.folderId,!0).promise;this.promise=s;const n=yield s;if(this.tempIds.dialogs!==t)return;this.promise=null;let o=n.dialogs;if(o.length){const e=o[o.length-1].index||0;o=o.slice(),Object(Lt.a)(o,e=>e.peerId===a.a.myId),this.chatRightsAction&&(o=o.filter(e=>this.filterByRights(e.peerId))),this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(o.map(e=>e.peerId)),n.isEnd){if(!this.loadedWhat.dialogs)return this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return e.isUser()&&("send_messages"!==this.chatRightsAction||E.a.canSendToUser(e))||G.a.hasRights(e.toChatId(),this.chatRightsAction)}getMoreContacts(){return It(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),s=Promise.all([e?E.a.getContactsPeerIds(this.query):[],this.query?E.a.searchContacts(this.query):void 0]);this.promise=s;let[i,n]=yield s;if(this.tempIds.contacts!==t)return;if(n){let t=e?n.my_results.concat(n.results):n.my_results;this.chatRightsAction&&(t=t.filter(e=>this.filterByRights(e))),this.peerType.includes("dialogs")||(t=t.filter(e=>e.isUser())),this.cachedContacts=Object(Ct.a)(i.concat(t))}else this.cachedContacts=i.slice();Object(V.a)(this.cachedContacts,a.a.myId),this.promise=null}const t=St.a.height/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return It(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=n.default.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),s=yield t;if(this.tempIds.channelParticipants!==e)return;const i=s.participants.map(e=>G.a.getParticipantPeerId(e));Object(V.a)(i,a.a.myId),this.renderResultsFunc(i),(this.list.childElementCount>=s.count||s.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=e.filter(e=>E.a.isNonContactUser(e))),e.forEach(e=>{const{dom:t}=_c.addDialogNew({dialog:e,container:this.scrollable,drawStatus:!1,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const s=this.selected.has(e),i=new pt.a;s&&(i.input.checked=!0),t.containerEl.prepend(i.label)}let s;s=e.isAnyChat()?n.default.getChatMembersString(e.toChatId()):e===a.a.myId?Object(T.d)(this.selfPresence):E.a.getUserStatusString(e),t.lastMessageSpan.append(s)})}add(e,t,s=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const i=document.createElement("div");i.classList.add("selector-user","scale-in");const n=new fc;return n.classList.add("selector-user-avatar","tgico","avatar-32"),n.isDialog=!0,i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new wt.a({peerId:e.toPeerId(),dialog:!0}).element),n.updateWithOptions({peerId:e})),t&&("string"==typeof t?i.innerHTML=t:(Object(k.a)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(i,this.input),this.onChange&&this.onChange(this.selected.size),s&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),i}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const s=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};a.a.settings.animationsEnabled?t.addEventListener("animationend",s,{once:!0}):s()}getSelected(){return[...this.selected]}addInitial(e){e.forEach(e=>{this.add(e,void 0,!1)}),window.requestAnimationFrame(()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:ft.a.Static})})}}var Et=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Pt extends ht.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new Mt({appendTo:this.body,onChange:()=>Et(this,void 0,void 0,(function*(){const t=this.selector.getSelected(),s=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(s);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()})),peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),he.a||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence}),this.title.append(this.selector.input)}}class kt extends z{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new Kn({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=_c.createChatList({new:!0});s.append(i);const{dom:n}=_c.addDialogNew({dialog:this.userId.toPeerId(!1),container:i,drawStatus:!1,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(E.a.getUserStatusString(this.userId));const a=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0});e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&Object(ge.a)(this.participant.banned_rights.pFlags,e.pFlags)||G.a.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new Kn({});if("channelParticipantBanned"===this.participant._){const s=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});Object(l.b)(s,()=>{const t=Object(gt.a)([s],!0);G.a.clearChannelParticipantBannedRights(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()},()=>{t()})},{listenerSetter:this.listenerSetter}),t.content.append(s)}const s=Object(B.a)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});Object(l.b)(s,()=>{Object(gt.a)([s],!0);G.a.kickFromChannel(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()})},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container)}}}var Tt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class xt{constructor(e){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const t=G.a.getChat(e.chatId),s=t.default_banned_rights,i=e.participant?G.a.combineParticipantBannedRights(e.chatId,e.participant.banned_rights):s,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0];a.checkboxField=new pt.a({text:a.text,checked:G.a.hasRights(e.chatId,o,i),restriction:!0,withRipple:!0}),(e.participant&&s.pFlags[o]||t.username&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,Object(l.b)(a.checkboxField.label,e=>{ot(T.c.format(n,!0))},{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",()=>{if(!a.checkboxField.checked){this.v.filter(e=>this.toggleWith[o].includes(e.flags[0])).forEach(e=>{e.checkboxField.checked=!1})}}),e.appendTo.append(a.checkboxField.label)}}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v){!t.checkboxField.checked&&t.flags.forEach(t=>{e.pFlags[t]=!0})}return e}}class At extends z{init(){return Tt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new Kn({name:"ChannelPermissionsHeader"});e=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content}),this.eventListener.addEventListener("destroy",()=>{G.a.editChatDefaultBannedRights(this.chatId,e.takeOut())},{once:!0}),this.scrollable.append(t.container)}{const t=new Kn({name:"PrivacyExceptions"}),s=new Ze({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Pt({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>Tt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void ot("User is no longer participant")}const s=new kt(this.slider);s.participant=t,s.chatId=this.chatId,s.userId=e,s.open()}));t.content.append(s.container);const r=t.generateContentElement();r.classList.add("chatlist-container");const c=_c.createChatList({new:!0});r.append(c),Object(l.b)(c,e=>{const t=Object(bt.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();i(s)},{listenerSetter:this.listenerSetter});const d=(t,s)=>{const i=s.banned_rights,n=G.a.getChat(this.chatId).default_banned_rights,a=[];e.v.forEach(e=>{const t=e.flags[0];i.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)});const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...Object(T.f)(a.map(e=>Object(T.d)(e)),!1))),o.classList.toggle("hide",!a.length)},h=(e,t)=>{const{dom:s}=_c.addDialogNew({dialog:o.a.getPeerId(e.peer),container:c,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t});d(s.listEl,e)};this.listenerSetter.add(a.a)("updateChannelParticipant",e=>{var t,s,i;const n="channelParticipantBanned"===(null===(t=e.new_participant)||void 0===t?void 0:t._)&&!e.new_participant.banned_rights.pFlags.view_messages,a=c.querySelector(`[data-peer-id="${e.user_id}"]`);n?(a?d(a,e.new_participant):h(e.new_participant,!1),"channelParticipantBanned"!==(null===(s=e.prev_participant)||void 0===s?void 0:s._)&&++g):(a&&a.remove(),"channelParticipantBanned"===(null===(i=e.prev_participant)||void 0===i?void 0:i._)&&--g),p()});const p=()=>{Object(k.a)(s.subtitle,Object(T.d)(g?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[g]))};let u,g=0;const m=()=>(u=new vt({scrollable:this.scrollable,getPromise:()=>n.default.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,c.childElementCount).then(e=>{for(const t of e.participants)h(t,!0);return g=e.count,p(),e.participants.length<50||e.count===c.childElementCount})}),u.load());this.scrollable.append(t.container),G.a.isChannel(this.chatId)?yield m():(p(),this.listenerSetter.add(a.a)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,m())}))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class Ot{constructor(e,t=o.a.getDialogType(e),s){const n=new wt.a({peerId:e}).element,a=(t,n=p&&!!t.size)=>{let a=G.a.leave(e.toChatId());n&&(a=a.finally(()=>i.a.flushHistory(e))),s&&s(a)},r=t=>{let n;if(e.isUser())n=i.a.flushHistory(e,!1,p?!!t.size:void 0);else{if(!t.size)return a(t);n=G.a.delete(e.toChatId())}s&&s(n)};let l,c,d,h,p;switch(t){case"channel":G.a.hasRights(e.toChatId(),"delete_chat")?(G.a.deleteChannel,l="ChannelDeleteMenu",c="AreYouSureDeleteAndExitChannel",h=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChannelForAll"}]):(l="LeaveChannelMenu",c="ChannelLeaveAlertWithName",d=[n],h=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":l="DeleteChatUser",c="AreYouSureDeleteThisChatWithUser",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}],p=[{text:"DeleteMessagesOptionAlso",textArgs:[new wt.a({peerId:e}).element]}];break;case"saved":l="DeleteChatUser",c="AreYouSureDeleteThisChatSavedMessages",h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}];break;case"megagroup":case"group":G.a.hasRights(e.toChatId(),"delete_chat")?(l="DeleteMegaMenu",c="AreYouSureDeleteAndExit",h=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChat.DeleteGroupForAll"}]):(l="LeaveMegaMenu",c="AreYouSureDeleteAndExitName",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new ut("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}var jt=s(101),_t=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ft extends z{init(){var e;return _t(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield jt.a.getActiveAvailableReactions(),s=yield n.default.getChatFull(this.chatId);let i=null!==(e=s.available_reactions)&&void 0!==e?e:[];const a=new Set(i),o=new Kn({caption:G.a.isBroadcast(this.chatId)?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),r=new pt.a({toggle:!0,checked:!!a.size}),l=new Ze({checkboxField:r,titleLangKey:"EnableReactions"});o.content.append(l.container);const c=new Kn({name:"AvailableReactions"}),d=t.map(e=>{const t=new pt.a({toggle:!0,checked:a.has(e.reaction)});this.listenerSetter.add(t.input)("change",()=>{t.checked?(a.add(e.reaction),r.checked||r.setValueSilently(!0)):(a.delete(e.reaction),!a.size&&r.checked&&r.setValueSilently(!1)),p()});const s=new Ze({checkboxField:t,title:e.title,havePadding:!0});return Os({row:s,doc:e.static_icon,size:"small"}),c.content.append(s.container),t});this.listenerSetter.add(l.checkboxField.input)("change",()=>{r.checked?d.every(e=>!e.checked)&&(d.forEach(e=>e.checked=!0),p()):(d.forEach(e=>e.checked=!1),p())});const h=()=>{const e=Array.from(a);if([...e].sort().join()===[...i].sort().join())return;const t=n.default.getCachedFullChat(this.chatId);t&&(t.available_reactions=e),G.a.setChatAvailableReactions(this.chatId,e),i=e},p=Object(lt.a)(h,3e3,!1,!0);this.eventListener.addEventListener("destroy",h,{once:!0}),this.scrollable.append(o.container,c.container)}))}}var Dt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Rt extends H{_init(){var e;return Dt(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",null!==(e=this.tempId)&&void 0!==e||(this.tempId=0);const t=++this.tempId;this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let s=yield n.default.getChatFull(this.chatId,!0);const i=G.a.getChat(this.chatId),o=G.a.isBroadcast(this.chatId),r=G.a.isChannel(this.chatId),c=[],d=e=>{c.push(e)};this.listenerSetter.add(a.a)("chat_update",e=>{this.chatId===e&&c.forEach(e=>e())}),this.listenerSetter.add(a.a)("chat_full_update",e=>{this.chatId===e&&(s=n.default.getCachedFullChat(e)||s)});const h=this.chatId.toPeerId(!0),p=G.a.hasRights(this.chatId,"change_type"),u=G.a.hasRights(this.chatId,"change_permissions");{const e=new Kn({noDelimiter:!0}),n=[],r=document.createElement("div");if(r.classList.add("input-wrapper"),this.chatNameInputField=new O.b({label:o?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new O.b({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(i.title),this.descriptionInputField.setOriginalValue(s.about),r.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new Xe({peerId:h,inputFields:n,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.content.append(this.editPeer.avatarEdit.container,r),p){const t=new Ze({titleLangKey:o?"ChannelType":"GroupType",clickable:()=>{const e=new mt(this.slider);e.chatId=this.chatId,e.chatFull=s,e.open(),this.listenerSetter.add(e.eventListener)("destroy",n)},icon:"lock"}),n=()=>{let e;t.subtitle.textContent="",e=o?i.username?"TypePublic":"TypePrivate":i.username?"TypePublicGroup":"TypePrivateGroup",t.subtitle.append(Object(T.d)(e))};n(),e.content.append(t.container)}if(p||u){const i=new Ze({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=new Ft(this.slider);e.chatId=this.chatId,e.open().then(()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)})}}),n=(yield jt.a.getAvailableReactions()).filter(e=>!e.pFlags.inactive).length,a=()=>{var e;const t=null!==(e=s.available_reactions)&&void 0!==e?e:[];i.subtitle.innerHTML=t.length+"/"+n};a(),e.content.append(i.container)}if(u&&!o){const t=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],s=new Ze({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new At(this.slider);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>{s.subtitle.innerHTML=t.reduce((e,t)=>e+ +G.a.hasRights(this.chatId,t,i.default_banned_rights),0)+"/"+t.length};n(),e.content.append(s.container),this.listenerSetter.add(a.a)("chat_update",e=>{this.chatId===e&&n()})}if(this.scrollable.append(e.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(G.a.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(G.a.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>G.a.editPhoto(t,e))),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter}),o&&G.a.hasRights(this.chatId,"change_info")){const t=new pt.a({text:"PeerInfo.SignMessages",checked:!!i.pFlags.signatures,withRipple:!0});this.listenerSetter.add(t.input)("change",()=>{const e=t.toggleDisability(!0);G.a.toggleSignatures(this.chatId,t.checked).then(()=>{e()})}),d(()=>{t.setValueSilently(!!i.pFlags.signatures)}),e.content.append(t.label)}}if(!o){const e=new Kn({});if(!o&&p){const t=new pt.a({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(t.input)("change",()=>{const e=t.toggleDisability(!0);G.a.togglePreHistoryHidden(this.chatId,!t.checked).then(()=>{e()})});const i=()=>{t.setValueSilently(r&&!s.pFlags.hidden_prehistory)};i(),d(i),e.content.append(t.label)}e.content.childElementCount&&this.scrollable.append(e.container)}if(G.a.hasRights(this.chatId,"delete_chat")){const e=new Kn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new Ot(h,void 0,e=>{const s=Object(gt.a)([t],!0);e.then(()=>{this.close()},()=>{s()})})},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}r||this.listenerSetter.add(a.a)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{h===e&&(this.chatId=t.toChatId(),this._init())})}))}init(){return this._init()}}var Bt=s(111);class Nt extends H{init(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!E.a.isContact(this.peerId.toUserId());this.setTitle(e?"AddContactTitle":"Edit");{const t=new Kn({noDelimiter:!0}),s=[],n=document.createElement("div");if(n.classList.add("input-wrapper"),this.nameInputField=new O.b({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new O.b({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=E.a.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(n.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new Xe({peerId:this.peerId,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const r=new pt.a({text:"Notifications"});r.input.addEventListener("change",e=>{e.isTrusted&&i.a.togglePeerMute(this.peerId)}),this.listenerSetter.add(a.a)("notify_settings",e=>{if("notifyPeer"!==e.peer._)return;const t=o.a.getPeerId(e.peer.peer);if(this.peerId===t){const t=!Bt.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new wt.a({peerId:this.peerId}).element);const c=document.createElement("div");if(c.classList.add("profile-subtitle"),c.append(Object(T.d)("EditContact.OriginalName")),t.content.append(s,l,c,n),e){const e=E.a.getUser(this.peerId),s=new Ze({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?E.a.formatUserPhone(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new wt.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new Ze({checkboxField:r}),s=!Bt.a.isPeerLocalMuted(this.peerId,!1);r.checked=s,t.content.append(e.container)}}else t.content.append(n);this.scrollable.append(t.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0,E.a.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,E.a.getUser(this.peerId).phone).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter})}if(!e){const e=new Kn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new ut("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(ht.a)([{langKey:"Delete",callback:()=>{const e=Object(gt.a)([t],!0);E.a.deleteContacts([this.peerId]).then(()=>{this.close()},()=>{e()})},isDanger:!0}])}).show()},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}}class Ut extends H{init(){this.container.classList.add("add-members-container"),this.nextBtn=Q({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",()=>{const e=this.selector.getSelected().map(e=>e.toPeerId());if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}})}attachToPromise(e){const t=Object(ee.g)(this.nextBtn,"arrow_next");e.then(()=>{this.close()},()=>{t()})}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const s="privacy"===this.peerType;return this.selector=new Mt({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[s?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:s,filterPeerTypeBy:s?["isAnyGroup","isUser"]:void 0}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}var Ht=!ae.d&&!1,zt=s(129);function Vt(e){const t=document.createElement("span");return t.classList.add("badge-fake"),Object(T.b)(t,e?"ScamMessage":"FakeMessage"),t}function Kt(e){var t;const s=[],i=o.a.getPeer(e);return(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.verified)&&s.push(function(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-check"),s.classList.add("verified-check"),e.append(t,s),e}()),(i.pFlags.fake||i.pFlags.scam)&&s.push(Vt(i.pFlags.scam)),s}const Gt=e=>e.touches?e.touches[0]:e,Wt=window;let qt=!1;a.a.addEventListener("context_menu_toggle",e=>{qt=e});class Qt{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{he.a?Wt.removeEventListener("touchmove",this.handleMove,{capture:!0}):(Wt.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{const t=Gt(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,he.a?Wt.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):Wt.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||qt)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=Gt(e),s=t.clientX,i=t.clientY,n=this.xDown-s,a=this.yDown-i;if(!this.hadMove){if(!n&&!a)return;this.hadMove=!0,he.a||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const o=this.onSwipe(n,a,e);void 0!==o&&o&&this.reset()},Object(w.a)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){he.a?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),Wt.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),Wt.addEventListener("mouseup",this.reset))}removeListeners(){he.a?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),Wt.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),Wt.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!he.a&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var $t=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Yt{constructor(e){this.scrollable=e,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(Yt.BASE_CLASS+"-avatar","media-container"),e&&(s="object"!=typeof e?r.a.getPhoto(e):e.action.photo);const i=new Image;i.classList.add("avatar-photo"),i.draggable=!1;const n=()=>{if(s){const e=Ps({container:t,photo:s,size:r.a.choosePhotoSize(s,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach(e=>{e.classList.add("avatar-photo")})}else{const e=o.a.getPeerPhoto(this.peerId);d.a.putAvatar(t,this.peerId,e,"photo_big",i)}};return this.avatars.childElementCount<=3?n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.avatars.append(t),this.addTab(),e},this.container=document.createElement("div"),this.container.classList.add(Yt.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Yt.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Yt.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Yt.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Yt.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Yt.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Yt.BASE_CLASS+"-arrow",Yt.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new R.a;const t=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1);let s=!1,i=!1;Object(l.b)(this.container,e=>$t(this,void 0,void 0,(function*(){if(i)return void Object(c.a)(e);if(s)return void(s=!1);if(!t())return;const n=this.container.getBoundingClientRect(),a=e.pageX,o=a-n.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||o>n.width*(1/3)&&o{t.push({element:this.avatars.children[s],item:e})});const s=t.slice(0,this.listLoader.previous.length),n=t.slice(this.listLoader.previous.length+1),a=this.avatars.children[this.listLoader.previous.length];i=!0,mc(a,e,()=>e===this.peerId,this.listLoader.current,s,n),i=!1}else{const e=a>n.right-n.width/2;let t;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,t=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(t),Object(Le.b)(()=>{this.avatars.classList.remove("no-transition")})}})),{listenerSetter:this.listenerSetter});const n=()=>{s=!0,document.body.addEventListener(he.a?"touchend":"click",e=>{s=!1},{once:!0})};let a=0,h=0,p=0,u=0;this.swipeHandler=new Qt({element:this.avatars,onSwipe:(e,t)=>{p=e;let s=h+e*-Yt.SCALE;return s>0?s=0:st()?!this.container.classList.contains("is-single")&&!i:(n(),Object(c.a)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();a=e.width,u=-a*(this.tabs.childElementCount-1),h=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Yt.TRANSLATE_TEMPLATE.replace("{x}",h+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(p)/(a/Yt.SCALE))*(p>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(Le.b)(()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")})}});this.intersectionObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)})})}setPeer(e){this.peerId=e;const t=o.a.getPeerPhoto(e);if(!t)return;const s=this.listLoader=new S({loadCount:50,loadMore:(t,a,o)=>{if(!a)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const s=t;return r.a.getUserPhotos(e,s,o).then(e=>({count:e.count,items:e.photos}))}{const t=[];return s.current||t.push(Promise.resolve(n.default.getChatFull(e.toChatId()))),t.push(i.a.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:o,backLimit:0})),Promise.all(t).then(e=>{const t=e.pop();if(y(t),!s.current){const n=e[0],a=Object(Lt.a)(t.history,e=>e.action.photo.id===n.chat_photo.id);s.current=a||i.a.generateFakeAvatarMessage(this.peerId,n.chat_photo)}return{count:t.count,items:t.history}})}},processItem:this.processItem,onJump:(e,t)=>{const s=this.listLoader.index,i=100*Yt.SCALE*s;this.avatars.style.transform=Yt.TRANSLATE_TEMPLATE.replace("{x}",`-${i}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active");this.tabs.children[s].classList.add("active"),this.loadNearestToTarget(this.avatars.children[s])}});"userProfilePhoto"===t._&&(s.current=t.photo_id),this.processItem(s.current),s.load(!0)}addTab(){const e=document.createElement("div");e.classList.add(Yt.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),s=t.indexOf(e);t.slice(Math.max(0,s-3),Math.min(t.length,s+3)).forEach(e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))})}cleanup(){this.listenerSetter.removeAll(),this.swipeHandler.removeListeners()}}Yt.BASE_CLASS="profile-avatars",Yt.SCALE=Ht?2:1,Yt.TRANSLATE_TEMPLATE=Ht?`translate3d({x}, 0, -1px) scale(${Yt.SCALE})`:"translate({x}, 0)";let Xt=(e,t)=>{Object(m.a)(t.title,e||""),t.container.style.display=e?"":"none"};class Jt{constructor(e,t,s=!0){this.scrollable=e,this.listenerSetter=t,this.isDialog=s,this.setPeerStatus=(e=!1)=>{const t=this.peerId;this.element.classList.toggle("is-me",t===a.a.myId),!t||a.a.myId===t&&this.isDialog||nc.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId,!this.isDialog)},Ht||this.scrollable.container.classList.add("no-parallax"),t||(this.listenerSetter=new R.a)}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new Kn({noDelimiter:!0}),this.avatar=new fc,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.isDialog=this.isDialog,this.avatar.attachClickEvent(),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new Ze({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&Promise.resolve(n.default.getProfileByPeerId(this.peerId)).then(e=>{tt(e.about),ot(T.c.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new Ze({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{tt("@"+o.a.getPeer(this.peerId).username),ot(T.c.format("UsernameCopied",!0))}}),this.phone=new Ze({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{tt("+"+E.a.getUser(this.peerId).phone),ot(T.c.format("PhoneCopied",!0))}}),this.link=new Ze({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{tt(this.link.title.textContent),ot(T.c.format("LinkCopied",!0))}}),this.location=new Ze({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new Ze({checkboxField:new pt.a({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),e.add(this.notifications.checkboxField.input)("change",e=>{e.isTrusted&&i.a.togglePeerMute(this.peerId)}),e.add(a.a)("dialog_notify_settings",e=>{if(this.peerId===e.peerId){const e=Bt.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),Ht&&this.element.append(Wn()),e.add(a.a)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),e.add(a.a)("peer_bio_edit",e=>{e===this.peerId&&this.setMoreDetails(!0)}),e.add(a.a)("peer_title_edit",e=>{e===this.peerId&&this.fillUsername()}),e.add(a.a)("user_update",e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()}),e.add(a.a)("contacts_update",e=>{if(this.peerId===e.toPeerId()){E.a.getUser(e).pFlags.self&&this.isDialog||this.fillUserPhone()}}),e.add(a.a)("avatar_update",e=>{this.peerId===e&&this.setAvatar()}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach(e=>{e.container.style.display="none"}),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0)}canBeDetailed(){return this.peerId!==a.a.myId||!this.isDialog}setAvatar(){if(this.canBeDetailed()){if(o.a.getPeerPhoto(this.peerId)){const e=this.avatars;return this.avatars=new Yt(this.scrollable),this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(Ht&&this.scrollable.container.classList.add("parallax"))}}Ht&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),this.avatar.updateWithOptions({peerId:this.peerId}),this.section.content.prepend(this.avatar,this.name,this.subtitle)}fillUsername(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=o.a.getPeerUsername(e);Xt(t,this.username)}}fillUserPhone(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=E.a.getUser(e);Xt(t.phone?E.a.formatUserPhone(t.phone):void 0,this.phone)}}fillNotifications(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=Bt.a.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else Object(Le.b)(()=>{e.container.style.display="none"})}fillRows(){const e=this.peerId;this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(),Object(k.a)(this.name,new wt.a({peerId:e,dialog:this.isDialog}).element),this.name.append(...Kt(e)),this.setPeerStatus(!0)}fillProfileElements(){this.cleaned&&(this.cleaned=!1,this.cleanupHTML(),this.setAvatar(),this.fillRows())}setMoreDetails(e){this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0);const t=this.peerId,s=this.threadId;t&&!o.a.isRestricted(t)&&this.canBeDetailed()&&Object(zt.a)(n.default.getProfileByPeerId(t,e),e=>{if(this.peerId!==t||this.threadId!==s||o.a.isRestricted(t))return;if(Xt(e.about?X.b.wrapRichText(e.about):void 0,this.bio),!t.isUser()){const s=G.a.getChat(t.toChatId());if(s.username)Xt("https://t.me/"+s.username,this.link);else{const t=e.exported_invite;t&&Xt(t.link,this.link)}}const i=e.location;"channelLocation"==(null==i?void 0:i._)&&Xt(i.address,this.location),this.setMoreDetailsTimeout=window.setTimeout(()=>this.setMoreDetails(!0),6e4)})}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}}class Zt extends H{constructor(e){super(e,!1),this.threadId=0,this.historiesStorage={}}init(){this.container.classList.add("shared-media-container","profile-container");const e=Object(B.a)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const s=document.createElement("div");s.className="transition slide-fade";const i=document.createElement("div");i.classList.add("transition-item"),this.title.append(Object(T.d)("Profile")),this.editBtn=N("edit"),i.append(this.title,this.editBtn);const n=document.createElement("div");n.classList.add("transition-item");const o=this.title.cloneNode();o.append(Object(T.d)("PeerInfo.SharedMedia")),n.append(o),s.append(i,n),this.header.append(s),this.profile=new Jt(this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element);this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;r(t<=56)};const r=e=>{t.classList.toggle("state-back",e),this.searchSuper.container.classList.toggle("is-full-viewport",e),c(+e),e||this.searchSuper.cleanScrollPositions()},c=Object(_.a)(s,"slide-fade",400,null,!1);c(0),Object(l.b)(this.closeBtn,e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),c(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),Object(l.b)(this.editBtn,e=>{let t;t=this.peerId.isAnyChat()?new Rt(this.slider):new Nt(this.slider),t&&(t instanceof Rt?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())}),a.a.addEventListener("contacts_update",e=>{this.peerId===e&&this.toggleEditBtn()}),a.a.addEventListener("chat_update",e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()}),a.a.addEventListener("history_multiappend",e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))}),a.a.addEventListener("history_delete",({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))}),a.a.addEventListener("message_sent",({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])}),this.searchSuper=new ui({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&a.a.settings.animationsEnabled?250:0;setTimeout(()=>{d.classList.toggle("is-hidden","members"!==e.type)},t)}}),this.searchSuper.scrollStartCallback=()=>{r(!0)},this.profile.element.append(this.searchSuper.container);const d=Q({icon:"addmember_filled"});this.content.append(d),d.addEventListener("click",()=>{const e=this.peerId,t=this.peerId.toChatId(),s=G.a.isChannel(t),i=(t,i)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[Object(T.d)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map(e=>{const t=document.createElement("b");return t.append(new wt.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new wt.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new wt.a({peerId:t[0]}).element],checked:!0}])}r.push(new wt.a({peerId:e}).element),new ut("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:i}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&rt({langPackKey:"InviteToGroupError"})};if(s){const e=new Ut(this.slider);e.open({type:"channel",skippable:!1,takeOut:s=>(i(s,()=>{const i=G.a.inviteToChannel(t,s);i.catch(n),e.attachToPromise(i)}),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Pt({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout(()=>{i([e],s=>{G.a.addChatUser(t,e,s.size?void 0:0).catch(n)})},0)}})})}renderNewMessages(e,t){if(!this.init&&this.historiesStorage[e]){t=t.slice().reverse();for(const s of this.searchSuper.mediaTabs){const n=s.inputFilter,a=this.searchSuper.filterMessagesByType(t.map(t=>i.a.getMessageByPeer(e,t)),n);if(a.length){const t=this.historiesStorage[e][n];t&&t.unshift(...a.map(e=>({mid:e.mid,peerId:e.peerId}))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[n]&&(this.searchSuper.usedFromHistory[n]+=a.length,this.searchSuper.performSearchResult(a,s,!1))}}}}deleteDeletedMessages(e,t){if(!this.init&&this.historiesStorage[e]){for(const s of t)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=this.historiesStorage[e][i];if(!n)continue;const a=n.findIndex(e=>e.mid===s);if(-1!==a&&(n.splice(a,1),this.peerId===e)){const t=this.searchSuper.tabs[i].querySelector(`[data-mid="${s}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[i]>=a+1&&this.searchSuper.usedFromHistory[i]--}}this.scrollable.onScroll()}}cleanupHTML(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",this.searchSuper.canViewMembers()&&G.a.hasRights(this.peerId.toChatId(),"invite_users"))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var s;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){this.peerChanged&&(this.peerChanged=!1,this.cleanupHTML(),this.profile.fillProfileElements(),this.toggleEditBtn())}toggleEditBtn(){let e;e=this.peerId.isUser()?this.peerId!==a.a.myId&&E.a.isContact(this.peerId.toUserId()):G.a.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}loadSidebarMedia(e,t=!1){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}}const es=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1,b.b.addEventListener("changeScreen",(e,t)=>{t===b.a.medium&&e!==b.a.mobile&&this.toggleSidebar(!1)}),b.b.addEventListener("resize",()=>{this.setColumnProportion()}),this.sharedMediaTab=new Zt(this)}onCloseTab(e,t,s){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,s)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const s=document.body.classList.contains("is-right-column-shown");let i;if(void 0!==e?e?s||(i=!0):s&&(i=!0):i=!0,!i)return Promise.resolve();s||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=nc.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};le.a.appSidebarRight=es;var ts=es;class ss extends H{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=super.open(),s=$e.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");Object(m.a)(i,X.a.wrapEmojiText(s.poll.question));const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);os(n);const a=document.createDocumentFragment();return s.results.results.forEach((t,i)=>{if(!t.voters)return;const o=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");Object(m.a)(c,X.a.wrapEmojiText(r.text));const d=document.createElement("div");d.innerText=Math.round(n[i])+"%",l.append(c,d);const h=_c.createChatList();h.classList.add("poll-results-voters"),_c.setListClickListener(h,()=>{ts.onCloseBtnClick()},void 0,!0),h.style.minHeight=50*Math.min(t.voters,4)+"px",a.append(o,l,h);let p,u=4,g=!1,b=t.voters-4;const v=()=>{g||(g=!0,$e.a.getVotes(e,r.option,p,u).then(e=>{e.votes.forEach(e=>{const{dom:t}=_c.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()}),p&&(b-=e.votes.length,f.lastElementChild.replaceWith(Object(T.d)("PollResults.LoadMore",[Math.min(20,b)]))),p=e.next_offset,u=20,b&&e.votes.length||f.remove()}).finally(()=>{g=!1}))};if(v(),b<=0)return;const f=document.createElement("div");f.classList.add("poll-results-more","show-more","rp-overflow"),f.addEventListener("click",v),Object(te.a)(f);const y=document.createElement("div");y.classList.add("tgico-down"),f.append(y,Object(T.d)("PollResults.LoadMore",[Math.min(20,b)])),a.append(f)}),this.resultsDiv.append(i,a),ts.toggleSidebar(!0).then(()=>{}),t}}var is=s(74);class ns{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add("stacked-avatars"),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const s=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach((e,i)=>{let n=s[i];n||(n=document.createElement("div"),n.classList.add("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new fc,a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)}),Array.from(s).slice(e.length).forEach(e=>e.remove())}}let as=0;const os=e=>{const t=e.reduce((e,t)=>e+Math.round(t),0);if(t>100){const s=t-100,i=e.length;for(let t=0;t=.5&&is&&(s=i,t=n)}if(-1===t)return;e[t]+=1-s}}};a.a.addEventListener("poll_update",({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach(s=>{s.isClosed=!!e.pFlags.closed,s.performResults(t,e.chosenIndexes)})}),a.a.addEventListener("peer_changed",()=>{ls&&rs(ls,cs,ds)}),b.b.addEventListener("resize",()=>{hs.setMaxLength(),hs.resizePolls()}),b.b.addEventListener("changeScreen",()=>{hs.setMaxLength()});const rs=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),ls===e&&cs===t&&ds===s&&(ls=cs=null,ds=0)},200)};let ls,cs,ds;class hs extends HTMLElement{constructor(){super(),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=St.a.width<=360?St.a.width-120:b.b.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){if(!this.MAX_LENGTH)return;Array.from(document.querySelectorAll("poll-element.is-voted")).forEach(e=>{e.svgLines.forEach((t,s)=>{e.setLineProgress(s,1)})})}render(){as||(as=document.getElementById("poll-line").getTotalLength(),hs.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=$e.a.getPoll(e);let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),t.pFlags&&(this.isPublic=!!t.pFlags.public_voters,this.isQuiz=!!t.pFlags.quiz,this.isClosed=!!t.pFlags.closed,this.isMultiple=!!t.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const n=this.isMultiple?'':"",a=t.answers.map((e,t)=>`\n
\n
\n
\n \n \n \n ${n}\n
\n
\n
\n \n \n
\n `).join("");if(this.innerHTML='\n
\n
\n
\n
\n
\n '+a,Object(m.a)(this.firstElementChild,X.a.wrapEmojiText(t.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach((e,s)=>{Object(m.a)(e,X.a.wrapEmojiText(t.answers[s].text))}),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append(Object(T.d)(i)),this.isQuiz&&(this.classList.add("is-quiz"),t.close_period&&t.close_date)){const e=document.createElement("div");e.classList.add("poll-time"),this.descDiv.append(e);const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("poll-quiz-timer"),this.quizTimer=s;const i=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+i),s.append(o),this.descDiv.append(s);const r=1e3*t.close_period,l=1e3*(t.close_date-Ye.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=Te(i),i<=5&&(e.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+s*a,o.style.strokeDasharray=`${a} ${a}`,t>=l&&(clearInterval(this.quizInterval),e.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout(()=>{$e.a.getResults(this.message)},3e3))},1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append(Object(T.d)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",e=>{Object(c.a)(e),ts.isTabExists(ss)||new ss(ts).open(this.message)}),Object(te.a)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append(Object(T.d)("Chat.Poll.SubmitVote")),Object(te.a)(this.sendVoteBtn),t.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),Object(l.b)(this.sendVoteBtn,e=>{Object(c.a)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then(()=>{this.chosingIndexes.length=0,this.answerDivs.forEach(e=>{e.classList.remove("is-chosing")})})}),o.append(this.sendVoteBtn));const r=!(t.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(s,t.chosenIndexes,!1),r&&(this.setVotersCount(s),Object(l.b)(this,this.clickHandler))}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),Object(l.b)(t,s=>{Object(c.a)(s),t.classList.add("active"),((e,t,s)=>{ls&&rs(ls,cs,ds);const i=document.createElement("div");i.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),i.append(n),Object(m.a)(a,X.a.wrapRichText(e,{entities:t})),nc.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),ls=i,cs=s,ds=window.setTimeout(()=>{rs(i,s,ds)},he.a?5e3:7e3)})(e.solution,e.solution_entities,()=>{t.classList.remove("active")})}),this.sentVote){const s=e.results.find(e=>e.pFlags.correct);s&&!s.pFlags.chosen&&t.click()}}}clickHandler(e){const t=Object(Ce.a)(e.target,"poll-answer");if(!t)return;Object(c.a)(e);const s=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(s);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(s)}else this.sendVotes([s])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter((t,s)=>e.includes(s));return t.forEach(e=>{e.classList.add("is-voting")}),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=$e.a.sendVote(this.message,e).then(()=>{t.forEach(e=>{e.classList.remove("is-voting")}),this.classList.remove("disable-hover")}).catch(()=>{this.sentVote=!1}).finally(()=>{this.sendVotePromise=null})}performResults(e,t,s=!0){var i,n;if(a.a.settings.animationsEnabled||(s=!1),this.isQuiz&&((null===(i=e.results)||void 0===i?void 0:i.length)||this.isClosed)){this.answerDivs.forEach((t,s)=>{t.classList.toggle("is-correct",!!e.results[s].pFlags.correct)}),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),Object(k.a)(this.typeDiv,Object(T.d)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?Object(l.b)(this,this.clickHandler):Object(l.c)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map(t=>e.total_voters?t.voters/e.total_voters*100:0);this.classList.toggle("no-transition",!s),s&&Object(is.a)(this,"",!this.isRetracted,340),Object(Le.b)(()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,s),this.percents=t,this.isRetracted=!1})}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map(e=>e.toPeerId()),s=new ns({avatarSize:16});s.render(t),Object(k.a)(this.avatarsDiv,s.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,s=this.isClosed||t,i=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",s),this.viewResults.classList.toggle("hide",i),this.votersCountDiv.classList.toggle("hide",!s||!i)}}setResults(e,t,s){this.svgLines.forEach(e=>e.style.display=""),this.answerDivs.forEach((e,s)=>{e.classList.toggle("is-chosen",t.includes(s))});const i=Math.max(...e);if(this.maxPercents=e.map(e=>e/i),this.isRetracted)this.svgLines.forEach((e,t)=>{this.setLineProgress(t,-1)});else{const e=()=>{this.svgLines.forEach((e,t)=>{this.setLineProgress(t,1)})};s?Object(Le.b)(e):e()}let n;e=e.slice(),os(e);const a=t=>{e.forEach((e,s)=>{const i=n(e,t);this.numberDivs[s].innerText=i+"%"})};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),s)for(let e=9,t=0;e>=0;--e,++t)setTimeout(()=>{a(e)},34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),s)for(let e=0;e<10;++e)setTimeout(()=>{a(e)},34*e);else a(9);if(this.isRetracted){s&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach(e=>e.style.display="none")};s?setTimeout(()=>{this.classList.remove("is-retracting"),e()},340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let s,i=[t];s=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",Object(k.a)(this.votersCountDiv,Object(T.d)(s,i))}setLineProgress(e,t){const s=this.svgLines[e];-1===t?(s.style.strokeDasharray="",s.style.strokeDashoffset=""):(s.style.strokeDasharray=t*this.maxPercents[e]*hs.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*hs.MAX_OFFSET)}}hs.MAX_OFFSET=-46.5,hs.MAX_LENGTH=0,customElements.define("poll-element",hs);var ps=s(99),us=s(141),gs=s(81),ms=s(103),bs=s(153),vs=s(151),fs=s(46),ys=s(88),ws=s(22),Ss=s(172);function Cs(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}var Ls=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let Is=0;function Ms({doc:e,container:t,message:s,boxWidth:i,boxHeight:n,withTail:o,isOut:r,middleware:d,lazyLoadQueue:h,noInfo:p,group:u,onlyPreview:g,withoutPreloader:m,loadPromises:v,noPlayButton:f,size:y,searchContext:w,autoDownload:S}){var C,M;const E=null==S?void 0:S.video;let P=0===E;const k=!(i&&n),T=("video"!==e.type||e.size<=52428800&&!k)&&("gif"===e.type?a.a.settings.autoPlay.gifs:a.a.settings.autoPlay.videos);let x,A;if(!p){x=document.createElement("span"),x.classList.add("video-time"),t.append(x);let s=!1;"gif"!==e.type?(x.innerText=Te(e.duration,!1),f||"round"===e.type||(T&&!P?x.classList.add("tgico","can-autoplay"):s=!0)):(x.innerText="GIF",T||f||(s=!0,P=void 0)),s&&(A=document.createElement("span"),A.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(A))}let O,j={};if("image/gif"===e.mime_type){const a=Ps({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:m,loadPromises:v,autoDownloadSize:E,size:y});return j.thumb=a,j.loadPromise=a.loadPromises.full,j}const _=Cs();if(_.classList.add("media-video"),_.muted=!0,"round"===e.type){const i=document.createElement("div");i.classList.add("media-round","z-depth-1"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,i.message=s;const n=b.b.active.round,a=n.width/2,o=3.5,r=a-2*o;i.innerHTML=`\n \n `;const d=i.firstElementChild.firstElementChild;Is||(Is=2*Math.PI*r),d.style.strokeDasharray=Is+" "+Is,d.style.strokeDashoffset=""+Is,x.classList.add("tgico");s.pFlags.media_unread&&i.classList.add("is-unread");const h=document.createElement("canvas");h.width=h.height=e.w,i.prepend(h,x),i.append(_),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=fe.addMedia(e,!P),s=()=>{(nc.chat.setPeerPromise||Promise.resolve()).finally(()=>{Object(ms.a)(t)||(t.removeEventListener("play",r),t.removeEventListener("timeupdate",o),t.removeEventListener("pause",u),t.removeEventListener("ended",g))})},n=()=>{p.drawImage(t,0,0);const e=Is-t.currentTime/t.duration*Is;return d.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&(Object(ms.a)(t)?(t.paused&&n(),x.innerText=Te(t.duration-t.currentTime,!1)):s())},o=Ie(a),r=()=>{_.classList.add("hide"),i.classList.remove("is-paused"),Object(Pe.b)(n,h),O&&O.preloader&&O.preloader.classList.contains("manual")&&O.onClick()},u=()=>{Object(ms.a)(t)?i.classList.add("is-paused"):s()},g=()=>{_.classList.remove("hide"),i.classList.add("is-paused"),_.currentTime=0,x.innerText=Te(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",r),t.addEventListener("timeupdate",o),t.addEventListener("pause",u),t.addEventListener("ended",g),Object(l.b)(h,s=>{if(Object(c.a)(s),O&&!O.detached&&O.onClick(),t.paused){const s=!!w;if(fe.setSearchContext(w||{peerId:Me.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?Fe(i,e.mid):[];fe.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()}),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(n(),a(),_.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else _.autoplay=!0;let F;if(s){if(F=Ps({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:!0,loadPromises:v,autoDownloadSize:null==S?void 0:S.photo,size:y}),j.thumb=F,!T&&"gif"!==e.type||g)return j.loadPromise=F.loadPromises.full,j;if(o){const e=(F.images.thumb||F.images.full).parentElement;_.width=+e.getAttributeNS(null,"width"),_.height=+e.getAttributeNS(null,"height"),e.append(_)}}else{const t=L.a.getThumb(e,!1);t&&t.promise.then(()=>{_.poster=t.cacheContext.url})}!_.parentElement&&t&&((null==F?void 0:F.aspecter)||t).append(_);const D=ce.a.getCacheContext(e),R=!!(null===(C=null==s?void 0:s.media)||void 0===C?void 0:C.preloader);R?(O=s.media.preloader,O.attach(t,!1),P=void 0):D.downloaded||e.supportsStreaming||m?e.supportsStreaming&&(O=new ye.a({cancelable:!1,attachMethod:"prepend"})):O=new ye.a({attachMethod:"prepend"});const B=Object(ie.a)();if(_.addEventListener("error",e=>{4!==_.error.code&&console.error("Error "+_.error.code+"; details: "+_.error.message),O&&!R&&O.detach(),B.isFulfilled||B.resolve()},{once:!0}),Object(pe.e)(_).then(()=>{u&&I.a.addAnimation(_,u),O&&!R&&O.detach(),B.resolve()}),"video"===e.type){const e=Ie(()=>{_.videoWidth&&(x.innerText=Te(_.duration-_.currentTime,!1))});_.addEventListener("timeupdate",e),A&&_.addEventListener("timeupdate",()=>{us.a.mutateElement(A,()=>{A.remove()})},{once:!0})}_.muted=!0,_.loop=!0,_.autoplay=!0;let N=P&&(null===(M=null==F?void 0:F.preloader)||void 0===M?void 0:M.loadFunc);const U=()=>{O&&P&&!m&&(O.construct(),O.setManual());let i=Promise.resolve();if(O&&!R||m)if(D.downloaded||e.supportsStreaming)e.supportsStreaming&&(P?i=Promise.reject():!D.downloaded&&O&&(O.attach(t,!1,null),_.addEventListener(ae.g?"timeupdate":"canplay",()=>{O.detach()},{once:!0})));else{const s=i=L.a.downloadDoc(e,null==h?void 0:h.queueId,P);O&&O.attach(t,!1,s)}return!P&&N&&(N(),N=null),P=void 0,i.then(()=>{!d||d()?("round"===e.type&&fe.resolveWaitingForLoadMedia(s.peerId,s.mid,s.pFlags.is_scheduled),Object(ps.a)(_,D.url)):B.resolve()},()=>{}),{download:i,render:B}};return O&&!R&&O.setDownloadFunction(U),"gif"!==e.type||T?j.loadPromise=h?(h.push({div:t,load:()=>U().render}),Promise.resolve()):U().render:Object(l.b)(t,e=>{Object(c.a)(e),A.remove(),U()},{capture:!0,once:!0}),j}function Es({message:e,withTime:t,fontWeight:s,voiceAsMusic:n,showSender:o,searchContext:c,loadPromises:d,autoDownloadSize:h,lazyLoadQueue:p,sizeType:u}){var m,b;s||(s=500),u||(u="");const v=0===h,f=e.media.document||e.media.webpage.document,y=e.pFlags.is_outgoing&&(null===(m=e.media)||void 0===m?void 0:m.preloader);if("audio"===f.type||"voice"===f.type||"round"===f.type){const i=new De;return i.withTime=t,i.message=e,i.noAutoDownload=v,i.lazyLoadQueue=p,i.loadPromises=d,n&&(i.voiceAsMusic=n),c&&(i.searchContext=c),o&&(i.showSender=o),y&&(i.preloader=e.media.preloader),i.dataset.fontWeight=""+s,i.dataset.sizeType=u,i.render(),i}let w=f.file_name?f.file_name.split("."):"",S="";S=w.length>1&&Array.isArray(w)?Object(bs.a)(w.pop().split(" ",1)[0].toLowerCase()):"file";let C=document.createElement("div");C.classList.add("document","ext-"+S),C.dataset.docId=""+f.id;const I=document.createElement("div");I.classList.add("document-ico");const M=ce.a.getCacheContext(f);if((null===(b=f.thumbs)||void 0===b?void 0:b.length)||e.pFlags.is_outgoing&&M.url&&"photo"===f.type){C.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(f.type))I.innerHTML=``,t.push(I.firstElementChild);else{const e=Ps({photo:f,message:null,container:I,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:p,size:r.a.choosePhotoSize(f,54,54,!0)});I.style.width=I.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach(e=>e.classList.add("document-thumb"))}else I.innerText=S;let E=f.file_name?X.b.wrapPlainText(f.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const P=[Ee(f.size)];t&&P.push(Object(ne.d)(e.date)),o&&P.push(i.a.wrapSenderToPeer(e)),C.innerHTML=`\n ${M.downloaded&&!y||!e.mid?"":'
'}\n
\n
\n `;const k=C.querySelector(".document-name"),x=new we.a;x.dataset.fontWeight=""+s,x.dataset.sizeType=u,x.textContent=E,k.append(x),o&&k.append(i.a.wrapSentTime(e));if(C.querySelector(".document-size").append(...Object(T.g)(P," · ")),C.prepend(I),!y&&e.pFlags.is_outgoing&&!e.mid)return C;let A,O=null;const j=()=>{if(A){A.classList.add("downloaded");const e=A;setTimeout(()=>{e.remove()},200),A=null}O&&(O=null)},_=e=>{var t;const s=!e||e.isTrusted,i=L.a.getDoc(C.dataset.docId);let n;const o=nc.chat.bubbles?nc.chat.bubbles.lazyLoadQueue.queueId:void 0;if(s)if("pdf"===i.type){const e=L.a.downloading.has(i.id)||M.downloaded;n=L.a.downloadDoc(i,o),e&&n.then(()=>{setTimeout(()=>{const e=ce.a.getCacheContext(i).url;window.open(e)},a.a.settings.animationsEnabled?250:0)})}else n=g.has(i.mime_type)&&(null===(t=i.thumbs)||void 0===t?void 0:t.length)?L.a.downloadDoc(i,o):L.a.saveDocFile(i,o);else n=L.a.downloadDoc(i,o);return A&&(n.then(j),O.attach(A,!0,n)),{download:n}};return L.a.downloading.has(f.id)?(A=C.querySelector(".document-download"),O=new ye.a,O.attach(A,!1,L.a.downloading.get(f.id))):M.downloaded&&!y||(A=C.querySelector(".document-download"),O=e.media.preloader,O?(O.attach(A),e.media.promise.then(j)):(O=new ye.a,O.construct(),O.setManual(),O.attach(A),O.setDownloadFunction(_),void 0!==h&&h>=f.size&&Object(l.d)(O.preloader))),Object(l.b)(C,e=>{O?O.onClick(e):_(e)}),C}function Ps({photo:e,message:t,container:s,boxWidth:i,boxHeight:n,withTail:o,isOut:l,lazyLoadQueue:c,middleware:d,size:h,withoutPreloader:p,loadPromises:u,autoDownloadSize:g,noBlur:m,noThumb:v,noFadeIn:f,blurAfter:y}){var w;if(!e.sizes&&!e.thumbs)return i&&n&&!h&&"document"===e._&&r.a.setAttachmentSize(e,s,i,n,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};let S=0===g;h||(void 0===i&&(i=b.b.active.regular.width),void 0===n&&(n=b.b.active.regular.height)),s.classList.add("media-container");let C,I,M,E=s,P=!0,k=Promise.resolve();const T="document"===e._&&"image/gif"===e.mime_type&&!h;if(I=new Image,i&&n&&!h){const a=r.a.setAttachmentSize(e,s,i,n,void 0,t,void 0,T?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=a.photoSize,P=a.isFit,M=ce.a.getCacheContext(e,h.type),!P){E=document.createElement("div"),E.classList.add("media-container-aspecter"),E.style.width=a.size.width+"px",E.style.height=a.size.height+"px";const i=r.a.getStrippedThumbIfNeeded(e,M,!m,!0);if(i){k=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{Ps({container:s,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:c,isOut:l,loadPromises:u,middleware:d,withoutPreloader:p,withTail:o,autoDownloadSize:g,noBlur:m,noThumb:!0,blurAfter:!0}).images.full.classList.add("media-photo","thumbnail")}s.classList.add("media-container-fitted"),s.append(E)}}else h||(h=r.a.choosePhotoSize(e,i,n,!0)),M=ce.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,M,!m);t&&(k=Promise.all([k,t.loadPromise]),C=t.image,C.classList.add("media-photo"),E.append(C))}I.classList.add("media-photo");const x=(C||!M.downloaded)&&a.a.settings.animationsEnabled&&!f;let A;(null===(w=null==t?void 0:t.media)||void 0===w?void 0:w.preloader)&&!p?(A=t.media.preloader,A.attach(s),S=void 0):M.downloaded||(A=new ye.a({attachMethod:"prepend"}));const O=e=>ks(s,I,e,x,E,C),j=()=>{if(d&&!d())return Promise.resolve();if(y){const e=Object(vs.a)(M.url,12);return e.promise.then(()=>O(e.canvas.toDataURL()))}return O(M.url)};let _;const F=h.w>=150&&h.h>=150||S,D=()=>{S&&!p&&A&&(A.construct(),A.setManual());const t=T&&!h?L.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,S);A&&!M.downloaded&&!p&&F&&A.attach(s,!1,t),S=void 0;const i=t.then(j);return i.catch(()=>{}),{download:t,render:i}};return A&&A.setDownloadFunction(D),M.downloaded?k=_=D().render:c?c.push({div:s,load:()=>D().download}):_=D().render,u&&k&&u.push(k),{loadPromises:{thumb:k,full:_||Promise.resolve()},images:{thumb:C,full:I},preloader:A,aspecter:E}}function ks(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(ps.a)(t,s,()=>{us.a.mutateElement(e,()=>{n.append(t),Object(Le.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{us.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function Ts({size:e,doc:t,middleware:s,target:i,side:n,skipRatio:a,play:o}){const r=document.createElement("div");r.classList.add("emoji-animation"),r.style.width=e+"px",r.style.height=e+"px";const l=xs({div:r,doc:t,middleware:s,withThumb:!1,needFadeIn:!1,loop:!1,width:e,height:e,play:o,group:"none",skipRatio:a}).then(e=>(Object(ys.a)(e),e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(e.remove(),r.remove(),nc.chat.bubbles.scrollable.container.removeEventListener("scroll",g))}),Ss.a&&e.addEventListener("firstFrame",()=>{navigator.vibrate(100)},{once:!0}),e)),c=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},d=c(16),h=c(4),p=e/8*("right"===n?1:-1),u=()=>{if(!Object(ms.a)(i))return;const t=i.getBoundingClientRect(),s=("right"===n?t.right:t.left)+("center"===n?(t.width-e)/2:("right"===n?-e:0)+p+d),a=t.top+(t.height-e)/2+("center"===n?0:h);r.style.top=a+"px",r.style.left=s+"px"},g=Ie(u);return nc.chat.bubbles.scrollable.container.addEventListener("scroll",g),u(),nc.emojiAnimationContainer.append(r),{animationDiv:r,stickerPromise:l}}function xs({doc:e,div:t,middleware:s,lazyLoadQueue:n,group:o,play:d,onlyThumb:h,emoji:p,width:u,height:g,withThumb:m,loop:b,loadPromises:f,needFadeIn:y,needUpscale:w,skipRatio:S,static:C}){var M;const E=e.sticker;if(1===E&&(C=!0),u||(u=p?void 0:200),g||(g=p?void 0:200),2===E&&oe.a.loadLottieWorkers(),!E)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");let P;if(t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper"),C&&1!==E){const t=r.a.choosePhotoSize(e,u,g,!1);P=ce.a.getCacheContext(e,t.type)}else P=ce.a.getCacheContext(e);const k=p?Object(se.d)(p):-1,T=P.downloaded&&!y,x=!C&&(2===E||3===E),A=x;let O=Object(ie.a)(),j=!1;if(((null===(M=e.thumbs)||void 0===M?void 0:M.length)||e.stickerCachedThumbs)&&!t.firstElementChild&&(!T||A||h)&&!1!==m){let i,a=e.stickerCachedThumbs&&e.stickerCachedThumbs[k]||e.thumbs[0];const o=()=>{t.childElementCount||(i.classList.add("media-sticker","thumbnail"),us.a.mutateElement(t,()=>{t.append(i),O.resolve()}))};if("url"in a)i=new Image,Object(ps.a)(i,a.url,o),j=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a),i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("rlottie-vector","media-sticker","thumbnail"),i.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const n=document.createElementNS("http://www.w3.org/2000/svg","path");n.setAttributeNS(null,"d",s),i.append(n),t.append(i)}else a=e.thumbs.find(e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length})||a;a&&"photoPathSize"!==a._&&k<=0&&(i=new Image,fs.a||e.pFlags.stickerThumbConverted||P.url?(Object(ps.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o),j=!0):re.a.convert(""+e.id,a.bytes).then(n=>{a.bytes=n,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(ps.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o)}).catch(()=>{}))}else if((2===E&&k<=0||3===E)&&(m||h)){i=new Image;const r=()=>{if(t.childElementCount||s&&!s())return;const n=()=>{t.childElementCount||s&&!s()||Object(ps.a)(i,P.url,o)};return P.url?(n(),Promise.resolve()):L.a.getThumbURL(e,a).promise.then(n)};if(n&&h)return n.push({div:t,load:r}),Promise.resolve();r(),a.url&&(j=!0)}}if(f&&j&&f.push(O),h)return Promise.resolve();const _=()=>Ls(this,void 0,void 0,(function*(){if(!s||s()){if(2===E&&!C)return yield L.a.downloadDoc(e,null==n?void 0:n.queueId).then(n=>Ls(this,void 0,void 0,(function*(){if(s&&!s())throw new Error("wrapSticker 2 middleware");let r=yield oe.a.loadAnimationWorker({container:t,loop:b&&!p,autoplay:d,animationData:n,width:u,height:g,name:"doc"+e.id,needUpscale:w,skipRatio:S,toneIndex:k},o,s);if(r.addEventListener("firstFrame",()=>{const s=t.firstElementChild;!1!==y&&(y=(y||!s||"svg"===s.tagName)&&a.a.settings.animationsEnabled);const i=()=>{s&&s!==r.canvas&&s.remove()};y?us.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{us.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&us.a.mutate(i),!1!==m&&L.a.saveLottiePreview(e,r.canvas,k)},{once:!0}),p){const e={a:[],v:1};let n;gs.a.preloadAnimatedEmojiStickerAnimation(p),Object(l.b)(t,a=>Ls(this,void 0,void 0,(function*(){Object(c.a)(a);const o=oe.a.getAnimation(t);if(o.paused){const e=gs.a.getAnimatedEmojiSoundDocument(p);if(e){const s=document.createElement("audio");s.style.display="none",t.parentElement.append(s);try{yield L.a.downloadDoc(e);const t=ce.a.getCacheContext(e);s.src=t.url,s.play(),yield Object(pe.e)(s,void 0,!0),s.addEventListener("ended",()=>{s.src="",s.remove()},{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}if(!nc.chat.peerId.isUser())return;const r=gs.a.getAnimatedEmojiSticker(p,!0);if(!r)return;const l=Object(Ce.a)(t,"bubble"),d=l.classList.contains("is-out"),{animationDiv:h}=Ts({doc:r,middleware:s,side:d?"right":"left",size:280,target:t,play:!0});l&&(d?h.classList.add("is-out"):h.classList.add("is-in")),n||(n=Object(ws.a)(()=>{if(!e.a.length)return;const s=e.a[0].t;e.a.forEach(e=>{e.t=(e.t-s)/1e3});const n=Object(Ce.a)(t,"bubble");i.a.setTyping(nc.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:v.a.getServerMessageId(+n.dataset.mid),emoticon:p,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0},1e3,!1)),a.isTrusted&&(e.a.push({i:1,t:Date.now()}),n())})))}return r})));if(C||3===E){let i;C?i=new Image:(i=Cs(),i.muted=!0,d&&(i.autoplay=!0,i.loop=!0));const l=t.firstElementChild!==i&&t.firstElementChild;return!1!==y&&(y=(y||!T||(C?l:!l||"svg"===l.tagName))&&a.a.settings.animationsEnabled),i.classList.add("media-sticker"),y&&i.classList.add("fade-in"),new Promise((a,c)=>{const d=()=>{if(s&&!s())return a();const n=()=>{us.a.mutateElement(t,()=>{if(t.append(i),l&&l.classList.add("fade-out"),3===E&&!L.a.isSavingLottiePreview(e,k)){Object(ys.a)(i);const t=document.createElement("canvas");t.width=u*window.devicePixelRatio,t.height=g*window.devicePixelRatio;t.getContext("2d").drawImage(i,0,0,t.width,t.height),L.a.saveLottiePreview(e,t,k)}3===E&&o&&I.a.addAnimation(i,o),a(),y&&i.addEventListener("animationend",()=>{i.classList.remove("fade-in"),l&&l.remove()},{once:!0})})};C?Object(ps.a)(i,P.url,n):(i.src=P.url,Object(pe.e)(i).then(n))};if(P.url)d();else{let t;if(2===E&&C){const s=r.a.choosePhotoSize(e,u,g,!1);t=L.a.getThumbURL(e,s).promise}else t=L.a.downloadDoc(e,null==n?void 0:n.queueId);t.then(d,a)}})}}})),F=!n||T&&!x?_():(n.push({div:t,load:_}),Promise.resolve());return T&&C&&(O=F,f&&f.push(O)),F}function As({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return Ls(this,void 0,void 0,(function*(){if(null===(r=e.thumbs)||void 0===r?void 0:r.length)return s.classList.add("media-sticker-wrapper"),void t.push({div:s,load:()=>{const t=gs.a.getStickerSetThumbDownloadOptions(e),r=ce.a.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then(t=>{oe.a.loadAnimationWorker({container:s,loop:!0,autoplay:n,animationData:t,width:a,height:o,needUpscale:!0,name:"setThumb"+e.id},i)});{let t;return e.pFlags.videos?(t=Cs(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then(e=>{Object(ps.a)(t,URL.createObjectURL(e),()=>{s.append(t)})})}}});const l=gs.a.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&xs({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function Os({doc:e,row:t,size:s}){const i=t.media,n=t.createMedia("small");i&&n.classList.add("hide");const a=i?[]:void 0,o="small"===s?32:48,r=xs({div:n,doc:e,width:o,height:o,loadPromises:a});return a&&Promise.all(a).then(()=>{n.classList.remove("hide"),i.remove()}),r}function js(e,t,s){const i=new Ue("reply");return i.fill(e,t,s),i.container}function _s(e){const t=new qe(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&Ke),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&Ge),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=i+"px",o.style.height=a+"px";const r=o.children;t.forEach(({geometry:t,sides:s},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/i*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/i*100+"%",s&We&&s&Ve&&(l.style.borderTopLeftRadius="inherit"),s&We&&s&Ge&&(l.style.borderBottomLeftRadius="inherit"),s&Ke&&s&Ve&&(l.style.borderTopRightRadius="inherit"),s&Ke&&s&Ge&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Fs({groupId:e,attachmentDiv:t,middleware:s,uploading:n,lazyLoadQueue:a,isOut:o,chat:l,loadPromises:c,autoDownload:d}){const h=[],p=i.a.getMidsByAlbum(e);for(const e of p){const t=l.getMessage(e),s=t.media.photo||t.media.document,i="photo"===s._?r.a.choosePhotoSize(s,480,480):{w:s.w,h:s.h};h.push({size:i,media:s,message:t})}_s({container:t,items:h.map(e=>({w:e.size.w,h:e.size.h})),maxWidth:b.b.active.album.width,minWidth:100,spacing:2,forMedia:!0}),h.forEach((e,i)=>{const{size:n,media:r,message:l}=e,h=t.children[i];h.dataset.mid=""+l.mid,h.dataset.peerId=""+l.peerId;const p=h.firstElementChild;"photo"===r._?Ps({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,autoDownloadSize:d.photo}):Ms({doc:l.media.document,container:p,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:s,loadPromises:c,autoDownload:d})})}b.b.addEventListener("changeScreen",(e,t)=>{if(t===b.a.mobile||e===b.a.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=b.b.active.round.width,s=t/2,i=s-7;Is=2*Math.PI*i,e.forEach(e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+s),n.setAttributeNS(null,"cy",""+s),n.setAttributeNS(null,"r",""+i),n.style.strokeDasharray=Is+" "+Is,n.style.strokeDashoffset=""+Is})}}),a.a.addEventListener("download_start",e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach(e=>{e.querySelector(".preloader-container.manual")&&Object(l.d)(e)})});var Ds=s(93),Rs=s(113),Bs=s(95);function Ns(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(Bs.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}var Us=s(144);class Hs{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(Rs.a)(),Object(w.a)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach(e=>{this.update(e.id,!0)}),this.onSort&&this.sorted.forEach((e,t)=>{this.onSort(e,t)})}updateList(e){const t=this.middleware.get();this.updateListWith(s=>{if(!t()||void 0!==s&&!s)return e(!1);this._updateList(),e(!0)})}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,s,i=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,i,n,s),n}delete(e,t){const s=this.elements.get(e);if(!s)return!1;this.elements.delete(e);const i=this.sorted.indexOf(s);if(-1!==i&&this.sorted.splice(i,1),this.onDelete)if(t)this.onDelete(s);else{const e=this.middleware.get();this.updateElementWith(()=>{e()&&this.onDelete(s)})}return!0}update(e,t=!1,s=this.get(e),i){if(!s)return;s.index=this.getIndex(s),this.onUpdate&&this.onUpdate(s);const n=Object(Us.a)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var zs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Vs extends Hs{constructor(e={}){let t;super({getIndex:e.getIndex||(e=>E.a.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>{const t=E.a.getUserStatusString(e.id);Object(k.a)(e.dom.lastMessageSpan,t)}),onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Ns(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=_c.addDialogNew({dialog:e.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:Le.b,updateListWith:e=>zs(this,void 0,void 0,(function*(){return Object(ms.a)(this.list)?(yield Object(Ds.c)(),Object(ms.a)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,Object(w.a)(this,e),this.list=_c.createChatList(this.createChatListOptions);const s=()=>{t=window.setTimeout(()=>{this.updateList(e=>{e&&s()})},Vs.SORT_INTERVAL)};s()}}Vs.SORT_INTERVAL=3e4;var Ks=s(169);function Gs(e){let t=!1;return new Qt(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Ce.a)(t.target,"progress-line")&&!Object(Ks.a)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(s,i,n)=>{if(!t&&Math.abs(i)>20)return!0;if(Math.abs(s)>Math.abs(i))Object(c.a)(n),t=!0;else if(!t&&Math.abs(i)>Math.abs(s))return!0;return e.onSwipe(s,i,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Ws(e){return Gs(Object.assign(Object.assign({},e),{onSwipe:(t,s,i)=>{if(Math.abs(t)>50)return e.onSwipe(t,s,i),Object(ee.b)(),!0}}))}var qs=s(121);const Qs=e=>{if(e.element)return e.element;const{icon:t,text:s,onClick:i,checkboxField:n,noCheckboxClickListener:a}=e,o=document.createElement("div");o.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:"");let r=e.textElement;r||(r=e.textElement=s?Object(T.d)(s,e.textArgs):document.createElement("span"),e.regularText&&(r.innerHTML=e.regularText)),r.classList.add("btn-menu-item-text"),o.append(r);const d=!!n||!!e.keepOpen;return i&&Object(l.b)(o,e=>{Object(c.a)(e);const t=Object(Ce.a)(e.target,"btn-menu");if(t&&!t.classList.contains("active"))return;!1!==i(e)&&(d||Object(ee.c)(),n&&!a&&(n.checked="radio"===n.input.type||!n.checked))},e.options),n&&o.append(n.label),e.element=o};var $s=(e,t)=>{const s=document.createElement("div");s.classList.add("btn-menu"),t&&e.forEach(e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}});const i=e.map(Qs);return s.append(...i),s},Ys=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Xs extends Pt{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>Ys(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}nc.setInnerPeer({peerId:s}),nc.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class Js{constructor(e,t,s,n){const r=new wt.a({peerId:e}).element;t=t.slice();const l=(a,o)=>{n&&n(),"scheduled"===s?i.a.deleteScheduledMessages(e,t):i.a.deleteMessages(e,t,!!a.size||o)};let c,d,h,p,u,g=[];if(1===t.length?c="DeleteSingleMessagesTitle":(c="DeleteMessagesTitle",d=[Object(T.d)("messages",[t.length])]),h=o.a.isMegagroup(e)?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:l}],e===a.a.myId||"scheduled"===s);else if(e.isUser())g.push({text:"DeleteMessagesOptionAlso",textArgs:[r]});else{const s=G.a.getChat(e.toChatId()),n=G.a.hasRights(e.toChatId(),"delete_messages");if("chat"===s._){const s=n?t.slice():t.filter(t=>i.a.getMessageByPeer(e,t).fromId===a.a.myId);s.length&&(s.length===t.length?g.push({text:"DeleteForAll"}):(g.push({text:"DeleteMessagesOption"}),h="DeleteMessagesTextGroup",p=[Object(T.d)("messages",[s.length])]))}else u[0].callback=e=>l(e,!0)}Object(ht.a)(u);new ut("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:g}).show()}}var Zs=s(159);class ei{constructor(e,t,s){let n,a,o=[];n=`Send Message${t.length>1?"s":""} Now`,a=t.length>1?"Send "+t.length+" messages now?":"Send message now?";o.push({langKey:"Send",callback:()=>{s&&s(),i.a.sendScheduledMessages(e,t)}});new ut("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var ti=s(38);function si(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var ii=s(116);const ni=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class ai extends D.a{constructor(e){if(super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.cancelSelection=e=>{e&&(this.doNotAnimate=!0),this.onCancelSelection&&this.onCancelSelection(),this.selectedMids.clear(),this.toggleSelection(),si(),e&&(this.doNotAnimate=void 0)},Object(w.a)(this,e),this.navigationType="multiselect-"+Object(st.b)(),he.a)return this.listenerSetter.add(this.listenElement)("touchend",()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")}),void Object(ee.a)(this.listenElement,e=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),this.listenElement.addEventListener("touchend",e=>{Object(c.a)(e),document.body.classList.remove("no-select")},{once:!0,capture:!0}),si();const t=this.getElementFromTarget(e.target);t&&this.toggleByElement(t)},this.listenerSetter);const t=(e,t)=>{if(e===t)return[];const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=(s.top-i.top||s.left-i.left)<0,a=Object(Ce.a)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);n||([l,r]=[r,l]);return o.slice(r+1,l)};this.listenerSetter.add(this.listenElement)("mousedown",e=>{const s=Object(Ce.a)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,s))return;const i=new Map;let n,a=s;const o=(e,s=!0)=>{const r=+e.dataset.mid;if(!r||!e.dataset.peerId)return;const l=e.dataset.peerId.toPeerId();Object(ms.a)(a)||(a=e);let c=i.get(l);if(c||i.set(l,c=new Set),!c.has(r)){const d=this.isMidSelected(l,r);if(void 0===n&&(n=!d),c.add(r),n&&!d||!n&&d){const n=ni(i);if(this.toggleByElement&&s){n<2&&Object(ii.a)(e,a)&&(a=e);const s=t(a,e);s.length&&s.forEach(e=>{o(e,!1)})}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===n&&this.toggleByMid)for(const[e,t]of i)for(const s of t)this.toggleByMid(e,s)}}};let r=!1;const d=e=>{r||(si(),r=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,n)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,p)):void o(t)},h=e=>{i.size&&Object(l.b)(window,c.a,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),si()},p={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,p)})}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const s=!!this.getCheckboxInputFromElement(e);if(t){if(s)return!1;const t=new pt.a({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else s&&this.getCheckboxInputFromElement(e).parentElement.remove();return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){const t=this.selectedMids.size;if(!t&&!e)return;let s=!t,i=!t,n=!t;for(const[e,t]of this.selectedMids){const n=this.isScheduled?this.appMessagesManager.getScheduledMessagesStorage(e):this.appMessagesManager.getMessagesStorage(e);for(const e of t){const t=this.appMessagesManager.getMessageFromStorage(n,e);if(s||(s=!this.appMessagesManager.canForward(t)),i||(i=!this.appMessagesManager.canDeleteMessage(t)),s&&i)break}if(s&&i)break}this.onUpdateContainer&&this.onUpdateContainer(s,i,n)}toggleSelection(e=!0,t=!1){const s=this.isSelecting,i=this.selectedMids.size;if(this.isSelecting=!!i||t,s===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),he.a||(this.listenElement.classList.toggle("no-select",this.isSelecting),s&&si()),Object(ti.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),ae.f||(n?F.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):F.a.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0);this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),Object(is.a)(e,"is-selected",t,200)}isMidSelected(e,t){const s=this.selectedMids.get(e);return null==s?void 0:s.has(t)}length(){return ni(this.selectedMids)}toggleMid(e,t,s){let i=this.selectedMids.get(e);if(s||void 0===s&&(null==i?void 0:i.has(t)))i&&(i.delete(t),i.size||this.selectedMids.delete(e));else{if(a.a.config.forwarded_count_max-this.length()-1<0)return ot(T.c.format("Chat.Selection.LimitToast",!0)),!1;i||(i=new Set,this.selectedMids.set(e,i)),i.add(t)}return!0}deleteSelectedMids(e,t){const s=this.selectedMids.get(e);s&&(t.forEach(e=>{s.delete(e)}),s.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class oi extends ai{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Ce.a)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,s=e.dataset.peerId.toPeerId();this.toggleMid(s,t)&&this.updateElementSelection(e,this.isMidSelected(s,t))},this.toggleByMid=(e,t)=>{const s=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(s)},this.onUpdateContainer=(e,t,s)=>{const i=this.length();Object(k.a)(this.selectionCountEl,Object(T.d)("messages",[i])),this.selectionGotoBtn.classList.toggle("hide",1!==i),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if(Object(is.a)(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}),Object(is.a)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=N(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",()=>this.cancelSelection(),{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=N(`message ${e}-goto`);const s={listenerSetter:this.listenerSetter};Object(l.b)(this.selectionGotoBtn,()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),a.a.dispatchEvent("history_focus",{peerId:e,mid:t})},s),this.selectionForwardBtn=N(`forward ${e}-forward`),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Xs(e,()=>{this.cancelSelection()})},s),this.isPrivate&&(this.selectionDeleteBtn=N(`delete danger ${e}-delete`),Object(l.b)(this.selectionDeleteBtn,()=>{const e=[...this.selectedMids.keys()][0];new Js(e,[...this.selectedMids.get(e)],"chat",()=>{this.cancelSelection()})},s)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const i=this.selectionContainer;i.style.opacity="0",this.searchSuper.navScrollableContainer.append(i),i.offsetLeft,i.style.opacity=""}},this.isPrivate=!e.showSender}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e){Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach(e=>{this.toggleElementCheckbox(e,this.isSelecting)})}return s}}class ri extends ai{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Ce.a)(e,"grouped-item")||Object(Ce.a)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,s)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===s&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=s,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const e=this.selectedMids.get(this.bubbles.peerId);if(e){this.chat.getMidsByMid(t).forEach(t=>e.delete(t))}}return void this.bubbles.getBubbleGroupedItems(e).forEach(this.toggleByElement)}if(!this.toggleMid(this.bubbles.peerId,t))return;if(e.classList.contains("grouped-item")){const s=Object(Ce.a)(e,"bubble"),i=this.isGroupedBubbleSelected(s),n=this.isGroupedMidsSelected(t);(n||i)&&this.updateElementSelection(s,n)}this.updateElementSelection(e,this.isMidSelected(this.bubbles.peerId,t))},this.toggleByMid=(e,t)=>{const s=this.bubbles.getMountedBubble(t);s&&this.toggleByElement(s.bubble)},this.onToggleSelection=(e,t)=>{const{needTranslateX:s,widthFrom:i,widthTo:n}=this.chat.input.center(t);Object(is.a)(this.listenElement,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)});const a=ithis.cancelSelection(),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=Object(B.a)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append(Object(T.d)("MessageScheduleSend")),Object(l.b)(this.selectionSendNowBtn,()=>{new ei(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],()=>{this.cancelSelection()})},e)):(this.selectionForwardBtn=Object(B.a)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append(Object(T.d)("Forward")),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Xs(e,()=>{this.cancelSelection()})},e)),this.selectionDeleteBtn=Object(B.a)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append(Object(T.d)("Delete")),Object(l.b)(this.selectionDeleteBtn,()=>{new Js(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],this.chat.type,()=>{this.cancelSelection()})},e);const s=this.selectionLeft=document.createElement("div");s.classList.add("selection-container-left"),s.append(t,this.selectionCountEl);const i=this.selectionRight=document.createElement("div");i.classList.add("selection-container-right"),i.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==a&&(s.style.transform=`translateX(${-a}px)`,i.style.transform=`translateX(${a}px)`),this.selectionContainer.append(s,i),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",s.style.transform="",i.style.transform=""}}else this.selectionLeft&&void 0!==a&&(this.selectionLeft.style.transform=`translateX(-${a}px)`,this.selectionRight.style.transform=`translateX(${a}px)`)},this.onUpdateContainer=(e,t,s)=>{Object(k.a)(this.selectionCountEl,Object(T.d)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",s),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>{for(const[e,t]of this.selectedMids)for(const e of t){const t=this.bubbles.getMountedBubble(e);t&&this.toggleByElement(t.bubble)}}}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e)for(const e in this.bubbles.bubbles){const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return s}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const s=super.toggleElementCheckbox(e,t);if(s){e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach(e=>this.toggleElementCheckbox(e,t))}return s}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(+e.dataset.mid))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}isGroupedMidsSelected(e){const t=this.chat.getMidsByMid(e),s=t.filter(e=>this.isMidSelected(this.bubbles.peerId,e));return t.length===s.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}var li=s(149),ci=s(183),di=s(158),hi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class pi{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{a.a.dispatchEvent("history_focus",{peerId:this.peerId,mid:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionForwardBtn):new Xs({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionDeleteBtn):new Js(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Ce.a)(e.target,"search-super-item")}catch(e){}if(s){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.target=s,this.peerId=s.dataset.peerId.toPeerId(),this.mid=+s.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),this.buttons.forEach(e=>{let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||e.verify()),e.element.classList.toggle("hide",!t)}),s.classList.add("menu-open"),Object(ee.e)(e,this.element),Object(ee.d)(this.element,()=>{s.classList.remove("menu-open")})}};he.a||Object(ee.a)(e,s)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>i.a.canForward(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>i.a.canDeleteMessage(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=$s(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class ui{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new Z.d,this.middleware=Object(Rs.a)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=Object(Y.b)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},Object(w.a)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new pi(this.container,this),this.selection=new oi(this,i.a);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const s=this.navScrollable=new P.a(t);s.container.classList.add("search-super-nav-scrollable");const n=this.nav=document.createElement("nav");n.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=n,s.container.append(n);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("i");s.append(Object(T.d)(e.name)),s.append(i),t.append(s),Object(te.a)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),he.a&&Ws({element:this.tabsContainer,onSwipe:(e,t,s)=>{const i=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=i+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{Object(c.a)(e)};let s=2;const i=()=>{--s||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",i,{once:!0}),i}(this.tabsContainer),this.selectTab(o))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const s=document.createElement("div");s.classList.add("search-super-content-"+e.type),t.append(s),this.tabsContainer.append(t),this.tabs[e.inputFilter]=s,e.contentTab=s}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new x(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&!this.loaded[this.mediaTab.inputFilter]&&this.load(!0)},this.selectTab=Object(J.a)(this.tabsMenu,this.tabsContainer,(e,t,s)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const i=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(i);const n=this.mediaTab;if(this.mediaTab=i,-1!==this.prevTabId&&s&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(i.scroll={scrollTop:n,scrollHeight:0})}if(i.scroll){const e=n.scroll.scrollTop-i.scroll.scrollTop;e&&(i.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||i.contentTab.childElementCount||this.load(!0),this.prevTabId=e},()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()},void 0,s),Object(l.b)(this.tabsContainer,e=>{this.selection.isSelecting&&(Object(c.a)(e),this.selection.toggleByElement(Object(Ce.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Ce.a)(n.target,e);if(!a)return;const o=+a.dataset.mid;if(!o)return void this.log.warn("no messageId by click on target:",a);const r=a.dataset.peerId.toPeerId(),l=Array.from(this.tabs[s].querySelectorAll("."+t)).map(t=>{const s=Object(Ce.a)(t,e);return{element:t,mid:+s.dataset.mid,peerId:s.dataset.peerId.toPeerId()}}),c=l.findIndex(e=>e.mid===o&&e.peerId===r),d=i.a.getMessageByPeer(r,o);(new cc).setSearchContext(this.copySearchContext(s)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))};Object(l.b)(this.tabs.inputMessagesFilterPhotoVideo,o.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),Object(l.b)(this.tabs.inputMessagesFilterDocument,o.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],Object(Ds.a)(()=>{this.lazyLoadQueue.lock()},()=>{this.lazyLoadQueue.unlockAndRefresh()})}filterMessagesByType(e,t){return i.a.filterMessagesByInputFilter(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const{dialog:s,dom:i}=_c.addDialogNew({dialog:e.peerId,container:t.list,drawStatus:!1,avatarSize:54});_c.setLastMessage(s,e,i,this.searchContext.query)}processPhotoVideoFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){const a=i.a.getMediaFromMessage(e),o=document.createElement("div");let l;o.classList.add("grid-item");const c=r.a.choosePhotoSize(a,200,200);l="photo"!==a._?Ms({doc:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:c}).thumb:Ps({photo:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,withoutPreloader:!0,noBlur:!0,size:c}),[l.images.thumb,l.images.full].filter(Boolean).forEach(e=>{e.classList.add("grid-item-media")}),t.push(l.loadPromises.thumb),n.push({element:o,message:e})}processDocumentFilter({message:e,elemsToAppend:t,inputFilter:s}){const n=i.a.getMediaFromMessage(e),a=this.showSender||["voice","round"].includes(n.type),o=Es({message:e,withTime:!a,fontWeight:400,voiceAsMusic:!0,showSender:a,searchContext:this.copySearchContext(s),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});["audio","voice","round"].includes(n.type)&&o.classList.add("audio-48"),t.push({element:o,message:e})}processUrlFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){var a;let o=null===(a=e.media)||void 0===a?void 0:a.webpage;if(!o){const t=e.totalEntities?e.totalEntities.find(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._):null;let s,i,n;if(t)n=e.message.slice(t.offset,t.offset+t.length);else{const t=X.b.matchUrl(e.message);if(!t)return;s=t[0]}s="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:s||n,i=s;const a=e.message===s;s.match(/^(ftp|http|https):\/\//)||(i="https://"+s,s=s.includes("@")?s:"https://"+s),i=new URL(i).hostname,o={_:"webPage",url:s,display_url:i,id:"",hash:0},a||(o.description=e.message)}let l=document.createElement("div");if(l.classList.add("preview","row-media"),o.photo){Ps({container:l,message:null,photo:o.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,size:r.a.choosePhotoSize(o.photo,60,60,!1),loadPromises:t,noBlur:!0})}else l.classList.add("empty"),Object(m.a)(l,X.b.getAbbreviation(o.title||o.display_url||o.description||o.url,!0));let c=di.a.wrapTitle(o);const d=di.a.wrapDescription(o),h=Object(Zs.a)(X.b.wrapRichText(o.url||"")).firstElementChild;if(h instanceof HTMLAnchorElement)try{h.innerText=decodeURIComponent(h.href)}catch(e){}d.firstChild&&d.append("\n"),d.append(h),this.showSender&&d.append("\n",i.a.wrapSenderToPeer(e)),c.textContent||c.append(X.b.wrapPlainText(o.display_url.split("/",1)[0]));const p=new Ze({title:c,titleRight:i.a.wrapSentTime(e),subtitle:d,havePadding:!0,clickable:!0,noRipple:!0});p.container.append(l),p.container.innerText.trim().length&&n.push({element:p.container,message:e})}performSearchResult(e,t,s=!0){return hi(this,void 0,void 0,(function*(){const i=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield Object(Ds.c)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const c={elemsToAppend:i,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let d;switch(l){case"inputMessagesFilterEmpty":d=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":d=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":d=this.processDocumentFilter;break;case"inputMessagesFilterUrl":d=this.processUrlFilter}if(d){d=d.bind(this);for(const t of e)try{c.message=t,d(c)}catch(e){this.log.error("error rendering filter",l,c,t,e)}}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(i.length){const e=s?"append":"prepend";i.forEach(t=>{const{element:s,message:i}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?i.date:0,l);s.classList.add("search-super-item"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,n.items[e](s),this.selection.isSelecting&&this.selection.toggleElementCheckbox(s,!0)})}this.afterPerforming("inputMessagesFilterEmpty"===l?1:e.length,n)}}))}afterPerforming(e,t){if(t){const s=t.parentElement;if(Array.from(s.children).slice(1).forEach(e=>{e.remove()}),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),s.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const s=this.searchContext.query;if(s){const r=(t,i,r=!1)=>{t.forEach(t=>{if(e.has(t))return;e.add(t);const l=o.a.getPeer(t),{dom:c}=_c.addDialogNew({dialog:t,container:i.list,drawStatus:!1,avatarSize:48,autonomous:i.autonomous});if(r&&(l.participants_count||l.participants)){const e=new RegExp(`(${Object(ci.a)(s)}|${Object(ci.a)(Object(bs.b)(s))})`,"gi");c.titleSpan.innerHTML=c.titleSpan.innerHTML.replace(e,"$1"),c.lastMessageSpan.append(n.default.getChatMembersString(t.toChatId()))}else if(t===a.a.myId)c.lastMessageSpan.append(Object(T.d)("Presence.YourChat"));else{let e=o.a.getPeerUsername(t);if(e)e="@"+e;else{const s=E.a.getUser(t);s&&s.phone&&(e="+"+Object(qs.a)(s.phone).formatted)}c.lastMessageSpan.innerHTML=""+e+""}}),i.toggle()},c=e=>{if(t())return e};return Promise.all([E.a.getContactsPeerIds(s,!0).then(c).then(e=>{e&&r(e,this.searchGroups.contacts,!0)}),E.a.searchContacts(s,20).then(c).then(e=>{if(e&&(r(e.my_results,this.searchGroups.contacts,!0),r(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new T.c.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),Object(l.b)(e,()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()})}}),i.a.getConversations(s,0,20,0).promise.then(c).then(e=>{e&&r(e.dialogs.map(e=>e.peerId),this.searchGroups.contacts,!0)})])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>M.c.getState().then(s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach(e=>{let{dialog:t,dom:s}=_c.addDialogNew({dialog:e,container:this.searchGroups.recent.list,drawStatus:!1,meAsSaved:!0,avatarSize:48,autonomous:!0});s.lastMessageSpan.append(e.isUser()?E.a.getUserStatusString(e):n.default.getChatMembersString(e.toChatId()))}),s.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())});return Promise.all([E.a.getTopPeers("correspondents").then(e=>{if(!t())return;const s=e.findIndex(e=>e.id===a.a.myId);-1!==s&&(e=e.slice()).splice(s,1),e.length&&e.forEach(e=>{_c.addDialogNew({dialog:e.id,container:this.searchGroups.people.list,drawStatus:!1,onlyFirstName:!0,avatarSize:54,autonomous:!1})}),this.searchGroups.people.setActive()}),e()])}}loadMembers(e){const t=this.searchContext.peerId.toChatId(),s=this.middleware.get();let i;const a=t=>hi(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new Vs({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),Object(l.b)(this.membersList.list,e=>{const t=Object(bt.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=ts.toggleSidebar(!1)),i.then(()=>{nc.setInnerPeer({peerId:s})})}),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab)),t.forEach(e=>{const t=G.a.getParticipantPeerId(e);if(t.isAnyChat())return;E.a.getUser(t).pFlags.deleted||this.membersList.add(t)}))}));if(G.a.isChannel(t)){const o=this.membersList?200:50;i=n.default.getChannelParticipants(t,void 0,o,this.nextRates[e.inputFilter]).then(t=>{if(!s())return;let i=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(i?i.childElementCount:0)+t.participants.length,t.participants.length{if(!s())return;this.loaded[e.inputFilter]=!0;const i=t.participants;return"chatParticipantsForbidden"!==i._?a(i.participants):void 0});return this.loadPromises[e.inputFilter]=i.finally(()=>{s()&&(this.loadPromises[e.inputFilter]=null)})}loadType(e,t,s,n){var a,o;const r=e.inputFilter;if(this.loadPromises[r])return this.loadPromises[r];if("members"===e.type)return this.loadMembers(e);const l=null!==(a=this.historyStorage[r])&&void 0!==a?a:this.historyStorage[r]=[];if(!("inputMessagesFilterEmpty"!==r||l.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[r]=!0,Promise.resolve();const c="load ["+r+"]: ";if(l.length&&this.usedFromHistory[r]i.a.getMessageByPeer(e.peerId,e.mid)),r))}while(a{setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}let d=l.length?l[l.length-1].mid:0;return this.loadPromises[r]=i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:r},maxId:d,limit:s,nextRate:null!==(o=this.nextRates[r])&&void 0!==o?o:this.nextRates[r]=0})).then(i=>{if(l.push(...i.history.map(e=>({mid:e.mid,peerId:e.peerId}))),this.log(c+"search house of glass",r,i),n())return(i.history.length{setTimeout(()=>{if(n()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then(()=>{n()&&setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}},0)}),this.performSearchResult(this.filterMessagesByType(i.history,r),e))}).catch(e=>{this.log.error("load error:",e)}).finally(()=>{this.loadPromises[r]=null})}load(e=!1,t=!1){return hi(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(this.hideEmptyTabs){const e=this.mediaTabs.filter(e=>"inputMessagesFilterEmpty"!==e.inputFilter),t=e.map(e=>({_:e.inputFilter})),a=yield i.a.getSearchCounters(s,t);if(!n())return;if(this.loadMutex&&(yield this.loadMutex,!n()))return;let o,r=0;e.forEach(e=>{const t=a.find(t=>t.filter._===e.inputFilter);e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&void 0===o&&(o=e),t.count&&++r});const l=this.mediaTabsMap.get("members"),c=this.canViewMembers();l.menuTab.classList.toggle("hide",!c),c&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),o.menuTab.classList.add("active"),this.navScrollableContainer.classList.toggle("hide",r<=1))}this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter(e=>e!==this.mediaTab);if(a=a.filter(e=>{const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"members"===e.type),!a.length)return;const o=t?50:Math.round(3*(St.a.height/130|0)*1.25),r=a.map(e=>this.loadType(e,t,o,n));return Promise.all(r).catch(e=>{this.log.error("Load error all promises:",e)})}))}getMonthContainerByTimestamp(e,t){var s;const i=new Date(1e3*e);i.setHours(0,0,0),i.setDate(1);const n=i.getTime(),a=null!==(s=this.monthContainers[t])&&void 0!==s?s:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const s=document.createElement("div");s.classList.add("search-super-month-name");const o={month:"long"};i.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new T.c.IntlDateElement({date:i,options:o}).element;s.append(r),e.append(s);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(s,l);const c=Object(li.a)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},Ns(e,this.tabs[t],d)}return a[n]}canViewMembers(){return this.searchContext.peerId.isAnyChat()&&!G.a.isBroadcast(this.searchContext.peerId.toChatId())&&G.a.hasRights(this.searchContext.peerId.toChatId(),"view_participants")}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.lazyLoadQueue.clear(),this.mediaTabs.forEach(e=>{this.usedFromHistory[e.inputFilter]=-1}),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach(e=>{e.scroll=void 0})}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach(e=>{URL.revokeObjectURL(e)}),this.urlsToRevoke.length=0),this.mediaTabs.forEach(e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||Object(ee.f)(t,!0);const s=t.querySelector(".content-empty");s&&s.remove()}}),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=Object(ue.a)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:s,historyStorage:i,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:s,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=i?i:{},this.cleanup()}}const gi=(e,t,s,i)=>{((null==s?void 0:s.listenerSetter)?s.listenerSetter.add(e):e.addEventListener.bind(e))(l.a,s=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const n=e.querySelector(".btn-menu");Object(c.a)(s),e.classList.contains("menu-open")?Object(ee.c)():(t&&t(s),Object(ee.d)(n,i))})};var mi,bi=(e={},t,s,i,n)=>{var a;e.asDiv=!0;const o=null!==(a=e.container)&&void 0!==a?a:N("more",e);o.classList.add("btn-menu-toggle");const r=$s(s,e.listenerSetter);return r.classList.add(t),gi(o,i,e,n),o.append(r),o},vi=s(80),fi=s(173);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(mi||(mi={}));const yi=new class{constructor(){this.privacy={},a.a.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,a.a.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return ct.a.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then(s=>(E.a.saveApiUsers(s.users),G.a.saveApiChats(s.chats),vi.a.processLocalUpdate({_:"updatePrivacy",key:{_:Object(fi.a)(e)},rules:t.map(e=>{const t={};return Object.assign(t,e),t._=Object(fi.a)(t._),t})}),s.rules))}getPrivacy(e){const t=Object(fi.a)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=ct.a.invokeApi("account.getPrivacy",{key:{_:e}}).then(e=>(E.a.saveApiUsers(e.users),G.a.saveApiChats(e.chats),this.privacy[t]=e.rules))}getPrivacyRulesDetails(e){const t=[];let s={users:[],chats:[]},i={users:[],chats:[]};return e.forEach(e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueAllowUsers":s.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueDisallowUsers":i.users.push(...e.users)}}),{type:t[0],disallowPeers:i,allowPeers:s}}};le.a.appPrivacyManager=yi;var wi=yi;class Si{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],s=this.radioSection.caption;t?t instanceof HTMLElement?Object(k.a)(s,t):Object(T.b)(s,t):s.innerHTML="",s.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===mi.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===mi.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new Kn({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:mi.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:mi.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:mi.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter(t=>!e.skipTypes.includes(t.type)));const s=Object(st.b)();t.forEach(({type:e,langKey:t})=>{const i=new Ze({radioField:new nt({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=et([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=Gn(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach(s=>{s.row=new Ze(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new Ut(e.tab.slider).open({type:"privacy",skippable:!0,title:s.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),s.row.subtitle.innerHTML="",s.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})})}),t.append(s.row.container)})}const n=wi.getPrivacy(e.inputKey).then(t=>{const s=wi.getPrivacyRulesDetails(t);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach(e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map(e=>e.toPeerId())),t.push(...i.chats.map(e=>e.toPeerId(!0))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))})),e.tab.eventListener.addEventListener("destroy",()=>{const t=[];switch(this.type){case mi.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case mi.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case mi.Nobody:t.push({_:"inputPrivacyValueDisallowAll"})}this.exceptions&&[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]].forEach(([e,s,i],n)=>{if(this.exceptions.get(e).row.container.classList.contains("hide"))return;const a=this.peerIds[e];if(a){const e=this.splitPeersByType(a);e.chats.length&&t.push({_:s,chats:e.chats}),e.users.length&&t.push({_:i,users:e.users.map(e=>E.a.getUserInput(e))})}}),wi.setPrivacy(e.inputKey,t)},{once:!0})})}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach(e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)}),t}generateStr(e){return e.users.length||e.chats.length?Object(T.f)([e.users.length?Object(T.d)("Users",[e.users.length]):null,e.chats.length?Object(T.d)("Chats",[e.chats.length]):null].filter(Boolean),!1):[Object(T.d)("PrivacySettingsController.AddUsers")]}}class Ci extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+E.a.getSelf().phone,t=document.createElement("div");t.append(Object(T.d)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),Object(T.d)("PrivacyPhoneInfo4"),document.createElement("br"),function(e={}){const t=document.createElement("a");if(t.classList.add("anchor-copy"),e.mePath){const s="https://t.me/"+e.mePath;t.href=t.innerText=s}return Object(l.b)(t,e=>{Object(c.a)(e),tt(t.href),rt({langPackKey:"LinkCopied"})}),t}({mePath:e}));const s=new Si({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{i.setRadio(mi.Everybody),i.radioSection.container.classList.toggle("hide",e!==mi.Nobody)}}),i=new Si({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[mi.Nobody]});this.scrollable.container.insertBefore(i.radioSection.container,s.radioSection.container.nextSibling)}}var Li=s(94);class Ii extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new Kn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=gs.a.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?xs({doc:t,div:s,loop:!0,play:!0,width:160,height:160}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=Object(B.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});Object(l.b)(a,e=>{this.close()}),this.slider.sliceTabsUntilTab(_n,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var Mi=s(132);function Ei(e){return!ae.f||!e}class Pi extends H{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new Kn({caption:!0,noDelimiter:!0});Object(T.b)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=gs.a.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?xs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"📬"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.codeInputField=new Mi.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),Li.a.confirmPasswordEmail(""+e).then(e=>{c()}).catch(e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),Object(k.a)(a.label,Object(T.d)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),Object(k.a)(a.label,Object(T.d)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)})}}),o=Object(B.a)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),c=()=>{new Ii(this.slider).open()},d=e=>{Object(gt.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),Li.a.cancelPasswordEmail().then(e=>{this.slider.sliceTabsUntilTab(ki,this),this.close()},()=>{d(!1)})}),Object(l.b)(r,e=>{d(!0);const t=Object(ee.f)(r);Li.a.resendPasswordEmail().then(e=>{t.remove(),d(!1)})}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Ei(this.isFirst)&&this.codeInputField.input.focus()}}class ki extends H{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new Kn({caption:!0,noDelimiter:!0}),t=gs.a.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?xs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💌"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.inputField=new O.b({name:"recovery-email",label:"RecoveryEmail",plainText:!0});a.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),h()}),a.input.addEventListener("input",e=>{a.input.classList.remove("error")});const o=Object(B.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=()=>{new Ii(this.slider).open()},h=()=>{const e=a.value.trim(),t=X.b.matchEmail(e);if(!t||t[0].length!==e.length)return void a.input.classList.add("error");p(!0);const s=Object(ee.f)(o);Li.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then(e=>{d()},t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const s=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],i=new Pi(this.slider);i.state=this.state,i.email=e,i.length=s,i.open()}else console.log("password set error",t);p(!1),s.remove()})};Object(l.b)(o,h);const p=e=>{e?(o.setAttribute("disabled","true"),r.setAttribute("disabled","true")):(o.removeAttribute("disabled"),r.removeAttribute("disabled"))};Object(l.b)(r,e=>{new ut("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),Object(ee.f)(r),Li.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then(()=>{d()},e=>{p(!1)})},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Ei(this.isFirst)&&this.inputField.input.focus()}}var Ti=s(122),xi=s(108),Ai=s(131);class Oi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new Kn({noDelimiter:!0}),t=gs.a.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?xs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💡"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=document.createElement("div");i.classList.add("input-wrapper");const n=this.inputField=new O.b({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});n.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),n.value?d():h()});const a=(e,t)=>{e&&Object(c.a)(e);const s=t?n.value:void 0;if(s&&this.newPassword===s)return void ot(T.c.format("PasswordAsHintError",!0));const i=new ki(this.slider);i.state=this.state,i.plainPassword=this.plainPassword,i.newPassword=this.newPassword,i.hint=s,i.open()},o=Object(B.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=e=>a(e,!0),h=e=>a(e,!1);Object(l.b)(o,d),Object(l.b)(r,h),i.append(n.container,o,r),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ji extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new Kn({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new xi.a({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new Ai.a(s,157),n=Object(B.a)("btn-primary btn-color-primary",{text:"Continue"});t.append(s.container,n),e.content.append(i.container,t),this.scrollable.container.append(e.container),s.input.addEventListener("keypress",e=>{if(s.input.classList.contains("error")&&s.setState(O.a.Neutral),"Enter"===e.key)return o()});const a=()=>this.newPassword===s.value||(s.setError(),!1),o=e=>{if(e&&Object(c.a)(e),!a())return;const t=new Oi(this.slider);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return Object(l.b)(n,o),i.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class _i extends H{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new Kn({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new xi.a({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?X.b.wrapEmojiText(this.state.hint):void 0}),n=new Ti.a(i,157),a=Object(B.a)("btn-primary btn-color-primary"),o=new T.c.IntlElement({key:"Continue"});a.append(o.element),s.append(i.container,a),t.content.append(n.container,s),this.scrollable.container.append(t.container),i.input.addEventListener("keypress",e=>{if(i.input.classList.contains("error")&&(i.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()});const r=()=>!!i.value.length||(i.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&Object(c.a)(e),!r())return;const t=new ji(this.slider);t.state=this.state,t.newPassword=i.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),Li.a.getState().then(e=>{this.state=e,this.state.hint?Object(m.a)(i.label,X.b.wrapEmojiText(this.state.hint)):Object(k.a)(i.label,Object(T.d)("LoginPassword"))}));d=s=>{if(!r())return void Object(c.a)(s);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const l=Object(ee.f)(a),d=i.value;Li.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new Fi(this.slider);t.state=this.state,t.plainPassword=d,t.open(),this.slider.removeTabFromHistory(this)}},e=>{a.removeAttribute("disabled"),i.input.classList.add("error"),e.type,o.key="TwoStepAuth.InvalidPassword",o.update(),l.remove(),i.select(),t()})},t()}return Object(l.b)(a,d),n.load()}onOpenAfterTimeout(){Ei(this.isFirst)&&this.passwordInputField.input.focus()}}class Fi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new Kn({caption:!0,noDelimiter:!0}),t=gs.a.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?xs({doc:t,div:s,loop:!1,play:!0,width:168,height:168,emoji:"🔐"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement();if(this.state.pFlags.has_password){Object(T.b)(e.caption,"TwoStepAuth.GenericHelp");const t=Object(B.a)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=Object(B.a)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=Object(B.a)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});Object(l.b)(t,()=>{const e=new _i(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new ut("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{Li.a.updateSettings({currentPassword:this.plainPassword}).then(()=>{this.slider.sliceTabsUntilTab(_n,this),this.close()})},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()}),Object(l.b)(n,()=>{const e=new ki(this.slider);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()}),i.append(t,s,n)}else{Object(T.b)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=Object(B.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),Object(l.b)(s,e=>{const t=new _i(this.slider);t.state=this.state,t.open()})}this.scrollable.container.append(e.container)}}class Di extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new Si({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class Ri extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new Si({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[mi.Nobody]})}}class Bi extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new Si({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class Ni extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new Si({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[mi.Nobody]})}}class Ui extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new Si({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new Si({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Hi extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new Ze({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:Object(ne.c)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const s=document.createElement("div");return s.classList.add("row-midtitle"),s.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(s,t.subtitle),t},t=this.authorizations.slice();{const n=new Kn({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=Object(Lt.a)(t,e=>e.pFlags.current),o=e(a);if(n.content.append(o.container),t.length){const e=Object(B.a)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});Object(l.b)(e,t=>{new ut("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(gt.a)([e],!0);ct.a.invokeApi("auth.resetAuthorizations").then(t=>{e.remove(),s.container.remove()},i).finally(()=>{t()})}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const s=new Kn({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach(t=>{s.content.append(e(t).container)}),this.scrollable.append(s.container);const i=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&ot(T.c.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new ut("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{ct.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&n.remove()},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=$s([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),Object(ee.a)(this.scrollable.container,e=>{n=Object(Ce.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(ee.e)(e,o),Object(ee.d)(o))}),Object(l.b)(this.scrollable.container,e=>{n=Object(Ce.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()})}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class zi extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new Kn({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=Q({icon:"add",className:"is-visible"});this.content.append(t),Object(l.b)(t,e=>{new Pt({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{E.a.toggleBlock(e,!0)}})},{listenerSetter:this.listenerSetter});const s=_c.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(s);const i=(e,t)=>{const{dom:i}=_c.addDialogNew({dialog:e,container:s,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t}),n=E.a.getUser(e);n.pFlags.bot?i.lastMessageSpan.append("@"+n.username):n.phone?i.lastMessageSpan.innerHTML=E.a.formatUserPhone(n.phone):i.lastMessageSpan.append(n.username?"@"+n.username:E.a.getUserStatusString(e))};for(const e of this.peerIds)i(e,!0);let n;const o=this.menuElement=$s([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=n.dataset.peerId.toPeerId();E.a.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),Object(ee.a)(this.scrollable.container,e=>{n=Object(bt.a)(e.target,"LI"),n&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(ee.e)(e,o),Object(ee.d)(o))},this.listenerSetter),this.listenerSetter.add(a.a)("peer_block",e=>{const{peerId:t,blocked:n}=e,a=s.querySelector(`[data-peer-id="${t}"]`);n?a||i(t,!1):a&&a.remove()});let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,E.a.getBlocked(s.childElementCount,50).then(e=>{for(const t of e.peerIds)i(t,!0);(e.peerIds.length<50||s.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()}).finally(()=>{r=!1}))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Vi=s(134);function Ki(e){return e="input"+(e=e[0].toUpperCase()+e.slice(1))}class Gi extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");{const e=new Kn({noDelimiter:!0,caption:"SessionsInfo"});let t;const s=new Ze({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:"Loading",clickable:()=>{const e=new zi(this.slider);e.peerIds=t,e.open()}});let i;s.freezed=!0;const n=new Ze({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new _i(this.slider):i.email_unconfirmed_pattern?(t=new Pi(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,Li.a.resendPasswordEmail()):t=new Fi(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new Ze({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:"Loading",clickable:()=>{const e=new Hi(this.slider);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",()=>{this.updateActiveSessions()},{once:!0}),e.open()}});o.freezed=!0,e.content.append(s.container,n.container,o.container),this.scrollable.append(e.container);const r=e=>{e?Object(k.a)(s.subtitle,Object(T.d)("PrivacySettingsController.UserCount",[e])):Object(k.a)(s.subtitle,Object(T.d)("BlockedEmpty",[e]))};this.listenerSetter.add(a.a)("peer_block",()=>{l()});const l=()=>{E.a.getBlocked().then(e=>{s.freezed=!1,r(e.count),t=e.peerIds})};l(),Li.a.getState().then(e=>{i=e,Object(k.a)(n.subtitle,Object(T.d)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),n.freezed=!1}),this.updateActiveSessions()}{const e=new Kn({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new Ze({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new Ci(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new Ze({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new Di(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new Ze({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new Ri(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new Ze({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Ui(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new Ze({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new Bi(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new Ze({titleLangKey:"WhoCanAddMe",subtitleLangKey:"Loading",clickable:()=>{new Ni(this.slider).open()}}),c=e=>{const s=t[e];s&&wi.getPrivacy(e).then(e=>{const t=wi.getPrivacyRulesDetails(e),i=t.type===mi.Everybody?"PrivacySettingsController.Everbody":t.type===mi.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=t.disallowPeers.users.length+t.disallowPeers.chats.length,a=t.allowPeers.users.length+t.allowPeers.chats.length;s.subtitle.innerHTML="";const o=Object(T.d)(i);s.subtitle.append(o),(n||a)&&s.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)})};e.content.append(s.container,i.container,n.container,o.container,r.container,l.container),this.scrollable.append(e.container);for(const e in t)c(e);a.a.addEventListener("privacy_update",e=>{c(Ki(e.key._))})}const e=[];{const t=new Kn({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(ct.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new Ze({checkboxField:new pt.a({text:"PrivacyAndSecurity.SensitiveText",checked:s}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});t.content.append(i.container),t.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",()=>{const e=i.checkboxField.checked;e!==s&&ct.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new Kn({name:"FilterChats"}),t=()=>{new ut("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(gt.a)([s],!0);Vi.a.clearAllDrafts().then(()=>{e()})},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},s=Object(B.a)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(s)("click",t),e.content.append(s),this.scrollable.append(e.container)}return Promise.all(e)}updateActiveSessions(){ct.a.invokeApi("account.getAuthorizations").then(e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,Object(T.b)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])})}}function Wi(e){const t=e.getContext("2d"),s=new Array(4).fill(0),i=t.getImageData(0,0,e.width,e.height).data;for(let e=0;e.5?i/(2-n-a):i/(n+a),n){case e:o=(t-s)/i+(t1&&(s-=1),s<1/6?e+6*(t-e)*s:s<.5?t:s<2/3?e+(t-e)*(2/3-s)*6:e},r=s<.5?s*(1+t):s+t-s*t,l=2*s-r;n=i(l,r,e+1/3),a=i(l,r,e),o=i(l,r,e-1/3)}return[Math.round(255*n),Math.round(255*a),Math.round(255*o),Math.round(255*i)]}function $i(e){const t=[],s="#"===e[0]?1:0;if(e.length===5+s&&(e=(s?"#":"")+"0"+e.slice(s)),e.length===3+s)for(let i=s;i("0"+e.toString(16)).slice(-2)).join("")}function Ji(e){return Xi(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map(e=>e.endsWith("%")?+e.slice(0,-1):+e);return Qi(i[0],i[1],i[2],s)}(e))}function Zi(e){let{h:t,s:s,l:i}=qi(e[0],e[1],e[2]);s>0&&(s=Math.min(100,s+5+.1*(100-s))),i=Math.max(0,.65*i);return`hsla(${t}, ${s}%, ${i}%, .4)`}class en{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{let e=this._scrollDelta/this._scrollTails;if(this._scrollDelta%=this._scrollTails,e=e>0?Math.floor(e):Math.ceil(e),e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}this._onWheelRAF=void 0},this.drawNextPositionAnimated=()=>{const e=this._frames,t=e.shift();t&&this.drawImageData(t);const s=e.length;return s||(this._animatingToNextPosition=void 0),!!s};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,s=this._curve.length;t{var i;return e-(null!==(i=s[t-1])&&void 0!==i?i:0)})}hexToRgb(e){const t=Yi(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();for(;e>0;)t.push(t.shift()),--e;const s=[];for(let e=0;e({x:(e.x-i[s].x)/t,y:(e.y-i[s].y)/t}));return s.map(e=>n.map((t,s)=>({x:i[s].x+t.x*e,y:i[s].y+t.y*e})))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),s=t.data;let i=0;for(let t=0;tthis.hexToRgb(e)),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d")),this._canvas=e,this._ctx=this._canvas.getContext("2d"),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(){var e;if(this._colors.length<2)return;const t=this._tail,s=this._tails;let i;const n=[];for(let a=0,o=this._incrementalCurve.length;as&&void 0===i&&(i=a,r%=s),n.push(r)}[n.slice(0,i),void 0!==i?n.slice(i):[]].forEach((e,t,i)=>{const n=e[e.length-1];if(void 0!==n&&n>s&&(e[e.length-1]=+n.toFixed(2)),this._tail=null!=n?n:0,!e.length)return;const a=this.getNextPositions(this._phase,s,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=a.map(e=>this.getGradientImageData(e));this._frames.push(...o)}),this._animatingToNextPosition=!0,Object(Pe.a)(this.drawNextPositionAnimated)}scrollAnimate(e){this._colors.length<2&&e||(e&&!this._addedScrollListener?(document.addEventListener("wheel",this.onWheel),this._addedScrollListener=!0):!e&&this._addedScrollListener&&(document.removeEventListener("wheel",this.onWheel),this._addedScrollListener=!1))}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),s=new en;return s.init(t),{gradientRenderer:s,canvas:t}}}class tn{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(tn.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new O.b({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new O.b({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=tn.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),s=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(s?O.a.Neutral:O.a.Error),e="#"+e,this.hexInputField.setValueSilently(e),s&&this.setColor(e,!1,!0)});const s=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",()=>{const e=this.rgbInputField.value.match(s);this.rgbInputField.setState(e?O.a.Neutral:O.a.Error),e&&this.setColor(qi(+e[1],+e[2],+e[3]),!0,!1)}),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){xe(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){xe(this.elements.hue,()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()},e=>{this.hueHandler(e.x)},()=>{this.onGrabEnd()})}setColor(e,t=!0,s=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=function(e){const t=$i(e);return qi(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=qi(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const i=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+i,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,s)}getCurrentColor(){const e=Qi(this.hue,this.saturation,this.lightness,this.alpha),t=Xi(e),s=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:s,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const s=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",s.hex),e&&(this.hexInputField.setValueSilently(s.hex),this.hexInputField.setState(O.a.Neutral)),t&&(this.rgbInputField.setValueSilently(s.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(O.a.Neutral)),this.onChange&&this.onChange(s)}hueHandler(e,t=!0){const s=Object(ke.a)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*s);const i=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*s+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",i),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",i),t&&this.updatePicker()}saturationHandler(e,t,s=!0){const i=this.boxRect.width,n=this.boxRect.height,a=Object(ke.a)(e-this.boxRect.left,0,i)/i*100,o=Object(ke.a)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=Object(ke.a)(a,0,100),c=100-l/2,d=100-Object(ke.a)(o,0,100),h=Object(ke.a)(d/100*c,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}tn.BASE_CLASS="color-picker";class sn extends H{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=$i(e),s=this.theme.background,i=Zi(t);s.id="2",s.intensity=0,s.slug="",s.color=e.toLowerCase(),s.highlightningColor=i,M.c.pushToState("settings",a.a.settings),nc.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=a.a.getTheme();const e=new Kn({});this.colorPicker=new tn,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new Kn({}),s=this.grid=document.createElement("div");s.classList.add("grid");["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach(e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const i=document.createElement("div");i.classList.add("grid-item-media"),i.style.backgroundColor=e,t.append(i),s.append(t)}),Object(l.b)(s,e=>{const t=Object(Ce.a)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const s=t.dataset.color;s&&this.applyColor(s)},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container),this.applyColor=Object(ws.a)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,s=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}onOpen(){setTimeout(()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],s=!!t&&!e.slug;s&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),s||(this.colorPicker.onChange=this.onColorChange)},0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}let nn=0;class an extends H{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallpapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{Object(pe.f)("image/x-png,image/png,image/jpeg").then(e=>{const t="wallpaper-upload-"+ ++nn,s={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let i={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[s],file_name:e.name};i=L.a.saveDoc(i);const n=ce.a.getCacheContext(i);n.downloaded=e.size,n.url=URL.createObjectURL(e);let a={_:"wallPaper",access_hash:"",document:i,id:t,slug:t,pFlags:{}};const o=ce.a.upload(e,e.name),r=Object(ie.a)();r.addNotifyListener=o.addNotifyListener,r.cancel=o.cancel,o.then(t=>{ct.a.invokeApi("account.uploadWallPaper",{file:t,mime_type:e.type,settings:{_:"wallPaperSettings"}}).then(e=>{const t=e.document,s=ce.a.getCacheContext(t);Object.assign(s,n),a=e,a.document=L.a.saveDoc(a.document),this.setBackgroundDocument(a).then(r.resolve,r.reject)},r.reject)},r.reject);const l=this.getWallpaperKey(a);r.then(()=>{this.clicked.delete(l)},e=>{d.remove()});const c=new ye.a({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),d=this.addWallPaper(a,!1);this.clicked.add(l),c.attach(d,!1,r)})},this.onResetClick=()=>{const e=M.b.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(ue.a)(e.background),M.c.pushToState("settings",a.a.settings),nc.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Ce.a)(e.target,"grid-item");if(!t)return;const s=this.wallpapersByElement.get(t);if("wallPaperNoFile"===s._)return void this.setBackgroundDocument(s);const i=this.getWallpaperKey(s);if(this.clicked.has(i))return;this.clicked.add(i);const n=s.document,a=new ye.a({cancelable:!0,tryAgainOnFail:!1}),o=()=>{const e=this.setBackgroundDocument(s);ce.a.getCacheContext(n).url&&!this.theme.background.blur||a.attach(t,!0,e)};a.construct(),Object(l.b)(t,e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()},{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then(t=>{ce.a.cacheStorage.save("backgrounds/"+e,t)})},this.setBackgroundDocument=e=>{let t=++this.tempId;const s=()=>t===this.tempId,i=e.document,n=Object(ie.a)();let o;return i?(o=L.a.downloadDoc(i,nc.chat.bubbles?nc.chat.bubbles.lazyLoadQueue.queueId:0),n.addNotifyListener=o.addNotifyListener,n.cancel=o.cancel):o=Promise.resolve(),o.then(()=>{if(!s())return void n.resolve();const t=this.theme.background,o=i=>{let o;if(i&&!this.theme.background.color)o=function(e){const t=document.createElement("img");return new Promise(s=>{Object(ps.a)(t,e,()=>{const e=document.createElement("canvas"),i=t.naturalWidth/t.naturalHeight;1===i?(e.width=50,e.height=e.width/i):i>1?(e.height=50,e.width=e.height/i):e.width=e.height=50;e.getContext("2d").drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height),s(Wi(e))})})}(i);else{const{canvas:t}=en.create(this.getColorsFromWallpaper(e));o=Promise.resolve(Wi(t))}o.then(o=>{var r,l,c;if(!s())return void n.resolve();const d=Zi(Array.from(o)),h=null!==(r=e.slug)&&void 0!==r?r:"";t.id=e.id,t.intensity=null!==(c=null===(l=e.settings)||void 0===l?void 0:l.intensity)&&void 0!==c?c:0,t.color=this.getColorsFromWallpaper(e),t.slug=h,t.highlightningColor=d,M.c.pushToState("settings",a.a.settings),h&&this.saveToCache(h,i),nc.applyCurrentTheme(h,i,!0).then(n.resolve)})};if(!i)return void o();const r=ce.a.getCacheContext(i);t.blur?setTimeout(()=>{const{canvas:e,promise:t}=Object(vs.a)(r.url,12,4);t.then(()=>{s()?o(e.toDataURL()):n.resolve()})},200):o(r.url)}),n},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallpaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground"),this.theme=a.a.getTheme();{const e=Gn(this.scrollable),s=Object(B.a)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=Object(B.a)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),n=Object(B.a)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});Object(l.b)(s,this.onUploadClick,{listenerSetter:this.listenerSetter}),Object(l.b)(i,()=>{new sn(this.slider).open()},{listenerSetter:this.listenerSetter}),Object(l.b)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new pt.a({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(o.input)("change",()=>{this.theme.background.blur=o.input.checked,M.c.pushToState("settings",a.a.settings),setTimeout(()=>{const e=t.querySelector(".active");if(!e)return;const s=this.wallpapersByElement.get(e);s.pFlags.pattern||"wallPaperNoFile"===s._||this.setBackgroundDocument(s)},100)}),e.append(s,i,n,o.label)}a.a.addEventListener("background_change",this.setActive),ct.a.invokeApiHashable({method:"account.getWallPapers"}).then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=Gn(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),Object(l.b)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallpaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map(e=>"#"+e.toString(16)).join(","):""}getWallpaperKey(e){return""+e.id}getWallpaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){var s;const i=this.getColorsFromWallpaper(e),n="wallPaper"===e._;if(n&&e.pFlags.pattern&&!i)return;const a=!!e.pFlags.dark,o=n?e.document=L.a.saveDoc(e.document):void 0,l=document.createElement("div");l.classList.add("grid-item"),l.dataset.id=""+e.id;const c=this.getWallpaperKey(e);this.wallpapersByElement.set(l,e),this.elementsByKey.set(c,l);const d=document.createElement("div");let h,p;if(d.classList.add("grid-item-media"),n?(p=r.a.choosePhotoSize(o,200,200),h=Ps({photo:o,message:null,container:d,withoutPreloader:!0,size:p,noFadeIn:e.pFlags.pattern}),(h.loadPromises.thumb||h.loadPromises.full).then(()=>{us.a.mutate(()=>{l.append(d)})}),e.pFlags.pattern&&(d.classList.add("is-pattern"),a?(h.images.full.style.display="none",h.images.thumb&&(h.images.thumb.style.display="none")):(null===(s=e.settings)||void 0===s?void 0:s.intensity)&&(h.images.full.style.opacity=""+Math.abs(e.settings.intensity)/100))):l.append(d),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=en.create(i);if(t.classList.add("background-colors-canvas"),a&&n){const s=ce.a.getCacheContext(o,p.type);h.loadPromises.full.then(()=>{t.style.webkitMaskImage=`url(${s.url})`,t.style.opacity=""+Math.abs(e.settings.intensity)/100,d.append(t)})}else d.append(t)}return this.getWallpaperKeyFromTheme(this.theme)===c&&l.classList.add("active"),this.grid[t?"append":"prepend"](l),l}}class on extends ht.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Ce.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;nc.chat.input.sendMessageWithDocument(s)?this.hide():console.warn("got no doc by id:",s)},this.h6=document.createElement("h6"),this.h6.append(Object(T.d)("Loading")),this.header.append(this.h6),this.addEventListener("close",()=>{I.a.setOnlyOnePlayableGroup("")});const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),Object(l.b)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),Object(ee.f)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const s=Object(B.a)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(s),this.body.append(t);new P.b(this.body);this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return gs.a.getStickerSet(this.stickerSetInput).then(e=>{if(!e)return rt({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,I.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),Object(m.a)(this.h6,X.a.wrapEmojiText(e.set.title)),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=Object(B.a)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append(Object(T.d)("RemoveStickersCount",[Object(T.d)("Stickers",[e.set.count])]))):(t=Object(B.a)("btn-primary btn-color-primary",{noRipple:!0}),t.append(Object(T.d)("AddStickersCount",[Object(T.d)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),Object(l.b)(t,()=>{const e=Object(gt.a)([t],!0);gs.a.toggleStickerSet(this.set).then(()=>{this.hide()}).catch(()=>{e()})});const s=new Z.d;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const i=b.b.active.esgSticker.width;xs({doc:t,div:e,lazyLoadQueue:s,group:"STICKERS-POPUP",play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}})}}var rn,ln=s(30);function cn(e,t=!0){return function(e,t,s=!0){const i=e;let n;return s||(e=Se.a),function s(){e(),n=ln.a.setTimeout(s,t())}(),e=i,()=>{clearTimeout(n)}}(e,()=>1e3*(60-(new Date).getSeconds()),t)}var dn=!!(null===(rn=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===rn?void 0:rn.getCurrentPosition)&&!1;class hn extends H{init(){return this.header.classList.add("with-border"),this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([jt.a.getQuickReaction(),jt.a.getAvailableReactions()]).then(([e,t])=>{t=t.filter(e=>!e.pFlags.inactive);const s=new Kn,i=t.map(t=>{const s=new nt({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),i=new Ze({radioField:s,havePadding:!0});return s.main.classList.add("quick-reaction-title"),Os({row:i,doc:t.static_icon,size:"small"}),t===e&&s.setValueSilently(!0),i}),n=et(i,e=>{jt.a.setDefaultReaction(e)});s.content.append(n),this.scrollable.append(s.container)})}}class pn{constructor(e,t,s,i,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const l=document.createElement("div");l.classList.add(o+"-name"),Object(T.b)(l,e);const c=this.valueContainer=document.createElement("div");c.classList.add(o+"-value"),a&&(c.innerHTML=""+s),r.append(l,c),this.range=new Ae({step:t,min:i,max:n},s),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(c.innerText=""+e)}}),this.container.append(r,this.range.container)}}class un extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=Gn.bind(null,this.scrollable);{const t=e("Settings"),s=new pn("TextSize",1,a.a.settings.messagesTextSize,12,20);s.onChange=e=>{M.c.setByKey("settings.messagesTextSize",e)};const i=Object(B.a)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});Object(l.b)(i,()=>{new an(this.slider).open()});const n=new pt.a({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(s.container,i,n.label)}{const t=e("General.Keyboard"),s=document.createElement("form"),i="send-shortcut",n="settings.sendShortcut",a=new Ze({radioField:new nt({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new Ze({radioField:new nt({name:i,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});Object(T.b)(o.radioField.main,"General.SendShortcut.CtrlEnter",[ae.b?"⌘":"Ctrl"]),s.append(a.container,o.container),t.append(s)}if(dn){const t=e("DistanceUnitsTitle"),s=document.createElement("form"),i="distance-unit",n="settings.distanceUnit",a=new Ze({radioField:new nt({langKey:"DistanceUnitsKilometers",name:i,value:"kilometers",stateKey:n})}),o=new Ze({radioField:new nt({langKey:"DistanceUnitsMiles",name:i,value:"miles",stateKey:n})});s.append(a.container,o.container),t.append(s)}{const t=e("General.TimeFormat"),s=document.createElement("form"),i="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map(([e,t])=>new Ze({radioField:new nt({langKey:t,name:i,value:e,stateKey:n})})),r=cn(()=>{const e=new Date;a.forEach(([t],s)=>{const i=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[s].subtitle.textContent=i})});this.eventListener.addEventListener("destroy",r),s.append(...o.map(e=>e.container)),t.append(s)}{const t=e("Emoji"),s=new pt.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new pt.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const e=new Kn({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new Ze({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{new hn(this.slider).open()}}),s=()=>{Promise.resolve(jt.a.getQuickReaction()).then(e=>{Os({row:t,doc:e.static_icon,size:"small"})})};s(),this.listenerSetter.add(a.a)("quick_reaction",s);const i=new pt.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),n=new pt.a({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),o={},r=e.generateContentElement(),l=new Z.d,c=(e,t="append")=>{const s=new Ze({title:X.b.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new on({id:e.id,access_hash:e.access_hash}).show()}});o[e.id]=s;const i=document.createElement("div");i.classList.add("row-media"),As({set:e,container:i,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),s.container.append(i),r[t](s.container)};gs.a.getAllStickers().then(e=>{Object(ys.a)(e);for(const t of e.sets)c(t)}),this.listenerSetter.add(a.a)("stickers_installed",e=>{const t=e;o[t.id]||c(t,"prepend")}),this.listenerSetter.add(a.a)("stickers_deleted",e=>{const t=e;o[t.id]&&(o[t.id].container.remove(),delete o[t.id])}),e.content.append(t.container,i.label,n.label),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}var gn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class mn extends H{init(){return gn(this,void 0,void 0,(function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=Gn(this.scrollable,void 0,"Bio.Description"),s=document.createElement("div");s.classList.add("input-wrapper"),this.firstNameInputField=new O.b({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new O.b({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new O.b({label:"EditProfile.BioLabel",name:"bio",maxLength:70}),s.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const i=document.createElement("div");i.classList.add("caption"),Object(T.e)({element:i,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new Xe({peerId:a.a.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,s)}{const t=new Kn({name:"EditAccount.Username",caption:!0}),s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new dt({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"}),s.append(this.usernameInputField.container);const i=t.caption;i.append(Object(T.d)("UsernameSettings.ChangeDescription")),i.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append(Object(T.d)("UsernameHelpLink",[a])),i.append(n),e.push(this.usernameInputField),t.content.append(s),this.scrollable.append(t.container)}Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(n.default.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then(()=>{this.close()},e=>{console.error("updateProfile error:",e)})),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>n.default.uploadProfilePhoto(e))),this.usernameInputField.isValidToChange()&&e.push(E.a.updateUsername(this.usernameInputField.value)),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter});const t=E.a.getSelf(),s=yield n.default.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(s.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()}))}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var bn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class vn extends H{constructor(){super(...arguments),this.renderResults=e=>bn(this,void 0,void 0,(function*(){yield E.a.getContacts(),e.forEach(e=>{const{dom:t}=_c.addDialogNew({dialog:e,container:this.selector.scrollable,drawStatus:!1,rippleEnabled:!0,avatarSize:46}),s=this.selector.selected.has(e);t.containerEl.append(this.checkbox(s));const i=[];this.dialogsByFilters.forEach((t,s)=>{if(t.has(e)){const e=document.createElement("span");Object(m.a)(e,X.b.wrapEmojiText(s.title)),i.push(e)}});Object(T.f)(i,!1).forEach(e=>{t.lastMessageSpan.append(e)})})})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=N("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",()=>{const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const s of e)s.isPeerId()?t.push(s.toPeerId()):this.filter.pFlags[s]=!0;let s;s="included"===this.type?e=>t.includes(e):e=>!t.includes(e),Object(f.a)(this.filter.pinnedPeerIds,(e,t)=>{s(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))});const i="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";Object(f.a)(this.filter[i],(e,s)=>{t.includes(e)&&(this.filter[i].splice(s,1),this.filter[n].splice(s,1))}),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=t.map(e=>o.a.getInputPeerById(e)),this.editFolderTab.setFilter(this.filter,!1),this.close()}),this.dialogsByFilters=new Map,i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.dialogsByFilters.set(t,new Set(i.a.dialogsStorage.getFolderDialogs(t.id).map(e=>e.peerId)))})}checkbox(e){const t=new pt.a({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new Kn({noDelimiter:!0,name:"FilterChatTypes"});let s;t.container.classList.add("folder-categories"),s="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const i=document.createDocumentFragment();for(const e in s){const t=Object(B.a)("btn-primary btn-transparent folder-category-button",{icon:s[e].ico,text:s[e].text});t.dataset.peerId=e,t.append(this.checkbox()),i.append(t)}t.content.append(i);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new Mt({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats"}),this.selector.selected=new Set(n);let a=!1;const o=this.selector.add.bind(this.selector);this.selector.add=(e,t,i)=>{if(this.selector.selected.size>=100&&a&&!s[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout(()=>{t.checked=!1},0);return void ot(T.c.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=o(e,s[e]?Object(T.d)(s[e].text):void 0,i);return s[e]&&n.querySelector("avatar-element").classList.add("tgico-"+s[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const i in e.pFlags)s.hasOwnProperty(i)&&e.pFlags[i]&&t.content.querySelector(`[data-peer-id="${i}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,s){return this.originalFilter=e,this.filter=Object(ue.a)(this.originalFilter),this.type=t,this.editFolderTab=s,super.open()}}var fn=s(105);class yn extends H{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append(Object(T.d)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=N("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new ut("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),i.a.filtersStorage.updateDialogFilter(this.filter,!0).then(e=>{e&&this.close()}).finally(()=>{e.element.removeAttribute("disabled")})},isDanger:!0}]}).show()}};this.menuBtn=bi({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new Kn({}),s=document.createElement("div");s.classList.add("input-wrapper"),this.nameInputField=new O.b({label:"FilterNameHint",maxLength:12}),s.append(this.nameInputField.container),t.content.append(s);const n=(e,t,s,i)=>{const n=new Kn({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),s.forEach(e=>{const t=Object(B.a)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(i[e.name]=t),a.append(t)}),n};this.includePeerIds=n("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=n("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),o=this.excludePeerIds.container.querySelector(".folder-categories");a.querySelector(".btn").addEventListener("click",()=>{new vn(this.slider).open(this.filter,"included",this)}),o.querySelector(".btn").addEventListener("click",()=>{new vn(this.slider).open(this.filter,"excluded",this)}),this.confirmBtn.addEventListener("click",()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(a.children).slice(1).reduce((e,t)=>e+ +!t.style.display,0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?i.a.filtersStorage.updateDialogFilter(this.filter):i.a.filtersStorage.createDialogFilter(this.filter),e.then(e=>{e&&this.close()}).catch(e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?ot("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):ot("Please choose at least one chat for this folder.")}),this.nameInputField.input.addEventListener("input",()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()});const r="edit"===this.type?[i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=oe.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then(e=>(this.animation=e,oe.a.waitForFirstFrame(e))),...r])}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=Object(fn.a)(X.b.wrapDraftText(e.title));for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach(t=>{const s=this[t],n=_c.createChatList();let a=e[t];Object(f.a)(a,(e,t,s)=>{(e=>!!i.a.getDialogOnly(e)||!!e.isUser()&&"user"===E.a.getUser(e.toUserId())._)(e)||s.splice(t,1)}),a=a.slice();const o=e=>{for(let t=0,s=Math.min(a.length,e);to(20)),r.append(Object(T.d)("FilterShowMoreChats",[a.length])),e.append(r)}o(4)})}editCheckForChange(){if("edit"===this.type){const e=!Object(ge.a)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach(e=>e.remove()),t?(this.originalFilter=e,this.filter=Object(ue.a)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then(()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()})}}var wn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Sn extends H{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,s){let n,a,r="",c=[];if("dialogFilterSuggested"===e._)n=e.filter,r=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&c.push(Object(T.d)(t))}if(!c.length){const e=i.a.dialogsStorage.getFolderDialogs(n.id);let t=0,s=0,a=0;for(const i of e)o.a.isAnyGroup(i.peerId)?a++:o.a.isBroadcast(i.peerId)?s++:t++;t&&c.push(Object(T.d)("Chats",[t])),s&&c.push(Object(T.d)("Channels",[s])),a&&c.push(Object(T.d)("Groups",[a]))}}if(s)s.subtitle.textContent="",Object(T.f)(c).forEach(e=>{s.subtitle.append(e)});else if(s=new Ze({title:X.a.wrapEmojiText(n.title),subtitle:r,clickable:!0}),c.length&&Object(T.f)(c).forEach(e=>{s.subtitle.append(e)}),"dialogFilter"===e._){const e=n.id;this.filtersRendered.hasOwnProperty(n.id)||Object(l.b)(s.container,()=>{new yn(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?Ns(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return wn(this,void 0,void 0,(function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),Object(T.e)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=Object(B.a)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new Kn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new Kn({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),Object(l.b)(this.createFolderBtn,()=>{Object.keys(this.filtersRendered).length>=10?ot("Sorry, you can't create more folders."):new yn(this.slider).open()},{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.renderFolder(t,this.foldersSection.content);t()}),this.listenerSetter.add(a.a)("filter_update",e=>{this.filtersRendered.hasOwnProperty(e.id)?this.renderFolder(e,null,this.filtersRendered[e.id]):this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()}),this.listenerSetter.add(a.a)("filter_delete",e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()}),this.listenerSetter.add(a.a)("filter_order",e=>{e.forEach((e,t)=>{const s=this.filtersRendered[e].container;Ns(s,s.parentElement,t+1)})}),this.loadAnimationPromise=oe.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then(e=>(this.animation=e,oe.a.waitForFirstFrame(e))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}getSuggestedFilters(){return ct.a.invokeApi("messages.getSuggestedDialogFilters").then(e=>{this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach(e=>e.remove()),e.forEach(e=>{const t=this.renderFolder(e),s=Object(B.a)("btn-primary btn-color-primary",{text:"Add"});t.append(s),this.suggestedSection.content.append(t),Object(l.b)(s,n=>{if(Object(c.a)(n),Object.keys(this.filtersRendered).length>=10)return void ot("Sorry, you can't create more folders.");s.setAttribute("disabled","true");const a=e.filter;a.includePeerIds=[],a.excludePeerIds=[],a.pinnedPeerIds=[],i.a.filtersStorage.createDialogFilter(a,!0).then(e=>{e&&t.remove()}).finally(()=>{s.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter})})})}}class Cn extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new Kn({name:e.name}),s=new Ze({checkboxField:new pt.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new Ze({checkboxField:new pt.a({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Bt.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=Bt.a.isMuted(t);return s.checkboxField.checked=!e,i.checkboxField.checked=t.show_previews,e};o(),this.eventListener.addEventListener("destroy",()=>{const e=!s.checkboxField.checked,a=i.checkboxField.checked;if(e===Bt.a.isMuted(t)&&a===t.show_previews)return;const o=Object(ue.a)(t);o._="inputPeerNotifySettings",o.mute_until=e?2147483647:0,o.show_previews=a,Bt.a.updateNotifySettings(n,o)},{once:!0}),this.listenerSetter.add(a.a)("notify_settings",s=>{const i=Ki(s.peer._);e.inputKey===i&&(t=s.notify_settings,o())})})};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new Kn({name:"NotificationsOther"}),t=new Ze({checkboxField:new pt.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new Ze({checkboxField:new pt.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});M.c.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),Bt.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&Bt.a.setContactSignUpNotification(!s)},{once:!0})})}}}var Ln=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class In extends H{init(){return Ln(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new Kn({}),t=new Map,s=ct.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(st.b)();s.forEach(e=>{const s=new Ze({radioField:new nt({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=et([...t.values()],e=>{T.c.getLangPack(e)});T.c.getCacheLangPack().then(e=>{const s=t.get(e.lang_code);s?s.radioField.setValueSilently(!0):console.error("no row",s,e)}),e.content.append(n)});return this.scrollable.append(e.container),s}))}}function Mn(e){return new Promise((t,s)=>{const{button:i,checkbox:n}=e;i.callback=e=>{t(e?!!e.size:void 0)};const a=Object(ht.a)([i]);a.find(e=>e.isCancel).callback=()=>{s()},e.buttons=a,e.checkboxes=n&&[n],new ut("popup-confirmation",e).show()})}function En(e,t){const s=new Kn({name:t}),i="settings.autoDownload."+e+".",n=new pt.a({text:"AutodownloadContacts",name:"contacts",stateKey:i+"contacts",withRipple:!0}),a=new pt.a({text:"AutodownloadPrivateChats",name:"private",stateKey:i+"private",withRipple:!0}),o=new pt.a({text:"AutodownloadGroupChats",name:"groups",stateKey:i+"groups",withRipple:!0}),r=new pt.a({text:"AutodownloadChannels",name:"channels",stateKey:i+"channels",withRipple:!0});return s.content.append(n.label,a.label,o.label,r.label),s}class Pn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=En("photo","AutoDownloadPhotosTitle");this.scrollable.append(e.container)}}class kn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=Object(lt.a)(e=>{M.c.setByKey("settings.autoDownloadNew.file_size_max",e)},200,!1,!0),t=En("file","AutoDownloadFilesTitle"),s=a.a.settings.autoDownloadNew.file_size_max,i=Math.sqrt(Math.sqrt((s-524288)/20447232)),n=new T.c.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[Ee(s)]}),o=new pn("AutoDownloadMaxFileSize",.01,i,0,1,!1);o.onChange=t=>{const s=20447232*Math.pow(t,4)+524288|0;n.compareAndUpdate({args:[Ee(s)]}),e(s)},o.valueContainer.append(n.element),t.content.append(o.container),this.scrollable.append(t.container)}}class Tn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=En("video","AutoDownloadVideosTitle");this.scrollable.append(e.container)}}var xn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const An={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class On extends z{init(){return xn(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new Kn({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield M.c.getState(),s=new pt.a({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),i=()=>{Object(gt.a)([h],Object(ge.a)(t.settings.autoDownload,M.b.settings.autoDownload)&&Object(ge.a)(t.settings.autoDownloadNew,M.b.settings.autoDownloadNew))},n=()=>{this.setAutoDownloadSubtitle(r,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(d,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},o=e=>{const t=new e(this.slider,!0);t.open(),this.listenerSetter.add(t.eventListener)("destroy",()=>{n(),i()},{once:!0})},r=new Ze({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{o(Pn)}}),c=new Ze({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{o(Tn)}}),d=new Ze({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{o(kn)}}),h=Object(B.a)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});Object(l.b)(h,()=>{Mn({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then(()=>{a.a.settings.autoDownloadNew=Object(ue.a)(M.b.settings.autoDownloadNew),a.a.settings.autoDownload=Object(ue.a)(M.b.settings.autoDownload),M.c.pushToState("settings",a.a.settings),a.a.dispatchEvent("settings_updated",{key:"settings",value:a.a.settings}),n(),s.checked=!t.settings.autoDownloadNew.pFlags.disabled})});const p=()=>{const e=!s.checked,t=a.a.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[r,c,d].forEach(t=>{t.container.classList.toggle("is-disabled",e)}),M.c.pushToState("settings",t),a.a.dispatchEvent("settings_updated",{key:"settings",value:t}),i()};s.input.addEventListener("change",p),p(),n(),e.content.append(s.label,r.container,c.container,d.container,h),this.scrollable.append(e.container)}{const e=new Kn({name:"AutoplayMedia"}),t=new pt.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),s=new pt.a({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});e.content.append(t.label,s.label),this.scrollable.append(e.container)}}))}setAutoDownloadSubtitle(e,t,s){let i,n=[];const a=Object.keys(t),o=a.map(e=>t[e]?An[e]:void 0).filter(Boolean);if(o.length&&0!==s){const e=o.length===a.length;if(void 0!==s?(i=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push(Ee(s))):i=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...Object(T.f)(o.map(e=>Object(T.d)(e)),!0,!1)),n.push(e)}}else i="AutoDownloadOff";Object(k.a)(e.subtitle,Object(T.d)(i,n))}}var jn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class _n extends H{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=bi({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new ut("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{ct.a.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=N("edit"),this.header.append(this.buttons.edit,e),this.profile=new Jt(this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(a.a.myId),this.profile.fillProfileElements();const t=Object(B.a)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});t.addEventListener("click",()=>{const e=document.createElement("canvas");(new W.a).open(e,e=>{e().then(e=>n.default.uploadProfilePhoto(e))})}),this.profile.element.lastElementChild.firstElementChild.append(t);const s=()=>{var e;const s=E.a.getSelf();t.classList.toggle("hide","userProfilePhoto"!==(null===(e=s.photo)||void 0===e?void 0:e._))};s(),this.listenerSetter.add(a.a)("avatar_update",e=>{a.a.myId===e&&s()});const i=document.createElement("div");i.classList.add("profile-buttons");const o=[["unmute","AccountSettings.Notifications",Cn],["data","DataSettings",On],["lock","AccountSettings.PrivacyAndSecurity",Gi],["settings","Telegram.GeneralSettingsViewController",un],["folder","AccountSettings.Filters",Sn]].map(([e,t,s])=>new Ze({titleLangKey:t,icon:e,clickable:()=>{new s(this.slider,!0).open()}}));o.push(this.devicesRow=new Ze({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>jn(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=new Hi(this.slider);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",()=>{this.authorizations=void 0,this.updateActiveSessions(!0)},{once:!0}),e.open()}))}),this.languageRow=new Ze({titleLangKey:"AccountSettings.Language",titleRightSecondary:Object(T.d)("LanguageName"),icon:"language",clickable:()=>{new In(this.slider).open()}})),i.append(...o.map(e=>e.container));const r=new Kn;r.content.append(i),this.scrollable.append(this.profile.element,r.container),this.buttons.edit.addEventListener("click",()=>{new mn(this.slider).open()}),oe.a.loadLottieWorkers(),this.updateActiveSessions()}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=ct.a.invokeApi("account.getAuthorizations").finally(()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)});return t}updateActiveSessions(e){return this.getAuthorizations(e).then(e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length})}}class Fn extends H{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new Kn({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new O.b({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new O.b({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const s=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",s),this.channelDescriptionInputField.input.addEventListener("input",s),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,G.a.createChannel({title:e,about:t,broadcast:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),$n.removeTabFromHistory(this),new Ut(this.slider).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>G.a.inviteToChannel(e,t)})})}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var Dn=s(154);class Rn extends ht.b{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),Object(T.b)(this.title,"AddContactTitle"),Object(l.b)(this.btnConfirm,()=>{const e=E.a.importContact(s.value,i.value,n.value);e.then(()=>{this.hide()},e=>{"NO_USER"===e.type&&(rt({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)}),c.lockWithPromise(e)},{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const s=new O.b({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),i=new O.b({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Dn.a({required:!0});e.push(s,i,n);const a=()=>{const e=s.value+" "+i.value;c.avatarElem.peerTitle=e,c.avatarElem.update()};this.listenerSetter.add(s.input)("input",a),this.listenerSetter.add(i.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=E.a.getSelf(),r=Object(qs.a)(o.phone);r.code&&(n.value="+"+r.code.country_code);const c=new Xe({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(s.container,i.container,c.avatarElem),this.container.append(t,n.container),this.show()}}class Bn extends H{init(){this.container.id="contacts-container";const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new Rn},{listenerSetter:this.listenerSetter}),this.inputSearch=new j("Search",e=>{this.openContacts(e)}),this.listenerSetter.add(a.a)("contacts_update",e=>{const t=E.a.isContact(e),s=e.toPeerId();t?this.sortedUserList.add(s):this.sortedUserList.delete(s)}),this.title.replaceWith(this.inputSearch.container),this.middleware=Object(Rs.a)()}createList(){const e=new Vs,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),_c.setListClickListener(t,()=>{this.close()},void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!ae.e&&Ei(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",E.a.getContactsPeerIds(e,void 0,"online").then(e=>{if(!t())return;const s=this.sortedUserList=this.createList();let i=()=>{const t=St.a.height/72*1.25|0;e.splice(0,t).forEach(e=>{s.add(e)}),e.length||(i=void 0,this.scrollable.onScrolledBottom=null)};i(),this.scrollable.onScrolledBottom=()=>{i?i():this.scrollable.onScrolledBottom=null},Object(k.a)(this.scrollable.container,s.list)})}open(){return this.openContacts(),super.open()}}class Nn extends H{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!_c.sortedLists[Nn.filterId]){const e=_c.createChatList();_c.generateScrollable(e,Nn.filterId).container.append(e),_c.setListClickListener(e,null,!0)}const e=_c.scrollables[Nn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=_c.filterId,_c.setFilterId(Nn.filterId),_c.onTabChange()}onOpenAfterTimeout(){_c.sortedLists[this.wasFilterId].clear()}onClose(){_c.setFilterId(this.wasFilterId),_c.onTabChange()}onCloseAfterTimeout(){return _c.sortedLists[Nn.filterId].clear(),super.onCloseAfterTimeout()}}Nn.filterId=1;class Un extends H{constructor(){super(...arguments),this.isLocationWatched=!1}init(){this.container.classList.add("people-nearby-container"),this.setTitle("PeopleNearby"),this.errorCategory=document.createElement("div"),this.errorCategory.classList.add("text","hide","nearby-error"),this.retryBtn=Q({icon:"check"});const e=gs.a.getAnimatedEmojiSticker("🧭"),t=document.createElement("div");t.classList.add("sticker-container"),e?xs({doc:e,div:t,loop:!1,play:!0,width:86,height:86,emoji:"🧭",needUpscale:!0}).then(()=>{}):t.classList.add("media-sticker-wrapper");const s=document.createElement("div");s.classList.add("caption"),Object(T.b)(s,"PeopleNearbyInfo2"),this.locatedPeers=new Map;const i=()=>{const e=new Vs({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onUpdate:e=>{const t=this.locatedPeers.get(e.id),s=[this.parseDistance(t.distance)];e.id.isUser()||s.push(n.default.getChatMembersString(e.id.toChatId())),e.dom.lastMessageSpan.textContent="",e.dom.lastMessageSpan.append(...Object(T.f)(s,!1))},getIndex:e=>2147483647-this.locatedPeers.get(e.id).distance});return _c.setListClickListener(e.list,void 0,void 0,!1),e},a=this.peopleSection=new qn({name:"PeopleNearbyHeader",sortedList:i()}),o=this.chatsSection=new qn({name:"ChatsNearbyHeader",sortedList:i()}),r=a.makeButton({text:"MakeMyselfVisible",icon:"location"}),c=a.makeButton({text:"StopShowingMe",icon:"location"}),d=o.makeButton({text:"NearbyCreateGroup",icon:"newgroup"});Object(l.b)(r,()=>{Mn({titleLangKey:"MakeMyselfVisibleTitle",descriptionLangKey:"MakeMyselfVisibleInfo",button:{langKey:"OK"}}).then(()=>{this.startWatching()})},{listenerSetter:this.listenerSetter}),Object(l.b)(c,()=>{this.stopWatching()},{listenerSetter:this.listenerSetter}),Object(l.b)(d,()=>{new $(this.slider).open([],!0)},{listenerSetter:this.listenerSetter}),r.classList.add("primary"),c.classList.add("danger"),d.classList.add("primary"),this.content.append(this.retryBtn),this.scrollable.append(t,s,a.container,o.container,this.errorCategory)}parseDistance(e){return"miles"===a.a.settings.distanceUnit?e>1609.34?Object(T.d)("MilesAway",[Math.round(e/1609)]):Object(T.d)("FootsAway",[Math.round(3.281*e)]):e>=1e3?Object(T.d)("KMetersAway2",[e/1e3]):Object(T.d)("MetersAway2",[e])}open(){const e=super.open();return e.then(()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition(e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),E.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then(e=>{const t=e.updates[0].peers,s=t.sort((e,t)=>e.distance-t.distance),i=t.filter(e=>"peerChannel"==e.peer._).length,n=t.filter(e=>"peerChannel"!=e.peer._).length;null==s||s.forEach(e=>{const t=o.a.getPeerId(e.peer),s=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),s.sortedList.add(t)}),this.errorCategory.classList.toggle("hide",!(!n&&!i)),this.errorCategory.innerHTML="No groups or channels found around you."})},e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."})}),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,ot("Your position is now being shared. Do not close the page or it will be suspended."),E.a.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition(e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,s=e.coords.latitude!==this.latestLocationSaved.latitude,i=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(s||t)&&i&&(E.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})}))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,ot("The sharing of your position has been stopped. You will no longer be visible to other users."),E.a.getLocated(0,0,0,!1,0))}calculateDistance(e,t,s,i){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((s-e)*n)+Math.cos(e*n)*Math.cos(s*n)*(1-Math.cos((i-t)*n)/2)))}}var Hn=s(5),zn=s(6);function Vn(e,t=2){if(0===e)return"0";const s=t<0?0:t,i=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,i)).toFixed(s))+["","K","M","B","T"][i]}class Kn{constructor(e={}){const t=this.container=document.createElement("div");t.classList.add("sidebar-left-section-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add("sidebar-left-section"),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append(Wn()),s.classList.add("with-fake-delimiter");else if(e.noDelimiter)s.classList.add("no-delimiter");else{const e=document.createElement("hr");s.append(e)}const i=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2","sidebar-left-section-name"),Object(T.e)({element:t,key:e.name,args:e.nameArgs}),i.append(t)}if(t.append(s),e.caption){const s=this.caption=this.generateContentElement();s.classList.add("sidebar-left-section-caption"),t.append(s),!0!==e.caption&&Object(T.e)({element:s,key:e.caption})}}generateContentElement(){const e=document.createElement("div");return e.classList.add("sidebar-left-section-content"),this.innerContainer.append(e),e}}const Gn=(e,t,s)=>{const i=new Kn({name:t,caption:s});return e.append(i.container),i.content},Wn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e};class qn extends Kn{constructor(e){super(e),this.sortedList=e.sortedList,this.content.append(this.sortedList.list)}makeButton(e){const t=Object(B.a)("folder-category-button btn btn-primary btn-transparent",e);return this.title?this.content.insertBefore(t,this.title.nextSibling):this.content.prepend(t),t}}const Qn=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new j("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new Bn(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new Nn(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new pt.a({toggle:!0,checked:"night"===a.a.getTheme().name});n.input.addEventListener("change",()=>{a.a.settings.theme=n.input.checked?"night":"day",M.c.pushToState("settings",a.a.settings),a.a.dispatchEvent("theme_change")}),a.a.addEventListener("theme_change",()=>{n.setValueSilently("night"===a.a.getTheme().name)});const o=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout(()=>{nc.setPeer({peerId:nc.myId})},0)}},s,{icon:"user",text:"Contacts",onClick:t},dn?{icon:"group",text:"PeopleNearby",onClick:()=>{new Un(this).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{new _n(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new pt.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=T.c.format("TelegramFeaturesUrl",!0);nc.openUrl(e)}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout(()=>{e.remove()},0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([zn.a.set({kz_version:"Z"}),zn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>Hn.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{zn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>Hn.a.isMainDomain}].filter(Boolean);this.toolsBtn=bi({},"bottom-right",o,e=>{o.forEach(e=>{e.verify&&e.element.classList.toggle("hide",!e.verify())})}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const r=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(l.a,e=>{e.stopPropagation(),Object(ee.c)()});const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+Hn.a.suffix+" "+Hn.a.versionFull,c.append(d),r.classList.add("has-footer"),r.append(c),this.newBtnMenu=bi({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new Fn(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new Ut(this).open({type:"chat",skippable:!1,takeOut:e=>{new $(this).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:t}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",e.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",Object(te.a)(this.updateBtn),this.updateBtn.append(Object(T.d)("Update")),Object(l.b)(this.updateBtn,()=>{location.reload()}),e.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",()=>this.initSearch(),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",s.element.append(this.archivedCount),a.a.addEventListener("folder_unread",e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+Vn(t,1),this.archivedCount.classList.toggle("hide",!t)}}),E.a.getTopPeers("correspondents");const h={type:"global-search-focus",onPop:()=>(setTimeout(()=>{this.inputSearch.input.focus()},0),!1),noHistory:!0};F.a.pushItem(h),M.c.getState().then(e=>{const t=e.recentSearch||[];for(let e=0,s=t.length;e{fetch("version",{cache:"no-cache"}).then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e!==Hn.a.versionFull&&(this.hasUpdate=!0,clearInterval(s),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))}).catch(Se.a)},18e5)})}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new P.b(e),s=()=>{this.backBtn.click()};this.searchGroups={contacts:new x("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,s),globalContacts:new x("GlobalSearch","contacts",void 0,void 0,void 0,void 0,s),messages:new x("SearchMessages","messages"),people:new x(!1,"contacts",!0,"search-group-people",!0,!1,s),recent:new x("Recent","contacts",!0,"search-group-recent",!0,!0,s)};const n=this.searchSuper=new ui({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0});e.prepend(n.nav.parentElement.parentElement),t.container.append(n.container);n.setQuery({peerId:"".toPeerId(),folderId:0}),n.selectTab(0),n.load(!0);let a=[],o="".toPeerId(),r=0,l=0;const c=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},d=document.createElement("div");d.classList.add("search-helper"),d.addEventListener("click",e=>{const t=Object(Ce.a)(e.target,"selector-user");if(!t)return;const s=t.dataset.key;if(0===s.indexOf("date_")){const[e,t,i]=s.split("_");r=+t,l=+i}else o=s.toPeerId();t.addEventListener("click",()=>{p(t)}),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),c()}),n.nav.parentElement.append(d);const h=(e,t)=>{const s=document.createElement("div");s.classList.add("selector-user");const i=new fc;return i.classList.add("selector-user-avatar","tgico","avatar-30"),i.isDialog=!0,s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new wt.a({peerId:e.toPeerId()}).element),i.updateWithOptions({peerId:e})):i.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?s.innerHTML=t:(Object(k.a)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",i),s},p=e=>{0===e.dataset.key.indexOf("date_")?r=l=0:o="".toPeerId(),e.remove(),Object(V.a)(a,e),setTimeout(()=>{c(),this.inputSearch.onChange(this.inputSearch.value)},0)};this.inputSearch.onClear=()=>{a.forEach(e=>{p(e)})},this.inputSearch.onChange=e=>{if(n.cleanupHTML(),n.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:r,maxDate:l}),n.load(!0),d.innerHTML="",n.nav.classList.remove("hide"),!o&&e.trim()){const t=n.middleware.get();Promise.all([i.a.getConversations(e).promise.then(({dialogs:e})=>e.map(e=>e.peerId)),E.a.getContactsPeerIds(e,!0)]).then(e=>{if(!t())return;new Set(e[0].concat(e[1])).forEach(e=>{d.append(h(e))}),n.nav.classList.toggle("hide",!!d.innerHTML)})}if(!r&&e.trim()){const t=[];Object(ne.b)(e,t),t.forEach(e=>{d.append(h("date_"+e.minDate+"_"+e.maxDate,e.title))}),n.nav.classList.toggle("hide",!!d.innerHTML)}},n.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",e=>{const t=Object(bt.a)(e.target,"LI");if(!t)return;const s=Object(Ce.a)(t,"search-group");if(!s||s.classList.contains("search-group-recent")||s.classList.contains("search-group-people"))return;const i=t.getAttribute("data-peer-id").toPeerId();M.c.getState().then(e=>{const t=e.recentSearch||[];if(t[0]!==i){Object(V.a)(t,i),t.unshift(i),t.length>20&&(t.length=20),M.c.pushToState("recentSearch",t);for(const e of t)M.c.requestPeer(e,"recentSearch")}})},{capture:!0});let u=document.createElement("div");u.classList.add("search-group-scrollable"),u.append(this.searchGroups.people.list),this.searchGroups.people.container.append(u);new P.a(u);let g,m=!0;const b=Object(_.a)(e.parentElement,"zoom-fade",150,e=>{g&&clearTimeout(g),0!==e||m||(n.selectTab(0,!1),this.inputSearch.onClearClick(),g=window.setTimeout(()=>{g=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")},150)),m=!1});b(0);const v=()=>{this.toolsBtn.classList.remove("is-visible"),this.backBtn.classList.add("is-visible"),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);ae.f||F.a.findItemByType("global-search")||F.a.pushItem({onPop:()=>{s()},type:"global-search"}),b(1)};this.inputSearch.input.addEventListener("focus",v),v(),this.backBtn.addEventListener("click",e=>{this.toolsBtn.classList.add("is-visible"),this.backBtn.classList.remove("is-visible"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),F.a.removeByType("global-search"),b(0)});const f=N("close");this.searchGroups.recent.nameEl.append(f),f.addEventListener("click",()=>{Mn({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then(()=>{M.c.getState().then(e=>{this.searchGroups.recent.clear();const t=e.recentSearch||[];for(const e of t)M.c.releaseSinglePeer(e,"recentSearch");t.length=0,M.c.pushToState("recentSearch",t)})})})}};le.a.appSidebarLeft=Qn;var $n=Qn;class Yn{constructor(e){this.chat=e,this.bubbles=[],this.detailsMap=new Map,this.groups=[],this.newGroupDiff=121}removeBubble(e){const t=this.detailsMap.get(e);t&&(t.group.length&&(Object(Lt.a)(t.group,t=>t.bubble===e),t.group.length?this.updateGroup(t.group):Object(V.a)(this.groups,t.group)),this.detailsMap.delete(e))}changeBubbleMid(e,t){const s=this.detailsMap.get(e);s&&(s.mid=t)}addBubble(e,t,s){const i=t.date,n=t.mid;let o,r=t.viaBotId||t.fromId;r===a.a.myId&&t.peerId===a.a.myId&&t.fwdFromId===r&&(r=r.toPeerId(!0)),this.removeBubble(e);const l={bubble:e,mid:n,timestamp:i};if(this.bubbles.length){let e,t=-1;for(let e=0;es.mid)break}if(-1!==t&&(e=this.bubbles[t]),e){o=e.group;let t=0,s=0;for(;tt.mid===e);t&&this.updateGroup(t.group)}cleanup(){this.bubbles=[],this.groups=[],this.detailsMap.clear()}}class Xn extends ht.b{constructor(e,t,s={}){if(super("popup-date-picker",s.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},s)),this.onPick=t,this.options=s,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const s=+t.dataset.timestamp;this.selectedDate=new Date(s),this.setTitle(),this.setTimeTitle()},this.minDate=s.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&i&&i(+o[1]),o="0"+o[0]),t.setValueSilently(o),s(o.length)})};this.hoursInputField=new O.b({plainText:!0}),this.minutesInputField=new O.b({plainText:!0}),s(23,this.hoursInputField,e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()},e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)}),s(59,this.minutesInputField,e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()}),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),Object(l.b)(this.btnConfirm,()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()},{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const i=document.createElement("div");i.classList.add("popup-centerer"),i.append(this.container),this.element.append(i),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=s.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),s.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const s=new Date;s.setHours(0,0,0,0);const i={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===s.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const i={month:"short",day:"numeric"};n.getFullYear()!==s.getFullYear()&&(i.year="numeric"),t.push(new T.c.IntlDateElement({date:n,options:i}).element)}t.push(new T.c.IntlDateElement({date:n,options:i}).element),this.btnConfirm.firstChild.replaceWith(Object(T.d)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new T.c.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const s=document.createElement("button");return s.classList.add("btn-icon","date-picker-month-date"),e&&s.setAttribute("disabled","true"),t&&s.append(t),s}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&b.b.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new T.c.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const s=new Date,i=s.getDay();1!==i&&s.setHours(-24*(i-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new T.c.IntlDateElement({date:s,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),s.setDate(s.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{for(const t of e){const e=t.boundingClientRect,s=t.target.parentElement,i=t.rootBounds;e.bottom=i.top&&e.bottom{const t=e.filter(e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top)[0];if(!t)return;const s=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,s)},{root:this.container})}addSentinel(e,t){const s=document.createElement("div");return s.classList.add("sticky_sentinel",t),e.appendChild(s)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}class Zn extends HTMLElement{constructor(){super(),this.classList.add("reaction")}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e){this.type=e,this.classList.add("reaction-"+e)}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("reaction-sticker"),this.append(this.stickerContainer));const s=this.reactionCount;if(!e&&!t){const e=jt.a.getReaction(s.reaction);Object(zt.a)(e,e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive");const s="inline"===this.type?14:22,i=this.wrapStickerPromise=xs({div:this.stickerContainer,doc:null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon,width:s,height:s,static:!0}).finally(()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)})})}}renderCounter(){var e;const t=this.reactionCount,s="inline"===this.type?2:4;if(t.count>=s||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add("reaction-counter"));const e=Vn(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new ns({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map(e=>o.a.getPeerId(e.peer_id)))))}setIsChosen(e=!!this.reactionCount.pFlags.chosen){if("inline"===this.type)return;(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&Object(is.a)(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){Object(zt.a)(jt.a.getReaction(this.reactionCount.reaction),e=>{const t="inline"===this.type?28:40,s=document.createElement("div");s.classList.add("reaction-sticker-activate"),Promise.all([xs({div:s,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1}),Ts({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1}).stickerPromise]).then(([e,t])=>{const i=()=>{Object(Le.b)(()=>{e.remove(),s.remove(),this.stickerContainer.classList.remove("has-animation")})};e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then(()=>{setTimeout(i,1e3)}):i())}),e.addEventListener("firstFrame",()=>{this.stickerContainer.append(s),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()},{once:!0})})})}}customElements.define("reaction-element",Zn);const ea=new Map;class ta extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[]}connectedCallback(){let e=ea.get(this.key);e||ea.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=ea.get(this.key);e.delete(this),e.size||ea.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,s){void 0!==this.key&&this.disconnectedCallback(),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add("reactions-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.isPlaceholder)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,s=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!s),!s&&!this.sorted.length)return;const i=jt.a.getAvailableReactions(),n=s?i instanceof Promise?t.results:t.results.filter(e=>jt.a.isReactionActive(e.reaction)):[];Object(f.a)(this.sorted,(e,t,s)=>{const i=e.reactionCount.reaction;n.some(e=>e.reaction===i)||(s.splice(t,1),e.remove())});const a=n.reduce((e,t)=>e+t.count,0),o=t&&!!t.pFlags.can_see_list&&a<4;if(this.sorted=n.map((e,s)=>{const i=this.sorted.findIndex(t=>t.reactionCount.reaction===e.reaction);let n=-1!==i&&this.sorted[i];n||(n=new Zn,n.init(this.type)),Ns(n,this,s);const a=t.recent_reactions?t.recent_reactions.filter(t=>t.reaction===e.reaction):[];return n.reactionCount=Object.assign({},e),n.setCanRenderAvatars(o),n.render(this.isPlaceholder),n.renderCounter(),n.renderAvatars(a),n.setIsChosen(),n}),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===a.a.peerId&&e.forEach(e=>{const t=this.sorted.find(t=>t.reactionCount.reaction===e.reaction);t&&t.fireAroundAnimation()})}}customElements.define("reactions-element",ta);a.a.addEventListener("replies_updated",e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach(t=>{t.message=e,t.render()})});class sa extends HTMLElement{constructor(){super(),this.updated=!1}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new ns({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map(e=>o.a.getPeerId(e)),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new T.c.IntlElement);const s=this.text;if(e?e.replies?s.compareAndUpdate({key:"Comments",args:[e.replies]}):s.compareAndUpdate({key:"LeaveAComment"}):s.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?Vn(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(i.a.subscribeRepliesThread(this.message.peerId,this.message.mid),i.a.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",sa);const ia=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(T.b)(e,"EditedMessage"),e},na=()=>Object(T.d)("SponsoredMessage");var aa,oa;(oa=aa||(aa={})).setTime=e=>{var t;const{chatType:s,message:n}=e,a=new Date(1e3*n.date),o=[];let r,l,c,d;const h=!!n.pFlags.sponsored,p=!("action"in n)&&!h;let u,g=h?void 0:Object(ne.f)(a);if(p){if(n.views){const e=n.post_author||(null===(t=n.fwd_from)||void 0===t?void 0:t.post_author),s=document.createElement("span");s.classList.add("post-views"),s.innerHTML=Vn(n.views,1);const i=document.createElement("i");if(i.classList.add("tgico-channelviews","time-icon"),o.push(s,i),e){const t=document.createElement("span");Object(m.a)(t,X.b.wrapEmojiText(e)),t.insertAdjacentHTML("beforeend",", "),o.push(t)}}if(n.edit_date&&"scheduled"!==s&&!n.pFlags.edit_hide&&o.unshift(r=ia()),"pinned"!==s&&n.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),o.unshift(e)}"peerUser"===n.peer_id._&&(u=!0,d=i.a.getGroupsFirstMessage(n),c=new ta,c.init(d,"inline",!0),c.render(),o.unshift(c))}else h&&o.push(l=na());g&&o.push(g);let b=h?void 0:Object(ne.g)(a);p&&(b+=(n.edit_date&&!n.pFlags.edit_hide?"\nEdited: "+Object(ne.g)(new Date(1e3*n.edit_date)):"")+(n.fwd_from?"\nOriginal: "+Object(ne.g)(new Date(1e3*n.fwd_from.date)):""));const v=document.createElement("span");v.classList.add("time","tgico"),v.append(...o);const f=document.createElement("div");f.classList.add("inner","tgico"),b&&(f.title=b);let y=o;if(r&&(y[y.indexOf(r)]=ia()),l&&(y[y.indexOf(l)]=na()),c){const e=y[y.indexOf(c)]=new ta;e.init(d,"inline"),e.render()}return y=y.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e),g&&(y[y.length-1]=Object(ne.f)(a)),f.append(...y),v.append(f),v},oa.renderReplies=({bubble:e,bubbleContainer:t,message:s,messageDiv:i,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new sa;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},oa.setReply=({chat:e,bubble:t,bubbleContainer:s,message:i})=>{const n=!s;n&&(s=t.querySelector(".bubble-content"));const a=n?s.querySelector(".reply"):null;if(!i.reply_to_mid)return a&&a.remove(),void t.classList.remove("is-reply");const o=i.reply_to.reply_to_peer_id?e.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):e.peerId;let r,l=e.appMessagesManager.getMessageByPeer(o,i.reply_to_mid);"messageEmpty"===l._?(e.appMessagesManager.wrapSingleMessage(o,i.reply_to_mid),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:i.reply_to_mid,mid:i.mid}),r=Object(T.d)("Loading")):r=new wt.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=js(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var ra=s(150);function la(e,t,s){const i=e.getBoundingClientRect(),n="center"===s?Math.ceil(i.left+(i.right-i.left)/2+1):Math.ceil(i.left+1),a="bottom"===t?Math.floor(i.top+i.height-1):Math.ceil(i.top+1);return document.elementFromPoint(n,a)}function ca(e){e.style.display="none",e.offsetLeft,e.style.display=""}le.a.getElementByPoint=la;var da=s(16),ha=s(19),pa=s(49),ua=s(136),ga=s(11);const ma={keywords:{},version:0,langCode:Hn.a.langPackCode};class ba{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=Hn.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=ga.a.get(s).then(t=>(Object(ha.a)(t)||(t={}),Object(pa.a)(ma,t),t.langCode=e,this.keywordLangPacks[e]=t,ct.a.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then(e=>{t.version=e.version;const i=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return T.c.lastRequestedLangCode!==Hn.a.langPackCode&&e.push(this.getEmojiKeywords(T.c.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new ua.a(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const s=t[e];this.index.indexObject(s,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const s=this.index.search(e);t=Array.from(s).reduce((e,t)=>e.concat(t),[])}else t=this.recent.concat(ba.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=M.c.getState().then(e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[])}pushRecentEmoji(e){e=X.b.fixEmoji(e),this.getRecentEmojis().then(t=>{Object(V.a)(t,e),t.unshift(e),t.length>36&&(t.length=36),M.c.pushToState("recentEmoji",t),a.a.dispatchEvent("emoji_recent",e)})}}ba.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const va=new ba;le.a&&(le.a.appEmojiManager=va);var fa=va,ya=s(23),wa=s(26);const Sa=new Set;function Ca(e,t,s=!1,i=!1){var n;const o=document.createElement("span");let r;if(o.classList.add("super-emoji"),i&&!ya.a?r=X.a.wrapSingleEmoji(e):(e=X.a.fixEmoji(e),r=X.a.wrapEmojiText(e)),o.append(r),o.children.length>1){const e=o.firstElementChild;o.innerHTML="",o.append(e)}if("IMG"===(null===(n=o.firstElementChild)||void 0===n?void 0:n.tagName)){const e=o.firstElementChild,t=e.src;if(!Sa.has(t)){e.setAttribute("loading","lazy");const s=document.createElement("span");s.classList.add("emoji-placeholder"),a.a.settings.animationsEnabled&&(e.style.opacity="0",s.style.opacity="1"),e.addEventListener("load",()=>{Object(Le.b)(()=>{a.a.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),o.classList.remove("empty"),Sa.add(t)})},{once:!0}),o.append(s)}}s?t.prepend(o):t.appendChild(o)}function La(e){return Object(Ce.a)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class Ia{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=La(e.target);t&&(nc.chat.input.onEmojiSelected(t,!1),he.b&&Object(ti.a)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},s=new Map([["Emoji.Recent",[]]]);for(const t in wa.b){const i=""+wa.b[t],n=e[+i[0]-1];if(!n)continue;let a=s.get(n);a||(a=[],s.set(n,a)),a[+i.slice(1)||0]=t}s.delete(e.pop()),s.forEach((e,s)=>{const i=document.createElement("div");i.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append(Object(T.d)(s));const a=document.createElement("div");a.classList.add("super-emojis"),i.append(n,a),e.forEach(e=>{Ca(Object(se.a)(e),a,!1)}),t[s]=i});const i=this.menu=this.content.previousElementSibling,n=this.scroll=new P.b(this.content,"EMOJI"),o=Object(ee.f)(this.content,!0);Promise.all([Object(da.a)(200),fa.getRecentEmojis().then(e=>{const t=!!e.length,s=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[s].classList.add("active");const a=za.menuOnClick(i,n,void 0,s);return this.stickyIntersector=a.stickyIntersector,this.setMenuActive=a.setActive,e})]).then(([s,i])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of i)Ca(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map(e=>{const s=t[e];return s||console.error("no div by category:",e),n.container.append(s),this.stickyIntersector.observeStickyHeaderChanges(s),s})}),this.content.addEventListener("click",this.onContentClick),this.init=null,a.a.addEventListener("emoji_recent",e=>{const t=Array.from(this.recentItemsDiv.children);for(let s=0,i=t.length;s{this.closeScrollTop=this.scroll.scrollTop})}onClose(){}}var Ma=s(139),Ea=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Pa{constructor(e,t,s,i=!0){this.element=e,this.group=t,this.scrollable=s,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=Object(ie.a)(),this.timeout=window.setTimeout(()=>{this.timeout=0,this.scrollPromise.resolve()},150)},this.processInvisibleDiv=e=>this.scrollPromise.then(()=>Ea(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),s=e.querySelector("img");if(s&&(s&&s.classList.remove("hide"),yield Object(Le.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();I.a.getAnimations(t).forEach(e=>{I.a.checkAnimation(e,!0,!0)})}}))),this.lazyLoadQueue=new Z.c(void 0,(e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)}),i&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){if(e.querySelector("video"))return;this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId,s=L.a.getDoc(t);return this.scrollPromise.then(()=>{const t=Ms({doc:s,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0}).loadPromise;return t.finally(()=>{const t=e.querySelector("video");e.style.opacity="";const s=e.querySelector("img");s&&s.classList.add("hide"),t&&!t.parentElement&&setTimeout(()=>{t.src="",t.load();I.a.getAnimations(t).forEach(e=>{I.a.checkAnimation(e,!0,!0)})},0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)}),t})}})}add(e,t=this.element){var s;let i=e.w,n=e.h;n<100&&(i*=100/n,n=100);const a=Math.min(300,400,i),o=Object(Ma.a)(i,n,a,100),r=document.createElement("div");r.classList.add("gif","fade-in-transition"),r.style.width=o.width+"px",r.style.opacity="0",r.dataset.docId=""+e.id,t.append(r),this.lazyLoadQueue.observe(r);const l=L.a.getThumb(e,!1);let c;!!l&&(c=new Image,c.classList.add("media-poster"),l.cacheContext.url||l.promise.then(()=>{c.src=l.cacheContext.url}));const d=()=>{c&&(r.append(c),r.style.opacity="")};(null===(s=null==l?void 0:l.cacheContext)||void 0===s?void 0:s.url)?Object(ps.a)(c,l.cacheContext.url,d):d()}}class ka{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",za.onMediaClick);const t=new P.b(this.content,"GIFS"),s=new Pa(e,Ha,t),i=Object(ee.f)(this.content,!0);ct.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=L.a.saveDoc(t),s.add(t)}),i.remove()}),Ka.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var Ta=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class xa{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{I.a.getAnimations(e).forEach(e=>{t?I.a.checkAnimation(e,!1):I.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=L.a.getDoc(t),i=b.b.active.esgSticker.width,n=xs({doc:s,div:e,width:i,height:i,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0});return n.then(()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))}),n},this.processInvisibleDiv=e=>{const t=e.dataset.docId,s=L.a.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(s,e)},this.lazyLoadQueue=new Z.b(void 0,(e,t)=>{t||this.processInvisibleDiv(e)})}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,s){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),e.animated&&this.observeAnimatedDiv(t)),xs({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:s}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class Aa{constructor(){this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",s,i){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&("string"==typeof t?a.innerHTML=t:a.append(t)),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:i}),s.then(e=>{e.forEach(e=>{n.append(this.superStickerRenderer.renderSticker(e))}),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach(({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)}),this.queueCategoryPush.length=0)}),{titleDiv:a}}renderStickerSet(e,t=!1){return Ta(this,void 0,void 0,(function*(){const s=document.createElement("div");s.classList.add("sticker-category"),s.dataset.id=""+e.id,s.dataset.access_hash=""+e.access_hash;const i=document.createElement("button");i.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:s,tab:i},t?this.menu.insertBefore(i,this.menu.firstElementChild.nextSibling):this.menu.append(i);const n=gs.a.getStickerSet(e);this.categoryPush(s,X.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;As({set:e,container:i,group:Ha,lazyLoadQueue:za.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new P.a(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),a.a.addEventListener("stickers_installed",e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)}),a.a.addEventListener("stickers_deleted",e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}}),this.stickersDiv.addEventListener("click",e=>{const t=e.target;if(Object(Ce.a)(t,"category-title")){const e=Object(yt.a)(t,"data-id");new on({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else za.onMediaClick(e)});const s=(e=!1)=>{a.a.dispatchEvent("choosing_sticker",!e)};this.scroll=new P.b(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{s()},Ka.addEventListener("closed",()=>{s(!0)}),Ka.addEventListener("opened",()=>{s()}),this.stickyIntersector=za.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(ee.f)(this.content,!0);Promise.all([gs.a.getRecentStickers().then(e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},i.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append(Object(T.d)("Stickers.Recent"))}),gs.a.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new xa(za.lazyLoadQueue,Ha),Ka.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(gs.a.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let s=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);s||(s=this.superStickerRenderer.renderSticker(e));const i=this.recentDiv.querySelector(".category-items");i.prepend(s),i.childElementCount>20&&Array.from(i.children).slice(20).forEach(e=>e.remove())}onClose(){}}var Oa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const ja=new class{constructor(){this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,s="",i="",n){return ct.a.invokeApi("messages.getInlineBotResults",{bot:E.a.getUserInput(t),peer:o.a.getInputPeerById(e),query:s,geo_point:n?this.getGeoInput(n):void 0,offset:i},{stopTime:-1,noErrorBox:!0}).then(e=>{const t=e.query_id;return e.results.forEach(e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=L.a.saveDoc(e.document)),e.photo&&(e.photo=r.a.savePhoto(e.photo))),this.inlineResults[this.generateQId(t,e.id)]=e}),e})}generateQId(e,t){return e+"_"+t}pushPopularBot(e){E.a.getTopPeers("bots_inline").then(t=>{const s=e.toPeerId(),i=t.findIndex(e=>e.id===s);let n;n=-1!==i?t[i]:{id:s,rating:0},++n.rating,Object(Us.a)(t,n,"rating"),M.c.setKeyValueToStorage("topPeersCache")})}switchToPM(e,t,s){return this.setHash[t]={peerId:e,time:Date.now()},a.a.dispatchEvent("history_focus",{peerId:t.toPeerId()}),i.a.startBot(t,void 0,s)}checkSwitchReturn(e){return Oa(this,void 0,void 0,(function*(){const t=E.a.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const s=this.setHash[e];return s&&(delete this.setHash[e],Date.now()-s.time<36e5)?s.peerId:void 0}))}switchInlineQuery(e,t,s,i){a.a.dispatchEvent("history_focus",{peerId:e,threadId:t}),Vi.a.setDraft(e,t,"@"+E.a.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return ct.a.invokeApi("messages.getBotCallbackAnswer",{peer:o.a.getInputPeerById(e),msg_id:v.a.getServerMessageId(t),data:s.data},{stopTime:-1,noErrorBox:!0}).then(e=>{"string"==typeof e.message&&e.message.length&&ot(X.a.wrapRichText(e.message,{noLinks:!0,noLinebreaks:!0}))})}sendInlineResult(e,t,s,n={}){var a;const o=this.inlineResults[s];if(!o)return;this.pushPopularBot(t);const l=s.split("_"),c=l.shift(),d=l.join("_");if(n.viaBotId=t,n.queryId=c,n.resultId=d,o.send_message.reply_markup&&(n.replyMarkup=o.send_message.reply_markup),"botInlineMessageText"===o.send_message._)n.entities=o.send_message.entities,i.a.sendText(e,o.send_message.message,n);else{let t,s="";const l=o.send_message;switch(l._){case"botInlineMessageMediaAuto":if(s=l.message,"botInlineMediaResult"===o._){const{document:e,photo:s}=o;t=e?L.a.getMediaInput(e):r.a.getMediaInput(s)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(l.geo)},n.geoPoint=l.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(l.geo),title:l.title,address:l.address,provider:l.provider,venue_id:l.venue_id,venue_type:l.venue_type},n.geoPoint=l.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:l.phone_number,first_name:l.first_name,last_name:l.last_name,vcard:l.vcard}}t||(t={_:"messageMediaPending",type:o.type,file_name:o.title||(null===(a=o.content)||void 0===a?void 0:a.url)||o.url,size:0,progress:{percent:30,total:0}}),i.a.sendOther(e,t,n)}}};le.a&&(le.a.appInlineBotsManager=ja);var _a=ja,Fa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Da extends H{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Ce.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;nc.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&ts.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new j("SearchGifsTitle",e=>{this.reset(),this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),Object(l.b)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Pa(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",I.a.checkAnimations(void 0,"GIFS-SEARCH"),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return ts.toggleSidebar(!0).then(()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}),e}search(e,t=!0){return Fa(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield E.a.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=_a.getInlineResults(Me.c,this.gifBotPeerId,e,this.nextOffset);const{results:s,next_offset:i}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=i,t&&(this.gifsDiv.innerHTML=""),s.length?s.forEach(e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)}):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}class Ra extends H{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new Z.d,this.inputSearch=new j("StickersTab.SearchPlaceholder",e=>{this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),Object(l.b)(this.setsDiv,e=>{const t=Object(Ce.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void nc.chat.input.sendMessageWithDocument(e)}const s=Object(Ce.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Ce.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),gs.a.getStickerSet({id:i,access_hash:n}).then(e=>{gs.a.toggleStickerSet(e.set).then(t=>{t&&(a.textContent="",a.append(Object(T.d)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))}).finally(()=>{a.removeAttribute("disabled")})})):gs.a.getStickerSet({id:i,access_hash:n}).then(e=>{new on(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",I.a.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const s=document.createElement("div");s.classList.add("sticker-set-header");const i=document.createElement("div");i.classList.add("sticker-set-details"),i.innerHTML='
',Object(m.a)(i.firstElementChild,X.a.wrapEmojiText(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append(Object(T.d)("Stickers",[e.count])),i.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append(Object(T.d)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),s.append(i,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()}),e}renderFeatured(){return gs.a.getFeaturedStickers().then(e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach(e=>{this.renderSet(e.set)})})}filterRendered(e,t){t=t.slice();const s=Array.from(this.setsDiv.children);return Object(f.a)(s,s=>{const i=s.dataset.stickerSet,n=t.findIndex(e=>e.set.id===i);-1!==n?t.splice(n,1):e&&s.dataset.title.toLowerCase().includes(e.toLowerCase())||s.remove()}),I.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?gs.a.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}var Ba=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Na extends D.a{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&Object(ii.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>Ba(this,void 0,void 0,(function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.forceClose=!1,this.dispatchEvent("opened")},he.a?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")},he.a?0:200)})),Object(w.a)(this,e)}attachButtonListener(e,t){let s=!0;he.a?Object(l.b)(e,()=>{s?(s=!1,this.toggle(!0)):this.toggle()},{listenerSetter:t}):t.add(e)("mouseover",i=>{s&&(t.add(e)("mouseout",this.onMouseOut),s=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.toggle(!0)},200)})}init(){he.a||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}var Ua=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Ha="emoticons-dropdown";class za extends Na{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(I.a.checkAnimations(!0,Ha),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=nc.chat,s=this.tabsEl.children,n=Array.from(s),a=i.a.canSendToPeer(e,t,"send_stickers");n[2].toggleAttribute("disabled",!a);const o=i.a.canSendToPeer(e,t,"send_gifs");n[3].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||1===Object(Bs.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>Ua(this,void 0,void 0,(function*(){he.a&&Object(ti.a)()&&(yield Object(da.a)(100)),this.element.parentElement!==nc.chat.input.chatInput&&nc.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),za.lazyLoadQueue.lock(),I.a.lockIntersectionGroup(Ha)}))),this.addEventListener("opened",()=>{I.a.unlockIntersectionGroup(Ha),za.lazyLoadQueue.unlock(),za.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{za.lazyLoadQueue.lock(),I.a.lockIntersectionGroup(Ha),I.a.checkAnimations(!0,Ha)}),this.addEventListener("closed",()=>{I.a.unlockIntersectionGroup(Ha),za.lazyLoadQueue.unlock(),za.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new Ia,this.stickersTab=new Aa,this.gifsTab=new ka,this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=Object(J.a)(this.tabsEl,this.container,this.onSelectTabClick,()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),I.a.checkAnimations(!1,Ha)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?ts.isTabExists(Ra)||new Ra(ts).open():ts.isTabExists(Da)||new Da(ts).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=nc.chat.input.messageInput;(null===(t=s.lastChild)||void 0===t?void 0:t.tagName)?s.lastElementChild.remove():s.lastChild&&(s.lastChild.textContent.length?s.lastChild.textContent=s.lastChild.textContent.slice(0,-1):s.lastChild.remove());const i=new Event("input",{bubbles:!0,cancelable:!0});nc.chat.input.messageInput.dispatchEvent(i),Object(c.a)(e)});const e=ae.c,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),a.a.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",()=>{e.lock()}),this.addEventListener("closed",()=>{const s=e.intersector.getVisible();for(const e of s)t(e);e.intersector.clearVisible()}),this.addEventListener("opened",()=>{e.unlockAndRefresh()})}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===nc.chat.input.messageInput)return e.getRangeAt(0)}}za.lazyLoadQueue=new Z.d,za.menuOnClick=(e,t,s,i=0)=>{let n=-1;const a=t=>t!==i&&(e.children[i].classList.remove("active"),e.children[t].classList.add("active"),i=t,!0),o=new Jn(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(Bs.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Ce.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(Bs.a)(s);if(!a(i))return;const o=(t.splitUp||t.container).children[i].offsetTop+1;t.container.scrollTop=n=o}),{stickyIntersector:o,setActive:a}},za.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(bt.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(nc.chat.input.sendMessageWithDocument(i,void 0,t)?(Va.container&&(Va.forceClose=!0,Va.container.classList.add("disable-hover"),Va.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const Va=new za;le.a.emoticonsDropdown=Va;var Ka=Va;var Ga=s(190);var Wa=!("undefined"==typeof RTCPeerConnection||ae.d);var qa=Wa;function Qa(e,t,s,i=e.getBoundingClientRect(),n=t.getBoundingClientRect()){let{top:a,right:o,bottom:r,left:l}=n;if(s){const e=t.querySelector(".sticky");if(e){a=e.getBoundingClientRect().bottom}}if(i.top>=r||i.bottom<=a||i.right<=l||i.left>=o)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},d="visualViewport"in window?window.visualViewport:window,h=d.width||d.innerWidth,p=d.height||d.innerHeight;return{rect:{top:i.topo&&o!==h?(c.right=!0,++c.horizontal,o):i.right,bottom:i.bottom>r&&r!==p?(c.bottom=!0,++c.vertical,r):i.bottom,left:i.left{ct.a.invokeApi("messages.importChatInvite",{hash:e}).then(e=>{vi.a.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.a.dispatchEvent("history_focus",{peerId:t})},e=>{"INVITE_REQUEST_SENT"===e.type&&rt({langPackKey:"RequestToJoinSent"})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new fc;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),Ps({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,Me.c,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),Object(m.a)(i,X.b.wrapEmojiText(t.title));const n=t.pFlags.broadcast,o=Object(T.d)(n?"Subscribers":"Members",[Object(Ya.a)(t.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,i,o),t.pFlags.request_needed){const e=document.createElement("div");Object(T.b)(e,n?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER"}($a||($a={}));class Ja{constructor(e,t){this.scrollable=e,this.reverse=t}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}save(){const{scrollTop:e,scrollHeight:t,clientHeight:s}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=s,this.scrollHeightMinusTop=this.reverse?t-e:e}restore(e){const{container:t,scrollHeightMinusTop:s,scrollable:i}=this;if(void 0===s)throw new Error("scroll was not saved");const n=t.scrollHeight;if(n===this.scrollHeight)return;this.scrollHeight=n;const a=this.reverse?n-s:s;this.scrollable.setScrollTopSilently(this.scrollTop=a),ae.g&&e&&ca(t)}}class Za{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver(e=>{const t=this.observing;for(let s=0,i=e.length;s{if(e.isIntersecting){const t=e.target,s=this.unreaded.get(t);this.onUnreadedInViewport(t,s)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this;e&&e.random_id&&(delete e.random_id,this.chat.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId()),random_id:e.random_id}))}}},this.onBubblesMouseMove=e=>{const t=Object(Ce.a)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=Object(Ce.a)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:s,hoverReaction:i}=this;if(e===s)return;if(this.unhoverPrevious(),s=this.hoverBubble=e,i=this.hoverReaction,i)i.dataset.loaded&&this.setHoverVisible(i,!0);else{i=this.hoverReaction=document.createElement("div"),i.classList.add("bubble-hover-reaction");const s=document.createElement("div");s.classList.add("bubble-hover-reaction-sticker"),i.append(s),t.append(i);let n=this.chat.getMessage(+e.dataset.mid);n=this.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware(()=>this.hoverReaction===i);Promise.all([this.appReactionsManager.getAvailableReactionsByMessage(n),Object(da.a)(400)]).then(([e])=>{const t=e[0];t?xs({div:s,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:tc,withThumb:!1,needFadeIn:!1}).then(e=>{Object(ys.a)(e),a()&&(e.addEventListener("firstFrame",()=>{a()&&(i.dataset.loaded="1",this.setHoverVisible(i,!0))},{once:!0}),Object(l.b)(i,e=>{Object(c.a)(e),this.appReactionsManager.sendReaction(n,t.reaction),this.unhoverPrevious()},{listenerSetter:this.listenerSetter}))}):i.remove()})}}else this.unhoverPrevious()},this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>{var t;let s=e.target,i=null;try{i=Object(Ce.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Ce.a)(s,"bubble-content")){if(i.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages){if(this.dateMessages[e].div===i){new Xn(new Date(+e),this.onDatePick).show();break}}return}if(!he.a&&Object(Ce.a)(s,"time"))return void this.chat.selection.toggleByElement(i);if(this.chat.selection.isSelecting&&e.isTrusted){if(i.classList.contains("service")&&void 0===i.dataset.mid)return;return Object(c.a)(e),he.a&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement(Object(Ce.a)(s,"grouped-item")||i)}const n=Object(Ce.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=Object(Ce.a)(s,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);const o=Object(Ce.a)(s,"spoiler");if(o){const t=Object(Ce.a)(o,"message"),s="is-spoiler-visible",i=t.classList.contains(s);i||Object(c.a)(e);const n=200,a=5e3,r=i?0:2;r&&t.classList.add("will-change");const l=t.dataset.spoilerTimeout;return null!==l&&(clearTimeout(+l),delete t.dataset.spoilerTimeout),void Object(is.a)(t,s,!0,n,()=>{t.dataset.spoilerTimeout=""+window.setTimeout(()=>{Object(is.a)(t,s,!1,n,()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout})},a)},r)}const r=Object(bt.a)(s,"REACTION-ELEMENT");if(r){if(Object(c.a)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,s=t.getReactionCount(r),i=t.getMessage();return void this.appReactionsManager.sendReaction(i,s.reaction)}if(Object(Ce.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Me.e){const t=this.chat.getMessage(e),s=this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id),i=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(s,n,i)}else{const t=this.appMessagesManager.filterMessages(this.chat.getMessage(e),e=>!!e.replies)[0],s=t.replies;s&&this.appMessagesManager.getDiscussionMessage(this.peerId,t.mid).then(e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})})}return}const d=Object(Ce.a)(s,"is-via");if(d){const t=d.querySelector(".peer-title");if(s===t||Object(ii.a)(s,t)){const s=t.innerText+" ";return this.appDraftsManager.setDraft(this.peerId,this.chat.threadId,s),void Object(c.a)(e)}}const h=Object(Ce.a)(s,"peer-title")||Object(bt.a)(s,"AVATAR-ELEMENT")||Object(yt.a)(s,"data-saved-from");if(h&&h!==i){s=h||s;const e=s.dataset.peerId||s.getAttribute("peer")||s.peerId,t=s.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,s]=t.split("_");this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+s})}else{const t=e.toPeerId();t!==Me.c?this.chat.appImManager.setInnerPeer({peerId:t}):ot(T.c.format("HidAccount",!0))}return}if(i.classList.contains("sticker")&&s.parentElement.classList.contains("attachment")){const e=+i.dataset.mid,s=null===(t=this.chat.getMessage(e).media)||void 0===t?void 0:t.document;return void((null==s?void 0:s.stickerSetInput)&&new on(s.stickerSetInput).show())}const p=Object(Ce.a)(s,"document-with-thumb");if("IMG"===s.tagName&&!s.classList.contains("emoji")&&!s.classList.contains("document-thumb")||s.classList.contains("album-item")||"VIDEO"===s.tagName&&!i.classList.contains("round")||p&&!p.querySelector(".preloader-container")||s.classList.contains("canvas-thumbnail")){const t=Object(Ce.a)(s,"album-item")||Object(Ce.a)(s,"document-container"),n=+(t||i).dataset.mid,a=this.chat.getMessage(n);if(!a)return void this.log.warn("no message by messageId:",n);const o=(t||i).querySelector(".preloader-container");if(o)return Object(l.d)(o),void Object(c.a)(e);const r="webpage",d=i.classList.contains(r),h=p?e=>cc.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),u=[],g=d?[n]:Object.keys(this.bubbles).map(e=>+e).filter(e=>{const t=this.chat.getMessage(e),s=this.appMessagesManager.getMediaFromMessage(t);return s&&h(s)}).sort((e,t)=>e-t);g.forEach(e=>{let t;if(p)t=".document-container";else{t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img"}const s=Array.from(this.bubbles[e].querySelectorAll(t)),i=new Set;if(p)s.forEach(e=>{u.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})});else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");s.forEach(s=>{if(t&&!Object(Ce.a)(s,"media-container-aspecter"))return;let n=Object(Ce.a)(s,"album-item");const a=n||s.parentElement;i.has(a)||(i.add(a),u.push({element:s,mid:n?+n.dataset.mid:e,peerId:this.peerId}))})}}),u.sort((e,t)=>e.mid-t.mid);let m=u.findIndex(e=>e.mid===n);return le.b&&this.log("open mediaViewer single with ids:",g,m,u),u[m]?((new cc).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:p?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(a,u[m].element,0,!0,u.slice(0,m),u.slice(m+1)),void Object(c.a)(e)):void this.log("no target for media viewer!",s)}if(-1===["IMG","DIV","SPAN"].indexOf(s.tagName)&&(s=Object(bt.a)(s,"DIV")),-1!==["DIV","SPAN"].indexOf(s.tagName)){if(s.classList.contains("goto-original")){const e=i.dataset.savedFrom,[t,s]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+s})}if(s.classList.contains("forward")){const e=+i.dataset.mid,t=this.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Xs({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Ce.a)(e.target,"reply")}catch(e){}if(t&&i.classList.contains("is-reply")){const e=+i.dataset.mid;this.replyFollowHistory.push(e);const t=this.chat.getMessage(e),s=t.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:s,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}},this.onScroll=(e,t)=>{var s,i;if(this.isHeavyAnimationInProgress){if(this.sliceViewportDebounced&&this.sliceViewportDebounced.clearTimeout(),this.scrolledDown&&!e)return}else this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),this.sliceViewportDebounced&&this.sliceViewportDebounced(),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const n=null!==(s=null==t?void 0:t.distanceToEnd)&&void 0!==s?s:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&n>0||t)&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350+(null!==(i=null==t?void 0:t.duration)&&void 0!==i?i:0))),n<300&&(this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.bubblesContainer.classList.add("scrolled-down"),this.scrolledDown=!0):this.bubblesContainer.classList.contains("scrolled-down")&&(this.bubblesContainer.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.onDatePick=e=>{const t=this.peerId;this.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then(e=>{var s;(null===(s=null==e?void 0:e.messages)||void 0===s?void 0:s.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")})},this.listenerSetter=new R.a,this.bubblesContainer=document.createElement("div"),this.bubblesContainer.classList.add("bubbles","scrolled-down"),this.chatInner=document.createElement("div"),this.chatInner.classList.add("bubbles-inner"),this.setScroll(),this.bubblesContainer.append(this.scrollable.container),this.log=this.chat.log,this.bubbleGroups=new Yn(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new Z.d,this.lazyLoadQueue.queueId=++no,this.listenerSetter.add(a.a)("history_update",({storage:e,peerId:t,mid:s})=>{if(this.chat.getMessagesStorage()===e){const e=this.bubbles[s];if(!e)return;const t=this.chat.getMessage(s);if(+e.dataset.timestamp>=t.date+Ye.a.serverTimeOffset-1)return void this.bubbleGroups.changeBubbleMid(e,s);this.setBubblePosition(e,t,!1),this.scrollingToBubble&&this.scrollToEnd()}}),this.listenerSetter.add(a.a)("dialog_flush",({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map(e=>+e))}),this.listenerSetter.add(a.a)("message_sent",e=>{var t,s,i,n,o,r,l,c;const{storage:d,tempId:h,tempMessage:p,mid:u}=e;if(this.chat.getMessagesStorage()!==d)return;const g=this.getMountedBubble(h,p)||this.getMountedBubble(u);if(g){const e=this.chat.getMessage(u),a=g.bubble,d=Array.from(a.querySelectorAll("reactions-element"));if(d.length&&d.forEach(t=>{t.changeMessage(e)}),e.replies){const t=a.querySelector("replies-element");t&&(t.message=e,t.init())}if(null===(t=e.media)||void 0===t?void 0:t.document){const t=a.querySelector(`.document-container[data-mid="${h}"] .document`);if(t){const a=Object(Ce.a)(t,"document-container");!(null===(n=null===(i=null===(s=p.media)||void 0===s?void 0:s.document)||void 0===i?void 0:i.thumbs)||void 0===n?void 0:n.length)&&(null===(o=e.media.document.thumbs)||void 0===o?void 0:o.length)&&Object(Ds.c)().then(()=>{const s=t.querySelector(".time"),i=Es({message:e});t.replaceWith(i),s&&i.querySelector(".document-size").append(s)}),a&&(a.dataset.mid=""+u)}}if(e.grouped_id){const e=a.querySelector(`.grouped-item[data-mid="${h}"]`)||a;e&&(e.dataset.mid=""+u)}if(null===(r=e.media)||void 0===r?void 0:r.poll){const t=a.querySelector("poll-element");if(t){const s=e.media.poll;t.message=e,t.setAttribute("poll-id",s.id),t.setAttribute("message-id",""+u)}}if(null===(l=e.media)||void 0===l?void 0:l.document){const t=a.querySelector(`audio-element[data-mid="${h}"], .document[data-doc-id="${h}"], .media-round[data-mid="${h}"]`);t&&(t instanceof De||t.classList.contains("media-round")?(t.dataset.mid=""+e.mid,delete t.dataset.isOutgoing,t.message=e,t.onLoad(!0)):t.dataset.docId=e.media.document.id)}(null===(c=e.media)||void 0===c?void 0:c.webpage)&&!a.querySelector(".web")&&Object(Ds.c)().then(()=>{this.safeRenderMessage(e,!0,!1,a,!1),this.scrollToBubbleIfLast(a)})}else this.log.warn("message_sent there is no bubble",e);const m=this.bubbles;if(m[h]){const e=m[h];m[u]=e,delete m[h],Object(Le.b)(()=>{const t=+e.dataset.mid;m[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===a.a.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}),e.dataset.mid=""+u}if(this.unreadOut.has(h)&&(this.unreadOut.delete(h),this.unreadOut.add(u)),"scheduled"===this.chat.type){(Date.now()/1e3|0)>=p.date-10&&this.deleteMessagesByIds([u])}}),this.listenerSetter.add(a.a)("message_edit",({storage:e,peerId:t,mid:s})=>{if(e!==this.chat.getMessagesStorage())return;const i=this.chat.getMessage(s),n=i.grouped_id?this.getGroupedBubble(i.grouped_id):this.getMountedBubble(s);if(!n)return;const a="scheduled"===this.chat.type,o=new Ja(this.scrollable,!0);o.save(),this.safeRenderMessage(n.message,!0,!1,n.bubble,a),o.restore(),a&&(this.messagesQueuePromise||Promise.resolve()).then(()=>{this.deleteEmptyDateGroups()})}),"scheduled"!==this.chat.type&&(this.listenerSetter.add(a.a)("missed_reactions_element",({message:e,changedResults:t})=>{if(this.peerId!==e.peerId||!e.reactions||!e.reactions.results.length)return;const s=this.getBubbleByMessage(e);if(s){if(e.grouped_id){e=this.getGroupedBubble(e.grouped_id).message}this.appendReactionsElementToBubble(s,e,t)}}),this.listenerSetter.add(a.a)("messages_reactions",e=>{let t;for(const{message:s,changedResults:i}of e){if(this.peerId!==s.peerId)return;if(!this.getBubbleByMessage(s))return;t||(t=new Ja(this.scrollable,!0),t.save());const e=s.peerId+"_"+s.mid,n=ea.get(e);if(n)for(const e of n)e.update(s,i);else a.a.dispatchEvent("missed_reactions_element",{message:s,changedResults:i})}t&&t.restore()})),this.listenerSetter.add(a.a)("album_edit",({peerId:e,groupId:t,deletedMids:s})=>{if(e!==this.peerId)return;const i=this.appMessagesManager.getMidsByAlbum(t).concat(s).find(e=>this.bubbles[e]);if(!i)return;const n=Object(li.a)(this.appMessagesManager.groupedMessagesStorage[t],"asc").pop();this.safeRenderMessage(this.chat.getMessage(n),!0,!1,this.bubbles[i],!1)}),this.listenerSetter.add(a.a)("messages_downloaded",({peerId:e,mids:t})=>{const s=this.getMiddleware();Object(Ds.c)().then(()=>{s()&&t.forEach(t=>{Object(f.a)(this.needUpdate,(s,i)=>{if(s.replyMid===t&&s.replyToPeerId===e){const{mid:e,replyMid:t}=this.needUpdate.splice(i,1)[0],n=this.bubbles[e];if(!n)return;const a=this.chat.getMessage(e);this.appMessagesManager.getMessageByPeer(s.replyToPeerId,t).deleted&&delete a.reply_to_mid,aa.setReply({chat:this.chat,bubble:n,message:a})}})})})}),he.a){const e="is-gesturing-reply",t=64,s=.75*t;let i,n,a=!1;Gs({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.chat.canSend())&&(i=Object(Ce.a)(t.target,"bubble"),i&&(Object(is.a)(i,e,!0,250),i.offsetLeft,n?(n.classList.remove("is-visible"),n.style.opacity=""):(n=document.createElement("span"),n.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),i.append(n)),!!i),onSwipe:(e,o)=>{a=e>=s,a&&!n.classList.contains("is-visible")&&n.classList.add("is-visible"),n.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(t,e));i.style.transform=`translateX(${r}px)`,Object(ee.b)()},onReset:()=>{const t=i;Object(is.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(Le.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let b;Object(l.b)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",e=>{if(0!==e.button)return;const t=Object(bt.a)(e.target,"CODE");return t?(Object(c.a)(e),tt(t.textContent),void rt({langPackKey:"TextCopied"})):void 0}),le.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Ce.a)(e.target,"grouped-item")||Object(Ce.a)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",this.chat.getMessage(e)),this.highlightBubble(t)}}),ae.e||"pinned"===this.chat.type||this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{if(this.chat.selection.isSelecting||!this.chat.canSend())return;const t=e.target,s=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(s&&!s.classList.contains("bubble-first")){const e=+s.dataset.mid;if(this.chat.getMessage(e).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}),this.stickyIntersector=new Jn(this.scrollable.container,(e,t)=>{for(const s in this.dateMessages){const i=this.dateMessages[s];if(i.container===t){const t=i.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate}),ae.g||(this.sliceViewportDebounced=Object(lt.a)(this.sliceViewport.bind(this),3e3,!1,!0)),Object(Ds.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),b=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,b&&b()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),b=null},this.listenerSetter)}constructPeerHelpers(){this.listenerSetter.add(a.a)("history_append",({storage:e,mid:t})=>{if(e===this.chat.getMessagesStorage()&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId(),a.a.settings.animationsEnabled)){const e=this.chat.gradientRenderer;e&&e.toNextPosition()}}),this.listenerSetter.add(a.a)("history_multiappend",e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort((e,t)=>t-e);this.renderNewMessagesByIds(t)}),this.listenerSetter.add(a.a)("history_delete",({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))}),this.listenerSetter.add(a.a)("dialog_unread",({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),Object(Ds.c)().then(()=>{this.updateUnreadByDialog()}))}),this.listenerSetter.add(a.a)("dialogs_multiupdate",e=>{e[this.peerId]&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.a)("dialog_notify_settings",e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.a)("chat_update",e=>{if(this.peerId===e.toPeerId(!0)){this.chatInner.classList.contains("has-rights")!==this.chat.canSend()&&(this.finishPeerChange(),this.chat.input.finishPeerChange())}}),this.listenerSetter.add(a.a)("settings_updated",e=>{if("settings.emoji.big"===e.key){const e=this.scrollable.isScrolledDown;e||this.setMessagesQueuePromise();Object(li.a)(this.bubbles,"desc").forEach(e=>{const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji")){const s=this.chat.getMessage(e);this.safeRenderMessage(s,void 0,!1,t)}}),e?this.scrollable.setScrollTopSilently(99999):this.performHistoryResult([],!0,!1,void 0)}}),this.listenerSetter.add(a.a)("messages_views",e=>{Object(Le.b)(()=>{let t;for(const{peerId:s,views:i,mid:n}of e){if(this.peerId!==s)return;const e=this.bubbles[n];if(!e)return;const a=Array.from(e.querySelectorAll(".post-views"));if(a.length){const e=Vn(i,1);let s=!1;a.forEach(i=>{(s||i.innerHTML!==e)&&(t||(t=new Ja(this.scrollable,!0),t.save()),s=!0,i.innerHTML=e)})}}t&&t.restore()})}),this.observer=new Za({root:this.scrollable.container}),this.listenerSetter.add(a.a)("chat_changing",({to:e})=>{const t=e!==this.chat,s=()=>{this.observer.toggleObservingNew(t)};t?s():setTimeout(()=>{s()},400)}),this.sendViewCountersDebounced=Object(lt.a)(()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.appMessagesManager.incrementMessageViews(this.peerId,e)},1e3,!1,!0)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,s=!1,i=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,l=this.scrollable.isScrolledDown;r===t||i&&l||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,s=!1,i=!1},l=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver(e=>{if(i)return void l(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let c=r+a;const d=c%1;if(c-=d,!s&&(s=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,i=!0,void l(!1);if(n+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.setScrollTopSilently(e)}l(!1),a=d,t=o})).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(a.a)("context_menu_toggle",this.unhoverPrevious),this.listenerSetter.add(a.a)("overlay_toggle",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.bubblesContainer)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){Object(is.a)(e,"is-visible",t,200,t?void 0:()=>{e.remove()},2)}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=a.a.idle.focusPromise.then(()=>{if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map(e=>+e));t>=e&&(t=Math.max(this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).maxId||0,t))}this.unreaded.forEach((e,s)=>{e<=t&&this.onUnreadedInViewport(s,e)});const s=[];for(const e of this.unreadedSeen){const t=this.chat.getMessage(e);this.appMessagesManager.isMentionUnread(t)&&s.push(e)}return this.appMessagesManager.readMessages(this.peerId,s),this.unreadedSeen.clear(),le.b&&this.log("will readHistory by maxId:",t),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch(e=>{this.log.error("readHistory err:",e),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)}).finally(()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())})})}constructPinnedHelpers(){this.listenerSetter.add(a.a)("peer_pinned_messages",e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&(i||this.deleteMessagesByIds(s))})}constructScheduledHelpers(){const e=()=>{this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size)};this.listenerSetter.add(a.a)("scheduled_new",({peerId:t,mid:s})=>{t===this.peerId&&(this.renderNewMessagesByIds([s]),e())}),this.listenerSetter.add(a.a)("scheduled_delete",({peerId:t,mids:s})=>{t===this.peerId&&(this.deleteMessagesByIds(s),e())})}onGoDownClick(){if(this.replyFollowHistory.length){Object(f.a)(this.replyFollowHistory,(e,t)=>{const s=this.bubbles[e];let i=!0;if(s){const e=s.getBoundingClientRect();i=St.a.height/2>e.top}else{this.chat.getMessage(e).deleted||(i=!1)}i&&this.replyFollowHistory.splice(t,1)}),this.replyFollowHistory.sort((e,t)=>t-e);const e=this.replyFollowHistory.pop();this.chat.setMessageId(e)}else this.chat.setMessageId()}getBubbleByPoint(e){let t=la(this.scrollable.container,e,"center");return t&&(t=Object(Ce.a)(t,"bubble")),t}getGroupedBubble(e){const t=this.appMessagesManager.groupedMessagesStorage[e];for(const[e]of t)if(this.bubbles[e]){const s=Math.max(...t.keys());return{bubble:this.bubbles[e],mid:+e,message:this.chat.getMessage(s)}}}getBubbleByMessage(e){if(!e.grouped_id)return this.bubbles[e.mid];const t=this.getGroupedBubble(e.grouped_id);return null==t?void 0:t.bubble}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t=this.chat.getMessage(e)){if(t.grouped_id&&this.appMessagesManager.getMidsByAlbum(t.grouped_id).length>1){const s=this.getGroupedBubble(t.grouped_id);if(s)return s.bubble=s.bubble.querySelector(`.document-container[data-mid="${e}"]`)||s.bubble,s}const s=this.bubbles[e];if(s)return{bubble:s,mid:e,message:t}}findNextMountedBubbleByMsgId(e){return this.bubbles[Object(li.a)(this.bubbles).find(t=>{var s;return!(t+e).sort((e,t)=>e-t).filter(e=>e>0&&!this.skippedMids.has(e));if(s.length)if(e)le.b&&this.log("Will load more (up) history by id:",s[0],"maxId:",s[s.length-1],t),this.getHistory(s[0],!0,void 0,void 0,t);else{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);if(-1!==s.indexOf(e.maxId))return void this.setLoaded("bottom",!0);le.b&&this.log("Will load more (down) history by id:",s[s.length-1],t),this.getHistory(s[s.length-1],!1,!0,void 0,t)}}setScroll(){this.scrollable=new P.b(null,"IM",300),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),he.a}updateUnreadByDialog(){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),t=this.peerId===a.a.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}deleteMessagesByIds(e,t=!0,s){let i=!1;e.forEach(e=>{if(!(e in this.bubbles))return;i=!0;const t=this.bubbles[e];delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeBubble(t),this.observer&&(this.observer.unobserve(t,this.unreadedObserverCallback),this.unreaded.delete(t),this.observer.unobserve(t,this.viewsObserverCallback),this.viewsMids.delete(e)),t.remove(),this.emptyPlaceholderMid===e&&(this.emptyPlaceholderMid=void 0)}),i&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),I.a.checkAnimations(!1,tc),this.deleteEmptyDateGroups(),s||this.onScroll())}setTopPadding(e=this.getMiddleware()){let t,s=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:i}=this.scrollable.container;s=e===i,s&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(i),this.isTopPaddingSet=!0)}return{isPaddingNeeded:s,unsetPadding:s?()=>{e()&&s&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessagesByIds(e,t){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const s=this.getMiddleware();t.then(()=>{s()&&this.renderNewMessagesByIds(e)})}return}this.chat.threadId&&(e=e.filter(e=>{const t=this.chat.getMessage(e).reply_to;return t&&(t.reply_to_top_id||t.reply_to_msg_id)===this.chat.threadId})),e=e.filter(e=>!this.bubbles[e]),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const s=this.getMiddleware(),{isPaddingNeeded:i,unsetPadding:n}=this.setTopPadding(s),a=this.performHistoryResult(e,!1,!0);t&&a.then(()=>{if(!s())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();i&&a.then(n)})}getLastBubble(){const e=this.getLastDateGroup();if(e)return e.lastElementChild}scrollToBubble(e,t,s,i){const n=Object(Ce.a)(e,"bubble");let a;if(n&&"end"!==t&&Object(Bs.a)(n)===(this.stickyIntersector?3:1)){a=n.parentElement}const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),r=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:s,forceDuration:i,axis:"y",getNormalSize:o?({rect:e})=>{let t=St.a.height;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||St.a.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{this.onScroll(!0,e)}});return s===ft.a.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),r}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return eo(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}getLastDateGroup(){let e,t=0;for(const s in this.dateMessages){const i=this.dateMessages[s];i.firstTimestamp>t&&(e=i.container,t=i.firstTimestamp)}return e}scrollToBubbleIfLast(e){return eo(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout(()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]},2e3)}createDateBubble(e,t=new Date(1e3*e)){let s;const i=new Date;i.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(i.getTime()===t.getTime())s=Object(T.d)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&2147483646===e)s=Object(T.d)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==i.getFullYear()&&(e.year="numeric"),s=new T.c.IntlDateElement({date:t,options:e}).element,n&&(s=Object(T.d)("Chat.Date.ScheduledFor",[s]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(s),o.append(r),a.append(o),a}getDateContainerByMessage(e,t){const s=new Date(1e3*e.date);s.setHours(0,0,0);const i=s.getTime();if(!this.dateMessages[i]){const t=this.createDateBubble(e.date,s),n=this.createDateBubble(e.date,s);n.classList.add("is-fake");const a=document.createElement("section");a.className="bubbles-date-group",a.append(t,n),this.dateMessages[i]={div:t,container:a,firstTimestamp:s.getTime()};const o=Object(li.a)(this.dateMessages,"asc");let r,l=0,c=o.length;for(;l+e)))}else this.isFirstLoad=!0,this.destroyResizeObserver();const v=this.chatInner;this.cleanup();const f=this.chatInner=document.createElement("div");n?(f.className=v.className,f.classList.remove("disable-hover","is-scrolling")):f.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const y=n||r&&u||l,w=b>0&&(!t||bthis.performHistoryResult(d.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,u,m);const{promise:M,cached:E}=L;E||n||(g.container.textContent="",this.chat.finishPeerChange(l,u,t,s),this.preloader.attach(this.bubblesContainer));const P=this.getMiddleware();I.a.lockGroup(tc);const T=M.then(()=>{if(E&&(n||this.chat.finishPeerChange(l,u,t,s)),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),g.lastScrollDirection=0,g.lastScrollPosition=0,Object(k.a)(g.container,f),I.a.unlockGroup(tc),I.a.checkAnimations(!1,tc),this.lazyLoadQueue.unlock(),d)g.setScrollTopSilently(d.top);else if(y){let e;if(S)g.setScrollTopSilently(99999);else if(C){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),g.setScrollTopSilently(0)}const s=t?this.getMountedBubble(t):{bubble:this.getLastBubble()};let i,a=c&&this.firstUnreadBubble||(null==s?void 0:s.bubble);if((null==a?void 0:a.parentElement)||(a=this.findNextMountedBubbleByMsgId(t)),a){const e=this.getLastBubble(),t=c?"start":u||l||e!==a?"center":"end";i="end"===t&&e===a&&n?this.scrollToEnd():this.scrollToBubble(a,t,n?void 0:ft.a.Static),!c&&l&&this.highlightBubble(a)}e&&(i||Promise.resolve()).then(()=>{e()})}else g.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const i=this.getMiddleware(),o=Promise.all([T,Object(Ds.c)()]);o.then(()=>{g.checkForTriggers()}),this.chat.dispatchEvent("setPeer",t,!u);if(this.appPeersManager.isChannel(e)){const e=this.getMiddleware(),t=()=>{if(!e())return;const s=[];for(const e in this.bubbles){let t=this.chat.getMessage(+e);"message"===t._&&(t=this.appMessagesManager.getGroupsFirstMessage(t),s.push(t.mid))}(s.length?this.appReactionsManager.getMessagesReactions(this.peerId,s):Promise.resolve()).then(()=>{setTimeout(t,1e4)})};Promise.all([o,Object(Ds.c)(),Object(da.a)(500)]).then(()=>{t()})}const h=this.appMessagesManager.isFetchIntervalNeeded(e);if(d||h?o.then(()=>{if(i()&&(g.checkForTriggers(),h)){const t=()=>{this.fetchNewPromise=new Promise(s=>{i()&&this.appMessagesManager.isFetchIntervalNeeded(e)?this.appMessagesManager.getNewHistory(e,this.chat.threadId).then(e=>{if(!i()||!e)return void s();const n=e.history.slice.isEnd(ra.a.Bottom);g.loadedAll.bottom&&g.loadedAll.bottom!==n&&(this.setLoaded("bottom",n),this.onScroll()),setTimeout(t,3e4),s()}):s()}).finally(()=>{this.fetchNewPromise=void 0})};n?setTimeout(t,3e4):t()}}):t&&!this.bubbles[r]&&t!==r||this.setLoaded("bottom",!0),this.log("scrolledAllDown:",g.loadedAll.bottom),g.loadedAll.bottom&&r&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===a){const t=this.appMessagesManager.getDialogOnly(e);(null==t?void 0:t.pFlags.unread_mark)&&this.appMessagesManager.markDialogUnread(e,!0)}}).catch(e=>{throw this.log.error("getHistory promise error:",e),P()||this.preloader.detach(),e});return{cached:E,promise:T}}onScrolledAllDown(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);this.appMessagesManager.readHistory(this.peerId,e.maxId,this.chat.threadId,!0)}}finishPeerChange(){const e=this.appPeersManager.isChannel(this.peerId),t=this.chat.canSend();this.chatInner.classList.toggle("has-rights",t),this.bubblesContainer.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",this.chat.isAnyGroup()),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}renderMessagesQueue(e,t,s,i){return this.messagesQueue.push({message:e,bubble:t,reverse:s,promises:i}),this.setMessagesQueuePromise()}setMessagesQueuePromise(){return this.messagesQueuePromise||!this.messagesQueue.length?Promise.resolve():this.messagesQueuePromise=new Promise((e,t)=>{setTimeout(()=>{const s=this.messagesQueue.slice();this.messagesQueue.length=0;const i=s.reduce((e,{promises:t})=>(e.push(...t),e),[]);this.log("promises to call",i,s,this.isHeavyAnimationInProgress);const n=this.getMiddleware();Promise.all(i).then(()=>{if(!n())throw"setMessagesQueuePromise: peer changed!";this.messagesQueueOnRender&&this.messagesQueueOnRender(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),s.forEach(({message:e,bubble:t,reverse:s})=>{this.setBubblePosition(t,e,s)}),e(),this.messagesQueuePromise=null,this.messagesQueue.length&&this.setMessagesQueuePromise(),this.setUnreadDelimiter()}).catch(t)},0)})}setBubblePosition(e,t,s){if(t.pFlags.local)return void this.chatInner[t.pFlags.sponsored?"append":"prepend"](e);const i=this.getDateContainerByMessage(t,s);if("scheduled"===this.chat.type||"pinned"===this.chat.type){const s=this.stickyIntersector?3:1;let n=Array.from(i.container.children).slice(s),a=0,o=0;for(;as.includes(e)));i.className=n.join(" "),C=i.lastElementChild,C.classList.contains("bubble-content-wrapper")||(C=i.querySelector(".bubble-content-wrapper")),S=C.firstElementChild,S.innerHTML="",S.style.cssText="",C.innerHTML="",C.appendChild(S);const a=C.style.transitionDelay;C.style.cssText="",C.style.transitionDelay=a,i===this.firstUnreadBubble&&i.classList.add("is-first-unread");const o=+i.dataset.mid;+e.mid===o||(delete this.bubbles[o],this.skippedMids.delete(o))}else if(C=document.createElement("div"),C.classList.add("bubble-content-wrapper"),S=document.createElement("div"),S.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),C.appendChild(S),i.appendChild(C),!y&&!e.pFlags.out&&this.observer){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=I.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3&&M.length===e.length){if(a.a.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(I);if(1===e.length&&!E&&t)E={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),Object(m.a)(t,P),i.classList.add("emoji-"+e.length+"x"),S.append(t)}i.classList.add("is-message-empty","emoji-big"),x=!0,k=!1,A=!1}i.classList.add("can-have-big-emoji")}}A&&Object(m.a)(w,P);const O=aa.setTime({chatType:this.chat.type,message:e});if(w.append(O),S.prepend(w),u&&e.views){if(i.classList.add("channel-post"),!(null===(h=e.fwd_from)||void 0===h?void 0:h.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),S.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const j=u&&e.reply_markup;if(j&&"replyInlineMarkup"===j._&&j.rows&&j.rows.length){const t=j.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach(t=>{const i=t.buttons;if(!i||!i.length)return;const n=document.createElement("div");n.classList.add("reply-markup-row"),i.forEach(t=>{const s=X.b.wrapRichText(t.text,{noLinks:!0,noLinebreaks:!0});let i;switch(t._){case"keyboardButtonUrl":{const e=X.b.wrapRichText(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=Object(Zs.a)(e).firstElementChild,i.classList.add("is-link","tgico");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline","tgico"),Object(l.b)(i,s=>{Object(c.a)(s);const i=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.appInlineBotsManager.checkSwitchReturn(i).then(e=>e||new Promise((e,t)=>{new Xs({[this.peerId]:[]},t=>{e(t)},!0).addEventListener("close",()=>{t()})})),n.then(e=>{const s=this.peerId===e?this.chat.threadId:void 0;this.appInlineBotsManager.switchInlineQuery(e,s,i,t.query)})});break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp"),"string"==typeof s?i.insertAdjacentHTML("beforeend",s):i.append(s),Object(te.a)(i),n.append(i)}),s.append(n)}),Object(l.b)(s,s=>{let i=s.target;if(i.classList.contains("reply-markup-button")||(i=Object(Ce.a)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline"))return;Object(c.a)(s);const n=Object(Bs.a)(i),a=t[Object(Bs.a)(i.parentElement)];if(!a.buttons||!a.buttons[n])return void this.log.warn("no such button",a,n,e);const o=a.buttons[n];this.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,o)}),k=!1,i.classList.add("with-reply-markup"),C.append(s)}const _=e.pFlags.is_outgoing;if(y){(e.pFlags.unread||_)&&this.unreadOut.add(e.mid);let t="";t=_?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}_&&i.classList.add("is-outgoing");const F=u&&this.appMessagesManager.getMessageWithReplies(e),D=!!F&&e.mid>0;D&&i.classList.add("with-replies");const R=u&&e.fwd_from,B=u&&e.fwdFromId,N=y&&(!R||this.peerId!==a.a.myId);let U=S;const H=!(e.viaBotId||e.fromId!==a.a.myId&&e.pFlags.out);if(E){let t=document.createElement("div");t.classList.add("attachment"),I||i.classList.add("is-message-empty");let s=!1;switch(E._){case"messageMediaPhoto":{const s=E.photo;I||(k=!1),H&&i.classList.add("hide-name"),i.classList.add("photo");const n=this.appMessagesManager.groupedMessagesStorage[g];if(g&&1!==n.size&&v){i.classList.add("is-album","is-grouped"),Fs({groupId:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:L,autoDownload:this.chat.autoDownload});break}const a=!ae.a&&k&&!D&&!1;a&&i.classList.add("with-media-tail"),Ps({photo:s,message:e,container:t,withTail:a,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:L,autoDownloadSize:this.chat.autoDownload.photo});break}case"messageMediaWebPage":{s=!0;let t=E.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let n=document.createElement("div");n.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));let c=document.createElement("div");c.classList.add("quote-text");const d=t.document;if(d)if("gif"===d.type||"video"===d.type||"round"===d.type){const t="round"===d.type?b.b.active.round:b.b.active.webpage;"round"===d.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),Ms({doc:d,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:N,group:tc,loadPromises:L,autoDownload:this.chat.autoDownload})}else{const t=Es({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:L,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}}});o.append(t),o.classList.add("preview-with-document"),c.classList.add("has-document")}let h;if(a&&c.append(a),t.site_name){const e=X.b.wrapRichText(t.url),s=Object(Zs.a)(e).firstElementChild;s.classList.add("webpage-name");const i=document.createElement("strong");Object(m.a)(i,X.b.wrapEmojiText(t.site_name)),s.textContent="",s.append(i),c.append(s),h=s}const p=this.appWebPagesManager.wrapTitle(t);if(p.textContent){let e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");Object(m.a)(t,p),e.append(t),c.append(e),h=e}const u=this.appWebPagesManager.wrapDescription(t);if(u.textContent){let e=document.createElement("div");e.classList.add("text"),Object(m.a)(e,u),c.append(e),h=e}if(r.append(c),l&&!d){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&h?(i.classList.add("is-square-photo"),s=!0,this.appPhotosManager.setAttachmentSize(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),Ps({photo:l,message:e,container:o,boxWidth:s?0:b.b.active.webpage.width,boxHeight:s?0:b.b.active.webpage.height,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:L,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}n.append(r),w.insertBefore(n,O);break}case"messageMediaDocument":{const n=E.document;if(n.sticker){i.classList.add("sticker"),k=!1,x=!0,n.animated&&i.classList.add("sticker-animated");const e=b.b.active,s=i.classList.contains("emoji-big")?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;this.appPhotosManager.setAttachmentSize(n,t,s.width,s.height),S.style.minWidth=t.style.width,S.style.minHeight=t.style.height,xs({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:tc,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?I:void 0,withThumb:!0,loadPromises:L})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(x=!0),!s&&I||(k=!1),H&&i.classList.add("hide-name"),i.classList.add(s?"round":"video");const a=this.appMessagesManager.groupedMessagesStorage[g];if(g&&1!==a.size&&v)i.classList.add("is-album","is-grouped"),Fs({groupId:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:L,autoDownload:this.chat.autoDownload});else{const a=!ae.a&&!ae.b&&!s&&k&&!D&&!1;a&&i.classList.add("with-media-tail"),Ms({doc:n,container:t,message:e,boxWidth:b.b.active.regular.width,boxHeight:b.b.active.regular.height,withTail:a,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:tc,loadPromises:L,autoDownload:this.chat.autoDownload,searchContext:s?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=function({albumMustBeRenderedFull:e,message:t,bubble:s,messageDiv:i,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,useSearch:c,sizeType:d}){let h;const p=e?n.getMidsByMid(t.mid):[t.mid];return p.forEach((e,t)=>{const s=n.getMessage(e),c=Es({message:s,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,sizeType:d}),u=document.createElement("div");u.classList.add("document-container"),u.dataset.mid=""+e,u.dataset.peerId=""+s.peerId;const g=document.createElement("div");if(g.classList.add("document-wrapper"),s.message){const e=document.createElement("div");e.classList.add("document-message");const t=X.b.wrapRichText(s.message,{entities:s.totalEntities});Object(m.a)(e,t),g.append(e)}if(p.length>1){const e=document.createElement("div");e.classList.add("document-selection"),u.append(e),u.classList.add("grouped-item"),0===t&&(h=g)}g.append(c),u.append(g),i.append(u)}),p.length>1&&s.classList.add("is-multiple-documents","is-grouped"),h}({albumMustBeRenderedFull:v,message:e,bubble:i,messageDiv:w,chat:this.chat,loadPromises:L,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName"});t&&(U=t);const a=w.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(O),i.classList.remove("is-message-empty"),w.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),s=!0}break}case"messageMediaCall":{const e=E.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";t.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),Object(T.b)(a,N?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append(Object(Ga.a)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),Object(T.b)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),s=!0,i.classList.remove("is-message-empty"),w.classList.add("call-message"),w.append(t);break}case"messageMediaContact":{const e=E,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,s=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name",a.append(X.b.wrapEmojiText([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+Object(qs.a)(e.phone_number).formatted:"Unknown phone number",t.append(n),n.append(a,o);const r=new fc;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),t.prepend(r),i.classList.remove("is-message-empty"),w.classList.add("contact-message"),w.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e){const t=new hs;return t.message=e,t.setAttribute("peer-id",""+e.peerId),t.setAttribute("poll-id",e.media.poll.id),t.setAttribute("message-id",""+e.mid),t.render(),t}(e);w.prepend(t),w.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),w.append(Object(T.d)(T.a),O),this.log.warn("unrecognized media type:",E._,e)}s||S.append(t)}x&&i.classList.add("just-media"),this.chat.selection.isSelecting&&this.chat.selection.toggleElementCheckbox(i,!0);let z="";const V=e.fromId!==a.a.myId&&this.appPeersManager.isAnyGroup(f)||e.viaBotId||e.pFlags.sponsored;if(V||R||e.reply_to_mid){let t,s;const n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===B;let o,r=R&&!R.from_id;if(e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+this.appUsersManager.getUser(e.viaBotId).username,s.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),Object(m.a)(t,X.b.wrapEmojiText(R.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new wt.a({peerId:B||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&u&&aa.setReply({chat:this.chat,bubble:i,bubbleContainer:S,message:e}),B||R)if(this.peerId===a.a.myId||n||i.classList.add("forwarded"),e.savedFrom&&(z=e.savedFrom,t.dataset.savedFrom=z),o=document.createElement("div"),t.dataset.peerId=""+B,this.peerId!==a.a.myId&&this.peerId!==Me.e&&!n||x){const e=[t];x&&e.unshift(document.createElement("br")),o.append(Object(T.d)("ForwardedFrom",[e]))}else o.style.color=this.appPeersManager.getPeerColorById(B,!1),o.append(t);else if(!e.viaBotId)if(!x&&V){o=document.createElement("div"),o.append(t);const s=null===(p=this.appPeersManager.getPeer(e.fromId))||void 0===p?void 0:p.pFlags;s&&(s.scam||s.fake)&&o.append(Vt(s.scam)),y||(o.style.color=this.appPeersManager.getPeerColorById(e.fromId,!1)),o.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append(Object(T.d)("ViaBot")," ",s),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),U.append(o));if(this.chat.isAnyGroup()&&!N){let t=new fc;t.classList.add("user-avatar","avatar-40"),t.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:(R&&(this.peerId===a.a.myId||this.peerId===Me.e)||n?B:e.fromId)||Me.c,peerTitle:!B&&R&&R.from_name?R.from_name:void 0,loadPromises:L}),C.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(z=`${this.chat.peerId}_${e.mid}`);if(F&&F.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),z&&("pinned"===this.chat.type||R.saved_from_msg_id)&&this.peerId!==Me.e){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),S.append(e),i.dataset.savedFrom=z,i.classList.add("with-beside-button")}if(i.classList.add(N?"is-out":"is-in"),n&&this.renderMessagesQueue(e,i,t,L),D){aa.renderReplies({bubble:i,bubbleContainer:S,message:F,messageDiv:w,loadPromises:L,lazyLoadQueue:this.lazyLoadQueue})&&(k=!0)}return u&&this.appendReactionsElementToBubble(i,e),k&&(i.classList.add("can-have-tail"),S.append(oo())),i}appendReactionsElementToBubble(e,t,s){if(this.peerId.isUser())return;const i=this.appMessagesManager.getGroupsFirstMessage(t);if(!i.reactions||!i.reactions.results.length)return;const n=new ta;if(n.init(i,"block"),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let i=e.querySelector(".document-message"),a=i&&i.querySelector(".time");a||(a=aa.setTime({chatType:this.chat.type,message:t})),n.append(a),i||(i=document.createElement("div"),i.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(i)),i.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}safeRenderMessage(e,t,s,i,n){try{return this.renderMessage(e,t,s,i,n)}catch(e){this.log.error("renderMessage error:",e)}}performHistoryResult(e,t,s,i){return eo(this,void 0,void 0,(function*(){let s,n;e=e.slice(),i&&e.unshift(i),this.chatInner.parentElement&&(this.messagesQueueOnRender=()=>{if(s=new Ja(this.scrollable,t),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}s.save();const e=s.getSaved();n=e.scrollHeight!==e.clientHeight}),this.needReflowScroll&&(ca(this.scrollable.container),this.needReflowScroll=!1);const a=e=>{const s="number"==typeof e?this.chat.getMessage(e):e;s.pFlags.local?this.processLocalMessageRender(s):this.safeRenderMessage(s,t,!0)},o=e.length;if(t)for(let t=0;t=0;--t)a(e[t]);if("scheduled"!==this.chat.type){const t=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),s=t.history.first,i=t.history.last;!s.isEnd(ra.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(ra.a.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);return yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),s&&(s.restore(!(1===e.length&&!t)),this.onRenderScrollSet(s.getSaved())),!0}))}onRenderScrollSet(e){if(!this.bubblesContainer.classList.contains("has-sticky-dates")){if(!this.preloader.detached||(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight!==e.clientHeight)){const e=this.getMiddleware(),t=()=>{e()&&this.bubblesContainer.classList.add("has-sticky-dates")};return void(this.willScrollOnLoad?t():setTimeout(t,600))}}this.willScrollOnLoad=void 0}requestHistory(e,t,s){if("chat"===this.chat.type||"discussion"===this.chat.type)return this.appMessagesManager.getHistory(this.peerId,e,t,s,this.chat.threadId);if("pinned"===this.chat.type){return this.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:s}).then(e=>({history:e.history.map(e=>e.mid)}))}return"scheduled"===this.chat.type?this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>({history:e.slice().reverse()})):void 0}animateAsLadder(e,t,s,i,n){return eo(this,void 0,void 0,(function*(){if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,s,i,n));if(!Object.keys(this.bubbles).length)return;let a,o=Object(li.a)(this.bubbles,"desc");s&&t.length&&(o=o.filter(e=>!t.includes(e))),a=i?n||Math.max(...o):e||Math.max(...o);const r=o.slice(o.findIndex(e=>a>e)),l=s?[]:[a],c=s?[]:o.slice(0,o.findIndex(e=>a>=e)).reverse();le.b&&this.log("getHistory: targeting mid:",a,n,e,r.map(e=>this.appMessagesIdsManager.getServerMessageId(e)),c.map(e=>this.appMessagesIdsManager.getServerMessageId(e)));const d=[];this.chatInner.classList.add("zoom-fading");const h=s?10:40,p=s?0:1,u=(e,t=0)=>{const s=Object(ie.a)();let i=0;return e.forEach((n,a)=>{if(!this.bubbles[n]||this.skippedMids.has(n))return void this.log.warn("animateAsLadder: no bubble by mid:",n);const o=this.bubbles[n].lastElementChild;if(i=(a+t||.1)*h,o.classList.add("zoom-fade"),o.style.transitionDelay=i+"ms",a===e.length-1){const e=t=>{t.target===o&&(s.resolve(),o.removeEventListener("transitionend",e))};o.addEventListener("transitionend",e)}d.push(o)}),e.length||s.resolve(),{lastMsDelay:i,animationPromise:s}},g=u(r,p),m=u(l),b=u(c,p),v=[g.animationPromise,m.animationPromise,b.animationPromise],f=[g.lastMsDelay,m.lastMsDelay,b.lastMsDelay];let y;return this.onAnimateLadder&&(yield this.onAnimateLadder()),Object(Le.b)(()=>{this.setStickyDateManually(),d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(Ds.b)(y,Math.max(...f)+200).then(()=>{Object(Le.b)(()=>{d.forEach(e=>{e.style.transitionDelay=""}),this.chatInner.classList.remove("zoom-fading")})})),y}))}renderEmptyPlaceholder(e,t,s,i){const n="empty-bubble-placeholder";let a,o;if(t.classList.add(n,n+"-"+e),"group"===e?a=Object(T.d)("GroupEmptyTitle1"):"saved"===e?a=Object(T.d)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?a=Object(T.d)("NoMessages"):"noScheduledMessages"===e?a=Object(T.d)("NoScheduledMessages"):"restricted"===e&&(a=document.createElement("span"),a.innerText=this.appPeersManager.getRestrictionReasonText(this.peerId)),a.classList.add("center",n+"-title"),i.push(a),"group"===e)i.push(Object(T.d)("GroupEmptyTitle2")),o=[Object(T.d)("GroupDescription1"),Object(T.d)("GroupDescription2"),Object(T.d)("GroupDescription3"),Object(T.d)("GroupDescription4")];else if("saved"===e)o=[Object(T.d)("ChatYourSelfDescription1"),Object(T.d)("ChatYourSelfDescription2"),Object(T.d)("ChatYourSelfDescription3"),Object(T.d)("ChatYourSelfDescription4")];else if("greeting"===e){const e=Object(T.d)("NoMessagesGreetingsDescription");e.classList.add("center",n+"-subtitle"),Object(Lt.a)(this.messagesQueue,e=>e.bubble===t);const a=document.createElement("div");a.classList.add(n+"-sticker");const o=this.getMiddleware(),r=this.appStickersManager.getGreetingSticker().then(e=>{if(!o())return;const t=[];return xs({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:tc,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),za.onMediaClick({target:e.target})}),Promise.all(t)});this.renderMessagesQueue(s,t,!1,[r]),i.push(e,a)}o&&(i.push(...o.map(e=>{const t=document.createElement("span");return t.classList.add(n+"-list-item"),t.append(e),t})),"group"===e?o.forEach(e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)}):"saved"===e&&o.forEach(e=>{const t=document.createElement("span");t.classList.add(n+"-list-bullet"),t.innerText="•",e.prepend(t)})),i.length>1&&t.classList.add("has-description"),i.forEach(e=>e.classList.add(n+"-line"))}processLocalMessageRender(e){const t=!!e.pFlags.sponsored,s=this.safeRenderMessage(e,void 0,void 0,void 0,t);s.classList.add("is-group-last","is-group-first"),t||(s.classList.add("bubble-first"),s.classList.remove("can-have-tail","is-in"));const i=[],n=this.appPeersManager.isBot(this.peerId);if(this.chat.isRestricted)this.renderEmptyPlaceholder("restricted",s,e,i);else{if(t){let t,i,n,o;s.classList.add("avoid-selection");const r=this.sponsoredMessage=e.sponsoredMessage,c=this.appPeersManager.getPeerId(r.from_id);r.channel_post?(t="OpenChannelPost",i=this.appMessagesIdsManager.generateMessageId(r.channel_post)):r.start_param||this.appUsersManager.isBot(c.toUserId())?(t="Chat.Message.ViewBot",n=r.start_param):t=this.appPeersManager.isAnyGroup(c)?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Xa(r.chat_invite_hash,r.chat_invite).show()}:r.chat_invite_hash?()=>{const e={_:$a.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{a.a.dispatchEvent("history_focus",{peerId:c,mid:i,startParam:n})};const d=Object(B.a)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.observer.observe(d,this.viewsObserverCallback),o&&Object(l.b)(d,o),void s.querySelector(".bubble-content").prepend(d)}if(n&&"message"===e._){const e=document.createElement("b");e.append(Object(T.d)("BotInfoTitle")),i.push(e,"\n\n")}else this.appPeersManager.isAnyGroup(this.peerId)&&this.appPeersManager.getPeer(this.peerId).pFlags.creator?this.renderEmptyPlaceholder("group",s,e,i):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",s,e,i):a.a.myId===this.peerId?this.renderEmptyPlaceholder("saved",s,e,i):this.appPeersManager.isUser(this.peerId)&&!n&&this.chat.canSend()&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",s,e,i):this.renderEmptyPlaceholder("noMessages",s,e,i)}if(i.length){s.querySelector(".message, .service-msg").prepend(...i)}const o=t?"append":"prepend";this.messagesQueueOnRenderAdditional?this.onAnimateLadder=()=>{if(this.chatInner[o](s),this.onAnimateLadder=void 0,!this.messagesQueuePromise)return Object(Le.d)()}:this.chatInner[o](s),this.emptyPlaceholderMid=e.mid}generateLocalMessageId(e=0){let t=("scheduled"===this.chat.type?-1:0)+e;const s=-Math.abs(t);return{id:s,mid:-Math.abs(this.appMessagesIdsManager.generateMessageId(s))}}generateLocalFirstMessage(e,t,s=0){const{id:i,mid:n}=this.generateLocalMessageId(s),a={_:e?"messageService":"message",date:0,id:i,mid:n,peer_id:this.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),Object(ys.a)(a),t&&t(a),this.appMessagesManager.saveMessages([a],{storage:new Map}),a.mid=n,a}getViewportSlice(){return function({overflowElement:e,selector:t,extraSize:s}){const i=e.getBoundingClientRect(),n=Array.from(e.querySelectorAll(t)),a=[],o=[],r=[];let l=!1;for(const t of n){const s=t.getBoundingClientRect(),n=Qa(t,e,!1,s,i);let c;!!n?(l=!0,c=o):c=l?r:a,c.push({element:t,rect:s,visibleRect:n})}if(s&&o.length){const e=o[0].rect.top-s,t=o[o.length-1].rect.bottom+s;for(let t=a.length-1;t>=0;--t){const s=a[t];s.rect.top>=e&&(a.splice(t,1),o.unshift(s))}for(let e=0,s=r.length;e+e.dataset.mid);let o;!!s.length==!!i.length||t||(o=new Ja(this.scrollable,!!s.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():s.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(ae.g||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,s=!0){if(this.scrollable.loadedAll[e]!==t){if(this.scrollable.loadedAll[e]=t,"bottom"===e&&this.appPeersManager.isBroadcast(this.peerId)&&!this.chat.isRestricted){const{mid:e}=this.generateLocalMessageId(1);if(t){const t=this.getMiddleware(()=>this.scrollable.loadedAll.bottom&&!this.bubbles[e]&&this.getSponsoredMessagePromise===s),s=this.getSponsoredMessagePromise=this.chat.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId())},{cacheSeconds:300}).then(e=>{if(!t())return;this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const s=e.messages.shift();if(!s)return;e.messages.push(s);const i=this.generateLocalFirstMessage(!1,e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s},1);return Promise.all([this.getHistoryTopPromise,this.messagesQueuePromise]).then(()=>{if(!t())return;this.performHistoryResult([i],!1,!0)})}).finally(()=>{this.getSponsoredMessagePromise=void 0})}else this.deleteMessagesByIds([e]),this.getSponsoredMessagePromise=void 0}if("top"===e&&t&&this.appPeersManager.isBot(this.peerId)&&!this.chat.isRestricted){this.log("inject bot description");const e=this.getMiddleware();return Promise.resolve(this.appProfileManager.getProfile(this.peerId.toUserId())).then(t=>{var s;if(!e())return;if(!(null===(s=t.bot_info)||void 0===s?void 0:s.description))return void this.checkIfEmptyPlaceholderNeeded();const i=this.generateLocalFirstMessage(!1,e=>{e.message=t.bot_info.description});this.processLocalMessageRender(i)})}this.checkIfEmptyPlaceholderNeeded()}}checkIfEmptyPlaceholderNeeded(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderMid&&(this.chat.isRestricted||!this.appMessagesManager.getHistoryStorage(this.peerId).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=this.generateLocalFirstMessage(!0);return this.processLocalMessageRender(e),!0}return!1}getHistory(e=0,t=!1,s=!1,i=0,n=!1){const o=this.peerId,r=this.appPeersManager.isBroadcast(o),l=Math.min(30,St.a.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==io){if(!io)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--io}let d,h=0;if(s&&(h=c,t||(c=0)),i&&!s)if("pinned"===this.chat.type)d=[i];else{const t=this.appMessagesManager.getHistoryStorage(o,this.chat.threadId).history.slice;if(t.length=0;--e){if(!this.chat.getMessage(d[e]).grouped_id)break;d.splice(e,1)}e=d[d.length-1]||e}}let p,u=this.requestHistory(e,c,h);const g=(null==d?void 0:d.length)&&u instanceof Promise,m=this.isFirstLoad&&h&&u instanceof Promise||g;g&&(p=u,u={history:d}),this.isFirstLoad=!1;const b=e=>eo(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(ra.a.Top)){if("discussion"===this.chat.type){const t=this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId+"_"+this.chat.threadId];t&&e.history.push(t),e.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse())}yield this.setLoaded("top",!0)}})),v=e=>Object(Ds.c)().then(()=>b(e)).then(()=>this.performHistoryResult(e.history||[],t,s,!g&&i)),f=e=>{const s=e.then(e=>(t?this.getHistoryTopPromise!==s:this.getHistoryBottomPromise!==s)?(this.log.warn("getHistory: peer changed"),Promise.reject()):n?(this.scrollable.onScroll(),!0):v(e),e=>{throw this.log.error("getHistory error:",e),e});return s};let y,w;if(u instanceof Promise)w=!1,y=f(u);else{if(n)return this.scrollable.onScroll(),null;w=!0,y=v(u)}const S=g?f(p):y;if(m&&a.a.settings.animationsEnabled){let s=g?2:1;this.messagesQueueOnRenderAdditional=()=>{if(this.log("ship went past rocks of magnets"),--s)return;this.messagesQueueOnRenderAdditional=void 0;this.animateAsLadder(i,d,g,h,e).then(()=>{setTimeout(()=>{this.loadMoreHistory(t,!0)},0)})}}else this.messagesQueueOnRenderAdditional=void 0;return t?this.getHistoryTopPromise=S:this.getHistoryBottomPromise=S,S.then(()=>{t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0}),n?null:(y.then(()=>{"chat"===this.chat.type&&setTimeout(()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)},0)}),{cached:w,promise:y})}setUnreadDelimiter(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);let t=this.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter(e=>!this.bubbles[e].classList.contains("is-out")).map(e=>+e).sort((e,t)=>e-t).find(e=>e>t),t&&this.bubbles[t])){let s=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==s&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e.maxId&&s.classList.add("is-first-unread"),this.firstUnreadBubble=s,this.attachedUnreadBubble=!0}}deleteEmptyDateGroups(){const e=this.stickyIntersector?3:1;let t=!1;for(const s in this.dateMessages){const i=this.dateMessages[s];i.container.childElementCount===e&&(i.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(i.container,i.div),delete this.dateMessages[s],t=!0)}t&&(this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function oo(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class ro{constructor(e,t,s,n){var r;let l,c,d,h=[],p=[];const u=o.a.canPinMessage(e),g=(a,o,r)=>{setTimeout(()=>{let a;a=s&&!t?u?i.a.unpinAllMessages(e):i.a.hidePinnedMessages(e):i.a.updatePinnedMessage(e,t,s,r,o),n&&a.then(n)},300)};if(s){let s="UnpinMessage";t?(l="UnpinMessageAlertTitle",c="Chat.Confirm.Unpin"):u?(l="Popup.Unpin.AllTitle",c="Chat.UnpinAllMessagesConfirmation",d=[""+((null===(r=i.a.pinnedMessages[e])||void 0===r?void 0:r.count)||1)]):(l="Popup.Unpin.HideTitle",c="Popup.Unpin.HideDescription",s="Popup.Unpin.Hide"),h.push({langKey:s,isDanger:!0,callback:g})}else{l="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(h.push({langKey:t,callback:e=>g(0,!1,!e.size)}),G.a.isBroadcast(e.toChatId())?c="PinMessageAlertChannel":(c="PinMessageAlert",p.push({text:"PinNotify",checked:!0}))):(c="PinMessageAlertChat",e===a.a.myId?h.push({langKey:t,callback:g}):(h.push({langKey:t,callback:e=>g(0,!e.size)}),p.push({text:"PinAlsoFor",textArgs:[new wt.a({peerId:e}).element],checked:!0})))}Object(ht.a)(h);new ut("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}function lo(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class co extends ut{constructor(e,t,s,n){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{o.isValid()&&(n&&n(),i.a.reportMessages(e,t,s,o.value).then(e=>{e&&rt({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");xs({doc:gs.a.getAnimatedEmojiSticker(co.STICKER_EMOJI),div:a,emoji:co.STICKER_EMOJI,width:100,height:100,loop:!1,play:!0}).finally(()=>{this.show()}),this.header.append(a);const o=new O.b({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});o.input.addEventListener("input",()=>{this.buttons[0].element.toggleAttribute("disabled",!o.isValid())}),this.body.append(o.container)}}co.STICKER_EMOJI="👮‍♀️";class ho extends ut{constructor(e,t,s){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const i=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];i.forEach(e=>{const t=Object(B.a)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)});const n=gs.a.preloadAnimatedEmojiSticker(co.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Ce.a)(a.target,"btn-primary"),r=i[Object(Bs.a)(o)][1];n.then(()=>{this.hide(),new co(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class po extends ut{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[Object(T.d)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(T.c.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}]});const e=new P.b(void 0);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},this.description.replaceWith(e.container),e.container.append(this.description),e.container.classList.add("scrolled-top"),this.show()}}var uo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class go extends ht.b{constructor(e,t){super("popup-reacted-list",null,{closable:!0,overlayClosable:!0,body:!0}),this.appMessagesManager=e,this.message=t,this.init()}init(){return uo(this,void 0,void 0,(function*(){const e=this.appMessagesManager.getGroupsFirstMessage(this.message),t=this.appMessagesManager.canViewMessageReadParticipants(e),s=new ta,i=Object.assign(Object.assign({},e),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},e.reactions),{pFlags:{},recent_reactions:[]})});i.reactions.results=i.reactions.results.map(e=>Object.assign(Object.assign({},e),{pFlags:{}})),s.init(i,"block"),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const n=document.createElement("div");n.classList.add("tabs-container"),n.dataset.animation="tabs";const a=new Map;let o=!1;if(i.reactions.results.length){const e=this.createFakeReaction("reactions",i.reactions.results.reduce((e,t)=>e+t.count,0));s.prepend(e),i.reactions.results.unshift(e.reactionCount),o=!0}let r=!1;if(t)try{const t=yield this.appMessagesManager.getMessageReadParticipants(e.peerId,e.mid);if(!t.length)throw"";const n=this.createFakeReaction("checks",t.length);s.prepend(n),i.reactions.results.unshift(n.reactionCount),r=!0}catch(e){}i.reactions.results.forEach(t=>{const s=new P.b(void 0);s.container.classList.add("tabs-tab");const i=new Kn({noShadow:!0,noDelimiter:!0}),o=_c.createChatList({dialogSize:72});_c.setListClickListener(o,()=>{this.hide()},void 0,!1,!0),i.content.append(o),s.container.append(i.container);const r="checks"!==t.reaction,l="checks"===t.reaction;let c;["checks","reactions"].includes(t.reaction)&&(t.reaction=void 0);const d=new vt({scrollable:s,getPromise:()=>uo(this,void 0,void 0,(function*(){const s=yield this.appMessagesManager.getMessageReactionsListAndReadParticipants(e,void 0,t.reaction,c,r,l);return c=s.nextOffset,s.combined.forEach(({peerId:e,reaction:t})=>{const{dom:s}=_c.addDialogNew({dialog:e,autonomous:!0,container:o,avatarSize:54,rippleEnabled:!1,meAsSaved:!1,drawStatus:!1});if(t){const e=document.createElement("div");e.classList.add("reacted-list-reaction-icon");xs({doc:jt.a.getReactionCached(t).static_icon,div:e,width:24,height:24}),s.listEl.append(e)}Object(k.a)(s.lastMessageSpan,E.a.getUserStatusString(e.toUserId()))}),!c}))});a.set(s.container,d),n.append(s.container)}),this.body.append(n);const l=Object(J.a)(s,n,(e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0);a.get(t).load()});l(0,!1),this.show()}))}createFakeReaction(e,t){const s=new Zn;s.init("block"),s.reactionCount={_:"reactionCount",count:t,reaction:e},s.setCanRenderAvatars(!1),s.renderCounter();const i=document.createElement("div");return i.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),s.prepend(i),s}}const mo="btn-menu-reactions-reaction",bo=!ae.g;class vo{constructor(e,t,s){this.appReactionsManager=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach((e,t)=>{this.onScrollProcessItem(t,e)})},this.onMouseMove=e=>{var t;const s=Object(Ce.a)(e.target,mo);if(!s)return;const i=this.reactionsMap.get(s);if(!i)return;if(!(null===(t=i.appear)||void 0===t?void 0:t.paused))return;const n=i.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const i=this.widthContainer=document.createElement("div");i.classList.add("btn-menu-reactions-container"),i.classList.add("btn-menu-reactions-container-"+t);const n=this.container=document.createElement("div");n.classList.add("btn-menu-reactions");const a=this.scrollable="vertical"===t?new P.b(void 0):new P.a(void 0);n.append(a.container),a.onAdditionalScroll=this.onScroll,a.setListeners(),a.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup="CHAT-MENU-REACTIONS-"+Date.now(),I.a.setOverrideIdleGroup(this.animationGroup,!0),he.a||n.addEventListener("mousemove",this.onMouseMove),Object(l.b)(n,e=>{const t=Object(Ce.a)(e.target,mo);if(!t)return;const s=this.reactionsMap.get(t);s&&this.appReactionsManager.sendReaction(this.message,s.reaction)}),i.append(n),this.middleware=null!=s?s:Object(Rs.a)()}init(e){this.message=e;const t=this.middleware.get(),s=this.appReactionsManager.getAvailableReactionsByMessage(e);Object(zt.a)(s,e=>{if(!t()||!e.length)return;e.forEach(e=>{this.renderReaction(e)});const i=()=>{this.container.classList.add("is-visible")};s instanceof Promise?Object(Le.b)(i):i()})}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),I.a.setOverrideIdleGroup(this.animationGroup,!1),I.a.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return a.a.settings.animationsEnabled&&!ae.e}renderReaction(e){const t=document.createElement("div");t.classList.add(mo);const s=document.createElement("div");s.classList.add(mo+"-scale");const i=document.createElement("div");let n;i.classList.add(mo+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(mo+"-select","hide"));const a={selectWrapper:n,appearWrapper:i,reaction:e.reaction};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(he.a?1:1.25),l={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;xs(Object.assign({doc:e.appear_animation,div:i,play:!0},l)).then(e=>{Object(ys.a)(e),a.appear=e,e.addEventListener("enterFrame",o=>{e.maxFrame===o&&s.then(e=>{Object(ys.a)(e),i.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)},Se.a)})},Se.a);const s=xs(Object.assign({doc:e.select_animation,div:n},l)).then(e=>(Object(ys.a)(e),oe.a.waitForFirstFrame(e))).catch(Se.a)}else delete l.needFadeIn,delete l.withThumb,xs(Object.assign({doc:e.static_icon,div:i},l));s.append(i),n&&s.append(n),t.append(s),this.scrollable.append(t)}onScrollProcessItem(e,t){const s=e.firstElementChild,i=Qa(e,this.scrollable.container);let n;if(i)if(i.overflow.left||i.overflow.right){const e=Math.abs(i.rect.left-i.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}bo&&(s.style.transform=n)}}class fo{constructor(e,t,s,i,n,a,o,r){this.attachTo=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.appPollsManager=n,this.appDocsManager=a,this.appMessagesIdsManager=o,this.appReactionsManager=r,this.onContextMenu=e=>{let t,s;try{s=Object(Ce.a)(e.target,"bubble-content-wrapper"),t=s?s.parentElement:Object(Ce.a)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let i=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),i&&i.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;if(!n)return;const a=this.isSponsored=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!lo(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention"),this.chat.selection.isSelecting&&!s){if(a)return;const e=this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find(e=>this.chat.selection.isMidSelected(this.peerId,e));t&&(n=t)}}this.isOverBubble=!!s;const o=Object(Ce.a)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=this.chat.getMessage(this.mid),this.noForwards=!a&&!this.appMessagesManager.canForward(this.message),this.viewerPeerId=void 0,this.canOpenReactedList=void 0;const r=this.init();i=r.element;const{cleanup:l,destroy:c,menuPadding:d,reactionsMenu:h,reactionsMenuPosition:p}=r;let u=!1;if(h){const e="is-visible";if(u=h.container.classList.contains(e),u&&h.container.classList.remove(e),"horizontal"===p){const e=i.offsetWidth,t=(e-8)/34%1,s=.65;if(t{h&&h.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout(()=>{c()},300)}),u&&h.container.classList.add("is-visible")},this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new ei(this.peerId,this.chat.getMidsByMid(this.mid))},this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>{if(lo()){tt((this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort((e,t)=>e-t):[this.mid]).reduce((e,t)=>{const s=this.chat.getMessage(t);return e+((null==s?void 0:s.message)?s.message+"\n":"")},"").trim())}else document.execCommand("copy")},this.onCopyAnchorLinkClick=()=>{tt(this.target.href)},this.onCopyLinkClick=()=>{let e;"discussion"===this.chat.type&&(e=this.appMessagesManager.getMessageByPeer(this.peerId,this.chat.threadId));const t=this.appPeersManager.getPeerUsername(e?e.fromId:this.peerId),s=this.appMessagesIdsManager.getServerMessageId(this.mid);let i,n="https://t.me/";t?(n+=t+"/"+(e?this.appMessagesIdsManager.getServerMessageId(e.fwd_from.channel_post):s),e&&(n+="?comment="+s),i="LinkCopied"):(n+="c/"+this.peerId.toChatId()+"/"+s,e&&(n+="?thread="+this.appMessagesIdsManager.getServerMessageId(e.mid)),i="LinkCopiedPrivateInfo"),ot(T.c.format(i,!0)),tt(n)},this.onPinClick=()=>{new ro(this.peerId,this.mid)},this.onUnpinClick=()=>{new ro(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>{if(this.chat.selection.isSelecting)Object(l.d)(this.chat.selection.selectionForwardBtn);else{const e=this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid);new Xs({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Ce.a)(this.target,"grouped-item")||Object(Ce.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new Js(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)},this.listenerSetter=new R.a,this.middleware=Object(Rs.a)(),he.a?Object(l.b)(e,e=>{if(t.selection.isSelecting)return;t.log("touchend",e);!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element","attachment"].join(", "))&&(Object(c.a)(e),this.onContextMenu(e))},{listenerSetter:this.chat.bubbles.listenerSetter}):Object(ee.a)(e,this.onContextMenu,this.chat.bubbles.listenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup()}filterButtons(e){return this.isSponsored?e.filter(e=>e.isSponsored):e.filter(e=>{let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||he.a,t=e.verify()),t})}setButtons(){this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending(()=>{Object(ys.a)(this.message),this.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)},new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>this.chat.canSend()&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>this.appMessagesManager.canEditMessage(this.message,"text")&&!!this.chat.input.messageInput},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>{if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const s of t)if(this.appMessagesManager.getMessageByPeer(e,s).message)return!0;return!1},notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{tt(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{tt(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>this.appPeersManager.isChannel(this.peerId)&&!this.message.pFlags.is_outgoing},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)&&"scheduled"!==this.chat.type},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{this.appDocsManager.saveDocFile(this.message.media.document)},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let s=!!he.a;const i=!t.type||!["gif","video","sticker"].includes(t.type);return i&&(s=s||!!Object(Ce.a)(this.target,"document")||!!Object(Ce.a)(this.target,"audio")),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return this.appMessagesManager.canEditMessage(this.message,"poll")&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.pFlags.out||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new ho(this.peerId,[this.mid])},verify:()=>!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&this.appPeersManager.isChannel(this.peerId),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new go(this.appMessagesManager,this.message)}},verify:()=>{var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||this.appMessagesManager.canViewMessageReadParticipants(this.message))},notDirect:()=>!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>this.appMessagesManager.canDeleteMessage(this.message)},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new po},verify:()=>!1,isSponsored:!0}]}init(){this.cleanup(),this.setButtons();const e=this.filterButtons(this.buttons),t=this.element=$s(e,this.listenerSetter);t.id="bubble-contextmenu",t.classList.add("contextmenu");const s=e.find(e=>!e.icon);if(s){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,i=!!(null==t?void 0:t.length),n=this.appMessagesManager.canViewMessageReadParticipants(this.message)?this.appPeersManager.getPeer(this.peerId).participants_count:void 0,a=e?e.results.reduce((e,t)=>e+t.count,0):void 0;s.element.classList.add("tgico-"+(i?"reactions":"checks"));const o=new T.c.IntlElement({key:i?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:i?void 0===n?[a]:[n,n]:void 0,element:s.textElement});let r;r=i?void 0===n?Object(T.d)("Chat.Context.ReactedFast",[a]):Object(T.d)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):Object(T.d)("Loading"),r.classList.add("btn-menu-item-text-fake"),s.element.append(r);const l=3,c=.875;o.element.style.visibility="hidden",o.element.style.paddingRight=i?c*Math.min(l,t.length)+"rem":"1rem";const d=this.middleware.get();this.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then(e=>{if(!d())return;r&&r.remove();const a=e.combined,h=void 0===n?e.reactionsCount:i?a.filter(e=>e.reaction).length:a.length;let p;if(1===a.length)p=new wt.a({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!i||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(i){const e=h===a.length||void 0===n;p=Object(T.d)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[h]:[h,a.length])}else a.length?p=Object(T.d)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,h)+"rem",p.classList.add("btn-menu-item-text-fake"),s.element.append(p)),a.length){const e=new ns({avatarSize:24});e.render(t?t.map(e=>this.appPeersManager.getPeerId(e.peer_id)):a.map(e=>e.peerId)),s.element.append(e.container),this.canOpenReactedList=!0}})}let i,n,a;if("message"===this.message._&&!this.chat.selection.isSelecting&&!this.message.pFlags.is_outgoing&&!this.message.pFlags.is_scheduled){a=ae.b||he.a?"horizontal":"vertical",n=this.reactionsMenu=new vo(this.appReactionsManager,a,this.middleware),n.init(this.appMessagesManager.getGroupsFirstMessage(this.message));const e=36+8,t=0,s=0;i="vertical"===a?{top:t,left:e}:{top:e,right:s,left:t}}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n.widthContainer.remove()},menuPadding:i,reactionsMenu:n,reactionsMenuPosition:a}}}var yo=s(194),wo=s.n(yo),So=s(175);class Co{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=$s(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Object(ee.a)(e.onContextElement,t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach(e=>{e.element.classList.toggle("hide",!e.verify())}),Object(c.a)(t),Object(ee.d)(this.sendMenu))},e.listenerSetter)}setPeerId(e){this.type=e===a.a.myId?"reminder":"schedule"}}var Lo=s(96),Io=s(117);class Mo extends ht.b{constructor(e){if(super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,s=Object(bt.a)(t,"LABEL"),i=Object(Io.a)(t);i||(t.parentElement.classList.add("is-filled"),s.classList.remove("hidden-widget"),s.firstElementChild.removeAttribute("disabled"));!s.nextElementSibling&&!i&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,s=Object(bt.a)(t,"LABEL"),i=Object(Bs.a)(s);this.correctAnswers&&this.correctAnswers[0][0]===i&&(this.correctAnswers=void 0),s.remove(),this.optionInputFields.splice(i,1),this.optionInputFields.forEach((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1);T.c.weakMap.get(e.label.firstElementChild).update()}),this.handleChange()},Object(T.b)(this.title,"NewPoll"),this.questionInputField=new O.b({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()}),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new Co({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const t=document.createElement("hr"),s=document.createElement("div");s.classList.add("caption"),Object(T.b)(s,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const n=document.createElement("div");n.classList.add("caption"),Object(T.b)(n,"Settings"),this.chat.appPeersManager.isBroadcast(this.chat.peerId)||(this.anonymousCheckboxField=new pt.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new pt.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new pt.a({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)}),this.listenerSetter.add(this.quizCheckboxField.input)("change",()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map(t=>{t.classList.toggle("radio-field",e)}),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach(t=>t.classList.toggle("hide",!e)),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()}),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),Object(T.b)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),c=document.createElement("div");c.classList.add("poll-create-questions"),this.quizSolutionField=new O.b({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()});const d=document.createElement("div");d.classList.add("subtitle"),Object(T.b)(d,"AddAnExplanationInfo"),c.append(this.quizSolutionField.container,d),a.push(r,o,c),a.forEach(e=>e.classList.add("hide")),this.body.parentElement.insertBefore(t,this.body),this.body.append(s,this.questions,document.createElement("hr"),n,i,...a),Object(l.b)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new P.b(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}getFilledAnswers(){return Array.from(this.questions.children).map((e,t)=>{const s=e.querySelector(".input-field-input");return s instanceof HTMLInputElement?s.value:Object(Lo.a)(s,!1).value}).filter(e=>!!e.trim())}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const s=this.getFilledAnswers();if(s.length<2)return!1;if(s.find(e=>e.length>100))return!1;const{value:i}=Object(Lo.a)(this.quizSolutionField.input,!1);return!(i.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){const t=this.questionInputField.value,s=this.getFilledAnswers(),{value:i,entities:n}=Object(Lo.a)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:s.map((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])})),id:void 0},r=this.chat.appPollsManager.getInputMediaPoll(o,this.correctAnswers,i,n);this.chat.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,s=new O.b({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(s.input)("input",this.onInput);const i=new nt({text:"",name:"question"});i.main.append(s.container),Object(l.b)(s.input,c.a,{listenerSetter:this.listenerSetter}),i.label.classList.add("hidden-widget"),i.input.disabled=!0,this.quizCheckboxField.input.checked||i.label.classList.remove("radio-field"),this.listenerSetter.add(i.input)("change",()=>{if(i.input.checked){const e=Object(Bs.a)(i.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}});const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),s.container.append(n),Object(l.b)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(i.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(s)}}var Eo=s(120);function Po(e){const t=e.src;return fetch(t).then(e=>e.arrayBuffer()).then(e=>{const t=new Uint8Array(e);let s=0;for(let e=0,i=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),Object(Eo.a)(this.input)}},this.attachFile=e=>{const t=this.willAttach,s=this.shouldCompress(e.type),i={};i.file=e;const n=document.createElement("div");n.classList.add("popup-item"),i.itemDiv=n;const a=s?this.attachMedia(e,i,n):this.attachDocument(e,i,n);return t.sendFileDetails.push(i),a},this.willAttach={type:s,sendFileDetails:[],group:!1},Object(l.b)(this.btnConfirm,()=>this.send(),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new Co({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new P.b(null);i.container.append(this.mediaContainer),this.inputField=new O.b({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:a.a.config.caption_length_max}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",()=>{this.files=[],ko=void 0}),ko=this}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new pt.a({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()})):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find(e=>g.has(e.type));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new pt.a({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()})):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter(e=>!this.files.find(t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});let t=this.inputField.value;if(t.length>a.a.config.caption_length_max)return void ot(T.c.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const s=this.willAttach;s.isMedia="media"===s.type||void 0;const{sendFileDetails:i,isMedia:n}=s,{peerId:o,input:r}=this.chat;i.forEach(e=>{e.itemDiv=void 0});const{length:l}=i,c=this.chat.getMessageSendingParams();this.iterate(e=>{t&&e.length!==l&&(this.chat.appMessagesManager.sendText(o,t,Object.assign(Object.assign({},c),{clearDraft:!0})),t=void 0);const i=Object.assign(Object.assign({},s),{sendFileDetails:e});this.chat.appMessagesManager.sendAlbum(o,i.sendFileDetails.map(e=>e.file),Object.assign(Object.assign(Object.assign({},c),{caption:t,isMedia:n,clearDraft:!0}),i)),t=void 0}),r.replyToMsgId=this.chat.threadId,r.onMessageSent()}attachMedia(e,t,s){s.classList.add("popup-item-media");let i;if(e.type.startsWith("video/")){const n=Cs(),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",()=>{n.pause()},{once:!0}),i=Object(pe.e)(n).then(()=>{t.width=n.videoWidth,t.height=n.videoHeight,t.duration=Math.floor(n.duration);const e=n.webkitAudioDecodedByteCount;return void 0!==e&&(t.noSound=!e),s.append(n),Object(pe.c)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})}),n.append(a)}else{const n=new Image;i=new Promise(i=>{n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,s.append(n),"image/gif"===e.type?(t.noSound=!0,Promise.all([Po(n).then(e=>{t.duration=Math.ceil(e)}),Object(pe.b)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})]).then(()=>{i()})):i()}}),n.src=t.objectURL=URL.createObjectURL(e)}return i}attachDocument(e,t,s){s.classList.add("popup-item-document");const i=e.type.startsWith("image/"),n=e.type.startsWith("audio/");(i||n||e.size<2e7)&&(t.objectURL=URL.createObjectURL(e));const a={_:"document",file:e,file_name:e.name||"",size:e.size,type:i?"photo":"doc"};if(t.objectURL){const s=ce.a.getCacheContext(a);s.url=t.objectURL,s.downloaded=e.size}const o=Es({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}}});return new Promise(e=>{const n=()=>{s.append(o),e()};if(i){const e=new Image;e.src=t.objectURL,e.onload=()=>{t.width=e.naturalWidth,t.height=e.naturalHeight,n()},e.onerror=n}else n()})}shouldCompress(e){return"media"===this.willAttach.type&&g.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)}),this.show())}setTitle(){const{willAttach:e,title:t,files:s}=this;let i;const n=[];if("document"===e.type)i="PreviewSender.SendFile",n.push(s.length);else{let e=0,t=0,a=0;s.forEach(s=>{s.type.startsWith("image/")?++e:s.type.startsWith("video/")?++t:++a}),[e,t,a].filter(e=>e>0).length>1?(i="PreviewSender.SendFile",n.push(s.length)):e?(i="PreviewSender.SendPhoto",n.push(e)):t&&(i="PreviewSender.SendVideo",n.push(t))}Object(k.a)(t,Object(T.d)(i,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const s=Object(Ma.a)(t.width,t.height,380,320);e.style.width=s.width+"px",e.style.height=s.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach(t=>e([t]));const s=t.length;for(let i=0;i{s.innerHTML="",e.length&&(this.setTitle(),this.iterate(e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map(e=>e.itemDiv)),_s({container:t,items:e.map(e=>({w:e.width,h:e.height})),maxWidth:380,minWidth:100,spacing:4}),s.append(t)}else e.forEach(e=>{this.appendMediaToContainer(e.itemDiv,e)})}))}).then(()=>{this.onRender()})}}const Ao=["ArrowUp","ArrowDown"],Oo=["ArrowLeft","ArrowRight"];function jo({list:e,type:t,onSelect:s,once:i,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Ao.concat(Oo):"x"===t?Oo:Ao);let r;const d=()=>r||e.querySelector(".active")||e.firstElementChild,h=(e,s)=>{if(r===e)return;let i=!1;r&&(i=!0,r.classList.remove("active")),r=e,r&&(r.classList.add("active"),i&&m&&s&&Object(ft.b)({container:m,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},p=(t,s)=>{let i;return i=s?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,i};let u;u="xy"===t?(t,s)=>"ArrowUp"===s||"ArrowDown"===s?((t,s)=>{const i=s?"nextElementSibling":"previousElementSibling",n=s?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[i]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[i]||e[n]}return o})(t,"ArrowDown"===s):p(t,"ArrowRight"===s):(e,t)=>p(e,"ArrowRight"===t||"ArrowDown"===t);let g=s=>{const i=s.key;if(o.has(i)){if(Object(c.a)(s),e.childElementCount>1){let e=d();e=u(e,i),h(e,!0)}}else("Enter"===i||"xy"!==t&&"Tab"===i)&&(Object(c.a)(s),f(d()))};const m=Object(Ce.a)(e,"scrollable");e.classList.add("navigable-list");const b=t=>{const s=Object(ii.a)(t.target,e);s&&h(s,!1)},v=t=>{Object(c.a)(t);const s=Object(ii.a)(t.target,e);s&&(h(s,!1),f(d()))},f=e=>{const t=s(e);(void 0!==t?!t:i)&&S()};let y=!1;const w=()=>{y||(y=!0,document.addEventListener("keydown",g,{capture:!0,passive:!1}),e.addEventListener("mousemove",b,{passive:!0}),Object(l.b)(e,v))},S=()=>{y&&(y=!1,document.removeEventListener("keydown",g,{capture:!0}),e.removeEventListener("mousemove",b),Object(l.c)(e,v))},C=()=>{a||h(e.firstElementChild,!1)};if(a){const e=g;g=t=>{a.has(t.key)&&(Object(c.a)(t),document.removeEventListener("keydown",g,{capture:!0}),g=e,document.addEventListener("keydown",g,{capture:!0,passive:!1}),a=void 0,C())}}else C();return w(),{attach:w,detach:S,resetTarget:C}}class _o extends D.a{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:s,resetTarget:i}=jo({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=s,this.resetTarget=i,ae.e||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},F.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",s(),this.navigationItem&&(F.a.removeItem(this.navigationItem),this.navigationItem=void 0)},{once:!0})},Object(w.a)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,s){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(F.a.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const i=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),Object(is.a)(this.container,"is-visible",!e,a.a.settings.animationsEnabled&&!s?300:0,()=>{this.hidden&&this.dispatchEvent("hidden")},i)}}class Fo extends _o{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!za.onMediaClick({target:e},!0),waitForKey:["ArrowUp","ArrowDown"]}),this.container.classList.add("stickers-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0),a.a.dispatchEvent("choosing_sticker",!0)}),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),a.a.dispatchEvent("choosing_sticker",!1)})}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),gs.a.preloadAnimatedEmojiSticker(e),gs.a.getStickersByEmoticon(e).then(e=>{if(!t())return;this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();let i;this.lazyLoadQueue.clear(),i=e.length?new Promise(t=>{const i=[];e.forEach(e=>{s.append(this.superStickerRenderer.renderSticker(e,void 0,i))}),Promise.all(i).finally(t)}):Promise.resolve(),i.then(()=>{this.list.replaceWith(s),this.list=s,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0})})}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.lazyLoadQueue=new Z.d,this.superStickerRenderer=new xa(this.lazyLoadQueue,tc)}}const Do=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Ro=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Bo extends Xn{constructor(e,t,s){var i;if(super((i=e).getTime()>Ro().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Do(),maxDate:Ro(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),s){const e=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),Object(l.b)(e,()=>{t(2147483646),this.hide()})}}}var No=s(171),Uo=s(107);function Ho(e,t=!0){const s=[],i=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),s=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&s==t.endOffset){const i=s-1,n=e.childNodes;if(t.startContainer===e&&n[i]){a=n[i],o=0;for(let e=0;e{s.onEmojiSelected(La(e),!0)}}),this.appEmojiManager=i,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new P.a(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollLeft=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach(e=>{Ca(e,this.list,!1,!0)})),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const s=this.controller.getMiddleware();this.appEmojiManager.getBothEmojiKeywords().then(()=>{if(!s())return;const i=e.replace(/^:/,""),n=this.appEmojiManager.searchEmojis(i);this.render(n,":"!==t)})}}class Vo extends _o{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Vo.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Vo.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach(e=>{const t=Vo.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)})),t||this.toggle(!e.length)}static listElement(e){const t=Vo.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const s=document.createElement("div");s.classList.add(t,e.className),s.dataset.peerId=""+e.peerId;const i=new fc;i.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),i.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?Object(m.a)(n,X.b.wrapEmojiText(e.name)):n.append(new wt.a({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),s.append(i,n),e.description){const i=document.createElement("div");i.classList.add(t+"-description",e.className+"-description"),Object(m.a)(i,X.b.wrapEmojiText(e.description)),s.append(i)}return s}}function Ko(e,t){const s=[].concat(e.bot_info);let i;void 0!==t&&(i=new ua.a({ignoreCase:!0}));const n=new Map;let a;if(s.forEach(e=>{e.commands.forEach((t,s)=>{const a="/"+t.command;n.set(t.command,{peerId:e.user_id.toPeerId(!1),command:t.command,name:a,description:t.description,index:s}),i&&i.indexObject(t.command,a)})}),i){const e=i.search(t);a=Array.from(e).map(e=>n.get(e))}else a=[...n.values()];return a=a.sort((e,t)=>n.get(e.command).index-n.get(t.command).index),a}Vo.BASE_CLASS="autocomplete-peer-helper",Vo.BASE_CLASS_LIST_ELEMENT=Vo.BASE_CLASS+"-list-element";class Go extends Vo{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${Vo.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return s.getReadyToSend(()=>{s.messageInput.innerHTML=t,s.sendMessage(!0)})}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t){if(!this.appUsersManager.isBot(t))return!1;const s=this.controller.getMiddleware();return Promise.resolve(this.appProfileManager.getProfileByPeerId(t)).then(t=>{if(!s())return;const i=Ko(t,e);this.render(i)}),!0}}class Wo{constructor(){this.helpers=new Set,this.middleware=Object(Rs.a)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach(t=>{t!==e&&t.toggle(!0,!0)}),e||this.middleware.clean()}}class qo extends Vo{constructor(e,t,s,i,n){super(e,t,"mentions-helper",e=>{const t=n.getUser(e.dataset.peerId.toUserId());let i,a="";t.username?a="@"+t.username:(a=t.first_name||t.last_name,i={_:"messageEntityMentionName",length:a.length,offset:0,user_id:t.id}),a+=" ",s.insertAtCaret(a,i)}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t,s){const i=e.trim();if(e.length!==i.length)return!1;const n=this.controller.getMiddleware();return this.appProfileManager.getMentions(t&&t.toChatId(),i,s).then(e=>{if(!n())return;const t=i.slice(1).toLowerCase();this.render(e.map(e=>{const s=this.appUsersManager.getUser(e);if(!s.username||s.username.toLowerCase()!==t)return{peerId:e,description:s.username?"@"+s.username:void 0}}).filter(Boolean))}),!0}}var Qo=s(33);class $o extends Na{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(ii.a)(t,this.element)||t===this.btnHover||(Object(c.a)(e),this.toggle(!1))},Object(w.a)(this,e),this.element.classList.add($o.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(a.a)("history_reply_markup",({peerId:e})=>{this.peerId===e&&(this.checkAvailability()&&this.isActive()&&this.render(),Object(Ds.c)().then(()=>{this.checkForceReply()}))})}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",()=>{this.render(),he.a&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",()=>{this.listenerSetter.remove(this.touchListener)},{once:!0}))}),this.listenerSetter.add(this.element)("click",e=>{const t=Object(Ce.a)(e.target,"btn");if(!t)return;const s=t.dataset.type,{peerId:i}=this;switch(s){case"keyboardButtonRequestPhone":Mn({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then(()=>{this.appMessagesManager.sendContact(i,a.a.myId)});break;default:this.appMessagesManager.sendText(i,t.dataset.text)}this.toggle(!1)}),super.init()}checkForceReply(){const e=this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}getReplyMarkup(){var e;return null!==(e=this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}render(e=this.getReplyMarkup()){this.element.innerHTML="";for(const t of e.rows){const e=document.createElement("div");e.classList.add($o.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add($o.BASE_CLASS+"-button","btn"),Object(m.a)(t,X.b.wrapEmojiText(s.text)),t.dataset.text=s.text,t.dataset.type=s._,e.append(t)}this.element.append(e)}}checkAvailability(e=this.getReplyMarkup()){var t;const s="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",s),s&&this.toggle(!1),!s}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}$o.BASE_CLASS="reply-keyboard";var Yo=s(189),Xo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Jo extends _o{constructor(e,t,s,i,n){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:s,queryId:i}=this.list.dataset;return this.chat.input.getReadyToSend(()=>{const n=this.appInlineBotsManager.generateQId(i,e.dataset.resultId);this.appInlineBotsManager.sendInlineResult(t.toPeerId(),s,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)})}}),this.chat=s,this.appUsersManager=i,this.appInlineBotsManager=n,this._checkQuery=(e,t,s)=>Xo(this,void 0,void 0,(function*(){const i=this.controller.getMiddleware(),n=yield this.appUsersManager.resolveUsername(t);if(!i())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.appInlineBotsManager.getInlineResults(e,n.id,s).then(t=>{var s;if(!i())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const a=this.list.cloneNode();a.dataset.peerId=""+e,a.dataset.botId=""+n.id,a.dataset.queryId=""+t.query_id;const o=new Pa(null,"INLINE-HELPER",this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],c=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=c?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),a.append(t),c)t.classList.add("grid-item");else{n.classList.add("empty"),Object(m.a)(n,X.b.wrapEmojiText([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),Object(m.a)(s,X.b.wrapEmojiText(e.title));const i=document.createElement("div");i.classList.add("inline-helper-result-description"),Object(m.a)(i,X.b.wrapRichText(e.description,{noCommands:!0,noLinks:!0})),t.append(s,i);const o=document.createElement("div");o.classList.add("inline-helper-separator"),a.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let s;n?(s=document.createElement("div"),n.append(s)):s=t,s.classList.add("media-container"),c&&s.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>ce.a.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then(e=>{const t=new Image;t.classList.add("media-photo"),Object(Yo.a)(e).then(e=>{ks(s,t,e,!0)})})})}}else{const a=e.document||e.photo;if(["sticker","gif"].includes(null===(s=a)||void 0===s?void 0:s.type)&&c)Object(ys.a)(a),"gif"===a.type?o.add(a,t):"sticker"===a.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(a,t,r),2===a.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(a){const e=c?48:void 0;c&&t.classList.add("no-border-radius"),Ps({photo:a,container:c?t:n,boxWidth:e,boxHeight:e,middleware:i,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then(()=>{if(!i())return void o.clear();a.classList.toggle("is-gallery",c),a.classList.toggle("super-stickers",c),this.container.classList.toggle("is-gallery",c);const s=this.list.parentElement;if(s.textContent="",t.switch_pm){const i=Object(B.a)("btn-primary btn-secondary btn-primary-transparent primary");Object(m.a)(i,X.b.wrapEmojiText(t.switch_pm.text)),Object(l.b)(i,s=>{this.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)}),s.append(i)}s.append(this.list=a),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0})});return{user:n,renderPromise:a}})),this.container.classList.add("inline-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)}),this.checkQuery=Object(lt.a)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)})}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.lazyLoadQueue=new Z.d,this.superStickerRenderer=new xa(this.lazyLoadQueue,"INLINE-HELPER")}}var Zo=s(32);class er extends Vo{constructor(e,t,s){super(e,void 0,"bot-commands",e=>{const s=e.querySelector(`.${Vo.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend(()=>{t.messageInput.innerHTML=s,t.sendMessage(!0),this.toggle(!0)})}),this.chatInput=t,this.appProfileManager=s}setUserId(e,t){var s;if(this.userId!==e||!(null===(s=this.list)||void 0===s?void 0:s.childElementCount))return this.userId=e,Object(zt.a)(this.appProfileManager.getProfile(e),e=>{if(!t())return;const s=Ko(e),i=50*s.length+8+24;this.container.style.setProperty("--height",i+"px"),this.render(s)});this.toggle(!1)}}class tr{constructor(e,t,s,i,n,o,r,d,h,p,u,g,m,b,v){this.chat=e,this.appMessagesManager=t,this.appMessagesIdsManager=s,this.appDocsManager=i,this.appChatsManager=n,this.appPeersManager=o,this.appWebPagesManager=r,this.appImManager=d,this.appDraftsManager=h,this.serverTimeManager=p,this.appNotificationsManager=u,this.appEmojiManager=g,this.appUsersManager=m,this.appInlineBotsManager=b,this.appProfileManager=v,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&Object(c.a)(e),this.recordCanceled=!0,this.recorder.stop(),So.a.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=he.a?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=he.a?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>{const{peerId:s}=this.chat,i=this.chat.bubbles.getMiddleware(),n=a.a.myId!==s&&s.isUser()&&this.appUsersManager.isUserOnlineVisible(s);new Bo(t,t=>{if(!i())return;t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout(()=>{i()&&this.appImManager.openScheduled(s)},0)},n).show()},this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,s)=>{Object(c.a)(e);let i=this.messageInput.innerHTML;if(i&&i!==s){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const s=this.messageInput.innerHTML;if(i===s){if(++e>2)break}else e=0;i=s}while(i!==s);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const s=e.code,i=t[s];if(document.getSelection().toString().trim().length&&i&&("KeyK"===s?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(i),Object(c.a)(e)),"KeyZ"===s){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:s,entities:i,caretPos:n}=Ho(this.messageInputField.input),a=X.b.parseMarkdown(s,i,!0),o=X.b.mergeEntities(i,X.b.parseEntities(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._);if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=s.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=ct.a.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.appWebPagesManager.saveWebPage(e),params:{url:t}}).then(s=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===s._?(this.setTopInfo("webpage",()=>{},s.site_name||s.title||"Webpage",s.description||s.url||""),delete this.noWebPage,this.willSendWebPage=s):this.willSendWebPage&&this.onHelperCancel())})}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(!s.trim())this.lastTimeType&&this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout(()=>{document.activeElement===this.messageInput&&this.resetCurrentFormatting()},0);else{const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"})),this.botCommands&&this.botCommands.toggle(!0)}this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(s,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,X.b.getEmojiEntityFromEmoji(e),t)},this.onBtnSendClick=e=>{if(Object(c.a)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!this.chat.canSend("send_media"))return void ot("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(ti.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),So.a.setKeepAlive(!0);const e=()=>{new ut("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{Object(l.d)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",t=>{Object(Ce.a)(t.target,"chat-input")||Object(Ce.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),F.a.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout(()=>{e()},0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,s=t.context.createAnalyser();t.connect(s),s.fftSize=32;const i=new Uint8Array(s.frequencyBinCount),n=255*i.length;let a=()=>{if(!this.recording)return;s.getByteFrequencyData(i);let e=0;i.forEach(t=>{e+=t});let t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;let o=Date.now()-this.recordStartTime,r=o%1e3,l=Te(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(Le.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":ot("Please allow access to your microphone");break;case"NotReadableError":ot(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),ot(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")})}},this.onHelperCancel=(e,t)=>{if(e&&Object(c.a)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=X.b.parseMarkdown(this.messageInputField.value,[]);if(e.message!==t)return void new ut("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if(Object(c.a)(e),Object(Ce.a)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&he.a&&!e.container.classList.contains("active")&&Object(ee.d)(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new R.a}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input"),this.chatInput.style.display="none",this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=oo();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const s=this.fakeSelectionWrapper=document.createElement("div");s.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,s),this.chatInput.append(this.inputContainer),this.goDownBtn=Q({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),Object(l.b)(this.goDownBtn,e=>{Object(c.a)(e),this.chat.bubbles.onGoDownClick()},{listenerSetter:this.listenerSetter});const i=this.controlContainer=document.createElement("div");i.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(i)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=N(""),this.replyElements.cancelBtn=N("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(i=!0,this.canToggleHideAuthor()),t=()=>{i=!1},s=this.forwardElements={};let i=!1;const n=[s.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new pt.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new pt.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new pt.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new pt.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=$s(n,this.listenerSetter),r=Array.from(o.children);if([{elements:r.slice(0,2),onChange:(e,t)=>{const n=!!+e;i&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=T.c.weakMap.get(e),i=s.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=i,t.update()}}},{elements:r.slice(2,4),onChange:e=>{const t=!!+e;let i;i=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?s.hideSender:s.showSender:t?s.showSender:s.hideSender,i.checkboxField.checked=!0}}].forEach(e=>{const t=Je(e.elements.map(e=>({container:e,input:e.querySelector("input")})),e.onChange),s=document.createElement("hr");t.append(s),o.append(t)}),o.append(s.changePeer.element),!he.a){this.forwardHover=new Na({element:o})}s.modifyArgs=n.slice(0,-1),this.replyElements.container.append(o),s.modifyArgs.forEach((e,t)=>{const{input:s}=e.checkboxField;s.type="radio",s.name=t<2?"author":"caption",s.value=""+ +!(t%2)}),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.sendAsContainer=document.createElement("div"),this.sendAsContainer.classList.add("new-message-send-as-container"),this.sendAsCloseBtn=document.createElement("div"),this.sendAsCloseBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const d=[{text:"SendMessageAsTitle",onClick:void 0}];let h;const p=e=>{e&&(h=this.sendAsAvatar);const t=this.sendAsAvatar!==h,s=!e&&t?2:0;Object(is.a)(this.sendAsCloseBtn,"is-visible",e,300,void 0,s),t||Object(is.a)(h,"is-visible",!e,300,void 0,s)};if(bi({noRipple:!0,listenerSetter:this.listenerSetter,container:this.sendAsContainer},"top-right",d,()=>{p(!0)},()=>{p(!1)}),d[0].element.classList.add("btn-menu-item-header"),this.sendAsBtnMenu=this.sendAsContainer.firstElementChild,this.sendAsBtnMenu.classList.add("scrollable","scrollable-y"),this.sendAsContainer.append(this.sendAsCloseBtn),this.btnToggleEmoticons=N("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type){this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=Q({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),Object(l.b)(this.goMentionBtn,e=>{Object(c.a)(e),this.appMessagesManager.goToNextMention(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.btnScheduled=N("scheduled btn-scheduled float hide",{noRipple:!0}),Object(l.b)(this.btnScheduled,e=>{this.appImManager.openScheduled(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.a)("scheduled_new",({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")}),this.listenerSetter.add(a.a)("scheduled_delete",({peerId:e})=>{this.chat.peerId===e&&this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(e=>{this.btnScheduled.classList.toggle("hide",!e.length)})}),this.btnToggleReplyMarkup=N("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new $o({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,appMessagesManager:this.appMessagesManager,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",()=>this.btnToggleReplyMarkup.classList.add("active")),this.listenerSetter.add(this.replyKeyboard)("close",()=>this.btnToggleReplyMarkup.classList.remove("active")),this.botCommands=new er(this.rowsWrapper,this,this.appProfileManager),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const e=document.createElement("div");e.classList.add("new-message-bot-commands-icon-scale");const t=this.botCommandsIcon=document.createElement("div");t.classList.add("animated-menu-icon","animated-menu-close-icon"),e.append(t),this.botCommandsToggle.append(e),Object(l.b)(this.botCommandsToggle,e=>{Object(c.a)(e);t.classList.contains("state-back")?(this.botCommands.toggle(!0),t.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),t.classList.add("state-back"))},{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",()=>{t.classList.add("state-back")}),this.botCommands.addEventListener("hiding",()=>{t.classList.remove("state-back")})}this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...g].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{new Mo(this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=bi({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.sendAsContainer,this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new Wo,this.stickersHelper=new Fo(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new zo(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Go(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new qo(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new Jo(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.appUsersManager,this.appInlineBotsManager),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=N("delete btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=N("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new Co({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),Ka.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Ka)("open",this.onEmoticonsOpen),this.listenerSetter.add(Ka)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(a.a)("settings_updated",()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()}),this.listenerSetter.add(a.a)("draft_updated",({peerId:e,threadId:t,draft:s,force:i})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(s,!0,i)}),this.listenerSetter.add(a.a)("peer_changing",e=>{this.chat===e&&this.saveDraft()}),this.listenerSetter.add(a.a)("chat_changing",({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)}),this.sendAsContainer&&this.listenerSetter.add(a.a)("peer_full_update",e=>{e.isChannel()&&this.chat.peerId===e&&this.updateSendAs()}),"scheduled"===this.chat.type?this.listenerSetter.add(a.a)("scheduled_delete",({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()}):(this.listenerSetter.add(a.a)("history_delete",({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))}),this.listenerSetter.add(a.a)("dialogs_multiupdate",e=>{e[this.chat.peerId]&&(this.startParam===Me.a?this.setStartParam():this.center(!0))}));try{this.recorder=new wo.a({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",e=>{let t=e.target.files;t.length&&(new xo(this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")},!1),Object(l.b)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&(Object(l.b)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(F.a.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:s}=this.chat,i=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});So.a.decode(e,!0).then(e=>{So.a.setKeepAlive(!1),this.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:i,threadId:s,clearDraft:!0}),this.onMessageSent(!1,!0)})}),Object(l.b)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),Object(l.b)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=Object(lt.a)(()=>this.saveDraft(),2500,!1,!0),this.botStartBtn=Object(B.a)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append(Object(T.d)("BotStart")),Object(l.b)(this.botStartBtn,()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=Object(gt.a)([this.botStartBtn],!0),s=this.chat.peerId,i=this.chat.bubbles.getMiddleware(()=>this.chat.peerId===s&&this.startParam===e&&this.toggleBotStartBtnDisability===t);this.appMessagesManager.startBot(s.toUserId(),void 0,e).then(()=>{i()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())})},{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn)}constructPinnedHelpers(){this.pinnedControlBtn=Object(B.a)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",()=>{const e=this.chat.peerId;new ro(e,0,!0,()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)})}),this.chatInput.classList.add("type-pinned")}center(e=!1){const t=this.getNeededFakeContainer();if(!t&&!this.inputContainer.classList.contains("is-centering"))return;if(t===this.fakeWrapperTo)return;const s=t||this.fakeWrapperTo,i=!!t,n=this.fakeWrapperTo;let a,o="",r="";const l=s.getBoundingClientRect(),c=this.fakeRowsWrapper.getBoundingClientRect(),d=c.width,h=l.width;if(d!==h){const e=h/d,t=(d-h)/2;if(a=l.left-c.left-t,i&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=t;const p=e?200:0;return Object(is.a)(this.inputContainer,"is-centering",i,p),Object(is.a)(this.rowsWrapperWrapper,"is-centering-to-control",!!(i&&t&&t.classList.contains("chat-input-control")),p),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(t&&t.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:d,widthTo:h}}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==this.startParam||!this.chat.canSend()||"pinned"===this.chat.type||this.chat.isStartButtonNeeded()?this.controlContainer:void 0}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){if(!this.goDownUnreadBadge)return;const e=this.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=Object(Lo.a)(this.messageInputField.input);let s;(e.length||this.replyToMsgId)&&(s={_:"draftMessage",date:Object(ne.h)(!0)+this.serverTimeManager.serverTimeOffset,message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,s)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.style.display="none",this.goDownBtn.classList.add("hide")),si(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,s=!1){return!(!s&&!Object(Io.a)(this.messageInput)||"scheduled"===this.chat.type)&&(e||(e=this.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId))?(this.messageInputField.value!==e.rMessage||this.replyToMsgId!==e.reply_to_msg_id)&&(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(e.rMessage,t,t),!0):(s&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then(()=>{Object(Le.b)(()=>{this.onMessageSent()})})),!1))}finishPeerChange(e){const t=this.chat.peerId,{forwardElements:s,btnScheduled:i,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,sendAsContainer:l,botCommandsToggle:c}=this;r.style.display="";const d=this.appPeersManager.isBroadcast(t);if(o.classList.toggle("is-broadcast",d),o.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",this.appPeersManager.canPinMessage(t)),s&&(this.forwardWasDroppingAuthor=!1,s.showCaption.checkboxField.setValueSilently(!0),s.showSender.checkboxField.setValueSilently(!0)),i){i.classList.add("hide");const e=this.chat.bubbles.getMiddleware();this.appMessagesManager.getScheduledMessages(t).then(t=>{e()&&i.classList.toggle("hide",!t.length)})}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),c&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),c.remove(),this.appPeersManager.isBot(t))){const e=t.toUserId(),s=this.chat.bubbles.getMiddleware(),i=this.appProfileManager.getProfile(e);Object(zt.a)(i,e=>{s()&&this.updateBotCommands(e,!(i instanceof Promise))})}l&&(this.sendAsAvatar&&(this.sendAsAvatar.remove(),this.sendAsAvatar=void 0),l.remove(),this.sendAsPeerId=void 0,this.updatingSendAsPromise=void 0,this.updateSendAs(!0)),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput():this.pinnedControlBtn&&this.pinnedControlBtn.append(Object(T.d)(this.appPeersManager.canPinMessage(this.chat.peerId)?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this.center(!1)}updateOffset(e,t,s,i){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,Object(is.a)(this.newMessageWrapper,"has-offset",t,s?0:300,void 0,i)}updateBotCommands(e,t){this.hasBotCommands=e.bot_info&&e.bot_info.commands.length,this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:s}=this,i=!!s&&this.isInputEmpty();if(!s){if(!t.parentElement)return;t.remove()}const n=i,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}updateSendAsButtons(e){const t=e.map((e,t)=>{const s=document.createElement("div"),i=document.createElement("div");return i.classList.add("btn-menu-item-subtitle"),e.isUser()?i.append(Object(T.d)("Chat.SendAs.PersonalAccount")):e===this.chat.peerId?i.append(Object(T.d)("VoiceChat.DiscussionGroup")):i.append(this.appProfileManager.getChatMembersString(e.toChatId())),s.append(new wt.a({peerId:e}).element,i),{onClick:t?()=>{const t=this.chat.peerId;if(t.isChannel()){const s=this.appProfileManager.getCachedFullChat(t.toChatId());if(s){s.default_send_as=this.appPeersManager.getOutputPeer(e),this.sendAsPeerId=e,this.updateSendAsAvatar(e),this.updateMessageInputPlaceholder();const t=this.chat.bubbles.getMiddleware(),i=()=>{if(this.sendAsPeerId!==e||!t())return;const s=this.sendAsPeerIds.slice();Object(V.a)(s,e),s.unshift(e),this.updateSendAsButtons(s)};a.a.settings.animationsEnabled?setTimeout(i,250):i()}}ct.a.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(t),send_as:this.appPeersManager.getInputPeerById(e)})}:void 0,textElement:s}}),s=$s(t);t.forEach((t,s)=>{const i=e[s],n=new fc;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:i}),s||n.classList.add("active"),t.element.prepend(n)}),Array.from(this.sendAsBtnMenu.children).slice(1).forEach(e=>e.remove()),this.sendAsBtnMenu.append(...Array.from(s.children))}updateSendAsAvatar(e,t){const s=this.sendAsAvatar;if(s&&s.peerId===e)return;s||(t=!0);let i=t?0:2;const n=t?0:300,a=this.sendAsAvatar=new fc;a.classList.add("new-message-send-as-avatar","avatar-30"),a.updateWithOptions({isDialog:!1,peerId:e}),Object(is.a)(a,"is-visible",!0,n,void 0,i),s&&Object(is.a)(s,"is-visible",!1,n,()=>{s.remove()},i),this.sendAsContainer.append(a)}getDefaultSendAs(){return Object(zt.a)(this.appProfileManager.getChannelFull(this.chat.peerId.toChatId()),e=>e.default_send_as?this.appPeersManager.getPeerId(e.default_send_as):void 0)}updateSendAs(e){const t=this.chat.peerId;if(!t.isChannel()||this.updatingSendAsPromise)return;const s=this.chat.bubbles.getMiddleware(()=>!this.updatingSendAsPromise||this.updatingSendAsPromise===r),{sendAsContainer:i}=this,n=t.toChatId(),a=this.getDefaultSendAs();a instanceof Promise&&(e=void 0);const o=Object(zt.a)(a,t=>{if(!s()||void 0===t)return;this.sendAsPeerId=t,this.updateSendAsAvatar(t,e),this.updateMessageInputPlaceholder(),this.appChatsManager.getSendAs(n).then(e=>{if(!s())return;const i=e.map(e=>this.appPeersManager.getPeerId(e));this.sendAsPeerIds=i.slice(),Object(V.a)(i,t),i.unshift(t),this.updateSendAsButtons(i)});let a=0;i.parentElement||(this.newMessageWrapper.prepend(i),a=2),this.updateOffset("as",!0,e,a),this.updatingSendAsPromise=void 0}),r=this.updatingSendAsPromise=Promise.resolve(o);return r}updateMessageInputPlaceholder(){const e=T.c.weakMap.get(this.messageInput);if(e){const{peerId:t,threadId:s}=this.chat;let i;i=s?"Comment":this.appPeersManager.isBroadcast(t)?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==a.a.myId||this.appMessagesManager.isAnonymousSending(t)?"SendAnonymously":"Message",e.compareAndUpdate({key:i})}}updateMessageInput(){const{chatInput:e,attachMenu:t,messageInput:s}=this,{peerId:i,threadId:n}=this.chat,a=this.chat.canSend();e.classList.contains("is-hidden")!==!a&&(e.classList.add("no-transition"),e.classList.toggle("is-hidden",!a),e.offsetLeft,e.classList.remove("no-transition")),this.updateMessageInputPlaceholder();const o=this.attachMenuButtons.filter(e=>{const t=e.verify(i,n);return e.element.classList.toggle("hide",!t),t});a?(s.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),s.innerHTML||this.messageInputField.onFakeInput()):s.removeAttribute("contenteditable"),t.toggleAttribute("disabled",!o.length),t.classList.toggle("btn-disabled",!o.length),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new O.b({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),Zo.a&&Object(Zo.b)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",e=>{const t=e.key;if(Object(No.a)(e))Object(c.a)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else Object(Eo.a)(this.messageInput)}),he.a&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),Ka.toggle(!1)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",()=>{this.checkAutocomplete()}),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)})}applyMarkdown(e,t){const s={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"var(--font-monospace)"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!s[e])return!1;const i=s[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e||"spoiler"===e){let t=!1;const s=window.getSelection();if(!s.isCollapsed){const i=s.getRangeAt(0),n=Uo.b[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(this.resetCurrentFormatting()):a.push("function"==typeof i?i():document.execCommand(i,!1,null))}else a.push("function"==typeof i?i():document.execCommand(i,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}resetCurrentFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=Ho(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match(tr.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,p=X.b.parseEntities(i);X.b.mergeEntities(a,p);const u=t?Math.max(t.length,e.length):e.length,g=[];t&&(g.push(t),t.offset=d);const m=c?u-c[2].length:u;a.forEach(e=>{e.offset>=d&&(e.offset+=m)}),X.b.mergeEntities(a,g);{const e={_:"messageEntityCaret",offset:d+u,length:0};let t=0;for(let s=a.length;te.offset)break}a.splice(t,0,e)}const b=Object(fn.a)(X.b.wrapDraftText(h,{entities:a}));this.messageInputField.setValueSilently(b,!0);const v=this.messageInput.querySelector(".composer-sel");v&&(!function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const s=document.createTextNode("");e.parentNode.insertBefore(s,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=s}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const s=window.getSelection();s.removeAllRanges(),s.addRange(t)}}(v),v.remove()),this.onMessageInput()}checkAutocomplete(e,t,s){if(void 0===e){const i=Ho(this.messageInputField.input,!0);e=i.value,t=i.caretPos,s=i.entities}if(-1===t&&(t=e.length),void 0===s){const t=X.b.parseMarkdown(e,s,!0);s=X.b.mergeEntities(s,X.b.parseEntities(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const i=e.match(tr.AUTO_COMPLETE_REG_EXP);let n;if(i){const t=s[0];let o=i[2];const r=o[0];if(this.stickersHelper&&a.a.settings.stickers.suggest&&this.chat.canSend("send_stickers")&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?this.appMessagesIdsManager.getServerMessageId(this.chat.threadId):void 0;this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?Me.c:this.chat.peerId,e)&&(n=this.mentionsHelper)}else i[1]||"/"!==r?a.a.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(n=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):this.commandsHelper.checkQuery(o,this.chat.peerId)&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}checkInlineAutocomplete(e,t){let s=!1;if(!t){const i=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(i){const n=i[1],a=e.slice(i[0].length);s=i[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Object(is.a)(this.btnPreloader,"show",!0,400):(this.btnPreloader=N("none btn-preloader float show disable-hover",{noRipple:!0}),Object(ee.f)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then(({user:e,renderPromise:t})=>{s&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then(()=>{Object(is.a)(this.btnPreloader,"show",!1,400)})}).catch(Se.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(is.a)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Object(is.a)(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=Object(ue.a)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let s=!1;new Xs(e,()=>{s=!0}).addEventListener("close",()=>{this.helperWaitingForward=!1,s||t()})}clearInput(e=!0,t=!0,s=""){if(document.activeElement===this.messageInput&&ae.f){const e=document.createElement("input");document.body.append(e),Object(Qo.a)(e),this.messageInputField.setValueSilently(s),Object(Qo.a)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(s);he.a||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let i=!1;e&&(i=this.setDraft(void 0,!1)),!i&&t&&this.onMessageInput()}isInputEmpty(){return Object(Io.a)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach(t=>{this.btnSend.classList.toggle(t,e===t)}),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const s=this.messageInputField.value;X.b.parseEntities(s).filter(e=>"messageEntityEmoji"===e._).forEach(e=>{const t=Object(se.a)(e.unicode);this.appEmojiManager.pushRecentEmoji(t)}),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:s}=this;if("scheduled"===s.type&&!e&&!t)return void this.scheduleSending();const{peerId:i}=s,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=Object(Lo.a)(this.messageInputField.input);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new Js(i,[t],s.type);this.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.appMessagesManager.sendText(i,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),this.onMessageSent(!1,!1));if(this.forwarding){const e=Object(ue.a)(this.forwarding);setTimeout(()=>{for(const t in e)this.appMessagesManager.forwardMessages(i,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()}));o||this.onMessageSent()},0)}}sendMessageWithDocument(e,t=!1,s=!1){var i;const n="sticker"===(e=this.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!this.chat.canSend(n)?(ot("Posting media content isn't allowed in this group."),!1):"scheduled"!==this.chat.type||t?!!e&&(this.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:s||void 0})),this.onMessageSent(s,!0),"sticker"===e.type&&(null===(i=Ka.stickersTab)||void 0===i||i.pushRecentSticker(e)),!0):(this.scheduleSending(()=>this.sendMessageWithDocument(e,!0,s)),!1)}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||Object(bt.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=Object(fn.a)(X.b.wrapDraftText(t.message,{entities:t.totalEntities}));const i=()=>{const n=this.appMessagesManager.wrapMessageForReply(t,void 0,[t.mid]);this.setTopInfo("edit",i,Object(T.d)("AccDescrEditing"),n,s,t),this.editMsgId=e,this.editMessage=t,s=void 0};i()}initMessagesForward(e){const t=()=>{const s=Object.keys(e).map(e=>e.toPeerId()),i=new Set;let n=0,o=0;s.forEach(t=>{const s=e[t];s.forEach(e=>{var s;const n=this.appMessagesManager.getMessageByPeer(t,e);!(null===(s=n.fwd_from)||void 0===s?void 0:s.from_name)||n.fromId||n.fwdFromId?i.add("P"+n.fromId):i.add("N"+n.fwd_from.from_name),n.media&&n.message&&++o}),n+=s.length});const r=i.size>2,l=[...i].map(e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===a.a.myId?Object(T.d)("Chat.Accessory.Forward.You"):new wt.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(bt.a)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const d=c.hideCaption.checkboxField.checked;o&&d?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const h=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=Object(T.d)(h,[n]),u=document.createDocumentFragment();let g,m;if(l.length<3?u.append(...Object(T.f)(l,!1)):u.append(l[0],Object(T.d)("AndOther",[l.length-1])),1===s.length){const t=s[0],i=e[t];if(g=this.appMessagesManager.getMessageByPeer(t,i[0]),m=!!g.grouped_id,m){const e=this.appMessagesManager.getMidsByMessage(g);(e.length!==n||e.find(e=>!i.includes(e)))&&(m=!1)}}const b=document.createDocumentFragment();if(m||1===n){const t=e[s[0]],i=this.appMessagesManager.wrapMessageForReply(g,void 0,t);b.append(u,": ",i)}else b.append(Object(T.d)("Chat.Accessory.Forward.From"),": ",u);let v=this.setTopInfo("forward",t,p,b);c.modifyArgs.forEach((e,t)=>{const i=e.textElement,n=T.c.weakMap.get(i);n.args=[t<2?s.length:o],n.update()}),this.forwardHover&&this.forwardHover.attachButtonListener(v,this.listenerSetter),this.forwarding=e};t()}initMessageReply(e){if(this.replyToMsgId===e)return;let t=this.chat.getMessage(e);const s=()=>{let i;"messageEmpty"===t._?(i=Object(T.d)("Loading"),this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then(i=>{this.replyToMsgId===e&&(t=i,"messageEmpty"===t._?this.clearHelper("reply"):s())})):i=new wt.a({peerId:t.fromId,dialog:!1}).element,this.setTopInfo("reply",s,i,t&&t.message,void 0,t),this.replyToMsgId=e};s()}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(F.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(is.a)(this.chat.container,"is-toggling-helper",!0,150,()=>{this.chat.container.classList.remove("is-toggling-helper")})}setInputValue(e,t=!0,s=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),Object(Le.b)(()=>{s&&Object(Eo.a)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight})}setTopInfo(e,t,s="",i="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=N(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const c=js(s,i,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),"webpage"===e&&(c.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),ae.e||F.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}tr.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class sr{constructor(e){this.floating=!1,Object(w.a)(this,e);const{divAndCaption:t,className:s}=this;t.container.classList.add("pinned-container","hide"),t.title.classList.add("pinned-container-title"),t.subtitle.classList.add("pinned-container-subtitle"),t.content.classList.add("pinned-container-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add("pinned-container-close",`pinned-${s}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("pinned-container-wrapper"),Object(te.a)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add("pinned-container-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){Object(l.b)(e,e=>{Object(c.a)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then(e=>{e&&this.toggle(!0)})},{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const s=(this.floating||b.b.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",s),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",s),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,s){this.divAndCaption.container.dataset.peerId=""+s.peerId,this.divAndCaption.container.dataset.mid=""+s.mid,this.divAndCaption.fill(e,t,s),this.topbar.setUtilsWidth()}}class ir extends Ae{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&Object(c.a)(e),fe.muted=!fe.muted},this.setVolume=()=>{const{volume:e,muted:t}=fe;let s;s=!e||t?0:e>.5?3:e>0&&e<.25?1:2,ir.ICONS.forEach(e=>this.icon.classList.remove("tgico-"+e)),this.icon.classList.add("tgico-"+ir.ICONS[s]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);fe.muted=!1,fe.volume=t}});const s=this.btn=document.createElement("div");s.classList.add("btn-icon","player-volume");const i=this.icon=document.createElement("span");i.classList.add("player-volume__icon"),s.append(i,this.container),Object(l.b)(i,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.a)("media_playback_params",this.setVolume),this.setVolume()}}ir.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class nr extends sr{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new Be("pinned-audio",(e,t)=>{Object(k.a)(this.divAndCaption.title,e),Object(k.a)(this.divAndCaption.subtitle,t)}),onClose:()=>{fe.stop()},floating:!0}),this.topbar=e,this.chat=t,this.appMessagesManager=s,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:s,playbackParams:i})=>{var n,a;let o,r;const l="voice"!==e.type&&"round"!==e.type;if(l){const t=e.attributes.find(e=>"documentAttributeAudio"===e._);o=X.b.wrapEmojiText(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?X.b.wrapEmojiText(t.performer):Object(T.d)("AudioUnknownArtist")}else o=new wt.a({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=Object(ne.d)(t.date);this.fasterEl.classList.toggle("hide",l),this.repeatEl.classList.toggle("hide",!l),this.onPlaybackParams(i),this.volumeSelector.setVolume(),this.progressLine.setMedia(s),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!s.paused),this.toggle(!1)},this.divAndCaption.border.remove();const i=N("fast_rewind active",{noRipple:!0}),n=N("fast_forward active",{noRipple:!0}),o=(e,t)=>{Object(l.b)(e,e=>{Object(c.a)(e),t()},{listenerSetter:this.topbar.listenerSetter})};o(i,()=>{fe.previous()}),o(n,()=>{fe.next()}),this.toggleEl=N("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),o(this.toggleEl,()=>{fe.toggle()}),this.wrapper.prepend(this.wrapper.firstElementChild,i,this.toggleEl,n),this.volumeSelector=new ir(this.listenerSetter,!0);const r=document.createElement("div");r.classList.add("progress-line-container"),r.append(this.volumeSelector.container);const d=document.createElement("div");d.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(d),this.volumeSelector.btn.append(r),this.repeatEl=N("audio_repeat",{noRipple:!0}),o(this.repeatEl,()=>{const e=fe.getPlaybackParams();e.round?e.loop?(fe.round=!1,fe.loop=!1):fe.loop=!fe.loop:fe.round=!0});const h=this.fasterEl=N("playback_2x",{noRipple:!0});o(h,()=>{fe.playbackRate=h.classList.contains("active")?1:1.75}),this.wrapperUtils.prepend(this.volumeSelector.btn,h,this.repeatEl);const p=document.createElement("div");p.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Oe(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),p.append(this.progressLine.container),this.wrapper.insertBefore(p,this.wrapperUtils),this.topbar.listenerSetter.add(a.a)("media_play",this.onMediaPlay),this.topbar.listenerSetter.add(a.a)("media_pause",this.onPause),this.topbar.listenerSetter.add(a.a)("media_stop",this.onStop),this.topbar.listenerSetter.add(a.a)("media_playback_params",this.onPlaybackParams);const u=fe.getPlayingDetails();u&&(this.onMediaPlay(u),this.onPlaybackParams(u.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}var ar;!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(ar||(ar={}));class or{constructor(){this.drawRect=(e,t,s,i,n)=>`M${e},${t+n}a${n},${n},0,0,1,${s},0v${i-2*n}a${n},${n},0,0,1,${-s},0Z`,this.getClipPath=(e,t,s)=>{let i="";if(2===s)i=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let s;return e<=1?s=ar.ONE:2===e?s=ar.TWO:3===e?s=ar.THREE:4===e?s=ar.FOUR:e>3&&(s=ar.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=ar.ONE:2===e?s=ar.TWO:3===e?s=ar.THREE:4===e?s=ar.FOUR:e>3&&(s=ar.MORE),s},this.getMarkTranslateY=(e,t,s)=>1===s?0:2===s?e?t+1:0:3===s?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,s,i)=>t<=4||e<=1?0:e>=t-2?i-ar.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?ar.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add("pinned-message-border"),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className="pinned-message-border-wrapper-1",this.border.classList.remove("pinned-message-border-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const s=this.getBarHeight(e,t),i=this.getMarkHeight(e,t),n=this.getTrackHeight(e,s),a="clipPath_"+e,o=this.getClipPath(a,s,e),r=this.getMarkTranslateY(t,s,e),l=this.getTrackTranslateY(t,e,s,n);return this.border.classList.toggle("pinned-message-border-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className="pinned-message-border-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add("pinned-message-border-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${i}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var rr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class lr{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=lr.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const s=document.createElement("div"),i=!Object.keys(this.rows).length&&!t;return s.className=lr.BASE_CLASS+"-row"+(i?"":" is-hiding hide"),this.rows[e]={element:s,new:!0},this.container.append(s),s}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout(()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)},lr.DURATION)}setNewRow(e,t=!1){const s=this.rows[e];s.new&&(t?(s.element.classList.remove("hide"),s.element.offsetLeft):s.element.classList.remove("is-hiding","hide"),delete s.new),this.clearRows(e)}animate(e,t,s=e>t,i=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!i)return this.setNewRow(e);const o=["from-top","from-bottom"];s||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}lr.DURATION=200,lr.BASE_CLASS="animated-super";class cr{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=cr.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=cr.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=cr.BASE_CLASS+"-decimal-placeholder";const i=new lr;return i.container.className=cr.BASE_CLASS+"-decimal-wrapper",t.append(s,i.container),this.container.append(t),this.decimals[e]={container:t,placeholder:s,animatedSuper:i}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout(()=>{this.decimals.splice(t,this.decimals.length-t).forEach(e=>{e.container.remove()})},lr.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(cr.EMPTY_INDEX,!0);t.animatedSuper.animate(cr.EMPTY_INDEX,s,this.reverse?ethis.previousNumber,!0)}),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map(e=>+e);Array.from(""+e).map(e=>+e).forEach((s,i)=>{var n;const a=this.getDecimal(i),o=a.animatedSuper.getRow(s,!0),r=null!==(n=t[i])&&void 0!==n?n:cr.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}cr.EMPTY_INDEX=-1,cr.BASE_CLASS="animated-counter";class dr{constructor(e,t,s,i){this.topbar=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.isStatic=!1,this.debug=!1,this.listenerSetter=new R.a;const n=new Ue("pinned-message");this.pinnedMessageContainer=new sr({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>rr(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new ro(this.topbar.peerId,this.pinnedMid,!0):new ro(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new or,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new lr,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new lr,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new cr(!0),n.title.append(Object(T.d)("PinnedMessage")," ",this.animatedCounter.container);const o=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(o),n.container.prepend(o),this.btnOpen=N("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),Object(l.b)(this.btnOpen,e=>{Object(c.a)(e),this.topbar.openPinned(!0)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.a)("peer_pinned_messages",({peerId:e})=>{e===this.topbar.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))}),this.listenerSetter.add(a.a)("peer_pinned_hidden",({peerId:e})=>{e===this.topbar.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)}),this.setPinnedMessage=Object(lt.a)(()=>this._setPinnedMessage(),100,!0,!0),this.setCorrectIndexThrottled=Object(ws.a)(this.setCorrectIndex.bind(this),100,!1),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const s=t.dataset.mid;t&&void 0!==s&&this.testMid(+s,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let s=this.mids.findIndex(t=>t<=e);if(-1===s||this.isNeededMore(s)){if(!(this.loadedTop&&es))return;this.pinnedIndex=s,this.pinnedMid=this.mids.find(t=>t<=e)||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>dr.LOAD_COUNT&&(!this.loadedBottom&&e<=dr.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=dr.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return rr(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{let s=!1;const i=[this.appMessagesManager.getSearch({peerId:this.topbar.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:dr.LOAD_COUNT,backLimit:dr.LOAD_COUNT}).then(e=>(s=!0,e))];if(!this.pinnedMaxMid){const e=this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))});i.push(e)}const n=(yield Promise.all(i))[0];let a=n.history.findIndex(t=>t.mid<=e);-1===a&&(a=n.history.length),this.offsetIndex=n.offset_id_offset?n.offset_id_offset-a:0,this.mids=n.history.map(e=>e.mid).slice(),this.count=n.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,this.debug&&this.chat.log("[PM]: getCurrentIndex result:",e,n,a,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.chat.log.error("[PM]: getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new R.a,function(e,t,s,i){if(he.a){let n;const a={passive:!0};i.add(e)("touchstart",t=>{t.touches.length>1?r():(n=t.touches[0].clientY,i.add(e)("touchmove",o,a),i.add(e)("touchend",r,a))},a);const o=e=>{const i=e.touches[0].clientY,a=i{i.removeManual(e,"touchmove",o,a),i.removeManual(e,"touchend",r,a)}}else i.add(e)("wheel",e=>{const i=e.deltaY>0;"bottom"===t&&i?s():"top"!==t||i||s()},{passive:!0})}(this.chat.bubbles.scrollable.container,"bottom",()=>{this.unsetScrollDownListener()},this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return rr(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield Object(Ds.c)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.chat.log.error("[PM]: handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return rr(this,void 0,void 0,(function*(){const t=this.chat.getMessage(e);t&&!t.deleted&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then(()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)}))}))}_setPinnedMessage(){return rr(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,s=this.chat.getMessage(this.pinnedMid),i=0===t;this.animatedCounter.container.classList.toggle("is-last",i),i||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.chat.log("[PM]: setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=Ne({title:void 0,titleEl:null,subtitle:s.message,subtitleEl:a,message:s,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+s.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}dr.LOAD_COUNT=50,dr.LOAD_OFFSET=5;var hr=Wa,pr=s(43);class ur extends ut{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{i.a.mutePeer(e,-1===s?Me.b:Object(pr.a)(!0)+s)}}],body:!0});const t=[{time:3600,langKey:"ChatList.Mute.1Hour"},{time:14400,langKey:"ChatList.Mute.4Hours"},{time:28800,langKey:"ChatList.Mute.8Hours"},{time:86400,langKey:"ChatList.Mute.1Day"},{time:259200,langKey:"ChatList.Mute.3Days"},{time:-1,langKey:"ChatList.Mute.Forever"}].map(e=>new Ze({radioField:new nt({langKey:e.langKey,name:"mute-time",value:""+e.time})}));let s;const n=et(t,e=>{s=+e});t[t.length-1].radioField.checked=!0;const a=new Kn({noShadow:!0,noDelimiter:!0});a.content.append(n),this.body.append(a.container),this.show()}}class gr{constructor(e,t,s,i,n,a,o,r,l){this.chat=e,this.appSidebarRight=t,this.appMessagesManager=s,this.appPeersManager=i,this.appChatsManager=n,this.appNotificationsManager=a,this.appProfileManager=o,this.appUsersManager=r,this.appGroupCallsManager=l,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&Object(c.a)(e);const s=e=>{e.forEach(e=>{e.element.classList.toggle("hide",!e.verify())})};t&&(s(this.menuButtons),this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith(Object(T.d)(this.appPeersManager.getDeleteButtonText(this.peerId)))),s(this.buttonsToVerify)},this.verifyVideoChatButton=e=>{var t;if(!hr||this.peerId.isUser())return!1;const s=this.appGroupCallsManager.groupCall,i=this.peerId.toChatId();if((null==s?void 0:s.chatId)===i)return!1;if(e&&(this.peerId.isBroadcast()&&"group"===e||this.peerId.isAnyGroup()&&"broadcast"===e))return!1;return(null===(t=this.appChatsManager.getChatTyped(i).pFlags)||void 0===t?void 0:t.call_active)||this.appChatsManager.hasRights(i,"manage_call")},this.verifyCallButton=e=>{if(!qa||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),s=this.appProfileManager.getCachedFullUser(t);return!!s&&!!("voice"===e?s.pFlags.phone_calls_available:s.pFlags.video_calls_available)},this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new ur(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",b.b.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===b.a.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),ae.g&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame(()=>{ae.g&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0})},this.setFloating=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer].filter(Boolean).reduce((e,t)=>{const s=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,s),t.isVisible()?e+ +s:e},0);this.container.dataset.floating=""+e},this.setPeerStatus=(e=!1)=>{if(!this.subtitle)return;const t=this.peerId;this.chat.appImManager.setPeerStatus(this.peerId,this.subtitle,e,!1,()=>t===this.peerId)},this.listenerSetter=new R.a,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar"),this.container.dataset.floating="0",this.btnBack=N("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const s=document.createElement("div");s.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),s.append(this.title);const i=document.createElement("div");i.classList.add("bottom"),this.subtitle&&i.append(this.subtitle),t.append(s,i),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new nr(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=bi({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(b.b)("changeScreen",this.onChangeScreen),Object(l.b)(this.container,e=>{const t=Object(Ce.a)(e.target,"pinned-container");if(Object(ti.a)(),t){if(Object(c.a)(e),Object(Ce.a)(e.target,"progress-line"))return;const s=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(s);else{const e=t.dataset.peerId.toPeerId(),i=fe.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:s,type:i.isScheduled?"scheduled":i.threadId?"discussion":void 0,threadId:i.threadId})}}else b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown")?n():Object(bt.a)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains("is-right-column-shown")):this.appSidebarRight.toggleSidebar(!0)},{listenerSetter:this.listenerSetter});const n=e=>{if(e&&Object(c.a)(e),b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown"))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);F.a.back(e?"im":"chat")}};Object(l.b)(this.btnBack,n,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>b.b.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>"chat"===this.chat.type&&a.a.myId!==this.peerId&&!this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.appMessagesManager.togglePeerMute(this.peerId)},verify:()=>"chat"===this.chat.type&&a.a.myId!==this.peerId&&this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.appProfileManager.getChannelFull(this.peerId.toChatId())).then(t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null===(e=t)||void 0===e?void 0:e.linked_chat_id)}},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),M.c.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{M.c.pushToState("chatContextMenuHintWasShown",!0),ot(Object(T.d)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}})},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(Nt)){const e=new Nt(this.appSidebarRight);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>this.peerId.isUser()&&!this.appPeersManager.isContact(this.peerId)},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Pt({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new ut("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new wt.a({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{s(),this.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{i()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()}),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>a.a.myId!==this.peerId&&this.peerId.isUser()&&this.appPeersManager.isContact(this.peerId)&&!!this.appUsersManager.getUser(this.peerId.toUserId()).phone},{icon:"lock",text:"BlockUser",onClick:()=>{new ut("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new wt.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&&rt({langPackKey:"UserBlocked"})})}}]}).show()},verify:()=>{var e;if(!this.peerId.isUser())return!1;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==a.a.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"lockoff",text:"Unblock",onClick:()=>{this.appUsersManager.toggleBlock(this.peerId,!1).then(e=>{e&&rt({langPackKey:"UserUnblocked"})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"delete danger",text:"Delete",onClick:()=>{new Ot(this.peerId)},verify:()=>"chat"===this.chat.type&&!!this.appMessagesManager.getDialogOnly(this.peerId)}],this.btnSearch=N("search"),this.attachClickEvent(this.btnSearch,e=>{this.chat.initSearch()},!0)}attachClickEvent(e,t,s){Object(l.b)(e,e=>{Object(c.a)(e),!s&&Object(ti.a)(),t(e)},{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructPeerHelpers(){return this.avatarElement=new fc,this.avatarElement.isDialog=!0,this.avatarElement.classList.add("avatar-42","person-avatar"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new dr(this,this.chat,this.appMessagesManager,this.appPeersManager),this.btnJoin=Object(B.a)("btn-primary btn-color-primary chat-join hide"),this.btnCall=N("phone"),this.btnGroupCall=N("videochat"),this.btnPinned=N("pinlist"),this.btnMute=N("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,()=>{this.openPinned(!0)}),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,()=>{const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let s;s=this.appChatsManager.isChannel(t)?this.appChatsManager.joinChannel(t):this.appChatsManager.addChatUser(t,a.a.myId),s.finally(()=>{e()&&this.btnJoin.removeAttribute("disabled")})}),this.listenerSetter.add(a.a)("chat_update",e=>{var t,s;if(this.peerId===e.toPeerId(!0)){const i=this.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(s=null===(t=i)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.left)),this.setUtilsWidth(),this.verifyButtons()}}),this.listenerSetter.add(a.a)("dialog_notify_settings",e=>{e.peerId===this.peerId&&this.setMutedState()}),this.listenerSetter.add(a.a)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),this.listenerSetter.add(a.a)("user_update",e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()}),this.listenerSetter.add(a.a)("peer_full_update",e=>{this.peerId===e&&this.verifyButtons()}),this.pinnedMessage&&this.chat.addEventListener("setPeer",(e,t)=>{const s=this.chat.bubbles.getMiddleware();M.c.getState().then(i=>{s()&&(this.pinnedMessage.hidden=!!i.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))})}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(a.a)("peer_pinned_messages",({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()})}constructDiscussionHelpers(){this.pinnedMessage=new dr(this,this.chat,this.appMessagesManager,this.appPeersManager)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),this.chatAudio&&this.chatAudio.destroy(),delete this.chatAudio,delete this.pinnedMessage}setPeer(e){this.wasPeerId=this.peerId,this.peerId=e,this.container.style.display=e?"":"none"}finishPeerChange(e,t,s){var i,n;const a=this.peerId;this.avatarElement&&this.avatarElement.updateWithOptions({peerId:a});const o=this.appPeersManager.isBroadcast(a);if(this.btnMute&&this.btnMute.classList.toggle("hide",!o),this.btnJoin)if(this.appPeersManager.isAnyChat(a)){const e=a.toChatId();Object(k.a)(this.btnJoin,Object(T.d)(this.appChatsManager.isBroadcast(e)?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(n=null===(i=this.appChatsManager.getChat(e))||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.left))}else this.btnJoin.classList.add("hide");this.setUtilsWidth(),this.verifyButtons();const r=this.chat.bubbles.getMiddleware();if(this.pinnedMessage)if("chat"===this.chat.type){if(void 0!==this.wasPeerId){const e=new dr(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}M.c.getState().then(t=>{r()&&(this.pinnedMessage.hidden=!!t.hiddenPinnedMessages[a],e||this.pinnedMessage.setCorrectIndex(0))})}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());Object(Le.b)(()=>{this.setTitle(),this.setPeerStatus(!0),this.setMutedState()})}setTitle(e){let t;"pinned"===this.chat.type?(t=void 0===e?Object(T.d)("Loading"):Object(T.d)("PinnedMessagesCount",[e]),void 0===e&&this.appMessagesManager.getSearchCounters(this.peerId,[{_:"inputMessagesFilterPinned"}],!1).then(e=>{const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}})):"scheduled"===this.chat.type?(t=this.peerId===a.a.myId?Object(T.d)("Reminders"):Object(T.d)("ScheduledMessages"),void 0===e&&this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>{this.setTitle(e.length)})):"discussion"===this.chat.type?(t=void 0===e?Object(T.d)("Loading"):Object(T.d)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.appMessagesManager.getHistory(this.peerId,0,1,0,this.chat.threadId),Promise.resolve()]).then(()=>{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).count;null===e?setTimeout(()=>{this.setTitle()},30):this.setTitle(e)})):"chat"===this.chat.type&&(t=new wt.a({peerId:this.peerId,dialog:!0}).element),Object(k.a)(this.title,t),"chat"===this.chat.type&&this.title.append(...Kt(this.peerId))}setMutedState(){if(!this.btnMute)return;const e=this.peerId;let t=this.appNotificationsManager.isPeerLocalMuted(e,!1);this.appPeersManager.isBroadcast(e)?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}}class mr extends H{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new j("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=N("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new A(e,this.inputSearch,{messages:new x("Chat.Search.PrivateSearch","messages")})}open(e,t,s,i){const n=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,i):(this.query=i,this.peerId=e,this.threadId=t,this.onDatePick=s,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&Object(l.b)(this.btnPickDate,()=>{new Xn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),ts.toggleSidebar(!0)),n}}class br{constructor(e,t,s){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new Xn(new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=Object(bt.a)(e.target,"LI");t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.bubblesContainer.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),Object(te.a)(this.backBtn);const i=this.listenerSetter=new R.a,n=(e,t)=>{Object(l.b)(e,t,{listenerSetter:i})};n(this.backBtn,()=>{this.destroy()}),this.inputSearch=new j("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new x(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new A(this.results,this.inputSearch,{messages:this.searchGroup},e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):(Object(k.a)(this.foundCountEl,this.inputSearch.value?Object(T.d)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))}),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.bubblesContainer.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),Object(te.a)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),s&&this.setQuery(s),ae.f||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},F.a.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.chat.search=void 0,F.a.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),s=+e.dataset.mid||void 0,i=Object(Bs.a)(e);i===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),i?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active");const n=this.chat.setPeer(t,s);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then(()=>{this.selectedIndex=i,Object(k.a)(this.foundCountEl,Object(T.d)("Of",[i+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()}).finally(()=>{this.setPeerPromise=null})}}class vr{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find(t=>Object(ge.a)(t.options,e));return t||(t=new vr,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then(()=>this.fillCanvas(e))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.img=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=Object(ps.b)(t,e,!1).then(()=>t)}cleanup(e){this.canvases.delete(e),this.canvases.size||(Object(V.a)(vr.INSTANCES,this),this.objectUrl&&URL.revokeObjectURL(this.objectUrl))}fillCanvas(e){const t=e.getContext("2d");t.fillStyle instanceof CanvasPattern&&t.clearRect(0,0,e.width,e.height);const s=this.img;let i=s.width,n=s.height;i*=e.height/n,n=e.height,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,e.width,e.height),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";for(let a=0;as.resize(e,t)))}}vr.INSTANCES=[];class fr extends D.a{constructor(e,t,s,i,n,a,o,r,l,c,d,h,p,u,g,m,b,v,f,y,w){super(),this.appImManager=e,this.appChatsManager=t,this.appDocsManager=s,this.appInlineBotsManager=i,this.appMessagesManager=n,this.appPeersManager=a,this.appPhotosManager=o,this.appProfileManager=r,this.appStickersManager=l,this.appUsersManager=c,this.appWebPagesManager=d,this.appPollsManager=h,this.apiManager=p,this.appDraftsManager=u,this.serverTimeManager=g,this.storage=m,this.appNotificationsManager=b,this.appEmojiManager=v,this.appMessagesIdsManager=f,this.appGroupCallsManager=y,this.appReactionsManager=w,this.type="chat",this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=Object(Y.b)("CHAT",Y.a.Log|Y.a.Warn|Y.a.Debug|Y.a.Error),this.peerId=Me.c,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0}setBackground(e,t){const s=a.a.getTheme();let i;if(!!s.background.color&&!s.background.slug&&!s.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=s.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const n=++this.backgroundTempId,o=this.gradientRenderer,r=this.patternRenderer,l=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const c=s.background.intensity&&s.background.intensity/100,d=!!c&&c<0;let h,p,u,g=null==i?void 0:i.firstElementChild;if(!i)if(i=document.createElement("div"),i.classList.add("chat-background-item"),e)if(c){i.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=vr.getInstance({url:e,width:t.width,height:t.height,mask:d}),g=this.patternCanvas=h.createCanvas(),g.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),d&&i.classList.add("is-dark")}else s.background.slug&&i.classList.add("is-image");else s.background.color&&i.classList.add("is-color");const m=s.background.color;if(m){const{canvas:e,gradientRenderer:t}=en.create(m);u=this.gradientRenderer=t,p=this.gradientCanvas=e,p.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),a.a.settings.animationsEnabled&&u.scrollAnimate(!0)}if(h){(d?p:g).style.setProperty("--opacity-max",""+Math.abs(c))}const b=new Promise(s=>{const a=()=>{if(this.backgroundTempId!==n)return h&&h.cleanup(g),void(u&&u.cleanup());const e=this.backgroundEl.lastElementChild;if(e===i)return void s();const a=[p,g].filter(Boolean);a.length&&i.append(...a),this.backgroundEl.append(i),Object(is.a)(i,"is-visible",!0,t?0:200,e?()=>{r&&r.cleanup(l),o&&o.cleanup(),e.remove()}:null,2),s()};if(h){h.renderToCanvas(g).then(()=>{if(this.backgroundTempId!==n)return;let e;e=Promise.resolve(),e.then(a)})}else e?Object(ps.a)(i,e,a):a()});return this.setBackgroundPromise=Promise.race([Object(da.a)(500),b])}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new gr(this,ts,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new ao(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager,this.appChatsManager,this.appReactionsManager,this.appWebPagesManager),this.input=new tr(this,this.appMessagesManager,this.appMessagesIdsManager,this.appDocsManager,this.appChatsManager,this.appPeersManager,this.appWebPagesManager,this.appImManager,this.appDraftsManager,this.serverTimeManager,this.appNotificationsManager,this.appEmojiManager,this.appUsersManager,this.appInlineBotsManager,this.appProfileManager),this.selection=new ri(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new fo(this.bubbles.bubblesContainer,this,this.appMessagesManager,this.appPeersManager,this.appPollsManager,this.appDocsManager,this.appMessagesIdsManager,this.appReactionsManager),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),"scheduled"===this.type||he.a||this.bubbles.setReactionsHoverListeners(),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.bubblesContainer,this.input.chatInput),this.bubbles.listenerSetter.add(a.a)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)}),this.bubbles.listenerSetter.add(a.a)("dialog_drop",e=>{e.peerId===this.peerId&&this.appImManager.setPeer()})}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.selection.cleanup()}setPeer(e,t,s){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const i=this.peerId===e;if(i){if(this.setPeerPromise)return}else a.a.dispatchEvent("peer_changing",this),this.peerId=e||Me.c;if(!e)return ts.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.a.dispatchEvent("peer_changed",e);if(!i){const t=ts.getTab(mr);t&&t.close(),this.noForwards=this.appPeersManager.noForwards(e),this.isRestricted=this.appPeersManager.isRestricted(e),this.container.classList.toggle("no-forwards",this.noForwards),ts.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=i,void 0===s&&this.isStartButtonNeeded()&&(s=Me.a);const n=this.bubbles.setPeer(e,t,s);if(!n)return;const{promise:o}=n,r=this.setPeerPromise=o.finally(()=>{this.setPeerPromise===r&&(this.setPeerPromise=null)});return i||(ts.sharedMediaTab.setLoadMutex(this.setPeerPromise),ts.sharedMediaTab.loadSidebarMedia(!0)),n}setAutoDownloadMedia(){this.autoDownload=function(e){let t,s=0,i=0,n=0;const o=a.a.settings;return!o.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?e.isContact()?"contacts":"private":e.isBroadcast()?"channels":"groups",o.autoDownload.photo[t]&&(s=o.autoDownloadNew.photo_size_max),o.autoDownload.video[t]&&(i=o.autoDownloadNew.video_size_max),o.autoDownload.file[t]&&(n=o.autoDownloadNew.file_size_max)),{photo:s,video:i,file:n}}(this.peerId)}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,s,i){if(this.peerChanged)return;let n=this.peerId;this.peerChanged=!0,this.cleanup(!1),this.topbar.setPeer(n),this.topbar.finishPeerChange(e,t,s),this.bubbles.finishPeerChange(),this.input.finishPeerChange(i),ts.sharedMediaTab.fillProfileElements(),this.log.setPrefix("CHAT-"+n+"-"+this.type),a.a.dispatchEvent("peer_changed",n),this.wasAlreadyUsed=!0}getMessagesStorage(){return this.appMessagesManager.getMessagesStorage(this.peerId)}getMessage(e){return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(),e)}getMidsByMid(e){return this.appMessagesManager.getMidsByMessage(this.getMessage(e))}isAnyGroup(){return this.peerId===a.a.myId||this.peerId===Me.e||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)this.search?this.search.setQuery(e):this.search=new br(this.topbar,this,e);else{let t=ts.getTab(mr);t||(t=new mr(ts)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return this.appPeersManager.isBot(this.peerId)&&!this.appMessagesManager.getDialogOnly(this.peerId)&&!this.appMessagesManager.getHistoryStorage(this.peerId).history.length}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,sendSilent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}}class yr{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,he.a){if(e&&Object(c.a)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools");["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach(t=>{const s=N(t,{noRipple:!0});e.append(this.buttons[t]=s),"link"!==t?s.addEventListener("mousedown",e=>{Object(c.a)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()}):Object(l.b)(s,e=>{Object(c.a)(e),this.showLinkEditor(),this.cancelClosening()})}),this.linkBackButton=N("left",{noRipple:!0}),this.linkInput=document.createElement("input"),Object(T.b)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",e=>{const t=!this.linkInput.value.length||!!X.b.matchUrl(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))}),this.linkInput.addEventListener("input",e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")}),this.linkBackButton.addEventListener("mousedown",e=>{Object(c.a)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()}),this.linkApplyButton=N("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",e=>{this.applyLink(e)});const s=document.createElement("div");s.classList.add("markup-tooltip-link-apply-container");const i=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");i.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(i,this.buttons.link),s.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,s),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",()=>{this.hide()})}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout(()=>{this.linkInput.focus()},200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){Object(c.a)(e),this.resetSelection();let t=this.linkInput.value;t&&!X.b.matchUrlProtocol(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout(()=>{this.hide()},0)}isLinkValid(){return!this.linkInput.value.length||!!X.b.matchUrl(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,F.a.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout(()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")},200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let s=0;s!!e)}(),t=[...new Set(e.map(e=>e.parentNode))],s=new Set;return t.forEach(e=>{for(const t in Uo.b){const i=Uo.b[t];e.closest(i.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&s.add(this.buttons[t])}}),[...s]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const s=this.buttons[t];s.classList.toggle("active",e.includes(s))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),s=document.body.getBoundingClientRect(),i=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=Qa(void 0,this.appImManager.chat.input.messageInput,!1,i).rect.top+-1*s.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=Object(ke.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(ke.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),lo())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),ae.e||F.a.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){he.a&&!ae.b&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",e=>{Object(c.a)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()},{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const s=document.getSelection();if(lo(s))this.hide();else if(he.a)if(ae.b)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=s.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()}))}}function wr(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function Sr(e,t,s,i,n,a,o,r){const l=[];return l.push("M"+(e+s/2)+","+t),l.push("H"+(e+s-a)),a>0&&l.push("A"+wr(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+wr(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+wr(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+wr(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}le.a.generatePathData=Sr;class Cr{constructor(e,t){let s;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(s=document.createElement("div"),s.classList.add("drop-icon","tgico-"+t.icon));const i=document.createElement("div");let n;i.classList.add("drop-header"),i.append(Object(T.d)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append(Object(T.d)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,s,i,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",""+e.width),this.svg.setAttributeNS(null,"height",""+e.height);const t=Sr(5,5,e.width-10,e.height-10,10,10,10,10);this.path.setAttributeNS(null,"d",t)}}function Lr(e){e.forEach(e=>e.classList.add("no-transition")),Object(Le.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var Ir=s(50),Mr=s(48),Er=s(138),Pr=s(128);class kr{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:s,minRadius:i,speed:n}=this,a=s-i;e[t]=i+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:s,N:i}=this;for(let n=0;n=1&&(i[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,s,i,n,a,o,r){if(n.getContext){const l=n.getContext("2d");l.beginPath(),l.moveTo(s,i),l.lineTo(e,i);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const s=this.progress[n],i=(t-(c[n]*(1-s)+d[n]*s))*r+o*(1-r);l.lineTo(e,i)}else{const a=this.progress[n-1],p=c[n-1]*(1-a)+d[n-1]*a,u=this.progress[n],g=(s-e)/h*(n-1),m=(s-e)/h*n,b=g+(m-g)/2,v=(t-p)*r+o*(1-r),f=(t-(c[n]*(1-u)+d[n]*u))*r+o*(1-r);l.bezierCurveTo(b,v,b,f,m,f),n===h&&l.lineTo(s,i)}a(l),l.fill(),l.closePath()}}}class Tr{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,s,i,n,a)=>{t.fillStyle=Tr.getGradientFromType(t,e,s,i,n,a)}}static getGradientFromType(e,t,s,i,n,a){const o=e.createLinearGradient(s,i,n,a);return t===Pr.a.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===Pr.a.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===Pr.a.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===Pr.a.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,s,i){}}class xr{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout(()=>{this.resizing=!1,this.invokeDraw()},250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:s,lbd2:i,scale:n,left:a,top:o,right:r,bottom:l,currentState:c,previousState:d,focused:h,resizing:p,canvas:u}=this;if(!h&&!p&&this.progressToState>=1)return;let g=Date.now()-this.lastUpdateTime;g>20&&(g=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*g,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:m,amplitude2:b,progressToState:v}=this,f=6*b*n,y=6*b*n;u.getContext("2d").clearRect(0,0,u.width,u.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,t.update(m,.3),s.update(m,.7),i.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-v,h=d):(n=d?v:1,c.update(l-o,r-a,g,m),h=c);const p=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},b=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};s.draw(a,o-f,r,l,u,p,o,1),i.draw(a,o-y,r,l,u,p,o,1),t.draw(a,o,r,l,u,b,o,1)}e||(this.raf=requestAnimationFrame(()=>this.draw()))},this.setCurrentState=(e,t)=>{const{currentState:s,states:i}=this;(null==s?void 0:s.stateId)!==e&&(this.previousState=t?s:null,this.currentState=i.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[Pr.a.UNMUTED,new Tr(Pr.a.UNMUTED)],[Pr.a.MUTED,new Tr(Pr.a.MUTED)],[Pr.a.MUTED_BY_ADMIN,new Tr(Pr.a.MUTED_BY_ADMIN)],[Pr.a.CONNECTING,new Tr(Pr.a.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(Pr.a.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new kr(3),this.lbd1=new kr(7),this.lbd2=new kr(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const s=this.canvas=document.createElement("canvas");return s.classList.add(e+"-canvas"),t.append(s),t}}var Ar=new class{constructor(){this.cache={},a.a.addEventListener("theme_change",()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let t in e)this.getProperty(t)})}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}};class Or{constructor(e,t){this.item=e,Object(w.a)(this,t)}play(e){return this.item.playPart(this,e)}}class jr{constructor(e,t){this.icon=e,this.autoplay=!1,Object(w.a)(this,t),this.parts=this.parts.map(e=>this.createPart(e))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:s,canvas:i,width:n,height:a}=this.icon;return t=oe.a.loadAnimationAsAsset({container:s,canvas:i,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then(e=>oe.a.waitForFirstFrame(e)).then(e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)}),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new Or(this,e)}getPart(e){return e instanceof Or?e:"string"==typeof e?this.parts.find(t=>t.name===e):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class _r{constructor(e){Object(w.a)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:s}=this;this.container.style.width=t+"px",this.container.style.height=s+"px";const i=this.canvas=document.createElement("canvas");i.classList.add("rlottie"),i.width=t,i.height=s,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Se.a)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new jr(this,e);return this.items.set(e.name,t),t}playPart(e,t,s){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,s)});const i=e.getPart(t);e.player.playPart({from:a.a.settings.animationsEnabled&&!this.skipAnimation?i.startFrame:i.endFrame,to:i.endFrame,callback:s})}static generateEqualParts(e,t){return new Array(e).fill(0).map((e,s)=>{const i=s*t;return{startFrame:i,endFrame:i+t-1}})}}class Fr extends _r{constructor(e){super({width:e.width,height:e.height}),Object(w.a)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const s=this.getPart(e),i=void 0!==t&&this.getColor&&this.getColor(t),n=s.item;n.initFrame=s.endFrame,n.color=i;const a=[...this.items.values()].map(e=>e.load());return Promise.all(a).then(Se.a)}setState(e,t,s){this.loaded||this.load(e,t);let i=!1,n=!1;return void 0!==e?i=this.setPartState(e,t,s):void 0!==t&&(n=this.setColorState(t)),i||n}setPartState(e,t,s){const{partState:i}=this;if(i===e)return void 0!==t&&this.setColorState(t);void 0!==t&&this.setColorState(t,!1),this.partState=e;return this.getPart(e,i).play(s),!0}setColorState(e,t=!0){const{colorState:s}=this;if(s===e||!this.getColor)return!1;this.colorState=e;const i=this.getItem(),n=this.getColor(e,s),a=()=>{i.player.setColor(n,t)};return i.player?a():i.onLoadForColor=a,!0}destroy(){this.items.forEach(e=>{e.loadPromise.then(()=>{e.player.remove()})})}}class Dr extends Fr{constructor(){super({width:36,height:36,getPart:(e,t)=>{const s=el;let i;switch(e){case s.HAND:i=t===s.MUTED?"muted-to-hand":"unmuted-to-hand";break;case s.MUTED:i=t===s.HAND?"hand-to-muted":"mute";break;case s.UNMUTED:i="unmute"}return this.getItem().getPart(i)}});this.container.classList.add("group-call-microphone-icon-container");this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var Rr=s(126);class Br extends Fr{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const s=Zr;let i;switch(e){case s.HAND:i=3;break;case s.MUTED:i=t===s.HAND?0:2;break;case s.UNMUTED:i=1}return this.getItem().getPart(i)},getColor:e?(e,t)=>function(e){const t=Zr;let s,i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const n=Ar.getProperty("gc-"+i+"-text-color");return s=Yi(n),s}(e):void 0}),this.colored=e;this.container.classList.add("group-call-participant-muted-icon-container");const t=_r.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=Zr;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}class Nr{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-status-container")}setState(e,t){const s=Zr,i=this.withIcons.filter(e=>!!t[e]).map(e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),s=document.createElement("i");return s.classList.add("group-call-participant-status-icon","group-call-participant-status-icon-"+e,t),s});let n,a;if(e===s.MUTED_FOR_ME)n=Object(T.d)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===s.UNMUTED)n=Object(T.d)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===s.HAND)n=Object(T.d)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!i.length)return void Object(m.a)(this.container,X.b.wrapEmojiText(t.about));n=Object(T.d)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add("group-call-participant-status",a),o.append(...i,n),Object(k.a)(this.container,o)}}class Ur extends Hs{constructor(e){super({getIndex:e=>e.participant.date,onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>{const{participant:t}=e,s=al(t);e.mutedIcon.setState(s),e.status.setState(s,t)},onSort:(e,t)=>{Ns(e.dom.listEl,this.list,t)},onElementCreate:t=>{const{dom:s}=_c.addDialogNew({dialog:t.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});s.listEl.classList.add("group-call-participant");const i=e.participants.get(t.id),n=al(i),a=new Br(!0),o=new Nr(["presentation","video"]);return a.setState(n),o.setState(n,i),Object(k.a)(s.lastMessageSpan,o.container),s.listEl.append(a.container),t.dom=s,t.participant=i,t.mutedIcon=a,t.status=o,t},updateElementWith:Le.b}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=_c.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach(e=>{this.onElementDestroy(e)})}onElementDestroy(e){e.mutedIcon.destroy()}}class Hr extends D.a{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){Object(w.a)(this,e);const{listenerSetter:t,element:s}=this;he.a?t.add(s)("click",e=>{this.ignoreClickClassName&&Object(Ce.a)(e.target,this.ignoreClickClassName)||this.toggleControls()}):(t.add(s)("mousemove",()=>{this.showControls()}),t.add(s)("mouseenter",()=>{this.showControls(!1)}),t.add(s)("mouseleave",e=>{e.relatedTarget&&this.showOnLeaveToClassName&&Object(Ce.a)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()}))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}function zr(e){const t=document.createElement("canvas");t.classList.add("call-video-blur");t.width=16,t.height=16;const s=t.getContext("2d");s.filter="blur(2px)";const i=()=>{s.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return Object(Pe.a)(()=>(i(),t.isConnected)),i(),t}class Vr{constructor(e,t,s){this.appPeersManager=e,this.instance=t,this.source=s,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-video-container"),this.info=document.createElement("div"),this.info.classList.add("group-call-participant-video-info"),this.left=document.createElement("div"),this.left.classList.add("group-call-participant-video-info-left"),this.right=document.createElement("div"),this.right.classList.add("group-call-participant-video-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add("group-call-participant-video-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,s){let i;e.pFlags.self?(i=Object(T.d)("VoiceChat.Status.You"),i.classList.add("peer-title")):(this.peerTitle=new wt.a({peerId:this.appPeersManager.getPeerId(e.peer)}),i=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Br(!1),this.groupCallParticipantStatus=new Nr([t]),this.left.append(i,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),s.classList.add("group-call-participant-video","call-video"),s.paused&&s.play();const n=zr(s);n.classList.add("group-call-participant-video-blur"),this.container.prepend(n,s),this.updateParticipant(e)}updateParticipant(e){const t=al(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Kr extends Hr{constructor(e){super(),Object(w.a)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:s}=this;s.add(a.a)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)}),s.add(this.instance)("pinned",e=>{this.participantsElements.forEach(t=>{t.forEach(t=>{this.setElementDisplay(t,e)})})}),Object(l.b)(this.container,e=>{const t=Object(Ce.a)(e.target,"group-call-participant-video-container");if(!t)return;const s=this.containers.get(t);this.instance.pinnedSource!==s.source?this.instance.pinSource(s.source):this.instance.unpinAll()},{listenerSetter:s}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:s,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const s=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!s);const i=e.source===t;e.setPinned(i)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=["video","presentation"],i=s.some(t=>!!e[t]);let n=this.participantsElements.get(t);(i||n)&&(n||this.participantsElements.set(t,n=new Map),s.forEach(s=>{let i=n.get(s);const a=e[s];if(!!a!=!!i){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,s);if(!t)return;const{video:a,source:o}=t;i=new Vr(this.appPeersManager,this.instance,o),this.containers.set(i.container,i),this.setElementDisplay(i,this.instance.pinnedSource),n.set(s,i),i.setParticipant(e,s,a),this.container.prepend(i.container)}else n.delete(s),i.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(i.container),i.destroy());this._onLengthChange()}else i&&i.updateParticipant(e)}))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.containers.forEach(e=>{e.destroy()})}}class Gr{constructor(e){this.onOpenProfileClick=()=>{const e=ht.b.getPopups(rl)[0];e&&e.hide(),a.a.dispatchEvent("history_focus",{peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.appGroupCallsManager.editParticipant(this.instance.id,this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>{Mn({peerId:this.targetPeerId,title:new wt.a({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new wt.a({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then(()=>{this.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)},Se.a)}}];const{listenerSetter:t}=e;this.appChatsManager=e.appChatsManager,this.appPeersManager=e.appPeersManager,this.appGroupCallsManager=e.appGroupCallsManager,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=$s(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Object(ee.a)(e.onContextElement,e=>{const t=Object(Ce.a)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==s&&s.append(this.element);const i=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=this.instance.getParticipantByPeerId(i),this.participant.pFlags.self||(this.canManageCall=this.appChatsManager.hasRights(this.chatId,"manage_call"),this.buttons.forEach(e=>{e.element.classList.toggle("hide",!e.verify(i))}),Object(c.a)(e),Object(ee.e)(e.touches?e.touches[0]:e,this.element,"right"),Object(ee.d)(this.element))},t),t.add(a.a)("group_call_participant",({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=this.appPeersManager.getPeerId(t.peer);this.targetPeerId===e&&Object(ee.c)()}});let s=document.body;Object(Rr.a)(document.body,()=>{const e=Object(Rr.d)();s=e?ht.b.getPopups(rl)[0].getContainer():document.body,e||Object(ee.c)()},t)}}class Wr{constructor(e){Object(w.a)(this,e);const t=new P.b(void 0);t.container.classList.add("group-call-participants-scrollable");const s=this.container=document.createElement("div");s.classList.add("group-call-participants");const i=this.sortedList=new Ur(this.instance),{instance:n,listenerSetter:o}=this;this.contextMenu=new Gr(Object.assign(Object.assign({},e),{onContextElement:i.list,listenerSetter:o,instance:n})),this.groupCallParticipantsVideo=new Kr(Object.assign(Object.assign({},e),{appendTo:t.container,displayPinned:!1})),t.append(i.list),s.append(t.container),e.appendTo.append(s),o.add(a.a)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)});new vt({scrollable:t,getPromise:()=>this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants:e,isEnd:t})=>(e.forEach(e=>{this.updateParticipant(e)}),t))});this.setInstance(n)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=this.sortedList.has(t);e.pFlags.left?s&&this.sortedList.delete(t):s?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class qr{constructor(e){this.appendTo=e,this.descriptionIntl=new T.c.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let s,i;t===Pr.a.CONNECTING?s="VoiceChat.Status.Connecting":(s="VoiceChat.Status.Members",i=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:s,args:i}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class Qr{constructor(e){this.appendTo=e,this.peerTitle=new wt.a({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?Object(m.a)(s,X.b.wrapEmojiText(i.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==s&&s.append(t.element))}}var $r=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}));function Yr(e,t,s){const i=e+"-button",n=document.createElement("div");n.classList.add(i,"call-button","rp-overflow"),s.icon&&n.classList.add("tgico-"+s.icon),s.noRipple||Object(te.a)(n),s.isDanger&&n.classList.add(i+"-red"),s.isConfirm&&n.classList.add(i+"-green"),s.callback&&Object(l.b)(n,s.callback,{listenerSetter:t});let a=n;if(s.text){const e=document.createElement("div");e.classList.add(i+"-container","call-button-container");const t="string"==typeof s.text?Object(T.d)(s.text):s.text;t.classList.add(i+"-text","call-button-text"),e.append(n,t),a=e}return a}class Xr extends D.a{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},Object(w.a)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add("movable-element"),this.addResizeHandlers(),this.setSwipeHandler(),b.b.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove("movable-element"),this.handlers&&this.handlers.forEach(e=>{e.remove()})}destroy(){b.b.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map(e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add("movable-element-resize-handler","movable-element-resize-handler-side-"+e),this.element.append(t),t})}setSwipeHandler(){let e,t,s,i,n;const a=this.swipeHandler=new Qt({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,i=Math.abs(a)*(e?1:-1),o=n.includes("e")?St.a.width-t:s+t;this.width=Math.min(o,s+i)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,s=Math.abs(o)*(t?1:-1),a=n.includes("s")?St.a.height-e:i+e;this.height=Math.min(a,i+s)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+s-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+i-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const s=Object(Ce.a)(t,"movable-element-resize-handler");return s?(n=s.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,s=this.width,i=this.height}})}setPositionToCenter(){this.top=St.a.height/2-this.height/2,this.left=St.a.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=Object(ke.a)(this.width,this.minWidth,St.a.width),this.height=Object(ke.a)(this.height,this.minHeight,St.a.height)}fixPosition(){this.top=Object(ke.a)(this.top,0,St.a.height-this.height),this.left=Object(ke.a)(this.left,0,St.a.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:s,height:i}=this;return{top:e,left:t,width:s,height:i}}set state(e){const{top:t,left:s,width:i,height:n}=e;this.top=t,this.left=s,this.width=i,this.height=n,this.onResize()}}var Jr,Zr,el,tl=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)},sl=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s};class il{constructor(e){Jr.set(this,void 0),Object(w.a)(this,e),this.toggleMovable(!he.a),this.listenerSetter.add(b.b)("changeScreen",(e,t)=>{t!==b.a.mobile&&e!==b.a.mobile||this.toggleMovable(!he.a)})}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return tl(this,Jr,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=sl(this,Jr,new Xr(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),sl(this,Jr,void 0,"f")}}}function nl(e,t,s){return t.forEach(t=>{t.classList.toggle(e,s)}),()=>nl(e,t,!s)}function al(e){const t=Zr;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}Jr=new WeakMap,function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(Zr||(Zr={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(el||(el={}));let ol={width:420,height:640};class rl extends ht.b{constructor(e){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(Rr.e)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=nl.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally(()=>{e()})},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally(()=>{e()})},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{const e=e=>{this.instance.hangUp(e)};this.appChatsManager.hasRights(this.instance.chatId,"manage_call")?new ut("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=Object(Rr.d)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(I.a.checkAnimations(e),a.a.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=Object(Rr.d)(),s=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,i=(t||!!(s&&s.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;i&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach(e=>{e.style.opacity="0"}),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",i),this.btnInvite.classList.toggle("hide",i),this.btnShowColumn.classList.toggle("hide",!i),a&&a.forEach(e=>{e.style.opacity=""})},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},Object(w.a)(this,e),this.videosCount=0,this.container.classList.add("group-call","night");const t=this.instance=this.appGroupCallsManager.groupCall,{listenerSetter:s}=this;if(!ae.c){const e=this.btnFullScreen=N("fullscreen"),t=this.btnFullScreen2=N("fullscreen group-call-cfs"),i=this.btnExitFullScreen=N("smallscreen");Object(l.b)(e,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(t,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(i,()=>{Object(Rr.b)()},{listenerSetter:s}),Object(Rr.a)(this.container,this.onFullScreenChange,s)}this.btnInvite=N("adduser");const i=this.btnShowColumn=N("rightpanel group-call-only-big");Object(l.b)(i,this.toggleRightColumn,{listenerSetter:s});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),n.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const r=this.header.cloneNode(!1),c=n.cloneNode(!1),d=this.title.cloneNode(!1);c.append(d);const h=N("rightpanel");r.append(...[h,c,this.btnFullScreen2].filter(Boolean)),Object(l.b)(h,this.toggleRightColumn,{listenerSetter:s}),this.body.prepend(r);const p=new P.b(void 0);p.container.classList.add("group-call-big-video-container"),this.container.append(p.container),this.groupCallTitle=new Qr(this.title),this.groupCallDescription=new qr(o),this.groupCallBodyHeaderDescription=new qr(d),this.constructButtons(),this.groupCallParticipantsVideo=new Kr(Object.assign({appendTo:p.container,instance:t,listenerSetter:s,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()}},e)),this.groupCallParticipants=new Wr(Object.assign({appendTo:this.body,instance:t,listenerSetter:s},e)),this.movablePanel=new il({listenerSetter:s,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!(Object(Ce.a)(t,"chatlist")||Object(Ce.a)(t,"group-call-button")||Object(Ce.a)(t,"btn-icon")||Object(Ce.a)(t,"group-call-participants-video-container")||Object(Rr.d)())}},onResize:()=>this.toggleBigLayout(),previousState:ol}),s.add(t)("state",()=>{this.updateInstance()}),s.add(a.a)("group_call_update",e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()}),s.add(t)("pinned",()=>{this.setHasPinned()}),s.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",()=>{const{movablePanel:e}=this;ol=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()}),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add("group-call-buttons");const t=Yr.bind(null,"group-call",this.listenerSetter),s=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),i=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});i.classList.toggle("hide",!$r);const n=t({noRipple:!0,callback:Object(ws.a)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Dr;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!$r);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(s,i,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===Pr.a.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(Rr.b)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const s=function(e,t){const s=el;return t.pFlags.can_self_unmute?t.pFlags.muted?s.MUTED:s.UNMUTED:s.HAND}(0,e);this.container.dataset.micState=s===el.HAND?"hand":s===el.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(s)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var ll,cl=s(185);!function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(ll||(ll={}));var dl=ll;class hl{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let s;if(this.state=t,t===dl.CONNECTED){s=document.createElement("span"),s.classList.add("call-description-duration");const t=()=>{s.innerText=Te(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let i;switch(t){case dl.PENDING:i=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case dl.REQUESTING:i="Call.StatusRequesting";break;case dl.EXCHANGING_KEYS:i="VoipExchangingKeys";break;case dl.CLOSED:i=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:i="Call.StatusConnecting"}s=Object(T.d)(i),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===dl.CONNECTED),Object(k.a)(this.container,s),this.container.parentElement||this.appendTo.append(this.container)}}class pl extends Fr{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const ul={width:400,height:580};let gl=Object.assign({},ul);class ml extends ht.b{constructor(e){super("popup-call",void 0,{withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(Rr.e)(this.container)},this.onFullScreenChange=()=>{const e=Object(Rr.d)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(I.a.checkAnimations(e),a.a.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},Object(w.a)(this,e),this.videoContainers={};const{container:t,listenerSetter:s,instance:i}=this;t.classList.add("call","night");const n=document.createElement("div");n.classList.add("call-avatar");const o=this.peerId=this.instance.interlocutorUserId.toPeerId(),r=new fc;r.classList.add("avatar-full"),r.updateWithOptions({isBig:!0,peerId:o}),n.append(r);const c=new wt.a({peerId:o}).element;c.classList.add("call-title");const d=document.createElement("div");d.classList.add("call-subtitle");this.description=new hl(d);const h=this.emojisSubtitle=document.createElement("div");h.classList.add("call-emojis"),t.append(n,c,d),ae.e?this.header.append(h):(this.btnFullScreen=N("fullscreen"),this.btnExitFullScreen=N("smallscreen hide"),Object(l.b)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(this.btnExitFullScreen,()=>Object(Rr.b)(),{listenerSetter:s}),Object(Rr.a)(this.container,this.onFullScreenChange,s),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(h)),this.partyStates=document.createElement("div"),this.partyStates.classList.add("call-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add("call-party-state");const p=Object(T.d)("VoipUserMicrophoneIsOff",[new wt.a({peerId:o,onlyFirstName:!0,limitSymbols:18}).element]);p.classList.add("call-party-state-text");const u=new pl(!1,!0);u.setState(!1,!1),this.partyMutedState.append(u.container,p),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=Yr.bind(null,"call",this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),s.add(i)("state",()=>{this.updateInstance()}),s.add(i)("mediaState",()=>{this.updateInstance()}),this.movablePanel=new il({listenerSetter:s,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!(Object(Ce.a)(t,"call-button")||Object(Ce.a)(t,"btn-icon")||Object(Rr.d)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?gl:Object.assign({},ul)});const g=this.movablePanel.movable;g&&this.listenerSetter.add(g)("resize",()=>{this.resizeVideoContainers()});const m=this.controlsHover=new Hr;m.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),m.showControls(!1),this.addEventListener("close",()=>{const{movablePanel:e}=this;gl=e.state,this.microphoneIcon.destroy(),e.destroy()}),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-first");const t=nl.bind(null,"btn-disabled"),s=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([s,i],!0);this.instance.toggleVideoSharing().finally(e)}}),i=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([s,i],!0);this.instance.toggleScreenSharing().finally(e)}});$r||(i.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new T.c.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new pl(!0,!0);n.firstElementChild.append(a.container),e.append(s,i,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-second"),this.declineI18nElement=new T.c.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),s=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,s),this.container.append(e)}createVideoContainer(e){const t=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),Object(l.b)(t,()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find(e=>!e.classList.contains("small"));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()});const s=zr(e);return s.classList.add("call-video-blur"),t.append(s,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===dl.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(Rr.b)(),this.btnVideo.classList.add("disabled"),void this.hide();const s=!e.isOutgoing&&t===dl.PENDING;this.declineI18nElement.compareAndUpdate({key:t===dl.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!s),this.btnAccept.classList.toggle("hide-me",!s),this.container.classList.toggle("two-button-rows",s);const i=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",i)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!i,!i,n),a||n(),this.muteI18nElement.compareAndUpdate({key:i?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const l=e.getMediaState("output");Object(is.a)(this.partyMutedState,"is-visible",!!(null==l?void 0:l.muted),300);const c=this.videoContainers,d=Object.assign({},c);["input","output"].forEach(t=>{const s=e.getMediaState(t),i=e.getVideoElement(t),n=!!(i&&i.videoWidth&&i.videoHeight);!i||n||i.dataset.hasPromise||(i.dataset.hasPromise="1",Object(pe.e)(i).then(()=>{delete i.dataset.hasPromise,this.updateInstance()}));const a=!!i&&n&&!(!s||"active"!==s.videoState&&"active"!==s.screencastState);let o=c[t];a&&i&&!o&&(o=c[t]=this.createVideoContainer(i),this.container.append(o)),!a&&o&&(o.remove(),delete c[t])});{const e=c.input,t=c.output;Object.keys(d).length!==Object.keys(c).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(c).length),!this.emojisSubtitle.textContent&&t{this.emojisSubtitle.append(X.b.wrapEmojiText(e.join("")))}),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach(e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),s=this.movablePanel.state,i=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:i,r=1/3*(Object(Rr.d)()?65535:a?s.height:s.width),l=a?t.videoWidth/t.videoHeight:1,c=a?1:t.videoHeight/t.videoWidth;e.style.width=r*l+"px",e.style.height=r*c+"px",e.style.maxWidth=o*l+"px",e.style.maxHeight=o*c+"px"}else e.style.cssText=""})}setDescription(){this.description.update(this.instance)}}var bl=s(186),vl=s(167);function fl(e){const t=Object(vl.a)(e,e.media[0]),s={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},i=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=s["video"===n&&s.video?"screencast":n]={},o=Object(vl.a)(e,t);a.ssrc=i(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map(e=>({semantics:e.semantics,ssrcs:e.sources.map(i)})));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach(e=>{r.push({id:+e.key,uri:e.value})});const l=new Map,c=e=>{let t=l.get(e);return t||l.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach(e=>{const t=+e.key,s=c(t),i=e.value.split("/"),[n,a,o]=i;s.name=n,s.clockrate=+a,s.channels=o?+o:0}),t.attributes.get("rtcp-fb").forEach(e=>{const t=+e.key;c(t).feedbackTypes=e.lines.map(e=>{const t=e.split(" "),[s,i]=t;return{type:s,subtype:i||""}})}),t.attributes.get("fmtp").forEach(e=>{const t=+e.key,s=c(t).parameters={},i=e.value.split(";");for(const e of i){const[t,i]=e.split("=");s[t]=i}}),a.payloadTypes=Array.from(l.values())}return s}var yl=s(164),wl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Sl extends bl.a{constructor(e){super(e)}negotiateInternal(){return wl(this,void 0,void 0,(function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let s;if(t.offerReceived){t.offerReceived=!1;const i=s=yield e.createAnswer();this.log("[sdp] local",i.type,i.sdp),yield e.setLocalDescription(i),this.log("[InitialSetup] send 2")}else{const i=s=yield e.createOffer();this.log("[sdp] local",i.sdp),yield e.setLocalDescription(i),t.offerSent=!0,this.log("[InitialSetup] send 0")}const i=fl(Object(yl.b)(s.sdp));t.sendCallSignalingData(i)}))}}var Cl=s(192),Ll=s(162),Il=s(146),Ml=s(135);var El=s(52);var Pl="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function kl(e){return Pl.digest("SHA-256",function(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}(e)).then(e=>new Uint8Array(e))}var Tl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class xl{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return kl(Object(El.a)(...e))}encryptPrepared(e){return Tl(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},s=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),i=this.p2pKey,n=yield this.concatSHA256([i.subarray(s+88,s+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(i,a,s),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,s=new ArrayBuffer(4);new DataView(s).setUint32(0,t>>>0,!1);const i=new Uint8Array([...new Uint8Array(s),...e]);return this.encryptPrepared(i)}prepareAesKeyIv(e,t,s){return Tl(this,void 0,void 0,(function*(){const[i,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(s,s+36)]),this.concatSHA256([e.subarray(40+s,40+s+36),t.subarray(0,16)])]);return{key:new Uint8Array([...i.subarray(0,8),...n.subarray(8,24),...i.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...i.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,s,i=!0){return Tl(this,void 0,void 0,(function*(){const t=yield Pl.importKey("raw",s.key,{name:"AES-CTR"},!1,[i?"encrypt":"decrypt"]),n=yield Pl[i?"encrypt":"decrypt"]({name:"AES-CTR",counter:s.iv,length:8*s.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,s){let i=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:s}=this,i=(t?8:0)+("Signaling"===s?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,l=yield this.prepareAesKeyIv(n,a,i),c=yield this.aesProcessCtr(o,r,l,!1),d=yield this.concatSHA256([n.subarray(88+i,88+i+32),c]);if(this.constTimeIsDifferent(d.subarray(8),a,16))return;const h=new DataView(c.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),c.slice(4))}))}}var Al=s(182);class Ol{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new Al.a;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r.add(`a=fingerprint:${t} ${s}`,"a=setup:"+i)}),s&&i&&r.add("a=ice-ufrag:"+s,"a=ice-pwd:"+i),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",Rl(c)),i&&r.add(`a=msid:${l} audio${i}`),r.add("a=rtcp-mux",Bl(a),Nl(s,i,n,l));break;case"video":r.add("m=video 61986 UDP/TLS/RTP/SAVPF "+a.map(e=>e.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",Rl(c)),i&&r.add(`a=msid:${l} video${i}`),r.add("a=rtcp-mux","a=rtcp-rsize",Bl(a),Nl(s,i,n,l))}}return r.add(Ul(2)),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new Al.a;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r.add(`a=fingerprint:${t} ${s}`,"a=setup:"+i)}),s&&i&&r.add("a=ice-ufrag:"+s,"a=ice-pwd:"+i),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",Rl(c)),i&&r.add(`a=msid:${l} audio${i}`),r.add("a=rtcp-mux",Bl(a),Nl(s,i,n,l));break;case"video":r.add("m=video 61986 UDP/TLS/RTP/SAVPF "+a.map(e=>e.id).join(" "),"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle","a=mid:"+e,"a=sendrecv",Rl(c)),i&&r.add(`a=msid:${l} video${i}`),r.add("a=rtcp-mux","a=rtcp-rsize",Bl(a),Nl(s,i,n,l))}}return r.add(Ul(2)),r.finalize()}}class jl{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Rl(c),r+="\na=rtcp-mux",r+=Bl(a),r+=Nl(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Rl(c),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Bl(a),r+=Nl(s,i,n,l)}}return r+=Ul(2),r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Rl(h),r+="\na=rtcp-mux",r+=Bl(c),r+=Nl(s,n,a,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${c.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Rl(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Bl(c),r+=Nl(s,n,a,l)}}return r+=Ul(2),r+="\n",r}}class _l{static generateOffer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Rl(c),i&&(r+=`\na=msid:${l} audio${i}`),r+="\na=rtcp-mux",r+=Bl(a),r+=Nl(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Rl(c),i&&(r+=`\na=msid:${l} video${i}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Bl(a),r+=Nl(s,i,n,l)}}return r+=Ul(2),r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:s,pwd:i,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach(e=>{const{hash:t,fingerprint:s,setup:i}=e;r+=`\na=fingerprint:${t} ${s}\na=setup:${i}`}),s&&i&&(r+=`\na=ice-ufrag:${s}\na=ice-pwd:${i}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map(e=>e.ssrc).join("_");for(let e=0;ee.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Rl(c),i&&(r+=`\na=msid:${l} audio${i}`),r+="\na=rtcp-mux",r+=Bl(a),r+=Nl(s,i,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map(e=>e.id).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Rl(c),i&&(r+=`\na=msid:${l} video${i}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Bl(a),r+=Nl(s,i,n,l)}}return r+=Ul(2),r+="\n",r}}function Fl(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function Dl(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function Rl(e){let t=[];for(let s=0;s{const{type:s,subtype:i}=e;t.push(`a=rtcp-fb:${n} ${[s,i].join(" ")}`)}),c){const e=[];Object.getOwnPropertyNames(c).forEach(t=>{e.push(`${t}=${c[t]}`)}),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function Nl(e,t,s,i){let n=[];return s&&s.length>0?s.forEach(t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach(t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${i} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)}))}):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${i} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}function Ul(e){return"m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"}class Hl{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:s,sdpMid:i,foundation:n,component:a,protocol:o,priority:r,address:l,type:c,relAddress:d,generation:h,tcpType:p,networkId:u,networkCost:g,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:s,sdpMid:i};throw"no sdpString"}static generateOffer(e){return Fl()?jl.generateOffer(e):Dl()?_l.generateOffer(e):Ol.generateOffer(e)}static generateAnswer(e){return Fl()?jl.generateAnswer(e):Dl()?_l.generateAnswer(e):Ol.generateAnswer(e)}}var zl=s(147),Vl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Kl extends Cl.a{constructor(e){super(),this.log=Object(Y.b)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),Object(w.a)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",e=>{this.log("state",dl[e]),e===dl.CLOSED&&this.cleanup()});const t=this.streamManager=new zl.a(Ll.b);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let s={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const i=this;s=new Proxy(s,{set:function(e,t,n){return e[t]=n,i.setMediaState(s),i.sendMediaState(),!0}}),this.mediaStates={input:s},this.sendMediaState=Object(lt.a)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?dl.CLOSED:"connected"===e||ae.g&&"completed"===e?dl.CONNECTED:dl.CONNECTING}return dl.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(dl.CLOSED-e+1);return t+=2147483647e3-(e===dl.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const s=this.description.findEntry(e=>e.type===t);if(!s)return;return this.elements.get(""+s.recvEntry.source)}}startScreenSharingInternal(){return Vl(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return Vl(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return Vl(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return Vl(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:s}=this,i=t.inputStream.getVideoTracks()[0];i&&(Object(Il.a)(i),t.appendToConference(s))}))}toggleVideoSharing(){return Vl(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===dl.CLOSING||e===dl.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=ln.a.setTimeout(()=>{this.hangUpTimeout=void 0,this.hangUp(t)},e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return Vl(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(dl.EXCHANGING_KEYS);const s=this.call;this.requestInputSource(!0,!!s.pFlags.video,!1);const i=s.g_a_hash;this.appCallsManager.generateDh().then(e=>(this.dh={g_a_hash:i,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.apiManager.invokeApi("phone.acceptCall",{peer:this.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b}))).then(e=>{this.appCallsManager.savePhonePhoneCall(e)}).catch(e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")})}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:s}=this,i=function(e){const t=[];return e.connections.forEach(e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:s,ipv6:i,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(s&&r.push(`turn:${s}:${n}`),i&&r.push(`turn:[${i}]:${n}`)):e.pFlags.stun&&(s&&r.push(`stun:${s}:${n}`),i&&r.push(`stun:[${i}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}}),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",i),!i)return;const n=this.connectionInstance=new Sl({call:this,streamManager:s,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(i);a.addEventListener("iceconnectionstatechange",()=>{const e=this.connectionState;void 0===this.connectedAt&&e===dl.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)}),a.addEventListener("negotiationneeded",()=>{n.negotiate()}),a.addEventListener("icecandidate",e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)}),a.addEventListener("track",e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)});n.createDescription();this.encryptor=new xl(e,t),this.decryptor=new xl(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",e=>{this.applyDataChannelData(JSON.parse(e.data))}),e.addEventListener("open",()=>{this.sendMediaState()})}applyDataChannelData(e){switch(e["@type"]){case"MediaState":e.type="output",this.log("got output media state",e),this.setMediaState(e);break;default:this.log.error("unknown data channel data:",e)}}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return Vl(this,void 0,void 0,(function*(){const t=JSON.stringify(e),s=(new TextEncoder).encode(t),{bytes:i}=yield this.encryptor.encryptRawPacket(s);this.log("sendCallSignalingData",this.id,t),yield this.apiManager.invokeApi("phone.sendSignalingData",{peer:this.appCallsManager.getCallInput(this.id),data:i})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:s}=e;if(0!==s)return;const i=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[s,i,n,a,o,r,...l]=e.split(" "),c={sdpString:t,foundation:s,component:i,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map(e=>Object(se.a)(e))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return Vl(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter(e=>"recvonly"===e.direction).forEach(e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"});const s=this.description;let i=s.entries.map(e=>e.mid);const n={type:"offer",sdp:s.generateSdp({bundle:i,entries:s.entries.filter(e=>i.includes(e.mid)),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=fl(Object(yl.b)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",()=>{this.stopVideoSharing()},{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e);this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then(()=>{this.setMuted(),this.onMutedChange()})}hangUp(e,t){return Vl(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(dl.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const s=this.mediaStates[e];t="active"===s.videoState||"active"===s.screencastState||t}yield this.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map(e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes}));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach(e=>{const t=e.payloadTypes,s=t.findIndex(e=>"VP8"===e.name),i=t[s],n=t.findIndex(e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===i.id});e.payloadTypes=[t[s],t[n]]})}applyCallSignalingData(e){return Vl(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:s}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const i=e=>e.map(e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map(e=>+e)}));[Object(Ml.c)("audio",+e.audio.ssrc),e.video?Object(Ml.c)("video",i(e.video.ssrcGroups)):void 0,e.screencast?Object(Ml.c)("screencast",i(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach(e=>{let t=s.getEntryBySource(e.source);if(t)return;const i=s.findFreeSendRecvEntry(e.type,!1);t=new Ml.a(i.mid,e.type),t.setDirection("sendrecv"),i.recvEntry=t,s.setEntrySource(t,e.sourceGroups||e.source)}),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;let a=s.entries.map(e=>e.mid);const o={type:n?"answer":"offer",sdp:s.generateSdp({bundle:a,entries:s.entries.filter(e=>a.includes(e.mid)),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=Hl.generateCandidate(t);e.sdpMLineIndex=0;const s=new RTCIceCandidate(e);this.candidates.push(s)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return Vl(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map(e=>this.addIceCandidate(t,e));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return Vl(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return Vl(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const s of t){const t=yield e.decryptRawPacket(s);if(!t)continue;const i=(new TextDecoder).decode(t);try{const e=JSON.parse(i);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",i),this.hangUp("phoneCallDiscardReasonDisconnect"),a.a.dispatchEvent("call_incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e.data),this.processDecryptQueue()}}class Gl{constructor(e,t,s,i,n){this.appGroupCallsManager=e,this.appPeersManager=t,this.appChatsManager=s,this.appAvatarsManager=i,this.appCallsManager=n,this.onState=()=>{this.updateInstance(this.instance)};const o=this.listenerSetter=new R.a;o.add(a.a)("call_instance",({instance:e})=>{this.instance||this.updateInstance(e)}),o.add(a.a)("call_accepting",e=>{this.instance!==e&&this.updateInstance(e)}),o.add(a.a)("group_call_instance",e=>{this.updateInstance(e)}),o.add(a.a)("group_call_update",e=>{const t=this.appGroupCallsManager.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)}),o.add(a.a)("group_call_amplitude",({amplitudes:e,type:t})=>{const{weave:s}=this;if(!e.length||!s)return;let i=0;for(let t=0;ti?n:i}s.setAmplitude(i)})}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new R.a,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof cl.a?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof cl.a)));const s=this.instance.isMuted;let i=e instanceof cl.a?e.state:function(e,t){switch(e){case dl.CLOSING:case dl.CLOSED:return Pr.a.CLOSED;case dl.CONNECTED:return t?Pr.a.MUTED:Pr.a.UNMUTED;default:return Pr.a.CONNECTING}}(e.connectionState,s);const{weave:n}=this;n.componentDidMount();const a=i===Pr.a.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),Object(is.a)(document.body,"is-calling",!a,250,a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0)),a||(n.setCurrentState(i,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!s))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof cl.a)return this.groupCallTitle.update(e);Object(k.a)(this.center,new wt.a({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const s=document.createElement("div");s.classList.add("topbar-call-left");const i=this.groupCallMicrophoneIconMini=new pl,n=N();n.append(i.container),s.append(n);const a=Object(ws.a)(()=>{this.instance.toggleMuted()},600,!0);Object(l.b)(n,e=>{Object(c.a)(e),a()},{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new Qr(o),this.groupCallDescription=new qr(s),this.callDescription=new hl(s);const r=document.createElement("div");r.classList.add("topbar-call-right");const d=N("endcall_filled");r.append(d),Object(l.b)(d,e=>{Object(c.a)(e);const{instance:t}=this;t&&(t instanceof cl.a?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))},{listenerSetter:e}),Object(l.b)(t,()=>{if(this.instance instanceof cl.a){if(ht.b.getPopups(rl).length)return;new rl({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()}else if(this.instance instanceof Kl){if(ht.b.getPopups(ml).find(e=>e.getCallInstance()===this.instance))return;new ml({appCallsManager:this.appCallsManager,appAvatarsManager:this.appAvatarsManager,appPeersManager:this.appPeersManager,instance:this.instance}).show()}},{listenerSetter:e}),t.append(s,o,r);const h=this.weave=new xr,p=h.render("topbar-call-weave");t.prepend(p),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var Wl=s(179),ql=s(119),Ql=s(24),$l=s(123),Yl=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Xl=new class{constructor(){this.log=Object(Y.b)("CALLS"),this.tempId=0,this.calls=new Map,this.instances=new Map,this.sortedInstances=[],qa&&(a.a.addMultipleEventsListeners({updatePhoneCall:e=>Yl(this,void 0,void 0,(function*(){var t;const s=this.saveCall(e.phone_call);let i=this.instances.get(s.id);switch(s._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=s.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:s.admin_id}),i.overrideConnectionState(dl.PENDING),i.setPhoneCall(s),i.setHangUpTimeout(45e3,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const e=i.dh.g_a=s.g_a_or_b,t=i.dh,n=yield ct.a.invokeCrypto("sha256",e);if(!Object(ql.a)(t.g_a_hash,n)){this.log.error("Incorrect g_a_hash",t.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.computeKey(e,t.b,t.p);if(s.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",s.key_fingerprint,o);break}i.encryptionKey=a,i.joinCall();break}}})),updatePhoneCallSignalingData:e=>{const t=this.instances.get(e.phone_call_id);(null==t?void 0:t.id)===e.phone_call_id&&t.onUpdatePhoneCallSignalingData(e)}}),this.audioAsset=new Wl.a(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,s]of this.instances)if(s.interlocutorUserId===e)return s}computeKey(e,t,s){return Yl(this,void 0,void 0,(function*(){return ct.a.invokeCrypto("compute-dh-key",e,t,s)}))}saveCall(e){const t="phoneCallDiscarded"===e._,s=this.calls.get(e.id);return s?(Object($l.a)(s,e),t&&this.calls.delete(e.id),e=s):t||this.calls.set(e.id,e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}createCallInstance(e){const t=new Kl(Object.assign({appCallsManager:this,apiManager:ct.a,apiUpdatesManager:vi.a},e));return t.addEventListener("state",e=>{const s=this.currentCall;e===dl.CLOSED?(this.instances.delete(t.id),Object(V.a)(this.sortedInstances,t)):Object(Us.a)(this.sortedInstances,t,"sortIndex"),e===dl.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const i=void 0!==t.connectedAt;e===dl.EXCHANGING_KEYS||e===dl.CONNECTING&&i?t.setHangUpTimeout(45e3,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),s!==t&&s||(e===dl.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!i?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===dl.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===dl.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===dl.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())}),t.addEventListener("id",(e,s)=>{void 0!==s&&this.instances.delete(s);const i=!!this.currentCall;this.instances.set(e,t),void 0===s&&a.a.dispatchEvent("call_instance",{instance:t,hasCurrent:i})}),t}savePhonePhoneCall(e){return E.a.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return ct.a.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then(e=>Yl(this,void 0,void 0,(function*(){return ct.a.invokeCrypto("generate-dh",e)})))}startCallInternal(e,t){this.log("p2pStartCallInternal",e,t);const s=n.default.getCachedFullUser(e);if(!s)return;const{video_calls_available:i}=s.pFlags,a=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});a.requestInputSource(!0,!(!t||!i),!1),a.overrideConnectionState(dl.REQUESTING),a.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:Me.c,date:Object(pr.a)(!0),id:--this.tempId,participant_id:e,protocol:a.protocol,pFlags:{video:t||void 0}}),this.generateDh().then(s=>(a.dh=s,ct.a.invokeApi("phone.requestCall",{user_id:E.a.getUserInput(e),protocol:a.protocol,video:t&&i,random_id:Object(st.a)(32),g_a_hash:a.dh.g_a_hash}))).then(e=>{const t=this.savePhonePhoneCall(e);a.overrideConnectionState(dl.PENDING),a.setPhoneCall(t),a.setHangUpTimeout(45e3,"phoneCallDiscardReasonHangup")})}verifyProtocolCompatibility(e){const t={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}.library_versions[0];return!e.library_versions.find(e=>Object(Ql.a)(t,e)>0)}discardCall(e,t,s,i){return Yl(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield ct.a.invokeApi("phone.discardCall",{video:i,peer:this.getCallInput(e),duration:t,reason:{_:s},connection_id:"0"});vi.a.processUpdateMessage(n)}))}};le.a&&(le.a.appCallsManager=Xl);var Jl=Xl,Zl=s(109),ec=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const tc="chat",sc=he.a?"touchstart":"mousemove";const ic=new class{constructor(){this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.onHashChange=()=>{const e=location.hash,t=e.split("?"),s=this.parseUriParams(e,t);if(this.log("hashchange",e,t[0],s),s.tgaddr){F.a.replaceState();const{onclick:e}=X.b.wrapUrl(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else switch(t[0]){case"#/im":{const e=s.p;let t=void 0!==s.post?v.a.generateMessageId(+s.post):void 0;switch(e[0]){case"@":this.openUsername({userName:e,lastMsgId:t});break;default:this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",a.a.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!a.a.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",a.a.settings.animationsEnabled),this.chatsSelectTabDebounced=Object(lt.a)(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),ct.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.a.settings.animationsEnabled?250:0,!1,!0),oe.a.setLoop(a.a.settings.stickers.loop),I.a.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();T.c.setTimeFormat(a.a.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>{const s=To();if(this.canDrag()||s){if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&Object(c.a)(e)}Object(pe.d)(e).then(e=>{if(e.length){if(s)return void s.addFiles(e);const i=this.chat.input;i.willAttachType=t||(g.has(e[0].type)?"media":"document"),new xo(this.chat,e,i.willAttachType)}})}},vi.a.attach(T.c.lastRequestedLangCode),Bt.a.start(),this.log=Object(Y.b)("IM",Y.a.Log|Y.a.Warn|Y.a.Debug|Y.a.Error),this.backgroundPromises={},M.b.settings.themes.forEach(e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(ae.d?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}}),this.selectTab(0),window.addEventListener("blur",()=>{I.a.checkAnimations(!0),this.offline=a.a.idle.isIDLE=!0,this.updateStatus(),clearInterval(this.updateStatusInterval),a.a.dispatchEvent("idle",a.a.idle.isIDLE),window.addEventListener("focus",()=>{this.offline=a.a.idle.isIDLE=!1,this.updateStatus(),this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),I.a.checkAnimations(!1),a.a.dispatchEvent("idle",a.a.idle.isIDLE)},{once:!0})}),window.addEventListener(sc,()=>{this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),this.updateStatus(),this.offline=a.a.idle.isIDLE=!1,a.a.dispatchEvent("idle",a.a.idle.isIDLE)},{once:!0,passive:!0}),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(b.b.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),F.a.onHashChange=this.onHashChange,this.setSettings(),a.a.addEventListener("settings_updated",this.setSettings),Object(Ds.a)(()=>{I.a.setOnlyOnePlayableGroup("lock"),I.a.checkAnimations(!0)},()=>{I.a.setOnlyOnePlayableGroup(""),I.a.checkAnimations(!1)}),ae.d&&M.c.oldVersion&&-1===Object(Ql.a)(M.c.oldVersion,"1.4.3")?this.deleteFilesIterative(e=>"image/svg+xml"===e.headers.get("Content-Type")).then(()=>{this.applyCurrentTheme()}):this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&ts.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)}),b.b.addEventListener("resize",()=>{const e=this.chatsContainer.getBoundingClientRect();vr.resizeInstances(e.width,e.height).then(()=>{})}),a.a.addEventListener("history_focus",e=>{let{peerId:t,threadId:s,mid:i,startParam:n}=e;s&&(s=v.a.generateMessageId(s)),i&&(i=v.a.generateMessageId(i)),this.setInnerPeer({peerId:t,lastMsgId:i,type:s?"discussion":void 0,threadId:s,startParam:n})}),a.a.addEventListener("peer_changing",e=>{this.saveChatPosition(e)}),a.a.addEventListener("theme_change",()=>{this.applyCurrentTheme()}),a.a.addEventListener("choosing_sticker",e=>{this.setChoosingStickerTyping(!e)}),a.a.addEventListener("peer_typings",({peerId:e,typings:t})=>{var s;const n=this.chat;if(!n||n.peerId!==e||a.a.overlaysActive||b.b.activeScreen===b.a.mobile&&1!==this.tabId)return;const o=t.find(e=>"sendMessageEmojiInteraction"===e.action._);if("sendMessageEmojiInteraction"===(null===(s=null==o?void 0:o.action)||void 0===s?void 0:s._)){const t=o.action,s=n.bubbles.bubbles[v.a.generateMessageId(o.action.msg_id)];if(s&&s.classList.contains("emoji-big")&&s.classList.contains("sticker")&&Qa(s,n.bubbles.scrollable.container)){const n=s.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach(e=>{setTimeout(()=>{Object(l.d)(n)},1e3*e.t)}),i.a.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}),a.a.addEventListener("instance_deactivated",()=>{const e=new ht.b("popup-instance-deactivated",void 0,{overlayClosable:!0}),t=document.createElement("div");t.classList.add("instance-deactivated-container"),e.container.replaceWith(t);const s=document.createElement("div");s.classList.add("header"),s.append(Object(T.d)("Deactivated.Title"));const i=document.createElement("div");i.classList.add("subtitle"),i.append(Object(T.d)("Deactivated.Subtitle")),t.append(s,i),document.body.classList.add("deactivated"),e.addEventListener("close",()=>{document.body.classList.add("deactivated-backwards"),Ir.a.activateInstance(),setTimeout(()=>{document.body.classList.remove("deactivated","deactivated-backwards")},333)}),e.show()}),a.a.addEventListener("chat_changing",({to:e})=>{this.toggleChatGradientAnimation(e)}),a.a.addEventListener("service_notification",e=>{Mn({button:{langKey:"OK",isCancel:!0},description:X.b.wrapRichText(e.message)})}),ga.a.get("chatPositions").then(e=>{ga.a.setToCache("chatPositions",e||{})}),(qa||hr)&&(this.topbarCall=new Gl(Er.a,o.a,G.a,d.a,Jl)),qa&&(a.a.addEventListener("call_instance",({instance:e})=>{const t=new ml({appCallsManager:Jl,appAvatarsManager:d.a,appPeersManager:o.a,instance:e});e.addEventListener("acceptCallOverride",()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then(()=>(a.a.dispatchEvent("call_accepting",e),!0)).catch(()=>!1)),t.addEventListener("close",()=>{const t=Jl.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")},{once:!0}),t.show()}),a.a.addEventListener("call_incompatible",e=>{rt({langPackKey:"VoipPeerIncompatible",langPackArguments:[new wt.a({peerId:e.toPeerId()}).element]})})),Ir.a.activateInstance();const e=()=>{Mr.default.setAuthorized(!0)};setInterval(e,ne.a),e(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const s=t.href,i=t.cloneNode(!0);i.className="anchor-url",i.innerText=s,i.removeAttribute("onclick"),new ut("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[i],buttons:[{langKey:"Open",callback:()=>{i.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:s}=e;i.a.sendText(this.chat.peerId,"/"+t+(s?"@"+s:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:$a.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:$a.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),hr&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>ec(this,void 0,void 0,(function*(){let s;s=X.b.PHONE_NUMBER_REG_EXP.test(e[0])?{_:$a.USER_PHONE_NUMBER,phone:e[0].slice(1)}:"c"===e[0]?{_:$a.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:$a.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(s)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;e.phone?t=this.makeLink($a.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(t=this.makeLink($a.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach(e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink($a.JOIN_CHAT,e);this.processInternalLink(t)}})}),this.onHashChange(),this.attachKeydownListener()}get myId(){return a.a.myId}get chat(){return this.chats[this.chats.length-1]}deleteFilesIterative(e){return ce.a.cacheStorage.timeoutOperation(t=>{const s=performance.now();return t.keys().then(s=>{const i=s.map(s=>t.match(s).then(t=>e(t)));return Promise.all(i).then(e=>(e.map((e,i)=>{if(!e)return;const n=s[i];return t.delete(n)}),Promise.all(e.filter(Boolean))))}).then(()=>{this.log("deleted files",performance.now()-s)})})}toggleChatGradientAnimation(e){this.chats.forEach(t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(a.a.settings.animationsEnabled&&t===e)})}appendEmojiAnimationContainer(e){const t=e===b.a.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",t=>{var s;const n=t.key;if(a.a.isOverlayActive||e.has(n))return;const o=t.target,r=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===o.tagName){if(!t.altKey||"ArrowUp"!==n&&"ArrowDown"!==n){if("ArrowUp"===n){if(r.input.editMsgId||!r.input.isInputEmpty())return;{const e=i.a.getHistoryStorage(r.peerId,r.threadId).history.slice;if(e.isEnd(ra.a.Bottom)&&e.length){let s;for(const t of e){const e=r.getMessage(t);if((this.myId===r.peerId?e.fromId===this.myId:e.pFlags.out)&&i.a.canEditMessage(r.getMessage(t),"text")){s=t;break}}s&&(r.input.initMessageEditing(s),Object(c.a)(t))}}}else if("ArrowDown"===n)return}else{const e=i.a.dialogsStorage.getFolderDialogs(a.a.filterId,!0);let t;if(a.a.peerId){const s=e.findIndex(e=>e.peerId===a.a.peerId);if(-1!==s){t=e["ArrowUp"===n?s-1:s+1]}}else"ArrowDown"===n&&(t=e[0]);t&&this.setPeer({peerId:t.peerId})}if((null===(s=null==r?void 0:r.input)||void 0===s?void 0:s.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==o.tagName&&!o.hasAttribute("contenteditable")&&!he.a&&(!b.b.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),Object(Eo.a)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}})}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return ec(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case $a.MESSAGE:{const t=e.post?v.a.generateMessageId(+e.post):void 0,s=e.comment?v.a.generateMessageId(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:s,startParam:e.start});break}case $a.PRIVATE_POST:{const t=e.channel.toChatId(),s=t.toPeerId(!0);if(G.a.getChat(t).deleted)try{yield G.a.resolveChannel(t)}catch(e){throw rt({langPackKey:"LinkNotFound"}),e}const i=v.a.generateMessageId(+e.post),n=e.thread?v.a.generateMessageId(+e.thread):void 0;n?this.openThread(s,i,n):this.setInnerPeer({peerId:s,lastMsgId:i,threadId:n});break}case $a.STICKER_SET:new on({id:e.set}).show();break;case $a.JOIN_CHAT:ct.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&G.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Xa(e.invite,t).show():this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})},e=>{"INVITE_HASH_EXPIRED"===e.type&&ot(Object(T.d)("InviteExpired"))});break;case $a.VOICE_CHAT:hr&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case $a.USER_PHONE_NUMBER:E.a.resolvePhone(e.phone).then(e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})}).catch(e=>{"PHONE_NOT_OCCUPIED"===e.type&&rt({langPackKey:"Alert.UserDoesntExists"})});break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:s}=X.b.wrapUrl(e),i=document.createElement("a");i.href=t,window[s](i)}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{Object(c.a)(null);const s=t.href;let i,n;e.noPathnameParams||(i=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(s));const a=e.callback({pathnameParams:i,uriParams:n},t);return void 0===a&&a}}parseUriParams(e,t=e.split("?")){const s={};return t[1]?(t[1].split("&").forEach(e=>{s[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])}),s):s}openUsername(e){const{userName:t,lastMsgId:s,threadId:i,commentId:n,startParam:a}=e;return E.a.resolveUsername(t).then(e=>{const t="user"===e._,o=e.id.toPeerId(!t);return i?this.openThread(o,s,i):n?this.openComment(o,s,n):this.setInnerPeer({peerId:o,lastMsgId:s,startParam:a})},e=>{"USERNAME_NOT_OCCUPIED"===e.type?rt({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&rt({langPackKey:"Alert.UserDoesntExists"})})}openThread(e,t,s){return i.a.wrapSingleMessage(e,s).then(()=>{const n=i.a.getMessageByPeer(e,s);return"messageEmpty"===n._?t=void 0:i.a.generateThreadServiceStartMessage(n),this.setInnerPeer({peerId:e,lastMsgId:t,threadId:s,type:"discussion"})})}openComment(e,t,s){return i.a.getDiscussionMessage(e,t).then(e=>this.openThread(e.peerId,s,e.mid))}callUser(e,t){return ec(this,void 0,void 0,(function*(){if(Jl.getCallByUserId(e))return;(yield n.default.getProfile(e)).pFlags.phone_calls_private?Mn({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[new wt.a({peerId:e.toPeerId()}).element],button:{langKey:"OK",isCancel:!0}}):(yield this.discardCurrentCall(e.toPeerId()),Jl.startCallInternal(e,"video"===t))}))}discardCurrentCall(e,t,s){return Er.a.groupCall&&Er.a.groupCall!==t?this.discardGroupCallConfirmation(e):Jl.currentCall&&Jl.currentCall!==s?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return ec(this,void 0,void 0,(function*(){const t=Jl.currentCall;t&&(yield Mn({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[new wt.a({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new wt.a({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return ec(this,void 0,void 0,(function*(){const t=Er.a.groupCall;t&&(yield Mn({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new wt.a({peerId:t.chatId.toPeerId(!0)}).element,new wt.a({peerId:e}).element],button:{langKey:"OK"}}),Er.a.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return ec(this,void 0,void 0,(function*(){const s=e.toChatId(),i=G.a.hasRights(s,"manage_call");if(t){if("groupCallDiscarded"===(yield Er.a.getGroupCallFull(t))._){if(!i)return void rt({langPackKey:"VoiceChat.Chat.Ended"});yield Mn({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}}yield this.discardCurrentCall(e),(()=>{ec(this,void 0,void 0,(function*(){const e=yield n.default.getChatFull(s);let t;if(e.call)t=Er.a.saveGroupCall(e.call,s);else{if(!i)return;t=yield Er.a.createGroupCall(s)}Er.a.joinGroupCall(s,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=a.a.getTheme();if(t.background.slug){const s=M.a.STATE_INIT.settings.themes.find(e=>e.name===t.name);return this.getBackground(t.background.slug).then(t=>this.setBackground(t,e),()=>(t.background=Object(ue.a)(s.background),this.setCurrentBackground(!0)))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=ce.a.cacheStorage.getFile("backgrounds/"+e).then(e=>URL.createObjectURL(e))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const s=this.chats.map(t=>t.setBackground(e));return s[s.length-1].then(()=>{t&&a.a.dispatchEvent("background_change")})}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,s=e.peerId+(e.threadId?"_"+e.threadId:""),i=ga.a.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete i[s],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:Object(li.a)(t.bubbles,"desc").filter(e=>!t.skippedMids.has(e)),top:e};i[s]=n,this.log("saved chat position:",n)}ga.a.set({chatPositions:i},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),s=ga.a.getFromCache("chatPositions");return s&&s[t]}applyHighlightningColor(){let e;const t=a.a.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!he.a&&e&&(a.a.themeColor=function(e){return Ji(e).slice(0,-2)}(e))}applyCurrentTheme(e,t,s){return this.applyHighlightningColor(),a.a.setTheme(),t&&(this.backgroundPromises[e]=Promise.resolve(t)),this.setCurrentBackground(void 0===s?!!e:s)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Lr([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.a.settings.animationsEnabled&&!1!==t&&Object(Ds.b)(Object(da.a)(400),400);const s=Object(Bs.a)(this.prevTab);Object(Bs.a)(e)>s&&F.a.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),Object(ti.a)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),he.a||this.attachDragAndDropListeners(),this.markupTooltip=new yr(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>ec(this,void 0,void 0,(function*(){if(l===s)return;const c=r.dataTransfer.types,d=c.contains?c.contains("Files"):c.indexOf("Files")>=0,h=To();if(!d||!this.canDrag()&&!h)return void(n=0);const p=h?o:a,u=h?t:e;if(l&&!u.length){const e=yield Object(pe.d)(r,!0),t=d&&!e.length,s=e.filter(e=>g.has(e)).length;this.log("drag files",e),h?(h.appendDrops(p),(e.length||t)&&u.push(new Cr(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),ic.log("drop",e),ic.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new Cr(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),ic.log("drop",e),ic.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new Cr(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),ic.log("drop",e),ic.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}Object(is.a)(p,"is-visible",l,200,()=>{l||(u.forEach(e=>{e.destroy()}),u.length=0)}),l?u.forEach(e=>{e.setPath()}):n=0,document.body.classList.toggle("is-dragging",l),s=l}));let n=0;document.body.addEventListener("dragenter",e=>{n++}),document.body.addEventListener("dragover",e=>{i(e,!0),Object(c.a)(e)}),document.body.addEventListener("dragleave",e=>{n--,0===n&&i(e,!1)});const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||a.a.isOverlayActive||!e.canSend("send_media"))}selectTab(e,t){!1===t&&Lr([$n.sidebarEl,this.columnEl,ts.sidebarEl]),document.body.classList.toggle("is-left-column-shown",0===e);const s=this.tabId;this.log("selectTab",e,s);let i=a.a.settings.animationsEnabled?Object(Le.a)():Promise.resolve();if(-1!==s&&s!==e&&a.a.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(da.a)(e),Object(Ds.b)(i,e)}return this.tabId=e,Object(ti.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!F.a.findItemByType("im"))&&F.a.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}}),a.a.dispatchEvent("im_tab_change",e),i}updateStatus(){return this.myId?(E.a.setUserStatus(this.myId,this.offline),ct.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new fr(this,G.a,L.a,_a,i.a,o.a,r.a,n.default,gs.a,E.a,di.a,$e.a,ct.a,Vi.a,Ye.a,ga.a,Bt.a,fa,v.a,Er.a,jt.a);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,s,i){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&a.a.dispatchEvent("peer_changing",this.chat),i||(i=this.chats.splice(e,this.chats.length-e)),a.a.dispatchEvent("chat_changing",{from:n,to:this.chat});for(let e=0;e1&&i.slice(0,-1).forEach(e=>{e.container.remove()}),this.chatsSelectTab(this.chat.container,s),t){a.a.dispatchEvent("peer_changed",this.chat.peerId);const e=ts.getTab(mr);e&&e.close();ts.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(ts.sharedMediaTab.loadSidebarMedia(!0),ts.sharedMediaTab.fillProfileElements())}i.forEach(e=>{e.beforeDestroy()}),setTimeout(()=>{i.forEach(e=>{e.destroy()})},350)}setPeer(e={},t){var s;this.init&&(this.init(),this.init=null),null!==(s=e.peerId)&&void 0!==s||(e.peerId=Me.c);const{peerId:i,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(i){if(o>0&&a.peerId&&a.peerId!==i){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===i)return void this.spliceChats(0,!0,!0,t);{const s=this.setPeer(e);return this.spliceChats(0,!1,!1,t),s}}}else{if(o>0)return void this.spliceChats(o,void 0,t);if(b.b.activeScreen===b.a.medium)return void this.selectTab(+!this.tabId,t)}if(i===a.peerId&&b.b.activeScreen<=b.a.medium&&document.body.classList.contains("is-left-column-shown"))return this.selectTab(1,t),!1;if(i||b.b.activeScreen!==b.a.mobile){const s=a.setPeer(i,n,e.startParam),o=(null==s?void 0:s.cached)?s.promise:Promise.resolve();i&&Promise.all([o,a.setBackgroundPromise]).then(()=>{setTimeout(()=>{setTimeout(()=>{this.chatsSelectTab(this.chat.container)},0),this.selectTab(1,t)},0)})}return i?void 0:(this.selectTab(0,t),!1)}setInnerPeer(e){var t;const{peerId:s}=e;if(s===Me.c||!s)return;const i=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex(e=>e.peerId===s&&e.type===i);if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const o=this.chat;let r=o;return o.inited&&(r=this.createNewChat()),i&&(r.setType(i),e.threadId&&(r.threadId=e.threadId)),a.a.dispatchEvent("chat_changing",{from:o,to:r}),this.setPeer(e)}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let s="peer-typing";switch(t.classList.add(s),t.dataset.action=e._,e._){case"sendMessageTypingAction":s+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=s+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":s+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":s+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":s+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=s+"-eye",t.append(e)}}return t.classList.add(s),t}getPeerTyping(e,t){if(!E.a.isBot(e)){const s=n.default.getPeerTypings(e);if(!s||!s.length)return;const i=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=e.isUser()?a.private:s.length>1?a.multi:a.chat;let r=i.action;if(s.length>1){const e={};s.forEach(t=>{const s=t.action._;void 0===e[s]&&(e[s]=0),++e[s]}),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let c,d=t.firstElementChild;if(d?d.dataset.action!==r._&&d.replaceWith(this.getTypingElement(r)):(d=this.getTypingElement(r),t.prepend(d)),e.isAnyChat()&&(c=[new wt.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]),"sendMessageEmojiInteractionSeen"===r._){c?c.pop():c=[];const e=Object(Zl.a)(X.b.wrapEmojiText(r.emoticon));c.push(e)}const h=Object(T.d)(l,c);return h.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(h):t.append(h),t}}getPeerStatus(e,t){var s;return ec(this,void 0,void 0,(function*(){let i;if(e){if(e.isAnyChat()){let t=this.getPeerTyping(e);if(t)return t;const s=e.toChatId(),a=yield n.default.getChatFull(s);this.chat.log("chatInfo res:",a);const o=a.participants_count||a.participants&&a.participants.participants&&a.participants.participants.length||1;if(i=n.default.getChatMembersString(s),o<2)return i;const r=yield n.default.getOnlines(s);if(r>1){const e=document.createElement("span");e.append(...Object(T.f)([i,Object(T.d)("OnlineCount",[Object(Ya.a)(r)])],!1)),i=e}return i}{const n=E.a.getUser(e);if(a.a.myId===e&&!t)return;if(n){if(i=E.a.getUserStatusString(n.id),!E.a.isBot(e)){let t=this.getPeerTyping(e);if(t||"userStatusOnline"!==(null===(s=n.status)||void 0===s?void 0:s._)||(t=document.createElement("span"),t.classList.add("online"),t.append(i)),t)return t}return i}}}}))}setPeerStatus(e,t,s,i,n,a){s&&(t.innerHTML=i?"‎":"");const o=t.querySelector(".peer-typing-container");o&&this.getPeerTyping(e,o)||this.getPeerStatus(e,a).then(e=>{n()&&Object(k.a)(t,e||(i?"‎":""))})}setChoosingStickerTyping(e){i.a.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}};le.a&&(le.a.appImManager=ic);var nc=ic;class ac extends Hr{constructor({video:e,play:t=!1,streamable:s=!1,duration:i,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new R.a,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(i),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new Oe(e,s),t.prepend(this.progress.container)}if(t){e.play().catch(t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())}).finally(()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)})}}stylePlayer(e){const{wrapper:t,video:s,skin:i,listenerSetter:n}=this;t.classList.add(i);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===i){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=Te(0|s.duration);const l=new ir(n),d=t.querySelector(".left-controls");if(l.btn.classList.remove("btn-icon"),d.insertBefore(l.btn,o.parentElement),Array.from(e).forEach(e=>{n.add(e)("click",()=>{this.togglePlay()})}),this.pipButton){n.add(this.pipButton)("click",()=>{this.video.requestPictureInPicture()});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,i=Object(lt.a)(e,t,!1,!0);n.add(s)("enterpictureinpicture",()=>{i(!0),n.add(s)("leavepictureinpicture",()=>{const e=n.add(s)("pause",()=>{clearTimeout(i),this.onPipClose&&this.onPipClose()},{once:!0}),i=setTimeout(()=>{n.remove(e)},t)},{once:!0})}),n.add(s)("leavepictureinpicture",()=>{i(!1)})}he.a||(n.add(s)("click",()=>{this.togglePlay()}),n.add(document)("keydown",e=>{if(a.a.overlaysActive>1||document.pictureInPictureElement===s)return;const{key:i,code:n}=e;let o=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)fe.muted=!fe.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==i&&"ArrowRight"!==i?o=!1:"ArrowLeft"===i?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=fe.playbackRate,s=ac.PLAYBACK_RATES.indexOf(t)+e;s>=0&&s{he.a||this.toggleFullScreen()}),n.add(i)("click",()=>{this.toggleFullScreen()}),Object(Rr.a)(t,this.onFullScreen.bind(this,i),n),n.add(s)("timeupdate",()=>{o.innerHTML=Te(0|s.currentTime)}),n.add(s)("play",()=>{t.classList.add("played"),he.a||n.add(s)("play",()=>{this.hideControls(!0)})},{once:!0}),n.add(s)("pause",()=>{this.showControls(!1)}),n.add(a.a)("media_playback_params",()=>{this.setPlaybackRateIcon()})}n.add(s)("play",()=>{t.classList.add("is-playing")}),n.add(s)("pause",()=>{t.classList.remove("is-playing")}),s.duration||e?r.innerHTML=Te(Math.round(s.duration||e)):Object(pe.e)(s).then(()=>{r.innerHTML=Te(Math.round(s.duration))})}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!ae.e&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=ac.PLAYBACK_RATES.map((e,t)=>({regularText:e+"x",onClick:()=>{fe.playbackRate=e}})),t=$s(e);t.classList.add("top-left"),gi(this.playbackRateButton,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,void 0,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;ac.PLAYBACK_RATES_ICONS.forEach(t=>{t="tgico-"+t,e.classList.remove(t)});let t=ac.PLAYBACK_RATES.indexOf(fe.playbackRate);-1===t&&(t=ac.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+ac.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(ae.c){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}Object(Rr.d)()?Object(Rr.b)():Object(Rr.e)(e)}onFullScreen(e){const t=Object(Rr.d)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}ac.PLAYBACK_RATES=[.5,1,1.5,2],ac.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var oc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class rc extends D.a{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if(Object(c.a)(e),he.a)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout(()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0},3e3));const s=this.isZooming();let i=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];s&&n.push("media-viewer-movers"),n.find(e=>{try{if(i=Object(Ce.a)(t,e),i)return!0}catch(e){return!1}}),i&&(s||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(a.a.overlaysActive>1)return;const t=e.key;let s=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):s=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),s&&Object(c.a)(e)},this.onKeyUp=e=>{a.a.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(a.a.overlaysActive>1||Object(Ce.a)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&(Object(c.a)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.log=Object(Y.b)("AMV"),this.preloader=new ye.a,this.preloaderStreamable=new ye.a({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new Z.a,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const s=document.createElement("div");s.classList.add("media-viewer");const i=this.topbar=document.createElement("div");i.classList.add("media-viewer-topbar","media-viewer-appear");const n=document.createElement("div");n.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=N("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const o=document.createElement("div");this.author.avatarEl=new fc,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const r=document.createElement("div");r.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach(e=>{const t=N(e,{noRipple:!0});this.buttons[e]=t,r.append(t)}),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=N("zoomout",{noRipple:!0}),Object(l.b)(this.zoomElements.btnOut,()=>this.changeZoom(!1)),this.zoomElements.btnIn=N("zoomin",{noRipple:!0}),Object(l.b)(this.zoomElements.btnIn,()=>this.changeZoom(!0)),this.zoomElements.rangeSelector=new Ae({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),s.append(this.content.main),this.overlaysDiv.append(s),n.append(this.buttons["mobile-close"],this.author.container),i.append(n,r),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){if(Object(l.b)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach(e=>{Object(l.b)(e,this.close.bind(this))}),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach(([e,t])=>{t.addEventListener("click",t=>{Object(c.a)(t),this.setMoverPromise||this.listLoader.go(e)})}),Object(l.b)(this.buttons.zoom,()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)}),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},he.a){new Qt({element:this.wholeDiv,onSwipe:(e,t)=>{if(Object(Rr.d)())return;if(Math.abs(e)/St.a.width>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/St.a.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Ce.a)(e.target,"media-viewer-caption")})}}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const s=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(s),this.zoomElements.rangeSelector.setProgress(s),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const s=-1;this.zoomSwipeHandler=new Qt({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(i,n)=>{[i,n]=[i*s,n*s],this.zoomSwipeX+=i-e,this.zoomSwipeY+=n-t,[e,t]=[i,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(s)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=bi({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&Object(c.a)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&F.a.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then(({onAnimationEnd:e})=>e);return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,s.finally(()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)}),s}toggleOverlay(e){a.a.isOverlayActive=e,I.a.checkAnimations(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){this.zoomSwipeHandler&&this.zoomSwipeHandler.removeListeners(),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0})}setGlobalListeners(){this.isZooming()&&this.zoomSwipeHandler.setListeners(),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),he.a||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,s=0){return oc(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const i=this.content.mover;t||(i.innerHTML="");const n=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(i);const o=0!==s,r=a.a.settings.animationsEnabled?o?350:200:0;let l,c;e&&(e instanceof fc||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Ce.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Ce.a)(e,"profile-avatars-container"),c=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==c.left&&(e=l=c=void 0))),e||(e=this.content.media),c||(l=e.parentElement,c=e.getBoundingClientRect());let d=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const s=Qa(l,Object(Ce.a)(l,"scrollable"),!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(d=!0):(l=(e=this.content.media).parentElement,c=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let p,u,g,m="";if(o?(p=1===s?St.a.width:-h.width,u=h.top):(p=c.left,u=c.top),m+=`translate3d(${p}px,${u}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(i.firstElementChild&&i.firstElementChild.classList.contains("media-viewer-aspecter")){g=i.firstElementChild;const e=g.querySelector(".ckin__player");if(e){const t=e.firstElementChild;g.append(t),e.remove()}g.style.cssText||(i.classList.remove("active"),this.setFullAspect(g,h,c),i.offsetLeft,i.classList.add("active"))}else g=document.createElement("div"),g.classList.add("media-viewer-aspecter"),i.prepend(g);g.style.cssText=`width: ${c.width}px; height: ${c.height}px; transform: scale3d(${h.width/c.width}, ${h.height/c.height}, 1);`}i.style.width=h.width+"px",i.style.height=h.height+"px";const b=c.width/h.width,v=c.height/h.height;o||(m+=`scale3d(${b},${v},1) `);let f=window.getComputedStyle(l).getPropertyValue("border-radius");const y=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(f);if(f=y.map(e=>parseInt(e)/b+"px").join(" "),o||(i.style.borderRadius=f),t&&1!==n){const e=St.a.width/2-c.width/2,t=St.a.height/2-c.height/2,s=c.left-e,i=c.top-t;this.moversContainer.style.transform=`matrix(${b}, 0, 0, ${v}, ${s}, ${i})`}else i.style.transform=m;let w;d&&(i.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=Object(ie.a)(),L={onAnimationEnd:C},I=setTimeout(()=>{C.isFulfilled||C.isRejected||C.resolve()},1e3);if(C.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(I)}),t)return e instanceof SVGSVGElement&&(w=i.querySelector("path"),w&&this.sizeTailPath(w,h,b,r,!1,S,f)),e.classList.contains("media-viewer-media")&&i.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout(()=>{i.style.borderRadius=f,i.firstElementChild&&(i.firstElementChild.style.borderRadius=f)},r/2),setTimeout(()=>{i.innerHTML="",i.classList.remove("moving","active","hiding"),i.style.cssText="display: none;",C.resolve()},r),i.classList.remove("opening"),L;{let t,s;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const n=Array.from(e.querySelectorAll("img")).pop();n&&(t=new Image,s=n.src,i.append(t))}else if(e instanceof HTMLImageElement)t=new Image,s=e.src;else if(e instanceof HTMLVideoElement)t=Cs(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,s=t+"-mv",{width:n,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+n),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${n} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,s)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,s));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,(e,t,s,i,o)=>`translate(${t=2!==(t=+t)?n-2/b:2/b}, ${a}) scale(${+i/b}, ${+o/v})`),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const s=f.split(" ").map(e=>parseInt(e));e=S?Sr(0,0,n-9/b,a,...s):Sr(9/b,0,n-9/b,a,...s),w.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+h.width),c.setAttributeNS(null,"height",""+h.height),i.prepend(o)}g&&(g.style.borderRadius=f,t&&g.append(t)),t=i.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),g||(t.style.width=h.width+"px",t.style.height=h.height+"px"),s&&(yield Object(ps.b)(t,s))),i.style.display="",Object(Le.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(Le.a)(),i.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,d&&(i.style.opacity=""),g&&this.setFullAspect(g,h,c),setTimeout(()=>{i.style.borderRadius="",i.firstElementChild&&(i.firstElementChild.style.borderRadius="")},0),i.dataset.timeout=""+setTimeout(()=>{i.classList.remove("moving","opening"),g&&(i.querySelector("video"),i.classList.remove("active"),g.style.cssText="",i.offsetLeft),i.classList.add("center","no-transition"),i.classList.add("active"),delete i.dataset.timeout,C.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),L}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout(()=>{this.wholeDiv.classList.remove("active")},0))}setFullAspect(e,t,s){const i=t.width/t.height;let{width:n,height:a}=s;i>0?n=a*i:a=n*i,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,s,i,n,a,o){const r=Date.now(),{width:l,height:c}=t;i/=2;const d=o.split(" ").map(e=>parseInt(e)),h=()=>{const t=Date.now()-r;let o=i?t/i:1;o>1&&(o=1),n&&(o=1-o);const p=d.map(e=>e*o);let u;u=a?Sr(0,0,l-9/s*o,c,...p):Sr(9/s*o,0,l,c,...p),e.setAttributeNS(null,"d",u),t{const a=t?-i.width:s;return e.replace(n,a+"px")});e.style.transform=n,setTimeout(()=>{e.remove()},350)}setNewMover(){const e=document.createElement("div");if(e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover){this.content.mover.parentElement.append(e)}else this.moversContainer.append(e);return this.content.mover=e}updateMediaSource(e,t,s){const i=e.tagName.toLowerCase()===s?e:e.querySelector(s);if(i&&!Object(Ce.a)(e,"document")){if(Object(Ce.a)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===s)return void(t.classList.contains("manual")&&t.click());t.remove()}}Object(ps.a)(i,t),i.classList.contains("thumbnail")&&i.parentElement.classList.contains("media-container-aspecter")&&i.classList.remove("thumbnail")}}setAuthorInfo(e,t){Object(k.a)(this.author.date,Object(ne.d)(t));const s=e.isPeerId();let i;s?i=new wt.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.append(X.b.wrapEmojiText(e)),i.classList.add("peer-title")),Object(k.a)(this.author.nameEl,i);let n=this.author.avatarEl;this.author.avatarEl=n.cloneNode(),this.author.avatarEl.updateWithOptions({peerId:e||Me.c,peerTitle:s?void 0:""+e}),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,a=!1,o=[],l=[],d){return oc(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const h="document"===e._,p=h&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(o,l,a),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout(()=>{this.listLoader.load(!0)},0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const u=this.content.media,g=!n||n===u;g&&(n=u),this.target={element:n};const m=++this.tempId;u.firstElementChild&&(u.innerHTML="");0!==i?(this.moveTheMover(this.content.mover,1===i),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),ae.f||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},F.a.pushItem(this.navigationItem)));const v=this.content.mover,f=St.a.width;let y=0;const w=St.a.height;w<1e6&&!b.b.isMobile&&(y=120);const S=w-120-y;let C=Promise.resolve();const I=r.a.setAttachmentSize(e,u,f,S,!b.b.isMobile,void 0,!!(h&&e.w&&e.h)).photoSize;if(g){const t=ce.a.getCacheContext(e,I.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(C=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),u.append(s))}const M=!(!h||!e.supportsStreaming),E=M?this.preloaderStreamable:this.preloader;let P;if(p){const t=d&&"gif"!==e.type,s=Cs({pip:t}),a=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:i})=>{const a=v.firstElementChild&&v.firstElementChild.classList.contains("media-viewer-aspecter")?v.firstElementChild:v,o=v.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",()=>{this.tempId!==m&&s.pause()}),s.addEventListener("error",()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),E&&E.detach()},{once:!0}),this.addEventListener("setMoverAfter",()=>{s.src="",s.load()},{once:!0}),ae.g&&(s.autoplay=!0),"gif"===e.type?(s.muted=!0,s.autoplay=!0,s.loop=!0):e.duration<60&&(s.loop=!0),a.append(s);const r=new Promise(e=>{s.addEventListener("canplay",e,{once:!0})}),l=()=>{"gif"!==e.type&&(s.dataset.ckin="default",s.dataset.overlay="1",Promise.all([r,i]).then(()=>{if(this.tempId!==m)return;(this.videoPlayer=new ac({video:s,play:!0,streamable:M,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const i=window.appMediaViewer;if(!e&&i&&i!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?F.a.removeItem(this.navigationItem):F.a.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,fe.setPictureInPicture(s)):this.releaseSingleMedia=fe.setSingleMedia(s,d))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",e=>{this.wholeDiv.classList.toggle("has-video-controls",e)}),this.addEventListener("setMoverBefore",()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0},{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1)}))};if(M){i.then(()=>{s.readyState{s.addEventListener("canplay",()=>{E.detach(),s.parentElement.classList.remove("is-buffering")},{once:!0})};s.addEventListener("waiting",()=>{const t=s.networkState===s.NETWORK_LOADING,i=s.readyState{Object(c.a)(e)}),e()}this.lazyLoadQueue.unshift({load:()=>{const o=ce.a.getCacheContext(e),r=M?Promise.resolve():L.a.downloadDoc(e);return M||i.then(()=>{o.url||E.attach(v,!0,r)}),Promise.all([r,i]).then(()=>{if(this.tempId!==m)return void this.log.warn("media viewer changed video");const e=o.url;n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):Object(ps.a)(s,e),t&&(this.releaseSingleMedia=fe.setSingleMedia(s,d),this.addEventListener("setMoverBefore",()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)},{once:!0})),this.updateMediaSource(n,e,"video"),l()}),r}})});P=C.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=ce.a.getCacheContext(e,I.type),i=h?L.a.downloadDoc(e):r.a.preloadPhoto(e,I);return t.then(()=>{s.url||this.preloader.attachPromise(i)}),Promise.all([t,i]).then(()=>{var e;if(this.tempId!==m)return void this.log.warn("media viewer changed photo");const t=s.url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(v,t,"img"),b.b.isMobile){const e=v.querySelectorAll("img");e&&e.length&&e.forEach(e=>{e.classList.remove("thumbnail")})}}else{const s=v.firstElementChild&&v.firstElementChild.classList.contains("media-viewer-aspecter")?v.firstElementChild:v,i="IMG"===(null===(e=s.firstElementChild)||void 0===e?void 0:e.tagName)?s.firstElementChild:null;if(!i||i.src!==t){let e=new Image;e.classList.add("thumbnail"),Object(ps.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(Le.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(v),this.preloader.setManual()}),i}})});P=C.then(t)}return this.setMoverPromise=P.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}var lc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class cc extends rc{constructor(){let e;super(new C({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||cc.isMediaCompatibleForDocumentViewer(a)))return{element:null,mid:s,peerId:n}}}),["delete","forward"]),this.onPrevClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,-1)},this.onNextClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,1)},this.onDeleteClick=()=>{const e=this.target;new Js(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new Xs({[e.peerId]:[e.mid]},()=>this.close())},this.onAuthorClick=e=>{const{mid:t,peerId:s}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const i=this.searchContext.threadId,n=this.getMessageByPeer(s,t);this.close(e).then(()=>{if(b.b.isMobile){const e=ts.getTab(Zt);e&&e.close()}nc.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:i?"discussion":void 0,threadId:i})})}},this.onDownloadClick=()=>{const{peerId:e,mid:t}=this.target,s=this.getMessageByPeer(e,t);if(s.media.photo)r.a.savePhotoFile(s.media.photo,nc.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&L.a.saveDocFile(e,nc.chat.bubbles.lazyLoadQueue.queueId)}},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout(()=>{e=void 0,this.content.caption.classList.remove("is-focused")},800)};this.content.caption.addEventListener("touchstart",()=>{b.b.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))});new P.b(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),Object(l.b)(this.buttons.delete,this.onDeleteClick);const s=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(s),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),Object(l.b)(this.buttons.forward,this.onForwardClick),Object(l.b)(this.author.container,this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const s=t.target.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return Object(c.a)(t),this.close().then(()=>{Object(l.c)(this.content.caption,e,{capture:!0}),t.target.click()}),!1}};Object(l.b)(this.content.caption,e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?i.a.getScheduledMessageByPeer(e,t):i.a.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let s="";t&&(s=X.b.wrapRichText(t,{entities:e.totalEntities})),Object(m.a)(this.content.caption.firstElementChild,s),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,s=0,n=!1,a=[],o=[]){const r=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return lc(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const l=e.mid,c=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,d=i.a.getMediaFromMessage(e),h="messageService"===e._||!i.a.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach(e=>{e.classList.toggle("hide",h)}),this.wholeDiv.classList.toggle("no-forwards",h);const p=h;[this.buttons.download,this.btnMenuDownload.element].forEach(e=>{e.classList.toggle("hide",p)});const u=i.a.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach(e=>{e.classList.toggle("hide",!u)}),this.setCaption(e);const g=r._openMedia.call(this,d,e.date,c,s,t,n,a,o,e);return this.target.mid=l,this.target.peerId=e.peerId,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||g.has(e.mime_type)}}class dc extends S{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const i=null==e?void 0:e.photoId;return r.a.getUserPhotos(this.peerId,i,s).then(e=>{const t=e.photos.map(e=>({element:null,photoId:e}));return{count:e.count,items:t}})}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var hc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class pc extends rc{constructor(e){super(new dc({peerId:e}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{r.a.savePhotoFile(r.a.getPhoto(this.target.photoId),nc.chat.bubbles.lazyLoadQueue.queueId)},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,s=0,i,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return hc(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=r.a.getPhoto(e),l=a._openMedia.call(this,o,o.date,this.peerId,s,t,!1,i,n);return this.target.photoId=o.id,l}))}}var uc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const gc=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[data-peer-id="'+e+'"]')).forEach(e=>{e.update()})};function mc(e,t,s,a,o,l){return uc(this,void 0,void 0,(function*(){let c=yield n.default.getFullPhoto(t);if(!s()||!c)return;const d=()=>Array.from(e.querySelectorAll("img")).find(e=>!e.classList.contains("emoji"))?e:null;if(t.isAnyChat()){const e=!!a,n="inputMessagesFilterChatPhotos";if(!a&&(a=yield i.a.getSearch({peerId:t,inputFilter:{_:n},maxId:0,limit:1}).then(e=>e.history[0]),!s()))return;if(a){a.action.photo.id!==c.id&&(e||(a=i.a.generateFakeAvatarMessage(t,c)));const s=e=>e.map(e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId}));return void(new cc).setSearchContext({peerId:t,inputFilter:{_:n}}).openMedia(a,d(),void 0,void 0,o?s(o):void 0,l?s(l):void 0)}}if(c){!Object(ha.a)(a)&&a&&(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new pc(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.a.addEventListener("avatar_update",gc),a.a.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||gc(e)});const bc=new Map,vc=new Set;class fc extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}disconnectedCallback(){const e=bc.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||bc.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}attachClickEvent(){let e=!1;Object(l.b)(this,t=>uc(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield mc(this,this.peerId,()=>this.peerId===s),e=!1})))}updateOptions(e){for(let t in e)this[t]=e[t]}updateWithOptions(e){const t=this.peerId;this.updateOptions(e);const s=this.peerId;if(t!==s){if(this.peerId=o.a.getPeerMigratedTo(s)||s,this.dataset.peerId=""+s,t){const e=bc.get(t);e&&(e.delete(this),e.size||bc.delete(t))}return this.update()}}r(e=!1){const t=d.a.putPhoto(this,this.peerId,this.isDialog,this.peerTitle,e,this.isBig),s=t?t.loadPromise:Promise.resolve();return this.loadPromises&&(t&&t.cached&&this.loadPromises.push(s),s.finally(()=>{this.loadPromises=void 0})),t}update(){if(this.lazyLoadQueue){if(!vc.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=bc.get(this.peerId);return e||(e=new Set,bc.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(vc.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}vc.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=bc.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);bc.delete(this.peerId);for(let t=0,s=e.length;t{let e=i.a.getDialogOnly(this.selectedId);e&&i.a.editPeerFolders([e.peerId],+!e.folder_id)},this.onPinClick=()=>{i.a.toggleDialogPin(this.selectedId,this.filterId).catch(e=>{"PINNED_DIALOGS_TOO_MUCH"===e.type&&(this.filterId>=1?rt({langPackKey:"PinFolderLimitReached"}):new ut("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new Sn($n).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[Object(T.d)("Chats",[a.a.config.pinned_dialogs_count_max])]}).show())})},this.onUnmuteClick=()=>{i.a.togglePeerMute(this.selectedId,!1)},this.onMuteClick=()=>{new ur(this.selectedId)},this.onUnreadClick=()=>{const e=i.a.getDialogOnly(this.selectedId);e&&(e.unread_count?(i.a.readHistory(this.selectedId,e.top_message),i.a.markDialogUnread(this.selectedId,!0)):i.a.markDialogUnread(this.selectedId))},this.onDeleteClick=()=>{new Ot(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(bt.a)(e.target,"LI")}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.filterId=_c.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=i.a.getDialogOnly(this.selectedId),this.buttons.forEach(e=>{const t=e.verify();e.element.classList.toggle("hide",!t)}),this.buttons[this.buttons.length-1].element.lastChild.replaceWith(Object(T.d)(o.a.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),Object(ee.e)(e,this.element),Object(ee.d)(this.element,()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0})}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>!i.a.isDialogUnread(this.dialog)},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>i.a.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>{var e;return!(this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>{var e;return this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>this.selectedId!==a.a.myId&&!Bt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.a.myId&&Bt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==a.a.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==a.a.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=$s(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var wc,Sc;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(wc||(wc={}));class Cc{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{zn.a.get("dc").then(e=>{e||(e=Hn.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.a.connectionStatus["NET-"+e],s=t&&t.status===wc.Connected;this.connecting&&s&&vi.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===wc.TimedOut,this.connecting=!s,this.retryAt=t&&t.retryAt,le.b&&this.log("connecting",this.connecting),this.setState()})},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,Object(k.a)(this.statusEl,Object(T.d)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{const e=Cc.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>ct.a.forceReconnect());this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,s=()=>{const s=Date.now();e.innerText=""+Math.round((t-s)/1e3),s>t&&clearInterval(i)},i=setInterval(s,1e3);s();const n=this.getA("ConnectionStatus.Reconnect",()=>ct.a.forceReconnectTimeout());this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");le.b&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame(()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout);this.setStateTimeout=window.setTimeout(()=>{Object(is.a)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,le.b&&this.log("setState: isShown:",this.connecting||this.updating)},e)})},this.log=Object(Y.b)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=Object(B.a)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new ye.a({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),e.prepend(this.statusContainer),a.a.addEventListener("connection_status_change",e=>{console.log(e),this.setConnectionStatus()}),a.a.addEventListener("state_synchronizing",e=>{e||(this.updating=!0,le.b&&this.log("updating",this.updating),this.setState())}),a.a.addEventListener("state_synchronized",e=>{le.b&&this.log("state_synchronized",e),e||(this.updating=!1,le.b&&this.log("updating",this.updating),this.setState())}),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,Cc.CHANGE_STATE_DELAY+1e3)}getA(e,t){const s=document.createElement("a");return s.classList.add("force-reconnect"),s.append(Object(T.d)(e)),Object(l.b)(s,e=>{Object(c.a)(e),t()}),s}}function Lc(e,t,s,i,n,a,o,r){if("number"==typeof a)a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]||e[t]}e.beginPath(),e.moveTo(t+a.tl,s),e.lineTo(t+i-a.tr,s),e.quadraticCurveTo(t+i,s,t+i,s+a.tr),e.lineTo(t+i,s+n-a.br),e.quadraticCurveTo(t+i,s+n,t+i-a.br,s+n),e.lineTo(t+a.bl,s+n),e.quadraticCurveTo(t,s+n,t,s+n-a.bl),e.lineTo(t,s+a.tl),e.quadraticCurveTo(t,s,t+a.tl,s),e.closePath(),o&&e.fill(),r&&e.stroke()}Cc.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(Sc||(Sc={}));const Ic=window.devicePixelRatio,Mc=20*Ic,Ec=2.5*Ic,Pc=2*Ic,kc=1*Ic;function Tc(e=!1){const t=document.createElement("canvas");t.width=t.height=Mc;const s=t.getContext("2d"),i=(Mc-(3*Pc+2*Ec))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Date.now(),r=(l=(o-n)%1e3,c=0,d=1e3,-1/2*(Math.cos(Math.PI*l/d)-1)+c);var l,c,d;s.clearRect(0,0,Mc,Mc),s.fillStyle=e&&!b.b.isMobile?Ar.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=r>=.5?e%2?2-2*r:2*(r-.5):e%2?2*r:1-2*r;let n=4+8*t;n*=Ic;Lc(s,i+e*Pc+e*Ec,(Mc-n)/2,Pc,n,kc,!0)}return!0};return{canvas:t,startAnimation:()=>{Object(Pe.a)(o),o()},setActive:t=>{e=t,o()}}}var xc=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ac extends Hs{constructor(e,t,s){super({getIndex:e=>i.a.getDialogOnly(e.id)[this.indexKey],onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Ns(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=jc.addListDialog({dialog:e.id,loadPromises:s,isBatch:t});return e.dom=i,(null==s?void 0:s.length)&&(e.loadPromises=s,Promise.all(s).finally(()=>{delete e.loadPromises})),e},updateElementWith:Le.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class Oc{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=Object(Y.b)("DIALOGS",Y.a.Log|Y.a.Error|Y.a.Warn|Y.a.Debug),this.contextMenu=new yc,this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>{this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()},this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,s=e.parentElement.parentElement,i=e.parentElement.nextElementSibling,n=!!i.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;s.classList.add("with-contacts");const a=new Kn({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),E.a.getContactsPeerIds(void 0,void 0,"online").then(e=>{let t=!1;const s=()=>{t&&a.container.classList.toggle("hide",!i.list.childElementCount),this.updateContactsLength(!0)},i=new Vs({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=St.a.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach(e=>{i.add(e)}),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),s=i.has(e);!s&&t?i.add(e):s&&!t&&i.delete(e)};const n=i.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,s()}),i.append(a.container)},this.verifyPeerIdForContacts=e=>e.isContact()&&!i.a.getDialogOnly(e),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout(()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&Object(Le.c)(()=>{const e=performance.now(),t=this.scroll.scrollTop,s=this.chatList.firstElementChild,i=this.scroll.container.getBoundingClientRect(),n=s.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)}),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-h,this.log("slice time",performance.now()-e)})},200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>this.scroll.loadedAll[e]?(this.loadContacts&&this.loadContacts(),Promise.resolve()):this.loadDialogsPromise?this.loadDialogsPromise:(this.log("onChatsScroll",e),this.loadDialogs(e)),this.chatsPreloader=Object(ee.f)(null,!0),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=Object(lt.a)(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),he.a&&Ws({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.allChatsIntlElement=new T.c.IntlElement({key:"FilterAllChatsShort"}),this.setFilterId(0),this.addFilter({id:this.filterId,title:"",titleEl:this.allChatsIntlElement.element,orderIndex:0}),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],a.a.addEventListener("state_cleared",()=>{M.c.getState().then(e=>{this.loadedDialogsAtLeastOnce=!1,E.a.clear(),G.a.clear();const t=i.a.filtersStorage.filters;for(const e in t)a.a.dispatchEvent("updateDialogFilter",{_:"updateDialogFilter",id:+e});i.a.clear(),this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)})});const t=new P.a(this.folders.menuScrollContainer);e.prepend(this.folders.menuScrollContainer);const s=Object(J.a)(this.folders.menu,this.folders.container,(e,t)=>{e=+t.dataset.filterId||0,ae.f||(e?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},F.a.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(F.a.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),this.filterId!==e&&(this.sortedLists[e].clear(),this.setFilterId(e),this.onTabChange())},()=>{for(const e in this.sortedLists)+e!==this.filterId&&this.sortedLists[e].clear()},void 0,t);this.folders.menu.firstElementChild.click(),i.a.construct(),M.c.getState().then(e=>(fe.setPlaybackParams(e.playbackParams),a.a.addEventListener("media_playback_params",e=>{M.c.pushToState("playbackParams",e)}),this.onStateLoaded(e))),b.b.addEventListener("resize",()=>{this.changeFiltersAllChatsKey()}),new Cc(this.chatsContainer),this.chatsContainer.append(e),setTimeout(()=>{oe.a.loadLottieWorkers()},200)}get chatList(){return this.sortedList.list}setFilterId(e){this.filterId=e,this.indexKey=i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(this.filterId):"index",a.a.filterId=e}setOnlineStatus(e,t){const s=e.classList.contains("is-online");!s&&t&&e.classList.add("is-online"),Object(is.a)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove("is-online")},t&&!s?2:0)}initListeners(){a.a.addEventListener("user_update",e=>{var t;const s=e.toPeerId(),i=this.getDialogDom(s);if(i&&!E.a.isBot(e)&&s!==a.a.myId){const s="userStatusOnline"===(null===(t=E.a.getUser(e).status)||void 0===t?void 0:t._);this.setOnlineStatus(i.avatarEl,s)}}),a.a.addEventListener("chat_update",e=>{const t=e.toPeerId(!0),s=i.a.getDialogOnly(t);s&&this.processDialogForCallStatus(s)}),a.a.addEventListener("folder_unread",e=>{this.setFilterUnreadCount(e.id)}),a.a.addEventListener("contacts_update",e=>{this.processContact&&this.processContact(e.toPeerId())}),a.a.addEventListener("dialog_flush",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setLastMessage(t,void 0,void 0,void 0,void 0,void 0,!0),this.validateDialogForFilter(t),this.setFiltersUnreadCount())}),a.a.addEventListener("dialogs_multiupdate",e=>{for(const t in e){const s=e[t];this.updateDialog(s),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(s)}}),a.a.addEventListener("dialog_drop",({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)}),a.a.addEventListener("dialog_unread",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setUnreadMessages(t),this.validateDialogForFilter(t))}),a.a.addEventListener("dialog_notify_settings",e=>{this.validateDialogForFilter(e),this.setUnreadMessages(e),this.setFiltersUnreadCount()}),a.a.addEventListener("dialog_draft",({dialog:e,drop:t,peerId:s})=>{t?this.sortedList.delete(s):this.updateDialog(e),this.processContact&&this.processContact(s)}),a.a.addEventListener("peer_changed",e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] li[data-peer-id="${e}"]`)).forEach(e=>{this.setDialogActive(e,!0)})}),a.a.addEventListener("filter_update",e=>{if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=i.a.dialogsStorage.getCachedDialogs(!0);this.validateListForFilter();for(let t=0,s=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange())}),a.a.addEventListener("filter_order",e=>{const t=this.folders.menu;e.forEach(e=>{const s=i.a.filtersStorage.getFilter(e),n=this.filtersRendered[e];this.sortedLists[e].indexKey=i.a.dialogsStorage.getDialogIndexKey(e),Ns(n.menu,t,s.orderIndex),Ns(n.container,this.folders.container,s.orderIndex)}),this.indexKey=i.a.dialogsStorage.getDialogIndexKey(this.filterId)}),a.a.addEventListener("peer_typings",({peerId:e,typings:t})=>{const s=i.a.getDialogOnly(e);s&&(t.length?this.setTyping(s):this.unsetTyping(s))})}setDialogActive(e,t){const s=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return xc(this,void 0,void 0,(function*(){if(e.notifySettings)for(const t in e.notifySettings)Object(ys.a)(t),Bt.a.savePeerSettings({key:t,settings:e.notifySettings[t]});Bt.a.getNotifyPeerTypeSettings(),this.initedListeners||(this.initListeners(),this.initedListeners=!0);const t=i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.addFilter(t)});return e.filters&&Object.keys(e.filters).length&&(yield t,this.showFiltersPromise&&(yield this.showFiltersPromise)),M.c.storagesResults.dialogs.length&&Vi.a.addMissedDialogs(),this.onChatsScroll().then(()=>{i.a.fillConversations()})}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),s=this.getOffsetIndex("bottom");if(!t.index&&!s.index)return!0;const i=e[this.indexKey];return(!t.index||i<=t.index)&&(!s.index||i>=s.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessage(e,void 0,t,void 0,void 0,void 0,!0),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;const s=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!s)return;const n=i.a.dialogsStorage.getFolder(e),a=0===e||!!n.dialogs.find(e=>(e.unread_count||e.pFlags.unread_mark)&&!Bt.a.isPeerLocalMuted(e.peerId,!0));s.classList.toggle("badge-gray",!a);const o=n.unreadDialogsCount;s.innerText=o?""+o:""}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}validateListForFilter(){const e=i.a.filtersStorage.getFilter(this.filterId)||null;this.sortedList.getAll().forEach(t=>{const s=i.a.getDialogOnly(t.id);this.testDialogForFilter(s,e)||this.deleteDialog(t.id)})}validateDialogForFilter(e,t){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e,t)||this.deleteDialog(e.peerId))}testDialogForFilter(e,t=i.a.filtersStorage.getFilter(this.filterId)){return!(!e||t&&!i.a.filtersStorage.testDialogForFilter(e,t)||!t&&this.filterId!==e.folder_id)}generateScrollable(e,t){const s=new P.b(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+t,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new Ac(e,i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(t):"index",this.onListLengthChange);return this.scrollables[t]=s,this.sortedLists[t]=n,s}addFilter(e){if(this.filtersRendered[e.id])return;const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("span");i.classList.add("text-super"),e.titleEl?i.append(e.titleEl):Object(m.a)(i,X.a.wrapEmojiText(e.title));const n=document.createElement("div");n.classList.add("badge","badge-20","badge-primary");const a=document.createElement("i");s.append(i,n,a),Object(te.a)(t),t.append(s);Ns(t,this.folders.menu,e.orderIndex);const o=this.createChatList(),r=this.generateScrollable(o,e.id);r.container.classList.add("tabs-tab","chatlist-parts");const l=document.createElement("div");l.classList.add("chatlist-top");const c=document.createElement("div");c.classList.add("chatlist-bottom"),l.append(o),r.container.append(l,c);const d=r.container;Ns(r.container,this.folders.container,e.orderIndex),this.setListClickListener(o,null,!0),this.filtersRendered[e.id]={menu:t,container:d,unread:n,title:i},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise(e=>{window.setTimeout(()=>{const t=Object.keys(this.filtersRendered).length>1,s=!this.folders.menuScrollContainer.classList.contains("hide");t!==s&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!s&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0,e()},0)})),this.showFiltersPromise}loadDialogs(e){if(this.loadDialogsPromise)return this.loadDialogsPromise;const t=new Promise(s=>xc(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=St.a.height/72*1.25|0,l=0;const{index:c}=this.getOffsetIndex(e);if(c)if("top"===e){const e=i.a.dialogsStorage.getFolderDialogs(a,!0),t=e.findIndex(e=>e[o]<=c),s=Math.max(0,t-r);r=t-s,l=e[s][o]+1}else l=c;try{const s=i.a.getConversations("",l,r,a,!0);if(!s.cached&&!n.childElementCount){n.parentElement.append(this.chatsPreloader)}const c=yield s.promise;if(this.loadDialogsPromise!==t)return;if("bottom"===e?c.isEnd&&(this.scroll.loadedAll[e]=!0):c.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,c.dialogs.length){const t="top"===e?c.dialogs.slice().reverse():c.dialogs,s=[],n=[],a=e=>{n.push(e)};t.forEach(e=>{if(!i.a.getDialogOnly(e.peerId))return;const t=this.sortedList.add(e.peerId,!0,a,!1);t.loadPromises&&s.push(...t.loadPromises)}),yield Promise.all(s).finally(),n.forEach(e=>e())}else this.onListLengthChange();const d=c.dialogs["top"===e?0:c.dialogs.length-1];d&&(this.offsets[e]=d[o]),this.log.debug("getDialogs "+r+" dialogs by offset:",l,c,n.childElementCount),setTimeout(()=>{this.scroll.onScroll()},0)}catch(e){this.log.error(e)}this.chatsPreloader.parentElement&&this.chatsPreloader.remove(),s()}))).finally(()=>{this.loadDialogsPromise=void 0});return this.loadDialogsPromise=t}generateEmptyPlaceholder(e){const t="empty-placeholder",s=document.createElement("div");s.classList.add(t,t+"-"+e.classNameType);const i=document.createElement("div");i.classList.add(t+"-header"),Object(T.b)(i,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&Object(T.b)(n,e.subtitle,e.subtitleArgs),s.append(i,n),{container:s,header:i,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let s=Array.from(t.children).find(e=>e.matches(".empty-placeholder"));const n=this.scroll.loadedAll.bottom&&!e.childElementCount;if(n&&s)return;if(!n)return void(s&&(t.classList.remove("with-placeholder"),s.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),s=a.container,s.prepend(function({emoji:e,width:t,height:s}){const i=document.createElement("div"),n=gs.a.getAnimatedEmojiSticker(e);return n?xs({doc:n,div:i,loop:!1,play:!0,width:t,height:s,emoji:e}).then(()=>{}):i.classList.add("media-sticker-wrapper"),{container:i}}({emoji:"📂",width:128,height:128}).container);const e=Object(B.a)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});Object(l.b)(e,()=>{new yn($n).open(i.a.filtersStorage.getFilter(this.filterId))}),s.append(e)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),s=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new T.c.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),Object(ps.b)(e,"assets/img/EmptyChats.svg"),Object(Le.d)()]).then(([e])=>{s.classList.add("visible"),t.classList.toggle("has-contacts",!!e)}),s.prepend(e)}t.append(s),t.classList.add("with-placeholder"),t.dataset.placeholderType=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise:this.updateContactsLengthPromise=E.a.getContacts().then(t=>{const s=this.emptyDialogsPlaceholderSubtitle;if(s){let e,i;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",i=[Object(T.d)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",i=[]),s.compareAndUpdate({key:e,args:i})}if(e){this.chatList.parentElement.classList.toggle("has-contacts",!!t.length)}return this.updateContactsLengthPromise=void 0,t.length})}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,s=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),s.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){const e=this.chatList,t=this.getDialogFromElement(e.firstElementChild),s=this.getDialogFromElement(e.lastElementChild),i=this.indexKey;this.offsets.top=t[i],this.offsets.bottom=s[i]}getDialogFromElement(e){return i.a.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,s=!1,n=!1,a=!1){let o;const r=(a?nc.setInnerPeer:nc.setPeer).bind(nc);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(bt.a)(s,"LI");if(i){if(n){const e=o===i;o&&!e&&o.classList.remove("active"),i&&(i.classList.add("active"),o=i,this.lastActiveElements.add(i))}if(i){t&&t();const e=i.dataset.peerId.toPeerId(),s=+i.dataset.mid||void 0;r({peerId:e,lastMsgId:s})}else r()}},{capture:!0}),le.b&&e.addEventListener("dblclick",e=>{const t=Object(bt.a)(e.target,"LI");if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",i.a.getDialogByPeerId(e))}}),s&&Object(ee.a)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessage(e,t,s,n,l,c=!1,d=!1){if(!s&&!(s=this.getDialogDom(e.peerId)))return;let h;if(t||(e.draft&&"draftMessage"===e.draft._&&(h=e.draft),t=i.a.getMessageByPeer(e.peerId,e.top_message)),"messageEmpty"===t._)return s.lastMessageSpan.innerHTML="",s.lastTimeSpan.innerHTML="",delete s.listEl.dataset.mid,void(d&&this.setUnreadMessages(e,s,c));const p=e.peerId,u=t&&i.a.isRestricted(t);{let e;if(!t.deleted&&!h&&!u){const s=i.a.getMediaFromMessage(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const i=r.a.choosePhotoSize(s,20,20);if("photoSizeEmpty"!==i._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),Ps({photo:s,message:t,container:e,withoutPreloader:!0,size:i,loadPromises:l}),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}const c=!!e&&!!(null==t?void 0:t.message);let d;if(d=n&&t.message?i.a.wrapMessageForReply(t,void 0,void 0,!1,n,c):h?i.a.wrapMessageForReply(h):t.deleted?document.createDocumentFragment():i.a.wrapMessageForReply(t,void 0,void 0,!1,void 0,c),e&&d.prepend(e),Object(k.a)(s.lastMessageSpan,d),h){const e=document.createElement("b");e.classList.add("danger"),e.append(Object(T.d)("Draft"),": "),s.lastMessageSpan.prepend(e)}else if(p.isAnyChat()&&p!==t.fromId&&!t.action){const e=o.a.getPeer(t.fromId);if(e&&e.id){const i=document.createElement("b");e.id===a.a.myId?i.append(Object(T.d)("FromYou")):i.append(new wt.a({peerId:t.fromId,onlyFirstName:!0}).element),i.append(": "),s.lastMessageSpan.prepend(i)}}}if(!t.deleted||h){const e=h?Math.max(h.date,t.date||0):t.date;Object(k.a)(s.lastTimeSpan,Object(ne.c)(new Date(1e3*e)))}else s.lastTimeSpan.textContent="";null!==d&&(d?this.setUnreadMessages(e,s,c):s.listEl.dataset.mid=t.mid)}setUnreadMessages(e,t=this.getDialogDom(e.peerId),s=!1){var n;if(!t)return;if(!s){const s=Bt.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(is.a)(t.listEl,"is-muted",s,200)}let o;if("draftMessage"!==(null===(n=e.draft)||void 0===n?void 0:n._)){const t=i.a.getMessageByPeer(e.peerId,e.top_message);!t.deleted&&t.pFlags.out&&t.peerId!==a.a.myId&&(o=t)}!function(e,t,s){let i;if((null==t?void 0:t.pFlags.out)&&(i=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!i)return void(e.textContent="");const n="tgico-"+i,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,o);const r=i.a.filtersStorage.getFilter(this.filterId);let l;l=r?-1!==r.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const c=i.a.isDialogUnread(e),d=l||c,h=Object(ms.a)(t.unreadBadge);d&&!h&&t.subtitleEl.append(t.unreadBadge);const p=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),u=t.mentionsBadge&&Object(ms.a)(t.mentionsBadge);p&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling)));const g=s?0:200;if(Object(is.a)(t.unreadBadge,"is-visible",d,g,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(is.a)(t.mentionsBadge,"is-visible",p,g,p?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},u?0:2),!d)return;l?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let m=!0,b=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",b=!0):c?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",m=!1),t.unreadBadge.classList.toggle("unread",m),t.unreadBadge.classList.toggle("mention",b)}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){if("object"!=typeof e){const t=i.a.getDialogOnly(e);if(!t){const t=e||Me.c;return{peerId:t,peer:o.a.getOutputPeer(t),pFlags:{}}}return t}return e}setCallStatus(e,t){let{callIcon:s,listEl:i}=e;if(!s&&t){const{canvas:t,startAnimation:n}=e.callIcon=s=Tc(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&Object(is.a)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){const t=this.getDialog(e.dialog);e.autonomous=!1;const s=this.addDialogNew(e);if(s){const{peerId:i}=t;Bt.a.isPeerLocalMuted(i,!0)&&s.dom.listEl.classList.add("is-muted"),i.isUser()||this.processDialogForCallStatus(t,s.dom),this.setLastMessage(t,void 0,s.dom,void 0,e.loadPromises,e.isBatch,!0)}return s}processDialogForCallStatus(e,t){if(!hr)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const s=G.a.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!s.pFlags.call_active||!s.pFlags.call_not_empty))}addDialogAndSetLastMessage(e){const{peerId:t,message:s,query:n}=e,a=jc.addDialogNew(Object.assign(Object.assign(Object.assign({},e),i.a.getMessageSenderPeerIdOrName(s)),{dialog:this.getDialog(t)}));return this.setLastMessage(a.dialog,s,a.dom,n),s.peerId!==t&&(a.dom.listEl.dataset.peerId=""+s.peerId),a}addDialogNew(e){return this.addDialog(e.dialog,e.container,e.drawStatus,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName)}addDialog(e,t,s=!0,i=!0,n=!1,o=!0,r=!0,l=54,c=!!t,d,h,p){var u,g;const m=this.getDialog(e),b=m.peerId,v=new fc;if(v.classList.add("dialog-avatar","avatar-"+l),v.updateWithOptions({loadPromises:h,lazyLoadQueue:d,isDialog:!!o,peerId:b,peerTitle:p}),s&&b!==a.a.myId&&b.isUser()){"userStatusOnline"===(null===(u=E.a.getUser(b).status)||void 0===u?void 0:u._)&&this.setOnlineStatus(v,!0)}const f=document.createElement("div");f.classList.add("user-caption");const y=document.createElement("span");y.classList.add("user-title");const w=new wt.a({peerId:b,fromName:p,dialog:o,onlyFirstName:n,plainText:!1});y.append(w.element),y.classList.add("tgico"),y.append(...Kt(b));const S=document.createElement("span");S.classList.add("user-last-message"),S.setAttribute("dir","auto");const C=document.createElement("li");C.classList.add("chatlist-chat"),i&&Object(te.a)(C),C.append(v,f),C.dataset.peerId=""+b;const L=document.createElement("span");L.classList.add("message-status","sending-status");const I=document.createElement("span");I.classList.add("message-time");const M=document.createElement("div");M.className="dialog-subtitle-badge badge badge-24";const P=document.createElement("p");P.classList.add("dialog-title");const k=document.createElement("span");k.classList.add("dialog-title-details"),k.append(L,I),P.append(y,k);const T=document.createElement("p");T.classList.add("dialog-subtitle"),T.append(S),f.append(P,T);const x={avatarEl:v,captionDiv:f,titleSpan:w.element,titleSpanContainer:y,statusSpan:L,lastTimeSpan:I,unreadBadge:M,lastMessageSpan:S,containerEl:C,listEl:C,subtitleEl:T};if(t){t[r?"append":"prepend"](C)}return c||(C.dialogDom=x,(null===(g=nc.chat)||void 0===g?void 0:g.peerId)===b&&this.setDialogActive(C,!0)),{dom:x,dialog:m}}setTyping(e){const t=this.getDialogDom(e.peerId);if(!t)return;const s=t.lastMessageSpan.querySelector(".peer-typing-container"),i=nc.getPeerTyping(e.peerId,s);!s&&i&&(Object(k.a)(t.lastMessageSpan,i),t.lastMessageSpan.classList.add("user-typing"))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessage(e,null,t,void 0,void 0,void 0,null))}}const jc=new Oc;le.a.appDialogsManager=jc;var _c=t.default=jc},194:function(e,t,s){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(i,n,function(t){return e[t]}.bind(null,n));return i},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";(function(t){var s=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return s&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],s=0;s{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,s)=>{var i=s=>{switch(s.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=s.data.samplePosition,e(s.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,s)=>{var i=s=>{"flushed"===s.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var s=i=>{"done"===i.data.message&&(e.removeEventListener("message",s),t())};e.addEventListener("message",s),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,s){return e.set(s,t),t+s.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,s(1))},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s}])},67:function(e,t,s){"use strict";s.d(t,"b",(function(){return c})),s.d(t,"a",(function(){return d}));var i=s(14),n=s(4),a=s(102),o=s(93),r=s(27);class l{constructor(e,t="",s=document.createElement("div")){this.el=e,this.container=s,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e)),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)}))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(a.b)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=0)}}class c extends l{constructor(e,t="",s=300,i){super(e,t),this.onScrollOffset=s,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,s=this.lastScrollPosition;this.onScrolledTop&&s<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-s<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",e=>{Object(r.a)(e),this.addScrollListener()},{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class d extends l{constructor(e,t="",s=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=s,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!i.a){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},70:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(35),n=s(79),a=s(7),o=s(45);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const s=this.input=document.createElement("input");let r;if(s.classList.add("checkbox-field-input"),s.type="checkbox",e.name&&(s.id="input-"+e.name),e.checked&&(s.checked=!0),e.stateKey&&i.c.getState().then(t=>{const n=Object(o.a)(t,e.stateKey);let a;a=e.stateValues?1===e.stateValues.indexOf(n):n,this.setValueSilently(a),s.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[s.checked?1:0]:s.checked,i.c.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(a.b)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(s),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("checkbox-box-check"),s.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),s.append(i);const n=document.createElement("div");n.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,n,s),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(n.a)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},77:function(e,t,s){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}s.d(t,"a",(function(){return i}))},85:function(e,t,s){"use strict";function i(e,t){return e.closest(t)}s.d(t,"a",(function(){return i}))},94:function(e,t,s){"use strict";var i=s(1),n=s(8);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(e=>e)}updateSettings(e={}){return this.getState().then(t=>{let s,i;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};s=e.currentPassword?n.a.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=t.new_algo,r=new Uint8Array(o.salt1.length+32);return function(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");crypto.getRandomValues(e)}(r),r.set(o.salt1,0),o.salt1=r,i=e.newPassword?n.a.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([s,i]).then(e=>(a.password=e[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=e[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(e,t,s={}){return n.a.invokeCrypto("computeSRP",e,t,!1).then(e=>n.a.invokeApi("auth.checkPassword",{password:e},s).then(e=>("auth.authorization"===e._&&n.a.setUser(e.user),e)))}confirmPasswordEmail(e){return n.a.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};i.a.passwordManager=a;t.a=a}}]); -//# sourceMappingURL=13.f5538912196e125de757.chunk.js.map \ No newline at end of file diff --git a/public/13.f5538912196e125de757.chunk.js.map b/public/13.f5538912196e125de757.chunk.js.map deleted file mode 100644 index b23aef473..000000000 --- a/public/13.f5538912196e125de757.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/environment/mediaMimeTypesSupport.ts","webpack:///./src/helpers/filterChatPhotosMessages.ts","webpack:///./src/helpers/listLoader.ts","webpack:///./src/helpers/searchListLoader.ts","webpack:///./src/components/appSearch.ts","webpack:///./src/components/inputSearch.ts","webpack:///./src/components/buttonIcon.ts","webpack:///./src/components/sliderTab.ts","webpack:///./src/components/slider.ts","webpack:///./src/components/avatarEdit.ts","webpack:///./src/components/buttonCorner.ts","webpack:///./src/components/sidebarLeft/tabs/newGroup.ts","webpack:///./src/components/appMediaPlaybackController.ts","webpack:///./src/helpers/schedulers/throttleWithRaf.ts","webpack:///./src/helpers/schedulers/throttleWith.ts","webpack:///./src/helpers/formatBytes.ts","webpack:///./src/helpers/string/toHHMMSS.ts","webpack:///./src/helpers/dom/attachGrabListeners.ts","webpack:///./src/components/rangeSelector.ts","webpack:///./src/components/mediaProgressLine.ts","webpack:///./src/components/audio.ts","webpack:///./src/components/divAndCaption.ts","webpack:///./src/components/chat/replyContainer.ts","webpack:///./src/helpers/array/accumulate.ts","webpack:///./src/components/groupedLayout.ts","webpack:///./src/components/editPeer.ts","webpack:///./src/components/radioForm.ts","webpack:///./src/components/row.ts","webpack:///./src/helpers/clipboard.ts","webpack:///./src/components/radioField.ts","webpack:///./src/components/toast.ts","webpack:///./src/components/usernameInputField.ts","webpack:///./src/components/popups/peer.ts","webpack:///./src/components/sidebarRight/tabs/chatType.ts","webpack:///./src/helpers/scrollableLoader.ts","webpack:///./src/components/appSelectPeers.ts","webpack:///./src/components/popups/pickUser.ts","webpack:///./src/components/sidebarRight/tabs/userPermissions.ts","webpack:///./src/components/sidebarRight/tabs/groupPermissions.ts","webpack:///./src/components/popups/deleteDialog.ts","webpack:///./src/components/sidebarRight/tabs/chatReactions.ts","webpack:///./src/components/sidebarRight/tabs/editChat.ts","webpack:///./src/components/sidebarRight/tabs/editContact.ts","webpack:///./src/components/sidebarLeft/tabs/addMembers.ts","webpack:///./src/environment/parallaxSupport.ts","webpack:///./src/components/generateFakeIcon.ts","webpack:///./src/components/generateTitleIcons.ts","webpack:///./src/components/generateVerifiedIcon.ts","webpack:///./src/components/swipeHandler.ts","webpack:///./src/components/peerProfileAvatars.ts","webpack:///./src/components/peerProfile.ts","webpack:///./src/components/sidebarRight/tabs/sharedMedia.ts","webpack:///./src/components/sidebarRight/index.ts","webpack:///./src/components/sidebarRight/tabs/pollResults.ts","webpack:///./src/components/stackedAvatars.ts","webpack:///./src/components/poll.ts","webpack:///./src/helpers/dom/createVideo.ts","webpack:///./src/components/wrappers.ts","webpack:///./src/helpers/dom/positionElementByIndex.ts","webpack:///./src/helpers/sortedList.ts","webpack:///./src/components/sortedUserList.ts","webpack:///./src/helpers/dom/handleHorizontalSwipe.ts","webpack:///./src/helpers/dom/handleTabSwipe.ts","webpack:///./src/components/buttonMenu.ts","webpack:///./src/components/popups/forward.ts","webpack:///./src/components/popups/deleteMessages.ts","webpack:///./src/components/popups/sendNow.ts","webpack:///./src/helpers/dom/cancelSelection.ts","webpack:///./src/components/chat/selection.ts","webpack:///./src/helpers/dom/getSelectedText.ts","webpack:///./src/components/appSearchSuper..ts","webpack:///./src/helpers/dom/lockTouchScroll.ts","webpack:///./src/components/buttonMenuToggle.ts","webpack:///./src/lib/appManagers/appPrivacyManager.ts","webpack:///./src/components/privacySection.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack:///./src/helpers/dom/anchorCopy.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack:///./src/helpers/dom/canFocus.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/email.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/index.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack:///./src/components/sidebarLeft/tabs/activeSessions.ts","webpack:///./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack:///./src/helpers/string/convertKeyToInputKey.ts","webpack:///./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack:///./src/helpers/averageColor.ts","webpack:///./src/helpers/color.ts","webpack:///./src/helpers/highlightningColor.ts","webpack:///./src/components/chat/gradientRenderer.ts","webpack:///./src/components/colorPicker.ts","webpack:///./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack:///./src/components/sidebarLeft/tabs/background.ts","webpack:///./src/components/popups/stickers.ts","webpack:///./src/helpers/eachMinute.ts","webpack:///./src/helpers/eachTimeout.ts","webpack:///./src/environment/geolocationSupport.ts","webpack:///./src/components/sidebarLeft/tabs/quickReaction.ts","webpack:///./src/components/sidebarLeft/tabs/generalSettings.ts","webpack:///./src/components/sidebarLeft/tabs/editProfile.ts","webpack:///./src/components/sidebarLeft/tabs/includedChats.ts","webpack:///./src/components/sidebarLeft/tabs/editFolder.ts","webpack:///./src/components/sidebarLeft/tabs/chatFolders.ts","webpack:///./src/components/sidebarLeft/tabs/notifications.ts","webpack:///./src/components/sidebarLeft/tabs/language.ts","webpack:///./src/components/confirmationPopup.ts","webpack:///./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack:///./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack:///./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack:///./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack:///./src/components/sidebarLeft/tabs/settings.ts","webpack:///./src/components/sidebarLeft/tabs/newChannel.ts","webpack:///./src/components/popups/createContact.ts","webpack:///./src/components/sidebarLeft/tabs/contacts.ts","webpack:///./src/components/sidebarLeft/tabs/archivedTab.ts","webpack:///./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack:///./src/helpers/number/formatNumber.ts","webpack:///./src/components/sidebarLeft/index.ts","webpack:///./src/components/chat/bubbleGroups.ts","webpack:///./src/components/popups/datePicker.ts","webpack:///./src/components/stickyIntersector.ts","webpack:///./src/components/chat/reaction.ts","webpack:///./src/components/chat/reactions.ts","webpack:///./src/components/chat/replies.ts","webpack:///./src/components/chat/messageRender.ts","webpack:///./src/helpers/dom/getElementByPoint.ts","webpack:///./src/helpers/dom/reflowScrollableElement.ts","webpack:///./src/lib/appManagers/appEmojiManager.ts","webpack:///./src/components/emoticonsDropdown/tabs/emoji.ts","webpack:///./src/components/gifsMasonry.ts","webpack:///./src/components/emoticonsDropdown/tabs/gifs.ts","webpack:///./src/components/emoticonsDropdown/tabs/stickers.ts","webpack:///./src/lib/appManagers/appInlineBotsManager.ts","webpack:///./src/components/sidebarRight/tabs/gifs.ts","webpack:///./src/components/sidebarRight/tabs/stickers.ts","webpack:///./src/helpers/dropdownHover.ts","webpack:///./src/components/emoticonsDropdown/index.ts","webpack:///./src/environment/webrtcSupport.ts","webpack:///./src/environment/callSupport.ts","webpack:///./src/helpers/dom/getVisibleRect.ts","webpack:///./src/lib/appManagers/internalLink.ts","webpack:///./src/components/popups/joinChatInvite.ts","webpack:///./src/helpers/scrollSaver.ts","webpack:///./src/helpers/dom/superIntersectionObserver.ts","webpack:///./src/components/chat/bubbles.ts","webpack:///./src/helpers/dom/copyFromElement.ts","webpack:///./src/lib/mtproto/constants.ts","webpack:///./src/helpers/dom/getViewportSlice.ts","webpack:///./src/components/popups/unpinMessage.ts","webpack:///./src/helpers/dom/isSelectionEmpty.ts","webpack:///./src/components/popups/reportMessagesConfirm.ts","webpack:///./src/components/popups/reportMessages.ts","webpack:///./src/components/popups/sponsored.ts","webpack:///./src/components/popups/reactedList.ts","webpack:///./src/components/chat/reactionsMenu.ts","webpack:///./src/components/chat/contextMenu.ts","webpack:///./src/components/chat/sendContextMenu.ts","webpack:///./src/components/popups/createPoll.ts","webpack:///./src/helpers/getGifDuration.ts","webpack:///./src/components/popups/newMedia.ts","webpack:///./src/helpers/dom/attachListNavigation.ts","webpack:///./src/components/chat/autocompleteHelper.ts","webpack:///./src/components/chat/stickersHelper.ts","webpack:///./src/components/popups/schedule.ts","webpack:///./src/helpers/dom/getRichValueWithCaret.ts","webpack:///./src/components/chat/emojiHelper.ts","webpack:///./src/components/chat/autocompletePeerHelper.ts","webpack:///./src/components/chat/commandsHelper.ts","webpack:///./src/components/chat/autocompleteHelperController.ts","webpack:///./src/components/chat/mentionsHelper.ts","webpack:///./src/components/chat/replyKeyboard.ts","webpack:///./src/components/chat/inlineHelper.ts","webpack:///./src/components/chat/botCommands.ts","webpack:///./src/components/chat/input.ts","webpack:///./src/helpers/dom/setCaretAt.ts","webpack:///./src/components/chat/pinnedContainer.ts","webpack:///./src/components/volumeSelector.ts","webpack:///./src/components/chat/audio.ts","webpack:///./src/components/chat/pinnedMessageBorder.ts","webpack:///./src/components/chat/pinnedMessage.ts","webpack:///./src/helpers/dom/handleScrollSideEvent.ts","webpack:///./src/environment/groupCallSupport.ts","webpack:///./src/components/popups/mute.ts","webpack:///./src/components/chat/topbar.ts","webpack:///./src/components/sidebarRight/tabs/search.ts","webpack:///./src/components/chat/search.ts","webpack:///./src/components/chat/patternRenderer.ts","webpack:///./src/components/chat/chat.ts","webpack:///./src/helpers/autoDownload.ts","webpack:///./src/components/chat/markupTooltip.ts","webpack:///./src/helpers/dom/getSelectedNodes.ts","webpack:///./src/helpers/generatePathData.ts","webpack:///./src/components/chat/dragAndDrop.ts","webpack:///./src/helpers/dom/disableTransition.ts","webpack:///./src/components/lineBlobDrawable.ts","webpack:///./src/components/topbarWeave.ts","webpack:///./src/helpers/dom/customProperties.ts","webpack:///./src/lib/rlottie/rlottieIcon.ts","webpack:///./src/components/superIcon.ts","webpack:///./src/components/groupCall/microphoneIcon.ts","webpack:///./src/components/groupCall/participantMutedIcon.ts","webpack:///./src/components/groupCall/index.ts","webpack:///./src/components/groupCall/participantStatus.ts","webpack:///./src/components/groupCall/participantsList.ts","webpack:///./src/helpers/dom/controlsHover.ts","webpack:///./src/components/call/videoCanvasBlur.ts","webpack:///./src/components/groupCall/participantVideo.ts","webpack:///./src/components/groupCall/participantVideos.ts","webpack:///./src/components/groupCall/participants.ts","webpack:///./src/components/groupCall/description.ts","webpack:///./src/components/groupCall/title.ts","webpack:///./src/environment/screenSharingSupport.ts","webpack:///./src/components/call/button.ts","webpack:///./src/components/movableElement.ts","webpack:///./src/helpers/movablePanel.ts","webpack:///./src/helpers/toggleClassName.ts","webpack:///./src/lib/calls/callState.ts","webpack:///./src/components/call/description.ts","webpack:///./src/components/groupCall/microphoneIconMini.ts","webpack:///./src/components/call/index.ts","webpack:///./src/lib/calls/helpers/parseSignalingData.ts","webpack:///./src/lib/calls/callConnectionInstance.ts","webpack:///./src/lib/crypto/subtle.ts","webpack:///./src/lib/crypto/utils/sha256.ts","webpack:///./src/helpers/bytes/convertToUint8Array.ts","webpack:///./src/lib/calls/p2P/p2PEncryptor.ts","webpack:///./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack:///./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack:///./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack:///./src/lib/calls/p2P/p2PSdpBuilder.js","webpack:///./src/lib/calls/callInstance.ts","webpack:///./src/lib/calls/p2P/getCallProtocol.ts","webpack:///./src/lib/calls/p2P/getRtcConfiguration.ts","webpack:///./src/components/topbarCall.ts","webpack:///./src/lib/appManagers/appCallsManager.ts","webpack:///./src/lib/appManagers/appImManager.ts","webpack:///./src/lib/mediaPlayer.ts","webpack:///./src/components/appMediaViewerBase.ts","webpack:///./src/helpers/fillPropertyValue.ts","webpack:///./src/components/appMediaViewer.ts","webpack:///./src/helpers/avatarListLoader.ts","webpack:///./src/components/appMediaViewerAvatar.ts","webpack:///./src/components/avatar.ts","webpack:///./src/components/dialogsContextMenu.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/components/sendingStatus.ts","webpack:///./src/components/connectionStatus.ts","webpack:///./src/helpers/roundRect.ts","webpack:///./src/components/groupCallActiveIcon.ts","webpack:///./src/helpers/easing/easeInOutSine.ts","webpack:///./src/lib/appManagers/appDialogsManager.ts","webpack:///./public/recorder.min.js","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/array/randomize.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","bytesCmp","bytes1","bytes2","len","length","i","placeCaretAtEnd","el","ignoreTouchCheck","activeElement","focus","window","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","TrackingMonkey","inputField","max","playAnimation","value","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","CodeInputField","lastLength","setLabel","replace","slice","setValueSilently","onFill","TelInputField","label","pasted","lastValue","telEl","HTMLInputElement","inputMode","pixelRatio","devicePixelRatio","letterSpacing","setProperty","originalFunc","bind","formattedPhoneNumber","abs","formatted","country","countryCode","leftPattern","code","dataset","onInput","key","test","metaKey","ctrlKey","shiftKey","preventDefault","concat","Set","filterChatPhotosMessages","forEachReverse","history","message","idx","arr","action","photo","splice","undefined","count","previous","next","reverse","loadCount","loadWhenLeft","loadedAllUp","loadedAllDown","safeAssign","loadedAll","current","setLoaded","dispatchJump","items","item","pop","unshift","push","shift","load","onJump","toPrevious","leftLength","go","down","loadPromiseDown","loadPromiseUp","older","resolve","anchor","promise","loadMore","result","forEach","processed","processItem","onLoadedMore","backLimit","maxId","mid","searchContext","incrementMessageId","getSearch","peerId","limit","inputFilter","_","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","has","filter","onEmptied","onHistoryMultiappend","obj","folderId","mids","sorted","Array","from","sort","a","b","targets","map","Boolean","onMessageSent","rootScope","isInner","otherSideLoader","storage","isScheduled","getScheduledMessagesStorage","getMessagesStorage","filterMessagesByInputFilterFromStorage","context","useSearch","setSearchContext","reset","ret","goUnsafe","goToOtherEnd","unsetCurrent","changed","removeEventListener","cleanup","clearable","className","clickable","autonomous","onFound","list","createChatList","nameEl","setListClickListener","innerHTML","childElementCount","setActive","clear","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","setTimeout","res","searchGroup","fromId","addDialogAndSetLastMessage","drawStatus","avatarSize","meAsSaved","err","console","error","replaceContent","catch","placeholder","prevValue","timeout","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","icon","slider","destroyable","_constructor","header","closeBtn","noRipple","title","content","addTab","listenerSetter","closeTab","args","init","selectTab","tabs","delete","removeAll","eventListener","dispatchEvent","onCloseAfterTimeout","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","findItemByType","navigationType","back","id","animate","isNavigation","closingId","onCloseTab","tab","_selectTab","Map","tabsContainer","sidebarEl","querySelector","querySelectorAll","get","onOpen","onOpenAfterTimeout","pushItem","onPop","canAnimate","indexOfAndSplice","tabConstructor","preserveTab","removeTabFromHistory","find","t","getTab","removeByType","onClose","open","getContext","clearRect","uploadAvatar","isGeoChat","setTitle","avatarEdit","_upload","section","inputWrapper","groupNameInputField","maxLength","groupLocationInputField","canBeEdited","valueCheck","contains","userLocationCoords","userLocationAddress","nextBtn","createChannel","about","geo_point","address","megagroup","chatId","inputFile","editPhoto","peerIds","inviteToChannel","disabled","createChat","toUserId","chatsSection","nameArgs","new","format","startLocating","userId","dom","addDialogNew","dialog","rippleEnabled","lastMessageSpan","getUserStatusString","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","SHOULD_USE_SAFARI_FIX","userAgent","match","appMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","seekOffset","seekForward","duration","seekTo","seekTime","onMediaDocumentLoad","doc","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","appDownloadManager","getCacheContext","src","url","playbackRate","set","onPlay","target","pip","getMessageByMedia","setMedia","verify","element","listLoader","getCurrent","getPrevious","jumpLength","findIndex","getNext","setTargets","getPlayingDetails","onPause","onEnded","isTrusted","lockedSwitchers","paused","clean","s","playingMediaType","playItem","getMedia","resolveWaitingForLoadMedia","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","cssText","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","getPlaybackParams","volume","muted","params","_volume","_muted","_playbackRate","_loop","_round","autoload","pFlags","is_scheduled","getMediaFromMessage","media_unread","myId","readMessages","once","deferred","w","waitingStorage","downloadDoc","safariBuffering","pictureInPictureElement","artwork","isVoice","artist","thumbs","bytes","sizes","h","preloadPhoto","setNewMediadata","peerPhoto","getPeerPhoto","loadAvatar","cached","getPeerTitle","attribute","attributes","file_name","performer","metadata","MediaMetadata","getScheduledMessageByPeer","getMessageByPeer","playbackParams","cb","willBePlayedMedia","deepEqual","copy","prev","addMedia","mediaType","getPlaybackMediaTypeFromMessage","wasPlaying","willBePlayed","toggleSwitchers","playPaused","enabled","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","formatBytes","decimals","dm","floor","log","parseFloat","pow","toFixed","toHHMMSS","str","leadZero","sec_num","parseInt","hours","minutes","seconds","attachGrabListeners","onStart","onMove","onEnd","onMouseMove","event","x","pageX","y","pageY","onMouseUp","onMouseDown","button","onTouchMove","touches","clientX","clientY","isTouch","onTouchEnd","onTouchStart","passive","mousedown","events","withTransition","useTransform","vertical","scrub","rect","getBoundingClientRect","seek","setFilled","onScrub","filled","step","setProgress","stepStr","index","indexOf","_removeListeners","percents","clamp","transform","rectMax","offsetAxisValue","bottom","left","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","removeListeners","filledLoad","setSeekMax","setListeners","setHandlers","scrubTime","isSafariBuffering","buf","buffered","numRanges","nearestStart","end","start","wrapVoiceMessage","audioEl","out","waveform","Uint8Array","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","mediaSizes","isMobile","minW","maxW","createElementNS","setAttributeNS","normValue","wfSize","barCount","maxValue","maxDelta","html","barX","sumI","bar_value","barWidth","insertAdjacentHTML","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","progress","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","cancelEvent","noop","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","totalLength","attr","elem","findMediaTargets","anchorMid","isBubbles","findUpClassName","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","toPeerId","HTMLElement","withTime","voiceAsMusic","showSender","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","firstElementChild","downloadDiv","onTypeLoad","descriptionEl","audioAttribute","parts","wrapEmojiText","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","sizeType","setInnerHTML","wrapSentTime","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","togglePlay","hadSearchContext","imgs","wrapped","wrapPhoto","boxWidth","boxHeight","loadPromises","withoutPreloader","lazyLoadQueue","images","thumb","full","img","attach","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","reject","playListener","download","setDownloadFunction","capture","isConnected","customElements","define","DivAndCaption","fill","border","subtitle","wrapReplyDivAndCaption","subtitleEl","mediaEl","limitSymbols","isRound","mediaChildren","children","middleware","textContent","wrapMessageForReply","webpage","chat","bubbles","getMiddleware","wrapSticker","div","group","CHAT_ANIMATION_GROUP","choosePhotoSize","noBlur","child","isMediaSet","accumulate","initialValue","reduce","acc","RectPart","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","ratio","cropRatios","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","diff","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","updateWithOptions","doNotEditAvatar","unlockOnSuccess","RadioForm","radios","form","checked","freezed","radioField","checkboxField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","titleRightSecondary","titleRightEl","navigationTab","ripple","RadioFormFromRows","rows","copyTextToClipboard","text","clipboard","writeText","textArea","top","position","appendChild","execCommand","removeChild","fallbackCopyTextToClipboard","alignRight","stateKey","appStateManager","getState","state","getDeepProperty","setByKey","main","langKey","Event","toastEl","toast","toastNew","langPackKey","langPackArguments","checkUsernameDebounced","debounce","checkUsername","getValue","originalValue","setState","Neutral","isUsernameValid","setError","invalidText","head","username","checkUsernamePromise","invokeApi","channel","getChannelInput","toChatId","available","Valid","availableText","takenText","isValidToChange","buttons","overlayClosable","avatarEl","isDialog","noTitle","titleLangArgs","fragment","createDocumentFragment","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","callback","original","nextElementSibling","isBroadcast","random","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","getChatInviteLink","show","caption","noDelimiter","linkInputField","applyBtn","migrateChat","channelId","updateUsername","close","setOriginalValue","toggleDisability","toggleNoForwards","onChatUpdate","noforwards","loading","loaded","getPromise","checkForTriggers","chatsContainer","selected","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","includes","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","splitUp","notRendered","filterPeerTypeBy","isPeerId","getPeer","deleted","method","innerContainer","topContainer","selectedContainer","selectedScrollable","li","click","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","testSelfSearch","dialogs","archived","pageCount","windowSize","tempId","getTempId","getConversations","newOffsetIndex","findAndSplice","d","chatRightsAction","filterByRights","renderSaved","isEnd","getMoreDialogs","contacts","getMoreContacts","isUser","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","results","filterUnique","channelParticipants","getChannelParticipants","q","participants","participant","getParticipantPeerId","promises","getMoreChannelParticipants","isNonContactUser","containerEl","isAnyChat","getChatMembersString","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","settings","animationsEnabled","values","forceDirection","Static","closable","getSelected","onSelect","hide","peerTypes","destroyListener","rights","takeOut","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","v","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","combineParticipantBannedRights","restrictionText","info","mainFlag","restriction","until_date","flag","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","setSubtitle","bannedRights","cantWhat","getPeerId","peer","listEl","update","needAdd","new_participant","view_messages","user_id","prev_participant","exceptionsCount","setLength","loader","setLoader","isChannel","migrateFrom","migrateTo","onScroll","getDialogType","peerTitleElement","callbackLeave","flush","leave","finally","flushHistory","callbackDelete","descriptionArgs","deleteChannel","isDanger","textArgs","availableReactions","getActiveAvailableReactions","getChatFull","originalReactions","available_reactions","enabledReactions","toggleSection","toggleCheckboxField","toggleRow","reactionsSection","checkboxFields","availableReaction","reaction","saveReactionsDebounced","wrapStickerToRow","static_icon","every","saveReactions","newReactions","getCachedFullChat","setChatAvailableReactions","chatUpdateListeners","addChatUpdateListener","canChangeType","canChangePermissions","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","reactionsRow","setReactionsLength","availableReactionsLength","getAvailableReactions","inactive","reactions","permissionsRow","setPermissionsLength","editTitle","editAbout","race","removeAttribute","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","_init","isNew","isContact","nameInputField","lastNameInputField","user","getUser","setDraftValue","first_name","last_name","notificationsCheckboxField","togglePeerMute","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","phone","formatUserPhone","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","skippable","attachToPromise","removeLoader","isPrivacy","selectedPeerIds","addInitial","generateFakeIcon","isScam","span","generateTitleIcons","verified","use","use2","generateVerifiedIcon","fake","scam","getEvent","attachGlobalListenerTo","RESET_GLOBAL","visible","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","onFirstSwipe","onSwipeResult","onSwipe","photoId","avatar","BASE_CLASS","getPhoto","Image","draggable","loadCallback","putAvatar","avatars","intersectionObserver","observe","loadCallbacks","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","freeze","clickX","prevTargets","nextTargets","openAvatarViewer","toRight","right","distance","offsetLeft","cancelNextClick","lastDiffX","minX","swipeHandler","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","ceil","IntersectionObserver","entries","entry","isIntersecting","loadNearestToTarget","getUserPhotos","photos","Number","MAX_SAFE_INTEGER","m","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","unobserve","setText","setPeerStatus","needClear","attachClickEvent","bio","tagName","getProfileByPeerId","notifications","setMoreDetails","fillUsername","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","setMoreDetailsTimeout","canBeDetailed","oldAvatars","setPeer","getPeerUsername","fillNotifications","cleaned","cleanupHTML","fillRows","override","isRestricted","callbackify","peerFull","wrapRichText","exportedInvite","historiesStorage","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","setIsSharedMedia","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","deleteDeletedMessages","mediaTabs","onChangeTab","mediaTab","btnAddMembers","scrollStartCallback","showConfirmation","onError","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","loadMutex","peerChanged","setQuery","historyStorage","fillProfileElements","single","justLoad","getElementById","isColumnProportionSet","to","medium","mobile","toggleSidebar","setColumnProportion","sharedMediaTab","proportion","scrollWidth","previousElementSibling","documentElement","enable","active","willChange","animationPromise","appSidebarRight","resultsDiv","poll","getPoll","quiz","question","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","showMore","lastElementChild","next_offset","avatarContainer","AVATAR_CLASS_NAME","CLASS_NAME","updateOptions","parentNode","lineTotalLength","minIndex","minRemainder","k","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","prevQuizHint","hideQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","setMaxLength","resizePolls","onHide","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","getTotalLength","pollId","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","strokeWidth","radius","circumference","PI","period","closeTime","serverTimeOffset","quizInterval","time","Date","now","timeLeft","color","stroke","strokeDashoffset","strokeDasharray","clearInterval","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","isTabExists","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","solution","solution_entities","toggleHint","textEl","entities","bubblesContainer","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","initQuizHint","timeEl","setResults","recent_voters","stackedAvatars","render","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","multiplier","createVideo","disablePictureInPicture","roundVideoCircumference","wrapVideo","withTail","isOut","noInfo","onlyPreview","noPlayButton","autoDownloadSize","noAutoDownload","isAlbumItem","canAutoplay","autoPlay","gifs","videos","spanTime","spanPlay","needPlayButton","mime_type","photoRes","divRound","halfSize","ctx","globalVideo","setPeerPromise","isInDOM","onPaused","onFrame","drawImage","onClick","detached","foreignObject","getAttributeNS","gotThumb","getThumb","poster","aspecter","isUpload","downloaded","attachMethod","renderDeferred","detach","isFulfilled","animationIntersector","addAnimation","videoWidth","sequentialDom","mutateElement","loadPhotoThumbFunc","loadFunc","setManual","queueId","renderImageFromUrl","wrapDocument","audioElement","extSplitted","split","ext","isArray","toLowerCase","docDiv","icoDiv","fileName","wrapPlainText","descriptionParts","nameDiv","_downloadDiv","save","canOpenAfter","downloading","saveDocFile","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","toDataURL","canAttachPreloader","renderPromise","mutate","wrapStickerAnimation","side","skipRatio","animationDiv","stickerPromise","withThumb","assumeType","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","stableOffsetX","setPosition","emojiAnimationContainer","onlyThumb","emoji","needUpscale","static","asStatic","stickerType","sticker","loadLottieWorkers","toneIndex","isAnimated","isThumbNeededForType","haveThumbCached","stickerCachedThumbs","afterRender","getPathFromPhotoPathSize","path","stickerThumbConverted","getPreviewURLFromThumb","webpWorkerController","convert","getThumbURL","blob","loadAnimationWorker","animationData","saveLottiePreview","data","sendInteractionThrottled","preloadAnimatedEmojiStickerAnimation","getAnimation","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","bubble","throttle","firstTime","setTyping","msg_id","getServerMessageId","emoticon","interaction","JSON","stringify","isSavingLottiePreview","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","animated","lottieLoader","URL","createObjectURL","getStickerSet","stickerSet","documents","previousMedia","createMedia","_size","wrapReply","replyContainer","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","groupId","attachmentDiv","getMidsByAlbum","getMessage","album","positionElementByIndex","pos","prevPos","whichChild","updateElementWith","updateListWith","onSort","canUpdate","_updateList","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","insertInDescendSortedArray","getUserStatusForSort","onListLengthChange","status","willChangeLength","createChatListOptions","doTimeout","updateList","good","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","ButtonMenuItem","noCheckboxClickListener","textElement","regularText","keepOpen","menu","peerIdMids","overrideOnSelect","setInnerPeer","initMessagesForward","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","canRevoke","sendScheduledMessages","cancelSelection","empty","accumulateMapSet","selectedMids","doNotAnimate","onCancelSelection","toggleSelection","listenElement","selectedText","toString","verifyTouchLongPress","getElementFromTarget","getElementsBetween","last","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","toggleByMid","canceledSelection","verifyMouseMoveTarget","removeManual","documentListenerOptions","hasCheckbox","getCheckboxInputFromElement","isElementShouldBeSelected","appendCheckbox","forceSelection","cantForward","cantDelete","cantSend","appMessagesManager","getMessageFromStorage","canForward","canDeleteMessage","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","updateContainer","toggleElementCheckbox","unselect","config","forwarded_count_max","toggleMid","updateElementSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","keys","fromPeerId","isPrivate","transitionElement","opacity","recording","canSelectBubble","isGroupedBubbleSelected","getMidsByMid","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","isGrouped","groupedCheckboxInput","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","onContextMenu","cancelBubble","withSelection","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","horizontalMenu","tabContent","skipScroll","startCallback","newMediaTab","fromMediaTab","offsetTop","scrollHeight","rect2","onMediaClick","targetClassName","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","lock","unlockAndRefresh","filterMessagesByInputFilter","setLastMessage","elemsToAppend","entity","totalEntities","display_url","sliced","matchUrl","same","hostname","hash","previewDiv","getAbbreviation","wrapTitle","subtitleFragment","wrapDescription","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","sharedMediaDiv","processCallback","processEmptyFilter","processPhotoVideoFilter","processDocumentFilter","processUrlFilter","monthContainer","getMonthContainerByTimestamp","afterPerforming","inputMessagesFilterEmpty","showMembersCount","participants_count","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","formatPhoneNumber","arg","globalContacts","intlElement","IntlElement","isShort","minDate","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","onlyFirstName","renderParticipants","membersList","LOAD_COUNT","loadMembers","loadChats","logStr","used","slicedLength","ids","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","toLoad","loadType","timestamp","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","IntlDateElement","haveTimestamps","getObjectKeysAndSort","goFirst","revokeObjectURL","newInputFilter","maxDate","ButtonMenuToggleHandler","openedMenu","PrivacyType","asDiv","btnMenu","appPrivacyManager","privacy","addMultipleEventsListeners","updatePrivacy","rules","inputKey","privacyRules","saveApiUsers","users","saveApiChats","chats","apiUpdatesManager","processLocalUpdate","convertInputKeyToKey","inputRule","rule","assign","privacyKey","types","allowPeers","disallowPeers","onRadioChange","captions","captionElement","radioSection","exceptions","Everybody","Nobody","radioRows","Contacts","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","getPrivacy","getPrivacyRulesDetails","setRadio","chatKey","usersKey","splitted","getUserInput","setPrivacy","getSelf","captionEl","mePath","anchorCopy","phoneSection","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","canFocus","isFirstInput","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","resendPasswordEmail","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","onSkipClick","saveHint","monkey","verifyInput","has_password","labelText","getStateInterval","_state","check","auth","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","Session","app_name","app_version","ip","date_active","date_created","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","otherSection","onTerminateClick","menuElement","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","clearAllDrafts","auths","averageColorFromCanvas","pixel","pixels","getImageData","pixelsLength","outPixel","Uint8ClampedArray","rgbaToHsla","g","l","hslaToRgba","hue2rgb","hexaToRgba","hexa","hexToRgb","hex","rgbaToHexa","rgba","hslaStringToHexa","hsla","alpha","val","endsWith","hslaStringToRgba","highlightningColor","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","onWheel","_animatingToNextPosition","_scrollDelta","deltaY","_onWheelRAF","drawOnWheel","changeTail","curPos","curPosition","_phase","_tail","drawGradient","drawNextPositionAnimated","frames","_frames","drawImageData","_incrementalCurve","positions","phase","curveMax","curve","getPositions","distances","nextPos","tail","getNextPositions","_hctx","createImageData","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","getGradientImageData","colors","getAttribute","_canvas","fillStyle","fillRect","tails","nextPhaseOnIdx","inc","curves","_addedScrollListener","scrollAnimate","createCanvas","gradientRenderer","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","hexaToHsla","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","rgbaArray","hsl","getCurrentColor","maxX","maxY","posX","posY","lightnessX","lightnessY","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","pushToState","applyCurrentTheme","onColorChange","applyColor","getTheme","gridSection","grid","backgroundColor","isColored","uploadTempId","clicked","wallpapersByElement","elementsByKey","onUploadClick","file","access_hash","dc_id","file_reference","saveDoc","wallpaper","upload","addNotifyListener","_wallpaper","newDoc","newCacheContext","setBackgroundDocument","getWallpaperKey","addWallPaper","onResetClick","defaultTheme","themes","blurCheckboxField","blur","onGridClick","saveToCache","cacheStorage","_tempId","onReady","getPixelPromise","imageUrl","naturalWidth","naturalHeight","averageColor","create","getColorsFromWallpaper","getWallpaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","invokeApiHashable","accountWallpapers","wallpapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","stickerSetInput","onStickersClick","fileId","sendMessageWithDocument","h6","setOnlyOnePlayableGroup","stickersDiv","stickersFooter","btn","loadStickerSet","installed_date","toggleStickerSet","esgSticker","eachMinute","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","getQuickReaction","quickReaction","setDefaultReaction","minValue","writeValue","valueDiv","valueContainer","messagesTextSize","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","renderQuickReaction","loopCheckboxField","stickerSets","stickersContent","renderStickerSet","getAllStickers","allStickers","sets","firstNameInputField","bioInputField","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","userFull","getProfile","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","hasOwnProperty","originalFilter","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","loadAnimationPromise","player","documentFragmentToHTML","wrapDraftText","ul","getDialogOnly","hasPeer","renderMore","_length","onEditOpen","exclude_peers","onCreateOpen","filtersRendered","dialogFilter","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","onFiltersContainerUpdate","renderFolder","getSuggestedFilters","order","suggestedFilters","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","invokeApiCacheable","lang_pack","languages","language","lang_code","native_name","getLangPack","getCacheLangPack","langPack","confirmationPopup","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","debouncedSave","sizeMax","autoDownloadNew","file_size_max","MAX","upTo","compareAndUpdate","AUTO_DOWNLOAD_FOR_KEYS","private","autoCheckboxField","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","openTab","onDisabledChange","gifsCheckboxField","videosCheckboxField","peerKeys","enabledKeys","isAll","logOut","edit","changeAvatarBtn","updateChangeAvatarBtn","buttonsDiv","devicesRow","languageRow","buttonsSection","overwrite","getAuthorizationsPromise","getAuthorizations","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","withConfirm","btnConfirm","importContact","telInputField","lockWithPromise","peerTitle","validate","country_code","inputSearch","openContacts","sortedUserList","createList","renderPage","sortedLists","chatList","generateScrollable","scrollables","wasFilterId","setFilterId","onTabChange","isLocationWatched","errorCategory","retryBtn","locatedPeers","dialogSize","parseDistance","peopleSection","sortedList","btnMakeVisible","makeButton","btnMakeInvisible","btnCreateGroup","startWatching","stopWatching","distanceUnit","latestLocationSaved","accuracy","getLocated","updates","orderedPeers","groupsCounter","usersCounter","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","lat1","long1","lat2","long2","asin","formatNumber","fakeGradientDelimiter","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","filteredButtons","openUrl","sessionStorage","kz_version","isMainDomain","toolsBtn","btnMenuFooter","rel","stopPropagation","suffix","versionFull","newBtnMenu","updateBtn","reload","initSearch","archivedCount","unreadDialogsCount","navigationItem","noHistory","requestPeer","checkUpdateInterval","cache","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","peopleContainer","hideNewBtnMenuTimeout","onFocus","clearRecentSearchBtn","releaseSinglePeer","detailsMap","newGroupDiff","updateGroup","viaBotId","fwdFromId","removeBubble","insertObject","foundBubble","foundAtIndex","foundMidOnSameTimestamp","_timestamp","_mid","bubbleGroup","insertIndex","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","setMonth","getMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","setFullYear","getDate","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","getMinutes","getHours","popupCenterer","timeOptions","sendDate","dateOptions","day","weekday","firstDate","weekStartDate","getDay","renderElement","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","handler","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","sentinel","headerSentinel","addSentinel","disconnect","_reactionCount","reactionCount","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","center_icon","wrapPromise","wrapStickerPromise","displayOn","recentReactions","peer_id","isChosen","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","REACTIONS_ELEMENTS","onConnectCallback","reactionElement","isPlaceholder","disconnectedCallback","connectedCallback","changedResults","hasReactions","availableReactionsResult","isReactionActive","some","totalReactions","can_see_list","reactionElementIdx","recent_reactions","setCanRenderAvatars","renderCounter","renderAvatars","setIsChosen","handleChangedResults","childNodes","timeSpan","fireAroundAnimation","updated","postKey","replies","leftPart","recent_repliers","isUnread","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","setTime","chatType","editedSpan","sponsoredSpan","reactionsElement","reactionsMessage","isSponsored","sponsored","isMessage","views","postAuthor","post_author","fwd_from","postViewsSpan","channelViews","edit_date","edit_hide","pinned","getGroupsFirstMessage","inner","clonedArgs","_reactionsElement","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","reply_to_mid","replyToPeerId","reply_to","reply_to_peer_id","appPeersManager","originalPeerTitle","originalMessage","wrapSingleMessage","needUpdate","replyMid","getElementByPoint","verticalSide","horizontalSide","elementFromPoint","reflowScrollableElement","EMOJI_LANG_PACK","keywords","version","langCode","langPackCode","keywordLangPacks","indexedLangPacks","getKeywordsPromises","storageKey","stateStorage","pack","isObject","validateInitObject","from_version","keywordsDifference","packKeywords","keyword","emoticons","getEmojiKeywords","lastRequestedLangCode","getRecentEmojis","indexObject","emojis","indexEmojis","search","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","fixEmoji","appEmojiManager","loadedURLs","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","getEmojiFromElement","nodeType","nodeValue","closeScrollTop","onContentClick","onEmojiSelected","divs","category","titleDiv","itemsDiv","unified","emojiScroll","hasRecent","activeId","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","observeStickyHeaderChanges","scrollPromise","processInvisibleDiv","intersector","isVisible","getAnimations","checkAnimation","processVisibleDiv","gifWidth","gifHeight","willUseWidth","calcImageInBox","gifsContainer","masonry","EMOTICONSSTICKERGROUP","addLazyLoadQueueRepeat","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","recentStickers","queueCategoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","stickers","categoryPush","menuWrapper","menuScroll","getRecentStickers","pushRecentSticker","inlineResults","setHash","geo","accuracy_radius","botId","getGeoInput","stopTime","noErrorBox","botResults","queryId","query_id","savePhoto","generateQId","resultId","topPeers","botPeerId","topPeer","rating","setKeyValueToStorage","startParam","startBot","bot_inline_placeholder","peerData","setDraft","callbackAnswer","noLinks","noLinebreaks","queryAndResultIds","inlineResult","pushPopularBot","queryID","resultID","send_message","reply_markup","replyMarkup","sendText","inputMedia","sendMessage","getMediaInput","geoPoint","provider","venue_id","venue_type","phone_number","vcard","percent","sendOther","appInlineBotsManager","nextOffset","onGifsClick","gifsDiv","checkAnimations","newSearch","gifBotPeerId","resolveUsername","getInlineResults","setsDiv","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","renderSet","covered","searchStickerSets","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","dispatchResultableEvent","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","chatInput","savedRange","getGoodRange","lockIntersectionGroup","unlockIntersectionGroup","unlock","refresh","emojiTab","stickersTab","gifsTab","0","1","2","messageInput","HIDE_EMOJI_TAB","INIT_TAB_ID","getVisible","clearVisible","rangeCount","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","overflow","horizontal","visualViewport","windowWidth","innerWidth","windowHeight","innerHeight","INTERNAL_LINK_TYPE","chatInvite","request_needed","processUpdateMessage","putPhoto","peopleCount","numberThousandSplitter","clientHeight","scrollHeightMinusTop","useReflow","previousScrollHeightMinusTop","newScrollTop","setScrollTopSilently","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","observer","callbacks","queue","IGNORE_ACTIONS","SERVICE_AS_REGULAR","TEST_SCROLL","appStickersManager","appUsersManager","appPhotosManager","appProfileManager","appDraftsManager","appMessagesIdsManager","appChatsManager","appReactionsManager","appWebPagesManager","unreadOut","skippedMids","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueuePromise","messagesQueue","messagesQueueOnRender","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","random_id","apiManager","invokeApiSingle","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","chatInner","onDatePick","contactDiv","appImManager","callDiv","callUser","spoiler","showDuration","useRafs","spoilerTimeout","getReactionCount","bubbleMid","reply_to_top_id","lastMsgId","saved_from_msg_id","openThread","filterMessages","getDiscussionMessage","channel_id","via","peerIdStr","savedFrom","messageId","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","getMidsByMessage","isReplyClick","replyToMid","reply_to_msg_id","ignoreHeavyAnimation","scrollDimensions","sliceViewportDebounced","topbar","pinnedMessage","setCorrectIndexThrottled","lastScrollDirection","setStickyDateManually","distanceToEnd","getDistanceToEnd","requestHistory","setMessageId","setScroll","bubbleGroups","changeBubbleMid","setBubblePosition","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","reactionsElements","changeMessage","repliesElement","newDiv","grouped_id","newPoll","safeRenderMessage","scrollToBubbleIfLast","getGroupedBubble","updatePosition","scrollSaver","restore","deleteEmptyDateGroups","getBubbleByMessage","appendReactionsElementToBubble","deletedMids","renderedId","renderMaxId","groupedMessagesStorage","replyAfter","shouldReply","canSend","_target","initMessageReply","highlightBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","renderNewMessagesByIds","toNextPosition","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","isScrolledDown","setMessagesQueuePromise","performHistoryResult","postViewsElements","different","postViews","toggleObservingNew","incrementMessageViews","resizeObserver","wasHeight","resizing","skip","scrolled","part","rAF","onResizeEnd","offsetHeight","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","readUnreaded","readPromise","idle","focusPromise","bubblesMaxId","getHistoryStorage","readContents","isMentionUnread","readHistory","bad","grouped","getHistoryTopPromise","getHistoryBottomPromise","getHistory","onScrolledTop","loadMoreHistory","readMaxId","readOutboxMaxId","msgId","permanent","ignoreOnScroll","emptyPlaceholderMid","ignoreNextScrollEvent","deleteSelectedMids","setPaddingTo","isPaddingNeeded","paddingTop","unsetPadding","replyTo","getLastBubble","setTopPadding","scrollToBubbleEnd","lastDateGroup","getLastDateGroup","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","margin","axis","getNormalSize","dimensions","lastScrollPosition","scrollToBubble","lastElem","lastTime","firstTimestamp","datasetKey","today","bubbleContent","serviceMsg","createDateBubble","fakeBubble","bubblesToo","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","cancelMeasure","samePeer","topMessage","pinnedMessages","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","unread_count","foundSlice","findSliceOffset","Bottom","isJump","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","getBubbleByPoint","destroyResizeObserver","oldChatInner","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","lockGroup","unlockGroup","mountedByLastMsgId","findNextMountedBubbleByMsgId","lastBubble","onRenderScrollSet","afterSetPromise","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","onScrolledAllDown","unread_mark","markDialogUnread","canWrite","createResizeObserver","setUnreadDelimiter","local","getDateContainerByMessage","STICKY_OFFSET","addBubble","additionalCallback","multipleRender","albumMustBeRenderedFull","our","contentWrapper","wasClassNames","classNames","transitionDelay","originalMid","unread","chat_id","wrapMessageActionTextNew","renderMessagesQueue","is_single","messageMessage","messageMedia","getAlbumText","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","big","forward","containerDiv","rowDiv","buttonEl","same_peer","checkSwitchReturn","switchInlineQuery","column","callbackButtonClick","messageWithReplies","getMessageWithReplies","withReplies","fwdFrom","nameContainer","canHideNameIfMedia","processingWebPage","previewResizer","preview","quote","quoteTextDiv","mediaSize","site_name","strong","textDiv","isSquare","emojiSticker","animatedSticker","staticSticker","newNameContainer","wrapper","wrapGroupedDocuments","lastContainer","formatCallDuration","reason","contact","contactDetails","contactNameDiv","contactNumberDiv","wrapPoll","needName","titleVia","isForwardFromChannel","from_id","isHidden","from_name","getPeerColorById","goto","generateTail","documentContainer","documentMessageDiv","renderMessage","isBackLimit","hadScroll","getRenderedLength","viewportSlice","getViewportSlice","deleteViewportSlice","saved","getSaved","needReflowScroll","processLocalMessageRender","firstSlice","lastSlice","Top","getScheduledMessages","additionMsgIds","isAdditionRender","animateAsLadder","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","delay","lastMsDelay","topRes","middleRes","bottomRes","delays","listElements","getRestrictionReasonText","getGreetingSticker","renderEmptyPlaceholder","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","addOffset","service","generateLocalMessageId","getOutputPeer","saveMessages","extraSize","invisibleTop","invisibleBottom","foundVisible","visibleRect","array","minTop","maxBottom","ignoreScrollSaving","invisible","checkPlaceholders","cacheSeconds","sponsoredMessages","generateLocalFirstMessage","bot_info","checkIfEmptyPlaceholderNeeded","Both","resultPromise","isFirstMessageRender","processResult","historyResult","serviceStartMessageId","threadsServiceMessagesIdsStorage","sup","processPromise","waitPromise","times","mustBeCount","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","reportMessages","STICKER_EMOJI","preloadStickerPromise","preloadAnimatedEmojiSticker","buttonsEl","marginTop","canViewReadParticipants","canViewMessageReadParticipants","newMessage","btnClose","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","animationGroup","setOverrideIdleGroup","renderReaction","setVisible","scaleContainer","appearWrapper","selectWrapper","canUseAnimations","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","appPollsManager","appDocsManager","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","noForwards","viewerPeerId","canOpenReactedList","initResult","destroy","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","closest","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","hasTarget","isGoodType","setButtons","filterButtons","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","MAX_AVATARS","PADDING_PER_AVATAR","visibility","paddingRight","reactionsCount","fakeElem","readParticipants","isFull","totalSize","paddingLeft","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","weakMap","questionInputField","sendSilent","setPeerId","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","getRichValue","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","getMessageSendingParams","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","attachFile","willAttach","shouldCompress","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","caption_length_max","wasInputValue","messageInputField","attachFiles","groupCheckboxField","mediaCheckboxField","toPush","_file","lastModified","isMedia","sendingParams","sendAlbum","replyToMsgId","startsWith","source","objectURL","controls","videoHeight","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onload","isPhoto","isAudio","finish","onerror","mimeType","foundPhotos","foundVideos","foundFiles","n","firstType","appendGroupCheckboxField","appendMediaCheckboxField","albumContainer","appendMediaToContainer","onRender","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","hidden","onVisible","listType","noBlurOnPop","removeItem","attachNavigation","controller","addHelper","fromController","skipAnimation","hideOtherHelpers","onChangeScreen","getStickersByEmoticon","ready","getMinDate","getMaxDate","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","node","alt","getRichElementValue","caretPos","substr","combineSameEntities","firstChar","getBothEmojiKeywords","searchEmojis","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","ignoreCase","commands","botInfo","botCommand","command","found","getReadyToSend","helpers","toggleListNavigation","preserveHelper","insertAtCaret","topMsgId","trimmed","getMentions","onBodyTouchStart","btnHover","attachButtonListener","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","sendInlineResult","_checkQuery","gifsMasonry","isGallery","gallery","noCommands","separator","dcId","readBlobAsDataURL","dataURL","switch_pm","btnSwitchToPM","switchToPM","checkQuery","serverTimeManager","appNotificationsManager","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","setKeepAlive","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","webPage","saveWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","resetCurrentFormatting","botCommands","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","getEmojiEntityFromEmoji","onBtnSendClick","forwarding","releaseMediaPlayback","setSingleMedia","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","onGoDownClick","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","sendAsContainer","sendAsCloseBtn","sendAsButtons","previousAvatar","onSendAsMenuToggle","sendAsAvatar","sendAsBtnMenu","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","setUserId","attachMenuButtons","fileInput","accept","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","updateSendAs","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","decode","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","pinnedControlBtn","originalChat","pinnedMessageContainer","neededFakeContainer","getNeededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","isStartButtonNeeded","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","rMessage","setInputValue","inputFake","updateOffset","hasBotCommands","getUserFullResult","updateBotCommands","sendAsPeerId","updatingSendAsPromise","updateMessageInput","currentPeerId","channelFull","default_send_as","updateSendAsAvatar","updateMessageInputPlaceholder","executeButtonsUpdate","sendAsPeerIds","updateSendAsButtons","send_as","getChannelFull","getDefaultSendAs","updateSendAsResult","getSendAs","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","setStart","readAllHistory","commandsMap","bold","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","previousSibling","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","suggest","checkEmoticon","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","unicode","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","hideCaptionCheckboxField","replyFragment","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","usingFullAlbum","albumMids","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","floating","divAndCaption","CLASSNAME_BASE","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","onMuteClick","setVolume","iconIndex","ICONS","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","fromName","volumeSelector","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","animateFirst","currentIndex","clearRow","DURATION","reflow","clearRows","previousIndex","fromTop","ignorePrevious","setNewRow","previousRow","AnimatedCounter","previousNumber","animatedSuper","decimal","previousDecimalNumber","getRow","EMPTY_INDEX","previousByDecimal","decimalNumber","getDecimal","hideLeft","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","locked","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","debug","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setCorrectIndex","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","lastY","isDown","handleScrollSideEvent","refreshPosition","setScrollDownListener","handleFollowingPinnedMessage","isLast","setCount","writeTo","writeMediaTo","mutePeer","tsNow","ONE_HOUR","radioForm","appGroupCallsManager","verifyButtons","isMenuOpen","btnMore","menuButtons","getDeleteButtonText","buttonsToVerify","verifyVideoChatButton","currentGroupCall","groupCall","getChatTyped","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","onResize","resize","setUtilsRAF","chatUtils","chatAudio","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","followPinnedMessage","getSearchContext","activeScreen","onBtnBackClick","isFirstChat","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","wasPeerId","newPinnedMessage","appSearch","beginSearch","btnPickDate","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","canvases","instance","INSTANCES","fillCanvas","renderImageFromUrlPromise","crossOrigin","objectUrl","CanvasPattern","imageWidth","imageHeight","mask","globalCompositeOperation","large","setCanvasDimensions","renderToCanvas","backgroundEl","Log","Warn","Debug","backgroundTempId","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","patternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","contextMenu","constructUtils","constructPeerHelpers","constructPinnedHelpers","constructDiscussionHelpers","constructScheduledHelpers","setReactionsHoverListeners","cleanupBackground","searchTab","setAutoDownloadMedia","setLoadMutex","loadSidebarMedia","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","setPrefix","wasAlreadyUsed","addedListener","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","nodes","getSelectedNodes","currentMarkups","activeButtons","getActiveMarkupButton","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","containerRect","isFirstShow","setMouseUpEvent","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","amplitude","speedScale","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","stateId","createGradient","shader","getGradientFromType","x0","y0","createLinearGradient","MUTED_BY_ADMIN","addColorStop","UNMUTED","MUTED","CONNECTING","dt","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","raf","draw","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","matchMedia","setAmplitude","setCanvasSize","computedStyle","getProperty","getComputedStyle","getPropertyValue","playPart","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","startFrame","endFrame","frameCount","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","getItem","invoke","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","withIcons","icons","iconClassName","element2","actionClassName","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","mutedState","hideControls","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","canHideControls","showControls","toggleControls","ignoreClickClassName","relatedTarget","showOnLeaveToClassName","callVideoCanvasBlur","renderFrame","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","setup","displayPinned","shouldDisplay","shouldDisplayElement","isPinned","setPinned","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","setParticipant","_onLengthChange","onOpenProfileClick","popup","getPopups","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getParticipantByPeerId","getContainer","groupCallParticipantsVideo","getGroupCallParticipants","descriptionIntl","mediaDevices","_className","buttonDiv","isConfirm","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","handlers","resizeHandlerClassName","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setCursor","toggleMovable","movable","movableOptions","setPositionToCenter","destroyElements","toggleClassName","raise_hand_rating","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","onFullScreenChange","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","setThemeColor","movablePanel","isBig","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","CLOSED","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CALL_STATE","interval","connectionState","CONNECTED","PENDING","REQUESTING","EXCHANGING_KEYS","connectedAt","INIT_STATE","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","createVideoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","parseSignalingData","sdp","parseMediaSectionInfo","fingerprints","fingerprint","ufrag","pwd","screencast","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","sources","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","connection","call","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","sha256","digest","TextEncoder","encode","convertToUint8Array","p2pKey","seqMap","bufferConcats","msgKeyLarge","concatSHA256","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","seq","ArrayBuffer","setUint32","encryptPrepared","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","importKey","msgKeyEquals","encryptedDataSize","decryptionBuffer","constTimeIsDifferent","getUint32","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","addDataChannel","finalize","dir","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","sdpString","sdpMLineIndex","sdpMid","foundation","component","protocol","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","streamManager","canCreateConferenceEntry","lowBattery","videoRotation","Proxy","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","iceConnectionState","findEntry","recvEntry","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startScreenSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","appendToConference","startVideoSharingInternal","isSharingVideoType","audioTrack","getAudioTracks","CLOSING","clearHangUpTimeout","hangUpTimeout","phoneCall","canAccept","isClosing","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","encryptionKey","configuration","iceServers","connections","ipv6","port","password","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","bindPrefix","createPeerConnection","negotiate","sendIceCandidate","onTrack","createDescription","encryptor","decryptor","appendStreamToConference","createDataChannel","processDecryptQueue","dataChannelEntry","createEntry","sendEntry","dataChannel","negotiated","applyDataChannelData","parse","sendDataChannelData","encryptRawPacket","iceCandidate","parsed","p2pParseCandidate","key_fingerprint","computeKey","joinCall","emojisFingerprint","getEmojisFingerprintPromise","invokeCrypto","codePoints","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","unlockStreamManager","stream","onInputStream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","closeConnectionAndStream","hasVideo","discardCall","_codec","setData","transport","performCodec","vp8PayloadType","rtxIdx","apt","filterNotVP8","setDataToDescription","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","createDataChannelEntry","tryToReleaseCandidates","doTheMagic","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","decryptRawPacket","TextDecoder","signalingData","applyCallSignalingData","appAvatarsManager","onState","amplitudes","weave","currentDescription","instanceListenerSetter","isChangingInstance","clearCurrentInstance","callDescription","convertCallStateToGroupState","componentDidMount","componentWillUnmount","groupCallMicrophoneIconMini","throttledMuteClick","getCallInstance","weaveContainer","calls","instances","sortedInstances","updatePhoneCall","saveCall","phone_call","confirmCall","createCallInstance","admin_id","setPhoneCall","setHangUpTimeout","g_a_or_b","updatePhoneCallSignalingData","phone_call_id","onUpdatePhoneCallSignalingData","audioAsset","callId","isDiscarded","oldCall","safeReplaceObject","getCall","currentCall","hasConnected","playSound","stopSound","playSoundIfDifferent","hasCurrent","random_length","dhConfig","isVideo","fullInfo","participant_id","myVersion","compareVersion","connection_id","FOCUS_EVENT_NAME","columnEl","offline","updateStatusInterval","onHashChange","parseUriParams","tgaddr","replaceState","onclick","wrapUrl","postId","post","openUsername","userName","setSettings","chatsSelectTabDebounced","setLoop","setTimeFormat","timeFormat","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","canDrag","DragEvent","_types","dataTransfer","addFiles","backgroundPromises","isIDLE","updateStatus","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","oldVersion","deleteFilesIterative","headers","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typings","overlaysActive","typing","singleInstance","activateInstance","setToCache","topbarCall","discardCurrentCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","makeLink","VOICE_CHAT","PHONE_NUMBER_REG_EXP","USER_PHONE_NUMBER","PRIVATE_POST","thread","comment","MESSAGE","domain","attachKeydownListener","timeoutOperation","perf","performance","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isOverlayActive","altKey","goodMid","nextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","saveApiChat","resolvePhone","wrappedUrl","noPathnameParams","pathname","noUriParams","openComment","generateThreadServiceStartMessage","getCallByUserId","phone_calls_private","startCallInternal","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","getGroupCallFull","saveGroupCall","createGroupCall","broadcastEvent","STATE_INIT","getBackground","setBackground","setCurrentBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","getFromCache","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","prevTab","prevIdx","attachDragAndDropListeners","handleSelection","drops","mediaDrops","mount","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","appendDrops","drop","setPath","transitionTime","setUserStatus","fromIndex","justReturn","spliced","chatFrom","beforeDestroy","chatIndex","spliceChats","existingIndex","oldChat","setType","dot","eye","getPeerTypings","langPackKeys","multi","mapa","typingElement","getTypingElement","htmlToSpan","descriptionElement","ignoreSelf","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","onPlaybackRackMenuToggle","onPip","onPipClose","playbackRateButton","skin","stylePlayer","setBtnMenuToggle","initDuration","buildControls","timeDuration","pipButton","fullScreenButton","timeElapsed","leftControls","requestPictureInPicture","debounceTime","debouncedPip","listener","toggleFullScreen","nextIdx","PLAYBACK_RATES","onFullScreen","setPlaybackRateIcon","pictureInPictureEnabled","rate","PLAYBACK_RATES_ICONS","webkitEnterFullscreen","enterFullscreen","topButtons","author","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","ctrlKeyDown","changeZoom","onKeyUp","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","onlyMobile","authorRight","zoom","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","lockControls","zoomSwipeHandler","lastDiffY","addProgress","btnMenuToggle","setMoverToTarget","appMediaViewer","removeGlobalListeners","toggleOverlay","setGlobalListeners","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","toLeft","windowW","newTransform","p1","newMover","oldAvatar","replaceChild","setAuthorInfo","isDocument","useContainerAsTarget","moveTheMover","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","otherMediaViewer","releaseSingleMedia","toggleGlobalListeners","setPictureInPicture","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","updateMediaSource","cancellablePromise","attachPromise","haveImage","captionTimeout","isForDocument","onAuthorClick","savePhotoFile","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","onCaptionClick","cantForwardMessage","cantDownloadMessage","setCaption","_openMedia","onAvatarUpdate","removeFromAvatarsCache","getFullPhoto","getTarget","hadMessage","isAvatarCached","believeMe","addedToQueue","newPeerId","getPeerMigratedTo","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","ConnectionStatus","SENDING_STATUS","hadConnect","connecting","timedOut","updating","setConnectionStatus","baseDcId","setFirstConnectionTimeout","connectionStatus","online","Connected","forceGetDifference","TimedOut","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","forceReconnect","timerSpan","forceReconnectTimeout","setStateTimeout","statusContainer","constructContainer","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","RADIUS","groupCallActiveIcon","START_X","startTime","wasMounted","itemProgress","startAnimation","indexKey","appDialogsManager","addListDialog","isBatch","folders","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","onChatsRegularScroll","sliceTimeout","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","allChatsIntlElement","addFilter","onStateLoaded","foldersScrollable","filtersNavigationItem","spliceItems","setPlaybackParams","changeFiltersAllChatsKey","getDialogIndexKey","hasClassName","getDialogDom","setOnlineStatus","processDialogForCallStatus","setFilterUnreadCount","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessages","setDialogActive","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","savePeerSettings","getNotifyPeerTypeSettings","initListeners","renderFiltersPromise","showFiltersPromise","storagesResults","addMissedDialogs","fillConversations","migratedTo","testDialogForFilter","topOffset","getOffsetIndex","bottomOffset","isDialogMustBeInViewport","unreadSpan","getFolder","foundUnmuted","getAll","sortedDialogList","clientWidth","wasShowing","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","cccc","offsetDialog","classNameType","subtitleArgs","placeholderContainer","generateEmptyPlaceholder","wrapLocalSticker","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","lastMessage","highlightWord","setUnread","draftMessage","lastTimeSpan","videoTypes","playIcon","withoutMediaType","sender","senderBold","setStatusMessage","disableAnimationIfRippleFound","setSendingStatus","statusSpan","hasUnreadBadge","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","transitionDuration","isMention","originalDialog","getDialog","setCallStatus","call_not_empty","getMessageSenderPeerIdOrName","addDialog","_dialog","captionDiv","titleSpanContainer","titleP","rightSpan","oldTypingElement","newTypingElement","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","default","prototype","AudioContext","webkitAudioContext","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","getUserMedia","WebAssembly","clearStream","getTracks","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","gain","setTargetAtTime","onstart","destroyWorker","Function","ScrollableBase","logPrefix","onScrollMeasure","needCheckAfterAnimation","scrollPosition","scrollProperty","addedScrollListener","removeHeavyAnimationListener","addScrollListener","removeScrollListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","ScrollableX","splitCount","scrollHorizontally","deltaX","CheckboxField","stateValue","stateValues","checkSvg","bg","withHover","currentHashPromise","newHashPromise","new_settings","newAlgo","new_algo","salt1","getRandomValues","randomize","hashes","new_password_hash","inputCheckPassword","setUser"],"mappings":"uFAAA,sDAUe,MAAMA,UAA2B,IAK9C,YAAYC,EAA6B,IACvCC,MAAM,OAAD,QACHC,WAAW,GACRF,IAPA,KAAAG,iBAAkB,EAyClB,KAAAC,kBAAqBC,IAC1B,YAAYA,GACZC,KAAKH,iBAAmBG,KAAKH,gBAE7BG,KAAKC,cAAcC,UAAUC,OAAO,aAAcH,KAAKH,iBACtDG,KAAKI,MAA2BC,KAAOL,KAAKH,gBAAkB,OAAS,WACxEG,KAAKM,6BAA+BN,KAAKM,+BArCzC,MAAMF,EAAQJ,KAAKI,MACnBA,EAAMC,KAAO,WACbD,EAAMG,aAAa,WAAY,IAC/BH,EAAMI,KAAO,qBACbJ,EAAMK,aAAe,MAUrB,MAAMC,EAAWC,SAASC,cAAc,SACxCF,EAASR,UAAUW,IAAI,YACvBH,EAASI,UAAY,EACrBJ,EAASL,KAAO,WAChBD,EAAMW,cAAcC,QAAQN,GAC5BN,EAAMW,cAAcE,aAAaP,EAASQ,YAAad,EAAMe,aAE7D,MAAMlB,EAAgBD,KAAKC,cAAgBU,SAASC,cAAc,QAClEX,EAAcC,UAAUW,IAAI,iBAAkB,SAE9Cb,KAAKoB,UAAUlB,UAAUW,IAAI,wBAC7Bb,KAAKoB,UAAUC,OAAOpB,GAEtBA,EAAcqB,iBAAiB,QAAStB,KAAKF,mBAC7CG,EAAcqB,iBAAiB,WAAYtB,KAAKF,sB,iCCjDrC,SAASyB,EAASC,EAA+BC,GAC9D,MAAMC,EAAMF,EAAOG,OACnB,GAAGD,IAAQD,EAAOE,OAChB,OAAO,EAGT,IAAI,IAAIC,EAAI,EAAGA,EAAIF,IAAOE,EACxB,GAAGJ,EAAOI,KAAOH,EAAOG,GACtB,OAAO,EAIX,OAAO,EAZT,mC,iCCAA,8CAae,SAASC,EAAgBC,EAAiBC,GAAmB,GAC1E,IAAG,KAAwBA,GAAoBpB,SAASqB,gBAAkBF,EAK1E,GADAA,EAAGG,aAC+B,IAAxBC,OAAOC,mBAAgE,IAAzBxB,SAASyB,YAA6B,CAC5F,IAAIC,EAAQ1B,SAASyB,cACrBC,EAAMC,mBAAmBR,GACzBO,EAAME,UAAS,GACf,IAAIC,EAAMN,OAAOC,eACjBK,EAAIC,kBACJD,EAAIE,SAASL,QAER,QAA4C,IAAlC1B,SAASgC,KAAKC,gBAAiC,CAE9D,IAAIC,EAAYlC,SAASgC,KAAKC,kBAC9BC,EAAUC,kBAAkBhB,GAC5Be,EAAUN,UAAS,GACnBM,EAAUE,Y,iCChCd,8CAUe,MAAMC,EAMnB,YAAsBC,EAAkDC,GAAlD,KAAAD,qBAAkD,KAAAC,OAHjE,KAAAC,UAAY,EAIjBnD,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,yBAGxB,OACL,OAAGb,KAAKoD,YAAoBpD,KAAKoD,YAC1BpD,KAAKoD,YAAc,IAAaC,qBAAqB,CAC1DjC,UAAWpB,KAAKoB,UAChBkC,MAAM,EACNC,UAAU,EACVC,MAAOxD,KAAKkD,KACZO,OAAQzD,KAAKkD,KACbQ,SAAS,GAER,4BAA4BC,KAAKC,IAElC5D,KAAK6D,UAAYD,EACjB5D,KAAK6D,UAAUvC,iBAAiB,aAAcwC,KAGX,IAA7B9D,KAAK6D,UAAUE,WAAmBD,GAAgB9D,KAAKmD,YAC1B,IAA9BnD,KAAK6D,UAAUE,WAAoBD,GAAgB9D,KAAKmD,aACvDnD,KAAK6D,UAAUG,SAAS,GACxBhE,KAAK6D,UAAUI,WAIrBjE,KAAKiD,mBAAmB3C,4BAA8B,KACjDN,KAAKiD,mBAAmBpD,iBACzBG,KAAK6D,UAAUK,aAAa,GAC5BlE,KAAK6D,UAAUM,SAAW,EAC1BnE,KAAKmD,UAAY,GACjBnD,KAAK6D,UAAUO,SAEfpE,KAAK6D,UAAUK,cAAc,GAC7BlE,KAAK6D,UAAUM,SAAW,GAC1BnE,KAAKmD,UAAY,EACjBnD,KAAK6D,UAAUO,SAIZ,IAAaC,kBAAkBT,KAInC,SACF5D,KAAK6D,WACN7D,KAAK6D,UAAUS,Y,iCChErB,8CAUe,MAAMC,EAWnB,YAAsBC,EAAkCtB,GAAlC,KAAAsB,aAAkC,KAAAtB,OAR9C,KAAAuB,IAAM,GACN,KAAAtB,UAAY,EAQpBnD,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,yBAE7B,MAAMT,EAAQoE,EAAWpE,MAEzBA,EAAMkB,iBAAiB,OAAQ,KAC7BtB,KAAK0E,cAAc,KAGrBtE,EAAMkB,iBAAiB,QAAUvB,IAC/BC,KAAK0E,cAAcF,EAAWG,MAAMhD,UAUjC,cAAcA,GACnB,IAAI3B,KAAK6D,UAAW,OAGpB,IAAIe,GADJjD,EAASkD,KAAKC,IAAInD,EAAQ,MAGxBiD,EAAQC,KAAKE,MAAMF,KAAKC,IAAI9E,KAAKyE,IAAK9C,IAAW,IAAM3B,KAAKyE,KAAO,OAEhEzE,KAAKgF,gBACNhF,KAAKgF,cAAcC,MAAK,GACxBjF,KAAKgF,cAAcE,OAAOC,MAAMC,QAAU,QAG5CpF,KAAK6D,UAAUqB,OAAOC,MAAMC,QAAU,IAYtCR,EAAQ,EAIV,MAAMb,EAAY/D,KAAKmD,UAAYyB,GAAS,EAAI,EAGhD5E,KAAK6D,UAAUK,aAAaH,GACN,IAAnB/D,KAAKmD,WAA6B,IAAVyB,GACzB5E,KAAK6D,UAAUG,SAAS,GAI1BhE,KAAKmD,UAAYyB,EAEjB5E,KAAK6D,UAAUO,OAMV,OACL,OAAGpE,KAAKoD,YAAoBpD,KAAKoD,YAC1BpD,KAAKoD,YAAciC,QAAQC,IAAI,CACpC,IAAajC,qBAAqB,CAChCjC,UAAWpB,KAAKoB,UAChBkC,MAAM,EACNC,UAAU,EACVC,MAAOxD,KAAKkD,KACZO,OAAQzD,KAAKkD,MACZ,4BAA4BS,KAAKE,IAClC7D,KAAKgF,cAAgBnB,EAGjB7D,KAAKwE,WAAWG,MAAMhD,QACxBkC,EAAUO,OAGL,IAAaC,kBAAkBR,KAGxC,IAAaR,qBAAqB,CAChCjC,UAAWpB,KAAKoB,UAChBkC,MAAM,EACNC,UAAU,EACVC,MAAOxD,KAAKkD,KACZO,OAAQzD,KAAKkD,MACZ,gCAAgCS,KAAKC,IACtC5D,KAAK6D,UAAYD,EAEb5D,KAAKwE,WAAWG,MAAMhD,SACxB3B,KAAK6D,UAAUqB,OAAOC,MAAMC,QAAU,QAGxCpF,KAAK6D,UAAUvC,iBAAiB,aAAcwC,KAIX,IAA7B9D,KAAK6D,UAAUE,WAAmBD,GAAgB9D,KAAKmD,YAC1B,IAA9BnD,KAAK6D,UAAUE,WAAoBD,GAAgB9D,KAAKmD,aACzDnD,KAAK6D,UAAUG,SAAS,GACxBhE,KAAK6D,UAAUI,SAGG,IAAjBH,GAAyC,IAAnB9D,KAAKmD,WAGzBnD,KAAKgF,gBACNhF,KAAKgF,cAAcE,OAAOC,MAAMC,QAAU,GAC1CpF,KAAKgF,cAAcZ,OACnBpE,KAAK6D,UAAUqB,OAAOC,MAAMC,QAAU,UAMrC,IAAaf,kBAAkBT,OAKrC,SACF5D,KAAK6D,WAAW7D,KAAK6D,UAAUS,SAC/BtE,KAAKgF,eAAehF,KAAKgF,cAAcV,Y,iCCtJ9C,8CAQe,MAAMiB,UAAuB,IAC1C,YAAY7F,GAIVC,MAAM,OAAD,QACHC,WAAW,GACRF,IAGL,MAAMU,EAAQJ,KAAKI,MACnBA,EAAMC,KAAO,MACbD,EAAMG,aAAa,WAAY,IAC/BH,EAAMK,aAAe,MAErB,IAAI+E,EAAa,EACjBxF,KAAKI,MAAMkB,iBAAiB,QAAUvB,IACpCC,KAAKI,MAAMF,UAAUoE,OAAO,SAC5BtE,KAAKyF,WAEL,MAAMd,EAAQ3E,KAAK2E,MAAMe,QAAQ,MAAO,IAAIC,MAAM,EAAGjG,EAAQiC,QAC7D3B,KAAK4F,iBAAiBjB,GAEtB,MAAMhD,EAAS3B,KAAK2E,MAAMhD,OAC1B,GAAGA,IAAWjC,EAAQiC,OACpBjC,EAAQmG,OAAO7F,KAAK2E,YACf,GAAGhD,IAAW6D,EACnB,OAGFA,EAAa7D,O,iCCtCnB,uEAYe,MAAMmE,UAAsB,IAIzC,YAAYpG,EAER,IACFC,MAAM,OAAD,QACHoG,MAAO,mCAEPvF,KAAM,SACHd,IAVC,KAAAsG,QAAS,EACV,KAAAC,UAAY,GAYjBjG,KAAKoB,UAAUlB,UAAUW,IAAI,qBAE7B,IAAIqF,EAAQlG,KAAKI,MACjB,GAAG8F,aAAiBC,iBAClBD,EAAM7F,KAAO,MACb6F,EAAMzF,aAAe,qBAChB,CACLyF,EAAME,UAAY,UAElB,MAAMC,EAAanE,OAAOoE,iBAC1B,GAAGD,EAAa,EAAG,CACjB,IAAIE,EACD,IACDA,GAA8B,IAAdF,EACR,MACRE,EAAgB,GAGlBL,EAAMf,MAAMqB,YAAY,mBAAoBD,EAAgB,MAG9D,MAAME,EAAezG,KAAK4F,iBAAiBc,KAAK1G,MAChDA,KAAK4F,iBAAoBjB,IACvB8B,EAAa9B,GACb,YAAgB3E,KAAKI,OAAO,IAIhC8F,EAAM5E,iBAAiB,QAAS,KAE9B4E,EAAMhG,UAAUoE,OAAO,SAEvB,MAAMK,EAAQ3E,KAAK2E,MAUnB,IAAIgC,EATS9B,KAAK+B,IAAIjC,EAAMhD,OAAS3B,KAAKiG,UAAUtE,QAC1C,IAAM3B,KAAKgG,QAAU,KAC7BhG,KAAK4F,iBAAiB5F,KAAKiG,UAAYtB,GAGzC3E,KAAKgG,QAAS,EAEdhG,KAAKyF,WAGL,IAAIoB,EAAmBC,EAAsBC,EAA8BC,EAAc,GACnD,MAAnChH,KAAK2E,MAAMe,QAAQ,MAAO,KAC3B1F,KAAK4F,iBAAiB,MAEtBe,EAAuB,YAAkB3G,KAAK2E,OAC9CkC,EAAYF,EAAqBE,UACjCC,EAAUH,EAAqBG,QAC/BE,EAAcL,EAAqBK,YACnCD,EAAcJ,EAAqBM,KACnCjH,KAAK4F,iBAAiB5F,KAAKiG,UAAYY,EAAY,IAAMA,EAAY,KAGvEX,EAAMgB,QAAQF,YAAcA,EAI5BtH,EAAQyH,SAAWzH,EAAQyH,QAAQR,KAGrCT,EAAM5E,iBAAiB,QAAS,KAC9BtB,KAAKgG,QAAS,IAQhBE,EAAM5E,iBAAiB,WAAavB,IAElC,MAAMqH,EAAMrH,EAAEqH,IACd,GAAG,KAAKC,KAAKD,KAAUrH,EAAEuH,UAAWvH,EAAEwH,SAAoB,cAARH,IAAiC,MAARA,IAAerH,EAAEyH,UAE1F,OADAzH,EAAE0H,kBACK,O,iLCnGf,MAAM,EAAM,IAAI,KAA4BC,OAAO,IAAI,MAIxC,MAFoB,IAAIC,IAAI,G,gCCK5B,SAASC,EAAyBjD,GAM/C,OAAAkD,EAAA,GAAelD,EAAMmD,QAAS,CAACC,EAASC,EAAKC,KACrCF,EAAmCG,OAAoDC,QAC3FF,EAAIG,OAAOJ,EAAK,QACGK,IAAhB1D,EAAM2D,SACL3D,EAAM2D,S,YCDD,MAAM,EAoBnB,YAAY5I,GAlBL,KAAA6I,SAAgB,GAChB,KAAAC,KAAY,GAEZ,KAAAC,SAAU,EAIP,KAAAC,UAAY,GACZ,KAAAC,aAAe,GAKf,KAAAC,aAAc,EACd,KAAAC,eAAgB,EAKxB,OAAAC,EAAA,GAAW9I,KAAMN,GAGZ,WAAW6I,EAAeC,EAAWC,GAC1CzI,KAAKuI,SAAWA,EAChBvI,KAAKwI,KAAOA,EACZxI,KAAKyI,QAAUA,EAGjB,YACE,YAAsBJ,IAAfrI,KAAKsI,MAAsBtI,KAAKuI,SAAS5G,QAAU,EAcrD,MAAMoH,GAAY,GACvB/I,KAAKgJ,aAAUX,EACfrI,KAAKuI,SAAW,GAChBvI,KAAKwI,KAAO,GACZxI,KAAKiJ,WAAU,EAAMF,GACrB/I,KAAKiJ,WAAU,EAAOF,GAGjB,GAAGpH,EAAgBuH,GAAe,GACvC,IAAIC,EAAYC,EAChB,GAAGzH,EAAS,EAAG,CAGb,GAFAwH,EAAQnJ,KAAKwI,KAAKJ,OAAO,EAAGzG,GAC5ByH,EAAOD,EAAME,OACTD,EACF,YAGkBf,IAAjBrI,KAAKgJ,SAAuBG,EAAMG,QAAQtJ,KAAKgJ,SAClDhJ,KAAKuI,SAASgB,QAAQJ,OACjB,CAGL,GAFAA,EAAQnJ,KAAKuI,SAASH,OAAOvD,KAAKJ,IAAI,EAAGzE,KAAKuI,SAAS5G,OAASA,IAAUA,GAC1EyH,EAAOD,EAAMK,SACTJ,EACF,YAGkBf,IAAjBrI,KAAKgJ,SAAuBG,EAAMI,KAAKvJ,KAAKgJ,SAC/ChJ,KAAKwI,KAAKc,WAAWH,GAavB,OAVGnJ,KAAKwI,KAAK7G,OAAS3B,KAAK2I,cACzB3I,KAAKyJ,MAAMzJ,KAAKyI,SAGfzI,KAAKuI,SAAS5G,OAAS3B,KAAK2I,cAC7B3I,KAAKyJ,KAAKzJ,KAAKyI,SAGjBzI,KAAKgJ,QAAUI,EACfF,GAAgBlJ,KAAK0J,QAAU1J,KAAK0J,OAAON,EAAMzH,EAAS,GACnD3B,KAAKgJ,QAGJ,aAAaW,GAClBA,EAAY3J,KAAKuI,SAASgB,KAAKvJ,KAAKgJ,SAClChJ,KAAKwI,KAAKc,QAAQtJ,KAAKgJ,SAE5BhJ,KAAKgJ,aAAUX,EAGV,SAAS1G,EAAgBuH,GAC9B,MAAMU,EAAajI,EAAS,EAAIkD,KAAKJ,IAAI,EAAG9C,EAAS3B,KAAKwI,KAAK7G,QAAUkD,KAAKC,IAAI,EAAGnD,EAAS3B,KAAKuI,SAAS5G,QACtGyH,EAAOpJ,KAAK6J,GAAGlI,GAAQiI,GAAqBV,GAMlD,MAAO,CACLE,KAAOQ,OAAoBvB,EAAPe,EACpBQ,cAIM,UAAUE,EAAenF,GAEjC,OADmBmF,EAAO9J,KAAK6I,cAAgB7I,KAAK4I,eAAiBjE,IAKlEmF,EAAM9J,KAAK6I,cAAgBlE,EACzB3E,KAAK4I,YAAcjE,EAEpBA,IACCmF,EAAM9J,KAAK+J,gBAAkB,KAC3B/J,KAAKgK,cAAgB,OAGrB,GAIF,KAAKC,GACV,GAAGA,EAAQjK,KAAK6I,cAAgB7I,KAAK4I,YAAa,OAAOvD,QAAQ6E,UAEjE,IAGIC,EAHAC,EAAUH,EAAQjK,KAAK+J,gBAAkB/J,KAAKgK,cAClD,OAAGI,IAIDD,EADCF,EACQjK,KAAKyI,QAAUzI,KAAKuI,SAAS,GAAKvI,KAAKwI,KAAKxI,KAAKwI,KAAK7G,OAAS,GAE/D3B,KAAKyI,QAAUzI,KAAKwI,KAAKxI,KAAKwI,KAAK7G,OAAS,GAAK3B,KAAKuI,SAAS,GAG1E4B,YAAWnK,KAAKgJ,SAChBoB,EAAUpK,KAAKqK,SAASF,EAAQF,EAAOjK,KAAK0I,WAAW/E,KAAK2G,IAC1D,IAAIL,EAAQjK,KAAK+J,gBAAkB/J,KAAKgK,iBAAmBI,EACzD,OAGCE,EAAOnB,MAAMxH,OAAS3B,KAAK0I,WAC5B1I,KAAKiJ,UAAUgB,GAAO,QAGN5B,IAAfrI,KAAKsI,QACNtI,KAAKsI,MAAQgC,EAAOhC,OAASgC,EAAOnB,MAAMxH,SAG7BsI,EAAQK,EAAOnB,MAAMoB,QAAQ7D,KAAK4D,EAAOnB,OAAStB,EAAA,EAAenB,KAAK,KAAM4D,EAAOnB,QAC1FC,IACN,MAAMoB,EAAYxK,KAAKyK,YAAczK,KAAKyK,YAAYrB,GAAQA,EAE1DoB,IAEDP,EACEjK,KAAKyI,QAASzI,KAAKuI,SAASe,QAAQkB,GAClCxK,KAAKwI,KAAKe,KAAKiB,GAEjBxK,KAAKyI,QAASzI,KAAKwI,KAAKe,KAAKiB,GAC3BxK,KAAKuI,SAASe,QAAQkB,MAI/BxK,KAAK0K,cAAgB1K,KAAK0K,gBACzB,QAAU/G,KAAK,KACbsG,EAAOjK,KAAK+J,gBAAkB,KAC5B/J,KAAKgK,cAAgB,OAGzBC,EAAOjK,KAAK+J,gBAAkBK,EAC5BpK,KAAKgK,cAAgBI,EAEnBA,ICrLI,MAAM,UAAqE,EAMxF,YAAY1K,EAAoH,IAC9HC,MAAM,OAAD,wBACAD,GAAO,CACV2K,SAAU,CAACF,EAAQF,EAAOvB,KACxB,MAAMiC,EAAYV,EAAQ,EAAIvB,EAC9B,IAAIkC,EAAQT,aAAM,EAANA,EAAQU,IAKpB,YAHaxC,IAAVuC,IAAqBA,EAAQ5K,KAAK8K,cAAcF,OAC/CX,IAAOW,EAAQ,IAAsBG,mBAAmBH,EAAO,IAE5D,IAAmBI,UAAU,OAAD,wBAC9BhL,KAAK8K,eAAa,CACrBG,OAAQjL,KAAK8K,cAAcG,SAAUd,aAAM,EAANA,EAAQc,QAC7CL,QACAM,MAAOP,EAAY,EAAIjC,EACvBiC,eACChH,KAAKgB,IAKkC,kCAArC3E,KAAK8K,cAAcK,YAAYC,GAChCxD,EAAyBjD,GAGxBA,EAAM0G,YACPrL,KAAK8K,cAAcQ,SAAW3G,EAAM0G,WAG/B,CAAC/C,MAAO3D,EAAM2D,MAAOa,MAAOxE,EAAMmD,YAG7C2C,YAAc1C,IAEZ,GADiB/H,KAAKuL,WAAW,CAACxD,EAAQ8C,MAC7BlJ,OAIb,OAAOjC,EAAQ+K,YAAY1C,OA4BvB,KAAAyD,gBAAkB,EAAEP,SAAQQ,WACpC,MAAMC,EAAmBtC,GAAeA,EAAK6B,SAAWA,GAAUQ,EAAKE,IAAIvC,EAAKyB,KAC1Ee,EAAS,CAACxC,EAAYpB,EAAaC,KACpCyD,EAAgBtC,IACjBnB,EAAIG,OAAOJ,EAAK,IAIpB,OAAAH,EAAA,GAAe7H,KAAKuI,SAAUqD,GAC9B,OAAA/D,EAAA,GAAe7H,KAAKwI,KAAMoD,GAEvB5L,KAAKgJ,SAAW0C,EAAgB1L,KAAKgJ,WACtChJ,KAAKgJ,aAAUX,EAKFrI,KAAK6L,WAChB7L,KAAK6L,cAKD,KAAAC,qBAAwBC,IAGhC,QAAmC1D,IAAhCrI,KAAK8K,cAAckB,SACpB,OAIF,IAAIhM,KAAK4I,aAAe5I,KAAKgK,cAC3B,OAGF,MAAMiC,EAAOF,EAAI/L,KAAK8K,cAAcG,QACpC,IAAIgB,EACF,OAGF,MAAMC,EAASC,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAE7CC,EADWxM,KAAKuL,WAAWW,GACRO,IAAI1E,GAAW/H,KAAKyK,YAAY1C,IAAU6D,OAAOc,SACvEF,EAAQ7K,SAgBL3B,KAAKgJ,QAGPhJ,KAAKwI,KAAKe,QAAQiD,GAFlBxM,KAAKuI,SAASgB,QAAQiD,KAOlB,KAAAG,cAAgB,EAAE5E,cAC1B/H,KAAK8L,qBAAqB,CACxB,CAAC/D,EAAQkD,QAAS,IAAItD,IAAI,CAACI,EAAQ8C,SA7FrC+B,EAAA,EAAUtL,iBAAiB,iBAAkBtB,KAAKwL,iBAClDoB,EAAA,EAAUtL,iBAAiB,sBAAuBtB,KAAK8L,sBACvDc,EAAA,EAAUtL,iBAAiB,eAAgBtB,KAAK2M,eAE5CjN,EAAQmN,UACV7M,KAAK8M,gBAAkB,IAAI,EAAiB,OAAD,wBACtCpN,GAAO,CACVmN,SAAS,MASL,WAAWZ,GACnB,MAAMc,EAAU/M,KAAK8K,cAAckC,YACjC,IAAmBC,4BAA4BjN,KAAK8K,cAAcG,QAClE,IAAmBiC,mBAAmBlN,KAAK8K,cAAcG,QAE1D,OADiB,IAAmBkC,uCAAuCnN,KAAK8K,cAAcK,YAAYC,EAAGa,EAAMc,EAASd,EAAKtK,QA6E7H,iBAAiByL,GACtBpN,KAAK8K,cAAgBsC,OAEc/E,IAAhCrI,KAAK8K,cAAckB,WACpBhM,KAAK4I,aAAc,OAEgBP,IAAhCrI,KAAK8K,cAAcQ,WACpBtL,KAAK6I,eAAgB,IAIe,kCAArC7I,KAAK8K,cAAcK,YAAYC,IAChCpL,KAAK4I,aAAc,IAGe,IAAjC5I,KAAK8K,cAAcuC,YACpBrN,KAAK6I,cAAgB7I,KAAK4I,aAAc,GAGvC5I,KAAK8M,iBACN9M,KAAK8M,gBAAgBQ,iBAAiBF,GAInC,QACLzN,MAAM4N,QACNvN,KAAK8K,mBAAgBzC,EAElBrI,KAAK8M,iBACN9M,KAAK8M,gBAAgBS,QAIlB,cACL,IAAIhF,EAAWvI,KAAKuI,SAMpB,OAJGvI,KAAK8M,kBACNvE,EAAWA,EAASb,OAAO1H,KAAK8M,gBAAgBvE,WAG3CA,EAGF,UACL,IAAIC,EAAOxI,KAAKwI,KAMhB,OAJGxI,KAAK8M,kBACNtE,EAAOA,EAAKd,OAAO1H,KAAK8M,gBAAgBtE,OAGnCA,EAGF,a,MACL,OAAOxI,KAAKgJ,UAA+B,QAApB,EAAAhJ,KAAK8M,uBAAe,eAAE9D,SAGvC,aAAarH,GACnB,OAAGA,EAAS,EAAU3B,KAAK6J,IAAI7J,KAAKuI,SAAS5G,QACjC3B,KAAK6J,GAAG7J,KAAKwI,KAAK7G,QAGzB,QAAQA,EAAgBuH,G,MAC7B,IAAIsE,EAEJ,GAAuB,QAApB,EAAAxN,KAAK8M,uBAAe,eAAE9D,QAAS,CAEhC,GADAwE,EAAMxN,KAAK8M,gBAAgBW,SAAS9L,EAAQuH,GACzCsE,EAAIpE,KACL,OAAOoE,EAAIpE,KAIb,MADAzH,EAAS6L,EAAI5D,YACC,EAAI5J,KAAK8M,gBAAgBtE,KAAOxI,KAAK8M,gBAAgBvE,UAAU5G,OAAQ,CAEnF,KADeA,EAAS,EAAI3B,KAAK8M,gBAAgBlE,YAAc5I,KAAK8M,gBAAgBjE,eAElF,OAIF,GAAIlH,EAAS,IAAmD,IAA7C3B,KAAK8M,gBAAgBhC,cAAcF,OAAe5K,KAAK8M,gBAAgBjE,gBACvFlH,EAAS,IAAmD,IAA7C3B,KAAK8M,gBAAgBhC,cAAcF,OAAe5K,KAAK8M,gBAAgBlE,aACvF,OAAO5I,KAAK8M,gBAAgBY,aAAa/L,GAG3C3B,KAAK8M,gBAAgBa,aAAahM,EAAS,IAK/C,GADA6L,EAAMxN,KAAKyN,SAAS9L,EAAQuH,IACxBsE,EAAIpE,KAAM,CACZ,GAAGpJ,KAAK4I,aAAe5I,KAAK6I,cAC1B,OAAO7I,KAAK0N,aAAa/L,GACjB3B,KAAK8M,kBACbnL,EAAS6L,EAAI5D,WACb4D,EAAMxN,KAAK8M,gBAAgBW,SAAS9L,EAAQuH,GAEzCsE,EAAIpE,MACLpJ,KAAK2N,aAAahM,EAAS,IAKjC,OAAO6L,aAAG,EAAHA,EAAKpE,KAOJ,UAAUU,EAAenF,G,MACjC,MAAMiJ,EAAUjO,MAAMsJ,UAAUa,EAAMnF,GAEtC,GAAGiJ,GACD5N,KAAK8M,iBACLnI,IACkC,KAAhB,QAAlB,EAAA3E,KAAK8K,qBAAa,eAAEuC,WACuC,CAC3D,MAAM5E,EAAUzI,KAAK4I,YACrB5I,KAAK8M,gBAAgBQ,iBAAiB,OAAD,wBAChCtN,KAAK8K,eAAa,CACrBF,MAAOnC,EAAU,EAAI,KAIvBzI,KAAK8M,gBAAgBrE,QAAUzI,KAAKyI,QACpCzI,KAAK8M,gBAAgB7D,UAAUR,GAAS,GACxCzI,KAAK8M,gBAAgBrD,MAAMhB,GAG7B,OAAOmF,EAGF,UACL5N,KAAKuN,QACLX,EAAA,EAAUiB,oBAAoB,iBAAkB7N,KAAKwL,iBACrDoB,EAAA,EAAUiB,oBAAoB,sBAAuB7N,KAAK8L,sBAC1Dc,EAAA,EAAUiB,oBAAoB,eAAgB7N,KAAK2M,eACnD3M,KAAK6L,eAAYxD,EAEdrI,KAAK8M,kBACN9M,KAAK8M,gBAAgBgB,UACrB9N,KAAK8M,qBAAkBzE,I,2DCjStB,MAAM,EAKX,YAAmB7H,EAAoCH,EAAsB0N,GAAY,EAAMC,EAAoBC,GAAY,EAAaC,GAAa,EAAaC,GAAnJ,KAAA3N,OAAoC,KAAAH,OAAsB,KAAA0N,YAA+D,KAAAG,aAA0B,KAAAC,UACpKnO,KAAKoO,KAAO,GAAkBC,iBAC9BrO,KAAKoB,UAAYT,SAASC,cAAc,OACrCoN,IAAWhO,KAAKoB,UAAU4M,UAAYA,GAEtCxN,IACDR,KAAKsO,OAAS3N,SAASC,cAAc,OACrCZ,KAAKsO,OAAOpO,UAAUW,IAAI,sBACN,iBAAX,GACPb,KAAKsO,OAAOjN,OAAO,YAAKb,IAE1BR,KAAKoB,UAAUC,OAAOrB,KAAKsO,SAG7BtO,KAAKoB,UAAUlB,UAAUW,IAAI,eAAgB,gBAAkBR,GAC/DL,KAAKoB,UAAUC,OAAOrB,KAAKoO,MAC3BpO,KAAKoB,UAAU+D,MAAMC,QAAU,OAE5B6I,GACD,GAAkBM,qBAAqBvO,KAAKoO,KAAMD,OAAS9F,EAAW6F,GAI1E,QACElO,KAAKoB,UAAU+D,MAAMC,QAAU,OAE5BpF,KAAK+N,YACN/N,KAAKoO,KAAKI,UAAY,IAI1B,YACExO,KAAKoB,UAAU+D,MAAMC,QAAU,GAGjC,SACKpF,KAAKoO,KAAKK,kBACXzO,KAAK0O,YAEL1O,KAAK2O,SAOI,MAAM,EAiBnB,YAAmBvN,EAA+BwN,EAAiCC,EAAgEC,GAAhI,KAAA1N,YAA+B,KAAAwN,cAAiC,KAAAC,eAAgE,KAAAC,WAhB3I,KAAAC,SAAW,EACX,KAAAC,aAAe,EACf,KAAAC,YAAc,EAEd,KAAAC,cAA+B,KAC/B,KAAAC,cAAwB,EAExB,KAAAC,MAAQ,GAER,KAAAC,eAAiC,KAGjC,KAAAC,SAAW,EAKjBtP,KAAKuP,WAAa,IAAI,IAAWvP,KAAKoB,WACtCpB,KAAKqP,eAAiBrP,KAAKuP,WAAWnO,UACtC,IAAI,IAAIQ,KAAK5B,KAAK6O,aAChB7O,KAAKqP,eAAehO,OAAOrB,KAAK6O,aAAajN,GAAsBR,WAGlEpB,KAAK6O,aAAaW,UACnBxP,KAAKuP,WAAWE,oBAAoBzP,KAAK6O,aAAaW,SAASpB,MAGjEpO,KAAK4O,YAAYc,SAAY/K,IAM3B3E,KAAKoP,MAAQzK,EACb3E,KAAKuN,OAAM,GACXvN,KAAK2P,cAGP3P,KAAKuP,WAAWK,iBAAmB,KAC7B5P,KAAKoP,MAAMS,SAEX7P,KAAKmP,gBACPnP,KAAKmP,cAAgBjN,OAAO4N,WAAW,KACrC9P,KAAK2P,aACL3P,KAAKmP,cAAgB,GACpB,MAKF,MAAM7J,GAAM,GACdA,IACDtF,KAAK4O,YAAYjK,MAAQ,GACzB3E,KAAKoP,MAAQ,GACbpP,KAAKiL,YAAS5C,EACdrI,KAAKsP,SAAW,GAGlBtP,KAAK+O,SAAW,EAChB/O,KAAKgP,aAAe,EACpBhP,KAAKiP,YAAc,EAEnB,IAAI,IAAIrN,KAAK5B,KAAK6O,aAChB7O,KAAK6O,aAAajN,GAAsB+M,QAG1C3O,KAAKkP,cAAgB,KAGhB,YAAYjE,EAAiBqE,EAAW,EAAGF,EAAQ,IACxDpP,KAAKiL,OAASA,EACdjL,KAAKsP,SAAWA,EAEbtP,KAAKoP,QAAUA,IAChBpP,KAAK4O,YAAYpK,WAAWG,MAAQyK,GAGtCpP,KAAK4O,YAAYxO,MAAM6B,QAGlB,aACL,GAAGjC,KAAKkP,cAAe,OAAOlP,KAAKkP,cAEnC,MAAME,EAAQpP,KAAKoP,MAEnB,IAAIA,EAAMS,OAER,YADA7P,KAAK8O,UAAY9O,KAAK8O,SAAS,IAIjC,IAAwB,IAArB9O,KAAKiP,YAAqBjP,KAAKgP,aAAehP,KAAKiP,WACpD,OAAO5J,QAAQ6E,UAGjB,MAAMU,EAAQ5K,KAAK+O,UAAY,EAE/B,OAAO/O,KAAKkP,cAAgB,IAAmBlE,UAAU,CACvDC,OAAQjL,KAAKiL,OACbmE,QACAjE,YAAa,CAACC,EAAG,4BACjBR,QACAM,MAAO,GACPoE,SAAUtP,KAAKsP,WACd3L,KAAKoM,IAGN,GAFA/P,KAAKkP,cAAgB,KAElBlP,KAAK4O,YAAYjK,QAAUyK,EAC5B,OAKF,MAAM,MAAC9G,EAAK,QAAER,GAAWiI,EAEtBjI,EAAQnG,QAAUmG,EAAQ,GAAG+C,MAAQ7K,KAAK+O,UAC3CjH,EAAQ0B,QAGV,MAAMwG,EAAchQ,KAAK6O,aAAaW,SAEtC1H,EAAQyC,QAASxC,IACf,IACE,MAAMkD,EAASjL,KAAKiL,OAASlD,EAAQkI,OAASlI,EAAQkD,OACtD,GAAkBiF,2BAA2B,CAC3CjF,SACA7J,UAAWpB,KAAKuP,WAChBY,YAAY,EACZC,WAAY,GACZC,WAAW,EACXtI,UACAqH,UAEF,MAAMkB,GACNC,QAAQC,MAAM,mCAAoCF,MAItDN,EAAY7P,SAEZH,KAAK+O,SAAWjH,EAAQnG,QAAUmG,EAAQA,EAAQnG,OAAS,GAAGkJ,KAErC,IAAtB7K,KAAKgP,cACNhP,KAAKgP,YAAc,GAErBhP,KAAKgP,aAAelH,EAAQnG,QAEJ,IAArB3B,KAAKiP,aACNjP,KAAKiP,WAAa3G,EAEf0H,EAAY1B,QACb,OAAAmC,EAAA,GAAeT,EAAY1B,OAAQ,YAAKhG,EAAQ,4BAA8B,8BAA+B,CAACA,KAGhHtI,KAAK8O,UAAY9O,KAAK8O,SAAS9O,KAAKiP,eAErCyB,MAAMJ,IACPC,QAAQC,MAAM,eAAgBF,GAC9BtQ,KAAKkP,cAAgB,Q,YCpNZ,MAAM,EAWnB,YAAYyB,EAA0BjB,GAL/B,KAAAkB,UAAY,GACZ,KAAAC,QAAU,EA+BjB,KAAA1J,QAAU,KACR,IAAInH,KAAK0P,SAAU,OAEnB,IAAI/K,EAAQ3E,KAAK2E,MAIdA,IAAU3E,KAAK4Q,YAChB5Q,KAAK4Q,UAAYjM,EACjBmM,aAAa9Q,KAAK6Q,SAClB7Q,KAAK6Q,QAAU3O,OAAO4N,WAAW,KAC/B9P,KAAK0P,SAAS/K,IACb,OAIP,KAAAoM,aAAe,KACb/Q,KAAK2E,MAAQ,GACb3E,KAAK0P,UAAY1P,KAAK0P,SAAS,IAC/B1P,KAAKgR,SAAWhR,KAAKgR,WA7CrBhR,KAAKwE,WAAa,IAAI,IAAW,CAC/BmM,cACA/Q,WAAW,IAGbI,KAAKoB,UAAYpB,KAAKwE,WAAWpD,UACjCpB,KAAKoB,UAAUlB,UAAUoE,OAAO,eAChCtE,KAAKoB,UAAUlB,UAAUW,IAAI,gBAE7Bb,KAAK0P,SAAWA,EAEhB1P,KAAKI,MAAQJ,KAAKwE,WAAWpE,MAC7BJ,KAAKI,MAAMF,UAAUW,IAAI,sBAEzB,MAAMoQ,EAAatQ,SAASC,cAAc,KAC1CqQ,EAAW/Q,UAAUW,IAAI,QAAS,gBAElCb,KAAKkR,SAAWvQ,SAASC,cAAc,KACvCZ,KAAKkR,SAAShR,UAAUW,IAAI,QAAS,WAAY,eAEjDb,KAAKI,MAAMkB,iBAAiB,QAAStB,KAAKmH,SAC1CnH,KAAKkR,SAAS5P,iBAAiB,QAAStB,KAAK+Q,cAE7C/Q,KAAKoB,UAAUC,OAAO4P,EAAYjR,KAAKkR,UAyBzC,YACE,OAAOlR,KAAKwE,WAAWG,MAGzB,UAAUA,GACR3E,KAAK4Q,UAAYjM,EACjBmM,aAAa9Q,KAAK6Q,SAClB7Q,KAAKwE,WAAWG,MAAQA,EAGnB,SACLmM,aAAa9Q,KAAK6Q,SAClB7Q,KAAKI,MAAMyN,oBAAoB,QAAS7N,KAAKmH,SAC7CnH,KAAKkR,SAASrD,oBAAoB,QAAS7N,KAAK+Q,e,6CClErC,MATI,CAAC/C,EAAoBtO,EAAuE,KAC9F,YAAO,WAAY,OAAF,QAC9ByR,KAAMnD,QAAa3F,GAChB3I,I,sSCiBQ,MAAM,EAcnB,YAAY0R,EAAuBC,GACjCrR,KAAKsR,aAAaF,EAAQC,GAGrB,aAAaD,EAAuBC,GAAc,GACvDrR,KAAKoR,OAASA,EACdpR,KAAKqR,YAAcA,EAEnBrR,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,WAAY,uBAGzCb,KAAKuR,OAAS5Q,SAASC,cAAc,OACrCZ,KAAKuR,OAAOrR,UAAUW,IAAI,kBAE1Bb,KAAKwR,SAAW,EAAW,4BAA6B,CAACC,UAAU,IACnEzR,KAAK0R,MAAQ/Q,SAASC,cAAc,OACpCZ,KAAK0R,MAAMxR,UAAUW,IAAI,yBACzBb,KAAKuR,OAAOlQ,OAAOrB,KAAKwR,SAAUxR,KAAK0R,OAGvC1R,KAAK2R,QAAUhR,SAASC,cAAc,OACtCZ,KAAK2R,QAAQzR,UAAUW,IAAI,mBAE3Bb,KAAKuP,WAAa,IAAI,IAAWvP,KAAK2R,aAAStJ,OAAWA,GAAW,GAErErI,KAAKoB,UAAUC,OAAOrB,KAAKuR,OAAQvR,KAAK2R,SAExC3R,KAAKoR,OAAOQ,OAAO5R,MAEnBA,KAAK6R,eAAiB,IAAI,IAGrB,QACL,OAAO7R,KAAKoR,OAAOU,SAAS9R,MAGjB,QAAQ+R,G,yCACnB,GAAG/R,KAAKgS,KACN,IACE,MAAM1H,EAAStK,KAAKgS,OACpBhS,KAAKgS,KAAO,KAET1H,aAAkBjF,gBACbiF,GAER,MAAMgG,GACNC,QAAQC,MAAM,iBAAkBF,GAIpCtQ,KAAKoR,OAAOa,UAAUjS,SAGd,QAIH,sBACFA,KAAKqR,cACNrR,KAAKoR,OAAOc,KAAKC,OAAOnS,MACxBA,KAAKoB,UAAUkD,UAGdtE,KAAK6R,gBACN7R,KAAK6R,eAAeO,YAId,SAAShL,GACjBpH,KAAK0R,MAAMlD,UAAY,GACvBxO,KAAK0R,MAAMrQ,OAAO,YAAK+F,KAIpB,MAAM,UAAgC,EAK3C,YAAYgK,GACVzR,MAAMyR,GACNpR,KAAKqS,cAAgB,IAAI,IAG3B,sBAGE,OAFArS,KAAKqS,cAAcC,cAAc,WACjCtS,KAAKqS,cAAcvE,UACZnO,MAAM4S,uB,YC/GF,MAAM,EASnB,YAAY7S,GAPL,KAAA8S,cAA6C,GAI5C,KAAAC,cAAe,EA0BhB,KAAAC,gBAAkB,KACVC,EAAA,EAAwBC,eAAe5S,KAAK6S,gBAEvDF,EAAA,EAAwBG,KAAK9S,KAAK6S,gBAC1B7S,KAAKwS,cAAc7Q,QAC3B3B,KAAK8R,SAAS9R,KAAKwS,cAAcxS,KAAKwS,cAAc7Q,OAAS,KAK1D,KAAAmQ,SAAW,CAACiB,EAA8BC,EAAmBC,KAClE,QAAU5K,IAAP0K,GAAoB/S,KAAKwS,cAAcxS,KAAKwS,cAAc7Q,OAAS,KAAOoR,EAC3E,OAAO,EAIT,MAAMG,EAAYlT,KAAKwS,cAAcnJ,MACrCrJ,KAAKmT,WAAWD,EAAWF,EAASC,GAEpC,MAAMG,EAAMpT,KAAKwS,cAAcxS,KAAKwS,cAAc7Q,OAAS,GAE3D,OADA3B,KAAKqT,gBAAmBhL,IAAR+K,EAAqBA,aAAe,EAAiBA,EAAIhS,UAAYgS,EAAQpT,KAAKyS,cAAgB,EAAI,EAAIO,IACnH,GAtCP,OAAAlK,EAAA,GAAW9I,KAAMN,GAEbM,KAAKkS,OACPlS,KAAKkS,KAAO,IAAIoB,KAGlBtT,KAAKuT,cAAgBvT,KAAKwT,UAAUC,cAAc,mBAClDzT,KAAKqT,WAAa,YAAiBrT,KAAKuT,cAAe,aA3BnC,KA4BhBvT,KAAKyS,cACPzS,KAAKqT,WAAW,GAGlBlH,MAAMC,KAAKpM,KAAKwT,UAAUE,iBAAiB,0BAAkDnJ,QAAQzI,IACnG,YAAiBA,EAAI9B,KAAK0S,mBA4BvB,UAAUK,GAKf,GAAG/S,KAAKwS,cAAcxS,KAAKwS,cAAc7Q,OAAS,KAAOoR,EACvD,OAAO,EAGT,MAAMK,EAAiBL,aAAc,EAAiBA,EAAK/S,KAAKkS,KAAKyB,IAAIZ,GAyBzE,OAxBGK,IACEA,EAAIQ,QACLR,EAAIQ,SAGHR,EAAIS,oBACL/D,WAAW,KACTsD,EAAIS,sBA9EU,MAoFlBlB,EAAA,EAAwBmB,SAAS,CAC/BzT,KAAML,KAAK6S,eACXkB,MAAQC,IACNhU,KAAK8R,cAASzJ,EAAW2L,GAAY,IAC9B,KAKbhU,KAAKwS,cAAcjJ,KAAKwJ,GACxB/S,KAAKqT,WAAWN,aAAc,EAAiBA,EAAG3R,UAAY2R,IACvD,EAGF,qBAAqBA,GAC1B,OAAAkB,EAAA,GAAiBjU,KAAKwS,cAAeO,GACrC/S,KAAKmT,WAAWJ,OAAI1K,GAGf,kBAAkB6L,EAA6CC,GACpE,IAAI,IAAIvS,EAAI5B,KAAKwS,cAAc7Q,OAAS,EAAGC,GAAK,IAAKA,EAAG,CACtD,MAAMwR,EAAMpT,KAAKwS,cAAc5Q,GAC/B,GAAGwR,IAAQe,EAAX,CACK,GAAGf,aAAec,EACrB,MAGFlU,KAAKoU,qBAAqBhB,KAKvB,OAAOc,GACZ,OAAOlU,KAAKwS,cAAc6B,KAAKC,GAAKA,aAAaJ,GAG5C,YAAYA,GACjB,QAASlU,KAAKuU,OAAOL,GAGb,WAAWnB,EAA6BC,EAAkBC,GAC9DA,GACFN,EAAA,EAAwB6B,aAAaxU,KAAK6S,gBAAgB,GAG5D,MAAMO,EAAiBL,aAAc,EAAiBA,EAAK/S,KAAKkS,KAAKyB,IAAIZ,GACtEK,IACEA,EAAIqB,SACLrB,EAAIqB,UAGHrB,EAAIb,qBACLzC,WAAW,KACTsD,EAAIb,uBAzIU,MA+If,OAAOa,GACRA,EAAIhS,UAAUL,gBAChBf,KAAKuT,cAAclS,OAAO+R,EAAIhS,WAE3BgS,EAAI5B,UACL4B,EAAI5B,SAASlQ,iBAAiB,QAAStB,KAAK0S,mB,qBCvJrC,MAAM,EAKnB,YAAYhD,GACV1P,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,eAE7Bb,KAAKkF,OAASvE,SAASC,cAAc,UACrCZ,KAAKkF,OAAOhF,UAAUW,IAAI,sBAE1Bb,KAAKmR,KAAOxQ,SAASC,cAAc,QACnCZ,KAAKmR,KAAKjR,UAAUW,IAAI,QAAS,mBAEjCb,KAAKoB,UAAUC,OAAOrB,KAAKkF,OAAQlF,KAAKmR,MAExC,YAAiBnR,KAAKoB,UAAW,MAC/B,IAAI,KAAcsT,KAAK1U,KAAKkF,OAAQwK,KAIjC,QACO1P,KAAKkF,OAAOyP,WAAW,MAC/BC,UAAU,EAAG,EAAG5U,KAAKkF,OAAO1B,MAAOxD,KAAKkF,OAAOzB,SCtBxC,MALM,CAAC/D,EAAwG,KAC7G,YAAO,mCAAqCA,EAAQsO,UAAY,IAAMtO,EAAQsO,UAAY,IAAKtO,GCoBjG,MAAM,UAAuB,EAA5C,c,oBAEU,KAAAmV,aAAyC,KAEzC,KAAAC,WAAqB,EAQnB,OACR9U,KAAKoB,UAAUlB,UAAUW,IAAI,uBAC7Bb,KAAK+U,SAAS,YAEd/U,KAAKgV,WAAa,IAAI,EAAYC,IAChCjV,KAAK6U,aAAeI,IAGtB,MAAMC,EAAU,IAAI,GAAe,IAE7BC,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3Bb,KAAKoV,oBAAsB,IAAI,IAAW,CACxCrP,MAAO,yBACPsP,UAAW,MAGbrV,KAAKsV,wBAA0B,IAAI,IAAW,CAC5CvP,MAAO,eACPvF,KAAM,WACN+U,aAAa,IAGfJ,EAAa9T,OACXrB,KAAKoV,oBAAoBhU,UACzBpB,KAAKsV,wBAAwBlU,WAG/BpB,KAAKoV,oBAAoBhV,MAAMkB,iBAAiB,QAAS,KAEvD,IAAIkU,IADUxV,KAAKoV,oBAAoBzQ,MACdhD,SAAW3B,KAAKoV,oBAAoBhV,MAAMF,UAAUuV,SAAS,SACnFzV,KAAK8U,YAAWU,EAAaA,KAAgBxV,KAAK0V,sBAAwB1V,KAAK2V,qBAClF3V,KAAK4V,QAAQ1V,UAAUC,OAAO,eAAgBqV,KAGhDxV,KAAK4V,QAAU,EAAa,CAACzE,KAAM,eAEnCnR,KAAK4V,QAAQtU,iBAAiB,QAAS,KACrC,MAAMoQ,EAAQ1R,KAAKoV,oBAAoBzQ,MAEvC,GAAG3E,KAAK8U,UAAU,CAChB,IAAI9U,KAAK2V,sBAAwB3V,KAAK0V,mBAAoB,OAC1D,IAAgBG,cAAc,CAC5BnE,QACAoE,MAAO,GACPC,UAAW,OAAF,QACP3K,EAAG,iBACApL,KAAK0V,oBAEVM,QAAShW,KAAK2V,oBACdM,WAAW,IACVtS,KAAMuS,IACJlW,KAAK6U,cACN7U,KAAK6U,eAAelR,KAAMwS,IACxB,IAAgBC,UAAUF,EAAQC,KAInCnW,KAAKqW,QAAQ1U,QACd,IAAgB2U,gBAAgBJ,EAAQlW,KAAKqW,SAG/C,GAAejC,qBAAqBpU,MACpC,GAAeiS,UAAU,UAG3BjS,KAAK4V,QAAQW,UAAW,EACxB,IAAgBC,WAAW9E,EAAO1R,KAAKqW,QAAQ5J,IAAIxB,GAAUA,EAAOwL,aAAa9S,KAAMuS,IAClFlW,KAAK6U,cACN7U,KAAK6U,eAAelR,KAAMwS,IACxB,IAAgBC,UAAUF,EAAQC,KAItC,GAAe/B,qBAAqBpU,MACpC,GAAeiS,UAAU,OAK/B,MAAMyE,EAAe,IAAI,GAAe,CACtClW,KAAM,UACNmW,SAAU,CAAC3W,KAAKqW,QAAQ1U,UAGpByM,EAAOpO,KAAKoO,KAAO,GAAkBC,eAAe,CACxDuI,KAAK,IAGPF,EAAa/E,QAAQtQ,OAAO+M,GAE5B8G,EAAQvD,QAAQtQ,OAAOrB,KAAKgV,WAAW5T,UAAW+T,GAElDnV,KAAK2R,QAAQtQ,OAAOrB,KAAK4V,SACzB5V,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,UAAWsV,EAAatV,WAGlD,sBACLpB,KAAKgV,WAAWrG,QAChB3O,KAAK6U,aAAe,KACpB7U,KAAKoV,oBAAoBzQ,MAAQ,GACjC3E,KAAKsV,wBAAwBlU,UAAUlB,UAAUW,IAAI,QACrDb,KAAK4V,QAAQW,UAAW,EAGnB,KAAKF,EAAmBvB,GAAqB,GAClD9U,KAAK8U,UAAYA,EACjB9U,KAAKqW,QAAUA,EACf,MAAM/L,EAAS3K,MAAM+U,OAwBrB,OAvBApK,EAAO3G,KAAK,KACPmR,GACD9U,KAAK+U,SAAS,qBACd/U,KAAKsV,wBAAwBlU,UAAUlB,UAAUoE,OAAO,QACxDtE,KAAKsV,wBAAwB1P,iBAAiB,IAAKiR,OAAO,WAAW,IACrE7W,KAAK8W,iBAEL9W,KAAKsV,wBAAwBlU,UAAUlB,UAAUW,IAAI,QAGvDb,KAAKqW,QAAQ9L,QAAQwM,IACnB,MAAM,IAACC,GAAO,GAAkBC,aAAa,CAC3CC,OAAQH,EACR3V,UAAWpB,KAAKoO,KAChB+B,YAAY,EACZgH,eAAe,EACf/G,WAAY,KAGd4G,EAAII,gBAAgB/V,OAAO,IAAgBgW,oBAAoBN,QAI5DzM,EAGD,gBACNgN,UAAUC,YAAYC,mBAAoBC,IACxCzX,KAAK0V,mBAAqB,CACxBgC,IAAKD,EAASE,OAAOC,SACrBC,KAAMJ,EAASE,OAAOG,WAGxB,IAAIC,EAAM,8CACVA,GAAO,QAAQN,EAASE,OAAOC,SAC/BG,GAAO,QAAQN,EAASE,OAAOG,UAC/BC,GAAO,eACPA,GAAO,oBACPA,GAAO,sBACPC,MAAMD,GACLpU,KAAMsU,GAAaA,EAASC,QAC5BvU,KAAMsU,IACLjY,KAAK2V,oBAAsBsC,EAASE,aACpCnY,KAAKsV,wBAAwB1P,iBAAiBqS,EAASE,iBAEvD3H,IACCA,aAAiB4H,yBAClBpY,KAAKsV,wBAAwB1P,iBAAiB,mDAE9C5F,KAAKsV,wBAAwB1P,iBAAiB,iD,idCrKtD,MAAMyS,GAAwB,MAC5B,IACE,OAAO,OAAcf,UAAUgB,UAAUC,MAAM,mBAAmB,GAAK,GACvE,MAAMjI,GACN,OAAO,IAJmB,GAm5B9B,MAAMkI,GAA6B,IAz3B5B,MAoCL,cAME,GAxCM,KAAAC,MAAoD,IAAInF,IACxD,KAAAoF,UAAiD,IAAIpF,IACrD,KAAAqF,aAAoD,IAAIrF,IAIxD,KAAAsF,oBAA0E,IAAItF,IAC9E,KAAAuF,6BAAkF,IAAIvF,IACtF,KAAAwF,wBAAoE,GAkBpE,KAAAC,cAAmD,CACzDC,MAAO,EACPC,MAAO,EACPC,MAAO,GAqGF,KAAAC,aAAe,CAACC,EAAoCX,EAAQzY,KAAKqZ,gBACnEZ,IACDA,EAAMa,YAAczU,KAAKJ,IAAI,EAAGgU,EAAMa,aAAeF,EAAQG,YAxJ/C,OA4JX,KAAAC,YAAc,CAACJ,EAAoCX,EAAQzY,KAAKqZ,gBAClEZ,IACDA,EAAMa,YAAczU,KAAKC,IAAI2T,EAAMgB,SAAUhB,EAAMa,aAAeF,EAAQG,YA9J5D,OAkKX,KAAAG,OAAS,CAACN,EAAoCX,EAAQzY,KAAKqZ,gBAC7DZ,IACDA,EAAMa,YAAcF,EAAQO,WA4GxB,KAAAC,oBAAuBnB,IAC7B,MAAMW,EAAUpZ,KAAK2Y,aAAahF,IAAI8E,GAChCoB,EAAM,IAAeC,OAAOV,EAAQW,OAC1B,UAAbF,EAAIxZ,MAAoBwZ,EAAIG,mBAAqB3B,IAClDrY,KAAKia,uBAAuBxB,GAI9B,MAAMyB,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxDpB,EAAM4B,IAAMH,EAAaI,IAEtBta,KAAKqZ,eAAiBZ,IACvBA,EAAM8B,aAAeva,KAAKua,aAEV,UAAbV,EAAIxZ,OACLoY,EAAMnV,KAAOtD,KAAKsD,OAKtB,MAAMkX,EAAMxa,KAAK8Y,wBAAwBe,EAAI9G,IAC1CyH,IACDA,EAAIrI,OAAOsG,GAEP+B,EAAItX,aACClD,KAAK8Y,wBAAwBe,EAAI9G,MAsMtC,KAAA0H,OAAU1a,IAChB,MAAM0Y,EAAQ1Y,EAAE2a,OACVtB,EAAUpZ,KAAK2Y,aAAahF,IAAI8E,IAChC,OAACxN,EAAM,IAAEJ,GAAOuO,EAIhBuB,EAAM3a,KAAK2a,IACdA,GACDA,EAAI1W,QAGN,MAAM8D,EAAU/H,KAAK4a,kBAAkBnC,GAGvC,GADsBzY,KAAKqZ,eACNZ,EAAO,CAC1BzY,KAAKiF,OACLjF,KAAK6a,SAASpC,EAAO1Q,GAErB,MAAM+S,EAAUC,GAAuBA,EAAQlQ,MAAQA,GAAOkQ,EAAQ9P,SAAWA,EAC3E+P,EAAahb,KAAKgb,WAClBhS,EAAUgS,EAAWC,aAC3B,IAAIjS,IAAY8R,EAAO9R,GAAU,CAC/B,MAAMT,EAAWyS,EAAWE,cAE5B,IACIC,EADAnT,EAAMO,EAAS6S,UAAUN,IAEjB,IAAT9S,EACDmT,IAAe5S,EAAS5G,OAASqG,IAEjCA,EAAMgT,EAAWK,UAAUD,UAAUN,IACzB,IAAT9S,IACDmT,EAAanT,EAAM,KAIX,IAATA,EACEmT,GACDnb,KAAK6J,GAAGsR,GAAY,GAGtBnb,KAAKsb,WAAW,CAACrQ,SAAQJ,SAM/BiF,WAAW,KACN9P,KAAKqZ,eAAiBZ,GAIzB7L,EAAA,EAAU0F,cAAc,aAActS,KAAKub,sBAC1C,IAGG,KAAAC,QAAWzb,IAYjB6M,EAAA,EAAU0F,cAAc,gBAGlB,KAAAmJ,QAAW1b,IACjB,IAAIA,EAAE2b,UACJ,OAGF1b,KAAKwb,QAAQzb,GAIb,MAAMib,EAAahb,KAAKgb,YACrBhb,KAAK2b,kBACJ3b,KAAK+E,QAASiW,EAAWhS,SAAYgS,EAAWxS,KAAK7G,SACtDqZ,EAAWK,UAAU1Z,QACrB3B,KAAKwI,SACNxI,KAAKiF,OACL2H,EAAA,EAAU0F,cAAc,gBA8BrB,KAAAlO,KAAO,IACLpE,KAAKG,QAAO,GAGd,KAAA8D,MAAQ,IACNjE,KAAKG,QAAO,GAGd,KAAA8E,KAAO,CAACwT,EAAQzY,KAAKqZ,gBAC1B,IAAIZ,EACF,OAAO,EAUT,GAPIA,EAAMmD,QACRnD,EAAMxU,QAGRwU,EAAMa,YAAc,EACpB,aAAcb,EAAO,SAElBA,IAAUzY,KAAKqZ,aAAc,CAC9B,MAAMD,EAAUpZ,KAAK2Y,aAAahF,IAAI8E,GACtC,GAAGW,aAAO,EAAPA,EAASyC,MAAO,CACjBpD,EAAM4B,IAAM,GACZ,MAAMpP,EAASmO,EAAQnO,OACjB6Q,EAAI1C,EAAQpM,YAAchN,KAAK0Y,UAAY1Y,KAAKyY,MAChD1L,EAAU+O,EAAEnI,IAAI1I,GACnB8B,IACDA,EAAQoF,OAAOiH,EAAQvO,KAEnBkC,EAAQ7J,MACV4Y,EAAE3J,OAAOlH,IAIbwN,EAAMnU,SAENtE,KAAK2Y,aAAaxG,OAAOsG,GAG3BzY,KAAKqZ,kBAAehR,EACpBrI,KAAK+b,sBAAmB1T,EAG1B,OAAO,GAGF,KAAA2T,SAAY5S,IACjB,MAAM,OAAC6B,EAAM,IAAEJ,GAAOzB,EAChB4D,EAAchN,KAAK8K,cAAckC,YACzBhN,KAAKic,SAAShR,EAAQJ,EAAKmC,GAMnC5I,OAEN0L,WAAW,KACT9P,KAAKkc,2BAA2BjR,EAAQJ,EAAKmC,IAC5C,IAGE,KAAAnD,GAAK,CAAClI,EAAgBuH,KAC3B,MAAM8R,EAAahb,KAAKgb,WACxB,IAAGhb,KAAK2b,iBAAoBX,EAI5B,MAA6B,UAA1Bhb,KAAK+b,iBACCf,EAAWmB,QAAQxa,EAAQuH,GAE3B8R,EAAWnR,GAAGlI,EAAQuH,IAY1B,KAAAkT,YAAcpc,KAAKqc,oBAAqBpD,GAAUjZ,KAAKG,QAAO,EAAM8Y,IACpE,KAAAqD,aAAetc,KAAKqc,oBAAqBpD,GAAUjZ,KAAKG,QAAO,EAAO8Y,IACtE,KAAAsD,YAAcvc,KAAKqc,oBAAqBpD,GAAUjZ,KAAKiF,KAAKgU,IAC5D,KAAAuD,oBAAsBxc,KAAKqc,oBAAoB,CAACpD,EAAOG,IAAYpZ,KAAKmZ,aAAaC,EAASH,IAC9F,KAAAwD,mBAAqBzc,KAAKqc,oBAAoB,CAACpD,EAAOG,IAAYpZ,KAAKwZ,YAAYJ,EAASH,IAC5F,KAAAyD,cAAgB1c,KAAKqc,oBAAoB,CAACpD,EAAOG,IAAYpZ,KAAK0Z,OAAON,EAASH,IAClF,KAAA0D,YAAc3c,KAAKqc,oBAAqBpD,GAAUA,GAASjZ,KAAKwI,QAChE,KAAAoU,gBAAkB5c,KAAKqc,oBAAqBpD,GAAUA,EAAQjZ,KAAK6c,YAAY5D,GAASjZ,KAAKuI,YAE7F,KAAAC,KAAO,IACLxI,KAAK6J,GAAG,GAGV,KAAAtB,SAAW,KAChB,IAAGvI,KAAK6c,YAAY7c,KAAKqZ,cAIzB,OAAOrZ,KAAK6J,IAAI,IAlpBhB7J,KAAKoB,UAAYT,SAASC,cAAc,OAExCZ,KAAKoB,UAAU+D,MAAM2X,QAAU,iBAC/Bnc,SAASgC,KAAKtB,OAAOrB,KAAKoB,WAEvBkW,UAAUyF,aAAc,CACzB,MAAMC,EAAwE,CAC5E5Y,KAAMpE,KAAKoc,YACXnY,MAAOjE,KAAKsc,aACZrX,KAAMjF,KAAKuc,YACXU,aAAcjd,KAAKwc,oBACnBU,YAAald,KAAKyc,mBAClBU,OAAQnd,KAAK0c,cACbU,cAAepd,KAAK4c,gBACpBS,UAAWrd,KAAK2c,aAGlB,IAAI,MAAMzU,KAAU8U,EAClB,IACE1F,UAAUyF,aAAaO,iBAAiBpV,EAA8B8U,EAAQ9U,IAC9E,MAAMoI,GACNC,QAAQgN,KAAK,wCAAyCrV,IAK5D0E,EAAA,EAAUtL,iBAAiB,sBAAwBuY,IACjD,MAAMW,EAAMxa,KAAK8Y,wBAAwBe,EAAI9G,IAC7C,GAAGyH,EACD,IAAI,MAAM/B,KAAS+B,EACjBxa,KAAK4Z,oBAAoBnB,KAK/B,MAAM+E,EAAuD,GAChD,CACX,SACA,QACA,eACA,OACA,SAEGjT,QAAQnD,IACX,MAAMqW,EAAQ,IAAMrW,EACpBoW,EAAWpW,GAAO,CAChBuM,IAAK,IAAM3T,KAAKyd,GAChBjD,IAAM7V,IACD3E,KAAKyd,KAAU9Y,IAKlB3E,KAAKyd,GAAQ9Y,GACV3E,KAAKqZ,cAAyB,SAARjS,GAA4C,UAA1BpH,KAAK+b,kBAAyC,UAAR3U,IAE/EpH,KAAKqZ,aAAajS,GAAOzC,GAGhB,iBAARyC,QAAoDiB,IAA1BrI,KAAK+b,mBAChC/b,KAAK+Y,cAAc/Y,KAAK+b,kBAAoBpX,GAG9C3E,KAAK0d,8BAIXC,OAAOC,iBAAiB5d,KAAMwd,GAGxB,yBACN5Q,EAAA,EAAU0F,cAAc,wBAAyBtS,KAAK6d,qBAGjD,oBACL,MAAM,OAACC,EAAM,MAAEC,EAAK,aAAExD,EAAY,cAAExB,EAAa,KAAEzV,EAAI,MAAEyB,GAAS/E,KAClE,MAAO,CACL8d,SACAC,QACAxD,eACAxB,gBACAzV,OACAyB,SAIG,kBAAkBiZ,GACvBhe,KAAK+Y,cAAgBiF,EAAOjF,cAC5B/Y,KAAKie,QAAUD,EAAOF,OACtB9d,KAAKke,OAASF,EAAOD,MACrB/d,KAAKme,cAAgBH,EAAOzD,aAC5Bva,KAAKoe,MAAQJ,EAAO1a,KACpBtD,KAAKqe,OAASL,EAAOjZ,MAqBhB,SAASgD,EAA0BuW,EAAmBzC,GAC3D,MAAM,OAAC5Q,EAAM,IAAEJ,GAAO9C,EAGhB+T,IADgB/T,EAAQwW,OAAOC,aACbxe,KAAK0Y,UAAY1Y,KAAKyY,MAC9C,IAAI1L,EAAU+O,EAAEnI,IAAI5L,EAAQkD,QACxB8B,GACF+O,EAAEtB,IAAIzS,EAAQkD,OAAQ8B,EAAU,IAAIuG,KAGtC,IAAImF,EAAQ1L,EAAQ4G,IAAI9I,GACxB,GAAG4N,EACD,OAAOA,EAGT,MAAMoB,EAAkB,IAAmB4E,oBAAoB1W,GAC/DgF,EAAQyN,IAAI3P,EAAK4N,EAAQ9X,SAASC,cAA2B,UAAbiZ,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KAAmB,QAAU,UAIzF,UAAbwZ,EAAIxZ,MACLoY,EAAMlY,aAAa,cAAe,QAIpC,MAAM6Y,EAAwB,CAC5BnO,SACAJ,MACAkP,MAAOF,EAAI9G,GACX8I,QACA7O,YAAajF,EAAQwW,OAAOC,cAG9Bxe,KAAK2Y,aAAa6B,IAAI/B,EAAOW,GAG7BX,EAAMqF,OAAS,EAGf9d,KAAKoB,UAAUC,OAAOoX,GAEtBA,EAAMnX,iBAAiB,OAAQtB,KAAKya,QACpChC,EAAMnX,iBAAiB,QAAStB,KAAKwb,SACrC/C,EAAMnX,iBAAiB,QAAStB,KAAKyb,SAErB,UAAb5B,EAAIxZ,OAAoB0H,aAAO,EAAPA,EAASwW,OAAOG,eAAgB3W,EAAQkI,SAAWrD,EAAA,EAAU+R,MACtFlG,EAAMnX,iBAAiB,aAAc,KACnC,IAAmBsd,aAAa3T,EAAQ,CAACJ,KACxC,CAACgU,MAAM,IAiBZ,MAAMC,EAAW,eACjB,GAAGR,EACDQ,EAAS5U,cACJ,CACL,MAAM6U,EAAIhX,EAAQwW,OAAOC,aAAexe,KAAK6Y,6BAA+B7Y,KAAK4Y,oBACjF,IAAIoG,EAAiBD,EAAEpL,IAAI1I,GACvB+T,GACFD,EAAEvE,IAAIvP,EAAQ+T,EAAiB,IAAI1L,KAGrC0L,EAAexE,IAAI3P,EAAKiU,GAqB1B,OAlBAA,EAASnb,KAAK,KAIZ,MAAMuW,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxD,GAAGA,EAAIG,mBAAqBE,EAAaI,IACvCta,KAAK4Z,oBAAoBnB,OACpB,CACL,IAAI+B,EAAMxa,KAAK8Y,wBAAwBe,EAAI9G,IACvCyH,IACFA,EAAMxa,KAAK8Y,wBAAwBe,EAAI9G,IAAM,IAAIpL,KAGnD6S,EAAI3Z,IAAI4X,GACR,IAAewG,YAAYpF,MAIxBpB,EAGF,SAASxN,EAAgBJ,EAAamC,GAC3C,MAAM8O,GAAK9O,EAAchN,KAAK0Y,UAAY1Y,KAAKyY,OAAO9E,IAAI1I,GAC1D,OAAO6Q,aAAC,EAADA,EAAGnI,IAAI9I,GAmCR,uBAAuB4N,GAC7BA,EAAMnX,iBAAiB,OAAQ,KAM7B,MAAMgY,EAAcb,EAAMa,YAG1Bb,EAAMnX,iBAAiB,WAAY,KACjCmX,EAAMa,YAAcb,EAAMgB,SAAW,EAErChB,EAAMnX,iBAAiB,WAAY,KACjCmX,EAAMa,YAAcA,EAIhBb,EAAMmD,QACRnD,EAAMrU,QAEP,CAACya,MAAM,KACT,CAACA,MAAM,MAIP,2BAA2B5T,EAAgBJ,EAAamC,GAC7D,MAAM+R,EAAI/R,EAAchN,KAAK6Y,6BAA+B7Y,KAAK4Y,oBAC3D7L,EAAUgS,EAAEpL,IAAI1I,GACtB,IAAI8B,EACF,OAGF,MAAM3C,EAAU2C,EAAQ4G,IAAI9I,GACzBT,IACDA,EAAQF,UACR6C,EAAQoF,OAAOtH,GAEXkC,EAAQ7J,MACV6b,EAAE5M,OAAOlH,IAQR,kBAAkBwN,GAEvB,QAASA,EAAMyG,gBAGT,mBAAmBzG,EAAyB9T,GAElD8T,EAAMyG,gBAAkBva,EAGZ,gBAAgBoD,EAA0BsR,EAAerZ,KAAKqZ,c,kDAC1E,GAAG1Y,SAASwe,wBACV,aAGI,aAAY9F,OAAchR,GAAW,GAE3C,MAAMwR,EAAM,IAAmB4E,oBAAoB1W,GAE7CqX,EAAwB,GAExBC,EAAuB,UAAbxF,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KAC5C,IAAIqR,EAAQ,GAAI4N,EAAS,GAEzB,GAAa,QAAV,EAAAzF,EAAI0F,cAAM,eAAE5d,OAAQ,CACrB,MAAMuB,EAAO2W,EAAI0F,OAAO1F,EAAI0F,OAAO5d,OAAS,GAC5C,IAAKuB,EAAqCsc,MAAO,CAC/C,MAAMtF,EAAeC,GAAA,EAAmBC,gBAAgBP,EAAK3W,EAAK7C,MAElE,GAAG6Z,EAAaI,IACd8E,EAAQ7V,KAAK,CACX8Q,IAAKH,EAAaI,IAClBmF,MAAO,GAAIvc,EAA6B6b,KAAM7b,EAA6Bwc,IAC3Erf,KAAM,mBAEH,CACY,IAAiBsf,aAAa9F,EAAK3W,GAC3CS,KAAK,KACT3D,KAAKqZ,eAAiBA,GAAiBa,EAAaI,KAIvDta,KAAK4f,gBAAgB7X,YAItB,GAAGsX,EAAS,CACjB,MAAMpU,EAASlD,EAAQkI,QAAUlI,EAAQkD,OACnC4U,EAAY,IAAgBC,aAAa7U,GAC/C,GAAG4U,EAAW,CACZ,MAAMvV,EAAS,IAAkByV,WAAW9U,EAAQ4U,EAAW,eAC/D,GAAGvV,EAAO0V,OAAQ,CAChB,MAAM1F,QAAYhQ,EAAOlH,YACzBgc,EAAQ7V,KAAK,CACX8Q,IAAKC,EACLmF,MAAO,UACPpf,KAAM,oBAGRiK,EAAOlH,YAAYO,KAAM2W,IACpBta,KAAKqZ,eAAiBA,GAAiBiB,GAI1Cta,KAAK4f,gBAAgB7X,KAK3B2J,EAAQ,IAAgBuO,aAAahV,GAAQ,GAAM,GACnDqU,EAAS,IAAKzI,OAAoB,UAAbgD,EAAIxZ,KAAmB,cAAgB,eAAe,GAG7E,IAAIgf,EAAS,CACX,MAAMa,EAAYrG,EAAIsG,WAAW9L,KAAK6L,GAA6B,2BAAhBA,EAAU9U,GAC7DsG,EAAwB,QAAhB,EAAAwO,aAAS,EAATA,EAAWxO,aAAK,QAAImI,EAAIuG,UAChCd,EAASY,aAAS,EAATA,EAAWG,UAGlBjB,EAAQzd,SACP,KACE,KACDyd,EAAQ7V,KAAK,CACX8Q,IAAK,8CACLoF,MAAO,UACPpf,KAAM,cAGR+e,EAAQ7V,KAAK,CACX8Q,IAAK,kCACLoF,MAAO,UACPpf,KAAM,cAIV,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAAKkK,QAAQrH,IACxC,MAAMuc,EAAQ,GAAGvc,KAAQA,IACzBkc,EAAQ7V,KAAK,CACX8Q,IAAK,6BAA6BoF,QAClCA,QACApf,KAAM,iBAMd,MAAMigB,EAAW,IAAIC,cAAc,CACjC7O,QACA4N,SACAF,YAGF9H,UAAUyF,aAAauD,SAAWA,KAG7B,sBACL,MAAM,aAACjH,GAAgBrZ,KACvB,IAAIqZ,EAAc,OAClB,MAAMtR,EAAU/H,KAAK4a,kBAAkBvB,GACvCrZ,KAAK4f,gBAAgB7X,EAASsR,GAGxB,kBAAkBZ,GACxB,MAAMW,EAAUpZ,KAAK2Y,aAAahF,IAAI8E,IAChC,OAACxN,EAAM,IAAEJ,GAAOuO,EAEtB,OADgBA,EAAQpM,YAAc,IAAmBwT,0BAA0BvV,EAAQJ,GAAO,IAAmB4V,iBAAiBxV,EAAQJ,GAIzI,oBACL,MAAM,aAACwO,GAAgBrZ,KACvB,IAAIqZ,EACF,OAGF,MAAMtR,EAAU/H,KAAK4a,kBAAkBvB,GACvC,MAAO,CACLQ,IAAK,IAAmB4E,oBAAoB1W,GAC5CA,UACA0Q,MAAOY,EACPqH,eAAgB1gB,KAAK6d,qBAkGlB,OAAOzZ,EAAgBqU,EAAQzY,KAAKqZ,cACzC,QAAIZ,SAIQpQ,IAATjE,IACDA,EAAOqU,EAAMmD,QAGZnD,EAAMmD,SAAWxX,IAIjBA,EACDqU,EAAMrU,OAENqU,EAAMxU,SAGD,IA+ED,oBAAoB0c,GAK1B,OAJ4CvH,IAC1CuH,EAAG3gB,KAAK2a,IAAKvB,IA2BV,YAAYX,GACjB,OAAGA,aAAK,EAALA,EAAOa,aAAc,IACtBb,EAAMa,YAAc,EACpBtZ,KAAKG,QAAO,EAAMsY,IACX,GAMJ,aAAaA,GAClBzY,KAAK4gB,kBAAoBnI,EAGpB,iBAAiBrL,GACtB,OAAG,OAAAyT,GAAA,GAAU7gB,KAAK8K,cAAesC,KAIjCpN,KAAK8K,cAAgB,OAAAgW,GAAA,GAAK1T,IACnB,GAGF,mBACL,OAAOpN,KAAK8K,cAGP,WAAW9B,EAAoB+X,EAAoBvY,GACxD,IAAIwS,EAAahb,KAAKgb,WAClBA,EAiBFA,EAAWzN,QAhBXyN,EAAahb,KAAKgb,WAAa,IAAI,EAAiB,CAClDtS,UAAW,GACXC,aAAc,EACd8B,YAAc1C,IACZ/H,KAAKghB,SAASjZ,GAAS,GAChB,CAACkD,OAAQlD,EAAQkD,OAAQJ,IAAK9C,EAAQ8C,MAE/CnB,OAAQ,CAACN,EAAMa,KACbjK,KAAKgc,SAAS5S,IAEhByC,UAAW,KACTe,EAAA,EAAU0F,cAAc,cACxBtS,KAAKiF,UAOX,MAAMwD,OAA0CJ,IAAhCrI,KAAK8K,cAAckB,SAChC+U,EACD/F,EAAWM,WAAWyF,EAAMvY,EAAMC,GAElCuS,EAAWvS,QAAUA,EAGvBuS,EAAW1N,iBAAiBtN,KAAK8K,eACjCkQ,EAAWhS,QAAUA,EAErBgS,EAAWvR,MAAK,GAChBuR,EAAWvR,MAAK,GAGV,gCAAgC1B,GACtC,MAAM8R,EAAM,IAAmB4E,oBAAoB1W,GACnD,IAAIkZ,EAA+B,QASnC,OARGpH,aAAG,EAAHA,EAAKxZ,QACU,UAAbwZ,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KAC7B4gB,EAAY,QACS,UAAbpH,EAAIxZ,OACZ4gB,EAAY,UAITA,EAGF,SAASxI,EAAyB1Q,GACvC,MAAMkZ,EAAYjhB,KAAKkhB,gCAAgCnZ,GAEvD/H,KAAKme,cAAgBne,KAAK+Y,cAAckI,GAExCjhB,KAAKqZ,aAAeZ,EACpBzY,KAAK+b,iBAAmBkF,EACxBjhB,KAAKqZ,aAAayE,OAAS9d,KAAK8d,OAChC9d,KAAKqZ,aAAa0E,MAAQ/d,KAAK+d,MAC/B/d,KAAKqZ,aAAakB,aAAeva,KAAKua,aAErB,UAAd0G,IACDjhB,KAAKqZ,aAAa/V,KAAOtD,KAAKsD,MAG7B,iBAAkBgU,WACnBtX,KAAK4f,gBAAgB7X,GAIlB,eAAe0Q,EAA0B1Q,GAC9C,MAAMsR,EAAerZ,KAAKqZ,aAEpB8H,EAAanhB,KAAKiE,QAExB,IAAIwW,EAqBJ,OApBGhC,IACDgC,EAAS,KACP,MAAME,EAAM3a,KAAK2a,IACdA,GACDA,EAAI1W,SAIJwU,EAAMmD,QACRnB,IAGFhC,EAAMnX,iBAAiB,OAAQmZ,IAGjCza,KAAKohB,kBAAa/Y,GACfoQ,EAAOzY,KAAK6a,SAASpC,EAAO1Q,GAC1B/H,KAAKqZ,kBAAehR,EACzBrI,KAAKqhB,iBAAgB,GAEd,CAACC,EAAaH,KACnBnhB,KAAKqhB,iBAAgB,GAElBhI,IACErZ,KAAK2Y,aAAahF,IAAI0F,GACvBrZ,KAAK6a,SAASxB,EAAcrZ,KAAK4a,kBAAkBvB,IAEnDrZ,KAAKwI,QAAUxI,KAAKuI,YAKrBvI,KAAKqZ,eAAiBZ,IACvBzY,KAAKqZ,kBAAehR,EACpBrI,KAAK+b,sBAAmB1T,GAGvBoQ,GACDA,EAAM5K,oBAAoB,OAAQ4M,GAQjC6G,GACDthB,KAAKoE,QAKJ,gBAAgBmd,GACrBvhB,KAAK2b,iBAAmB4F,EAGnB,oBAAoBtI,GACzBjZ,KAAK2a,IAAM1B,EAIX,MAAMpH,EAAiB,IAAI,IAC3BA,EAAehR,IAAIoY,EAAnBpH,CAA0B,wBAAyB,KAC9C7R,KAAK2a,MAAQ1B,IAIhBjZ,KAAK2a,SAAMtS,EAKXwJ,EAAeO,cACd,CAACyM,MAAM,IAEVhN,EAAehR,IAAIoY,EAAnBpH,CAA0B,OAAS9R,IAC9BC,KAAKqZ,eAAiBJ,GACvBjZ,KAAKiE,YAYb,KAAeuU,2BAA6BA,GAC7B,U,+CCl7BA,SAASgJ,GAA6CC,GACnE,OCHa,SAAmDC,EAAgCD,GAChG,IACI1P,EADA4P,GAAU,EAGd,MAAO,IAAIC,KACT7P,EAAO6P,EAEFD,IACHA,GAAU,EAEVD,EAAY,KACVC,GAAU,EAEVF,KAAM1P,ODVL8P,CAAa,KAASJ,G,aEChB,SAASK,GAAYtC,EAAeuC,EAAW,GAC5D,GAAa,IAAVvC,EAAa,OAAO,YAAK,aAAc,CAAC,IAE3C,MACMwC,EAAKD,EAAW,EAAI,EAAIA,EAGxBngB,EAAIiD,KAAKod,MAAMpd,KAAKqd,IAAI1C,GAAS3a,KAAKqd,IAJlC,OAMV,OAAO,YAJsB,CAAC,aAAc,cAAe,cAAe,eAIxDtgB,GAAI,CAACugB,YAAY3C,EAAQ3a,KAAKud,IANtC,KAM6CxgB,IAAIygB,QAAQL,M,wBCjBtD,SAASM,GAASC,EAAsBC,GAAW,GAChE,MAAMC,EAAUC,SAASH,EAAM,GAAI,IAC7BI,EAAQ9d,KAAKod,MAAMQ,EAAU,MACnC,IAAIG,EAAe/d,KAAKod,OAAOQ,EAAmB,KAARE,GAAiB,IACvDE,EAAeJ,EAAmB,KAARE,EAA2B,GAAVC,EAK/C,OAHGD,IAAOH,GAAW,GAClBI,EAAU,KAAIA,EAAUJ,EAAW,IAAMI,EAAUA,GACnDC,EAAU,KAAIA,EAAU,IAAMA,IACzBF,EAAqCA,EAAQ,IAAM,IAAMC,EAAU,IAAMC,ECDpE,SAASC,GAAoB/H,EAC1CgI,EACAC,EACAC,GAEA,MAAMC,EAAeC,IACnBH,EAAO,CAACI,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,WAGpCK,EAAaL,IACjBxiB,SAASkN,oBAAoB,YAAaqV,GAC1CnI,EAAQzZ,iBAAiB,YAAamiB,EAAa,CAAC5E,MAAM,IAC1DoE,GAASA,EAAM,CAACG,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,WAG5CM,EAAeN,IACC,IAAjBA,EAAMO,QAKTX,EAAQ,CAACK,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,UACzCD,EAAYC,GAEZxiB,SAASW,iBAAiB,YAAa4hB,GACvCviB,SAASW,iBAAiB,UAAWkiB,EAAW,CAAC3E,MAAM,KARrD9D,EAAQzZ,iBAAiB,YAAamiB,EAAa,CAAC5E,MAAM,KAW9D9D,EAAQzZ,iBAAiB,YAAamiB,EAAa,CAAC5E,MAAM,IAG1D,MAAM8E,EAAeR,IACnBA,EAAM1b,iBACNub,EAAO,CAACI,EAAGD,EAAMS,QAAQ,GAAGC,QAASP,EAAGH,EAAMS,QAAQ,GAAGE,QAASC,SAAS,EAAMZ,WAG7Ea,EAAcb,IAClBxiB,SAASkN,oBAAoB,YAAa8V,GAC1C5I,EAAQzZ,iBAAiB,aAAc2iB,EAAc,CAACC,SAAS,EAAOrF,MAAM,IAC5EoE,GAASA,EAAM,CAACG,EAAGD,EAAMS,QAAQ,GAAGC,QAASP,EAAGH,EAAMS,QAAQ,GAAGE,QAASC,SAAS,EAAMZ,WAGrFc,EAAgBd,IACpBJ,EAAQ,CAACK,EAAGD,EAAMS,QAAQ,GAAGC,QAASP,EAAGH,EAAMS,QAAQ,GAAGE,QAASC,SAAS,EAAMZ,UAClFQ,EAAYR,GAEZxiB,SAASW,iBAAiB,YAAaqiB,EAAa,CAACO,SAAS,IAC9DvjB,SAASW,iBAAiB,WAAY0iB,EAAY,CAACE,SAAS,EAAOrF,MAAM,KAK3E,OAFA9D,EAAQzZ,iBAAiB,aAAc2iB,EAAc,CAACC,SAAS,EAAOrF,MAAM,IAErE,KACL9D,EAAQlN,oBAAoB,YAAa4V,GACzC9iB,SAASkN,oBAAoB,YAAaqV,GAC1CviB,SAASkN,oBAAoB,UAAW2V,GAExCzI,EAAQlN,oBAAoB,aAAcoW,GAC1CtjB,SAASkN,oBAAoB,YAAa8V,GAC1ChjB,SAASkN,oBAAoB,WAAYmW,ICzD9B,MAAM,GAyBnB,YACEtkB,EAQAiF,EAAQ,GA7BH,KAAAwf,WAAY,EAIX,KAAAC,OAKH,GAOK,KAAAC,gBAAiB,EACjB,KAAAC,cAAe,EACf,KAAAC,UAAW,EA0DX,KAAArB,YAAeC,IACvBnjB,KAAKwkB,MAAMrB,IAGH,KAAAM,YAAeN,I,MACvBnjB,KAAKykB,KAAOzkB,KAAKoB,UAAUsjB,wBAC3B1kB,KAAKmkB,WAAY,EACjBnkB,KAAKwkB,MAAMrB,GACXnjB,KAAKoB,UAAUlB,UAAUW,IAAI,eAClB,QAAX,EAAAb,KAAKokB,cAAM,eAAEX,cAAezjB,KAAKokB,OAAOX,YAAYN,IAG5C,KAAAK,UAAaL,I,MACrBnjB,KAAKmkB,WAAY,EACjBnkB,KAAKoB,UAAUlB,UAAUoE,OAAO,eACrB,QAAX,EAAAtE,KAAKokB,cAAM,eAAEZ,YAAaxjB,KAAKokB,OAAOZ,UAAUL,IAQ3C,KAAAhc,QAAU,K,MACf,MAAMxC,GAAS3E,KAAK2kB,KAAKhgB,MACzB3E,KAAK4kB,UAAUjgB,IACJ,QAAX,EAAA3E,KAAKokB,cAAM,eAAES,UAAW7kB,KAAKokB,OAAOS,QAAQlgB,IAvE5C,OAAAmE,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,iBAG1Bb,KAAKskB,aACNtkB,KAAKoB,UAAUlB,UAAUW,IAAI,iBACrBb,KAAKqkB,gBACbrkB,KAAKoB,UAAUlB,UAAUW,IAAI,mBAG/Bb,KAAK8kB,OAASnkB,SAASC,cAAc,OACrCZ,KAAK8kB,OAAO5kB,UAAUW,IAAI,yBAE1B,MAAM8jB,EAAO3kB,KAAK2kB,KAAOhkB,SAASC,cAAc,SAChD+jB,EAAKzkB,UAAUW,IAAI,uBAEnB8jB,EAAKtkB,KAAO,QACZskB,EAAKI,KAAO,GAAK/kB,KAAK+kB,KACtBJ,EAAK7f,IAAM,GAAK9E,KAAK8E,IACrB6f,EAAKlgB,IAAM,GAAKzE,KAAKyE,IACrBkgB,EAAKhgB,MAAQ,GAAKA,EAEfA,GACD3E,KAAKglB,YAAYrgB,GAGnB,MAAMsgB,EAAU,GAAKjlB,KAAK+kB,KACpBG,EAAQD,EAAQE,QAAQ,KAC9BnlB,KAAK+hB,UAAsB,IAAXmD,EAAe,EAAID,EAAQtjB,OAASujB,EAAQ,EAI5DllB,KAAKoB,UAAUC,OAAOrB,KAAK8kB,OAAQH,GAGrC,YACE,OAAQ3kB,KAAK2kB,KAAKhgB,MAGb,YAAYyf,GACjBpkB,KAAKokB,OAASA,EAqBT,eACLpkB,KAAK2kB,KAAKrjB,iBAAiB,QAAStB,KAAKmH,SACzCnH,KAAKolB,iBAAmBtC,GAAoB9iB,KAAKoB,UAAWpB,KAAKyjB,YAAazjB,KAAKkjB,YAAaljB,KAAKwjB,WAShG,YAAY7e,GACjB3E,KAAK2kB,KAAKhgB,MAAQ,GAAKA,EACvB3E,KAAK4kB,WAAW5kB,KAAK2kB,KAAKhgB,OAGrB,YAAYA,GACjB3E,KAAK2kB,KAAKhgB,MAAQ,KAAO3E,KAAK2kB,KAAKhgB,MAAQA,GAC3C3E,KAAK4kB,WAAW5kB,KAAK2kB,KAAKhgB,OAGrB,UAAUA,GACf,IAAI0gB,GAAY1gB,EAAQ3E,KAAK8E,MAAQ9E,KAAKyE,IAAMzE,KAAK8E,KACrDugB,EAAW,OAAAC,GAAA,GAAMD,EAAU,EAAG,GAG3BrlB,KAAKskB,aACNtkB,KAAK8kB,OAAO3f,MAAMogB,UAAY,UAAUF,KAExCrlB,KAAK8kB,OAAO3f,MAAM3B,MAAoB,IAAX6hB,EAAkB,IAIvC,MAAMlC,G,MACd,MAAMqC,EAAUxlB,KAAKukB,SAAWvkB,KAAKykB,KAAKhhB,OAASzD,KAAKykB,KAAKjhB,MACvDiiB,EAAkB,OAAAH,GAAA,GAAMtlB,KAAKukB,WAAapB,EAAMG,EAAItjB,KAAKykB,KAAKiB,QAAUvC,EAAMC,EAAIpjB,KAAKykB,KAAKkB,KAAM,EAAGH,GAE3G,IAAI7gB,EAAQ3E,KAAK8E,IAAO2gB,EAAkBD,GAAWxlB,KAAKyE,IAAMzE,KAAK8E,KAerE,OAbIH,EAAQ3E,KAAK8E,KAAS9E,KAAKyE,IAAMzE,KAAK8E,KAAO,IAC/CH,GAAS3E,KAAK+kB,KAAO,IAGvBpgB,GAASA,EAAM0d,QAAQriB,KAAK+hB,UAC5Bpd,EAAQ,OAAA2gB,GAAA,GAAM3gB,EAAO3E,KAAK8E,IAAK9E,KAAKyE,KAKpCzE,KAAKglB,YAAYrgB,IACN,QAAX,EAAA3E,KAAKokB,cAAM,eAAES,UAAW7kB,KAAKokB,OAAOS,QAAQlgB,GAErCA,EAGF,kBACF3E,KAAKolB,mBACNplB,KAAKolB,mBACLplB,KAAKolB,iBAAmB,MAG1BplB,KAAK2kB,KAAK9W,oBAAoB,QAAS7N,KAAKmH,SAE5CnH,KAAKokB,OAAS,IClKH,MAAM,WAA0B,GAQ7C,YAAY3L,EAA6CmN,EAAsBvB,EAA0BC,GACvG3kB,MAAM,CACJolB,KAAM,IAAO,GAAK,IAClBjgB,IAAK,EACLL,IAAK,EACL4f,iBACAC,gBACC,GAZK,KAAAuB,YAAc,EAuDd,KAAAC,aAAe,KACvB9lB,KAAKyE,IAAMzE,KAAKyY,MAAMgB,SACtBzZ,KAAK2kB,KAAKpkB,aAAa,MAAO,GAAKP,KAAKyE,MAGhC,KAAAgX,QAAU,KAClBzb,KAAKglB,eAGG,KAAAvK,OAAS,KACjB,IAAIsL,EAAI,KACN/lB,KAAKglB,cAELhlB,KAAK6lB,YAAc7lB,KAAKyY,MAAMmD,OAAS,EAAI1Z,OAAO8jB,sBAAsBD,IAGvE/lB,KAAK6lB,aACN3jB,OAAO+jB,qBAAqBjmB,KAAK6lB,aAGhC7lB,KAAK4lB,YACN5lB,KAAKkmB,kBAGPlmB,KAAK6lB,YAAc3jB,OAAO8jB,sBAAsBD,IAGxC,KAAAI,aAAe,KACpBnmB,KAAKyY,MAAMmD,SACZ5b,KAAKglB,cAEFhlB,KAAK4lB,YACN5lB,KAAKkmB,oBAKD,KAAAE,WAAcrmB,IACtBC,KAAKkmB,mBA/EFzN,GACDzY,KAAK6a,SAASpC,EAAOmN,GAIlB,SAASnN,EAAyBmN,GAAa,GACjD5lB,KAAKyY,OACNzY,KAAKqmB,kBAGJT,IAAe5lB,KAAKsmB,YACrBtmB,KAAKsmB,WAAa3lB,SAASC,cAAc,OACzCZ,KAAKsmB,WAAWpmB,UAAUW,IAAI,wBAAyB,yBACvDb,KAAKoB,UAAUJ,QAAQhB,KAAKsmB,aAEpBtmB,KAAKsmB,YACbtmB,KAAKsmB,WAAWpmB,UAAUC,OAAO,QAASylB,GAG5C5lB,KAAKyY,MAAQA,EACbzY,KAAK4lB,WAAaA,IACdnN,EAAMmD,QAAUnD,EAAMa,YAAc,IACtCtZ,KAAKya,SAGP,IAAI0G,GAAa,EACjBnhB,KAAKumB,aACLvmB,KAAKwmB,eACLxmB,KAAKymB,YAAY,CACfhD,YAAa,KACXtC,GAAcnhB,KAAKyY,MAAMmD,OACzBuF,GAAcnhB,KAAKyY,MAAMxU,SAG3Buf,UAAYzjB,IAEVohB,GAAcnhB,KAAKyY,MAAMrU,UA8CrB,MAAMrE,GACd,MAAM2mB,EAAY/mB,MAAM6kB,MAAMzkB,GAE9B,OADAC,KAAKyY,MAAMa,YAAcoN,EAClBA,EAGC,kBACR,GAAG,GAA2BC,kBAAkB3mB,KAAKyY,OAAQ,OAC7D,MAAMmO,EAAM5mB,KAAKyY,MAAMoO,SACjBC,EAAYF,EAAIjlB,OAEhB2X,EAActZ,KAAKyY,MAAMa,YAC/B,IAAIyN,EAAe,EAAGC,EAAM,EAC5B,IAAI,IAAIplB,EAAI,EAAGA,EAAIklB,IAAallB,EAAG,CACjC,MAAMqlB,EAAQL,EAAIK,MAAMrlB,GACrB0X,GAAe2N,GAASA,GAASF,IAClCA,EAAeE,EACfD,EAAMJ,EAAII,IAAIplB,IAQlB,MAAMyjB,EAAWrlB,KAAKyY,MAAMgB,SAAWuN,EAAMhnB,KAAKyY,MAAMgB,SAAW,EACnEzZ,KAAKsmB,WAAWnhB,MAAM3B,MAAoB,IAAX6hB,EAAkB,IAIzC,aACRrlB,KAAKyE,IAAMzE,KAAKyY,MAAMgB,UAAY,EAC/BzZ,KAAKyE,IAAM,EACZzE,KAAK8lB,eAEL9lB,KAAKyY,MAAMnX,iBAAiB,aAActB,KAAK8lB,cAI5C,cACL,GAAG,GAA2Ba,kBAAkB3mB,KAAKyY,OAAQ,OAC7D,MAAMa,EAActZ,KAAKyY,MAAMa,YAE/B3Z,MAAMqlB,YAAY1L,GAGb,eACL3Z,MAAM6mB,eACNxmB,KAAKyY,MAAMnX,iBAAiB,QAAStB,KAAKyb,SAC1Czb,KAAKyY,MAAMnX,iBAAiB,OAAQtB,KAAKya,QACzCza,KAAKyY,MAAMnX,iBAAiB,aAActB,KAAKmmB,cAC/CnmB,KAAK4lB,YAAc5lB,KAAKyY,MAAMnX,iBAAiB,WAAYtB,KAAKomB,YAG3D,kBACLzmB,MAAM0mB,kBAEHrmB,KAAKyY,QACNzY,KAAKyY,MAAM5K,oBAAoB,aAAc7N,KAAK8lB,cAClD9lB,KAAKyY,MAAM5K,oBAAoB,QAAS7N,KAAKyb,SAC7Czb,KAAKyY,MAAM5K,oBAAoB,OAAQ7N,KAAKya,QAC5Cza,KAAKyY,MAAM5K,oBAAoB,aAAc7N,KAAKmmB,cAClDnmB,KAAK4lB,YAAc5lB,KAAKyY,MAAM5K,oBAAoB,WAAY7N,KAAKomB,aAGlEpmB,KAAK6lB,cACN3jB,OAAO+jB,qBAAqBjmB,KAAK6lB,aACjC7lB,KAAK6lB,YAAc,IC5BzB,SAASqB,GAAiBC,GACxBA,EAAQjnB,UAAUW,IAAI,YAEtB,MAAMkH,EAAUof,EAAQpf,QAClB8R,EAAM,IAAmB4E,oBAAoB1W,GAEhDA,EAAQwW,OAAO6I,KAChBD,EAAQjnB,UAAUW,IAAI,UAGxB,IAAIwmB,EAAYxN,EAAIsG,WAAW9L,KAAK6L,GAA6B,2BAAhBA,EAAU9U,GAA6Eic,UAAY,IAAIC,WAAW,IACnKD,EAhHK,SAAwBA,GACxBA,aAAoBC,aACvBD,EAAW,IAAIC,WAAWD,IAG5B,MACME,EAD6B,EAAlBF,EAAS1lB,OACI,EAAI,EAClC,IAAI4lB,EACF,OAAO,IAAID,WAAW,IAGxB,IAAIhd,EACJ,IACE,MAAMkd,EAAW,IAAIC,SAASJ,EAASK,QACvCpd,EAAS,IAAIgd,WAAWC,GACxB,IAAI,IAAI3lB,EAAI,EAAGA,EAAI2lB,EAAY3lB,IAAK,CAClC,MAAM+lB,EAAgB,EAAJ/lB,EAAQ,EAAI,EACxBgmB,EAAe,EAAJhmB,EAAQ,EACnB+C,EAAQ6iB,EAASK,UAAUF,GAAW,GAC5Crd,EAAO1I,GAAM+C,GAASijB,EAAY,IAEpC,MAAMtX,GACNhG,EAAS,IAAIgd,WAAW,IAY1B,OAAOhd,EA8EIwd,CAAeT,EAAS1hB,MAAM,EAAG,KAE5C,MAAM,IAACoiB,EAAK3mB,UAAW4mB,EAAY,OAAEC,GA7EvC,SAA4BZ,EAAsB5N,GAChD,MAGMyO,EAAeC,EAAA,EAAWC,SAAW,GAAK,GAG1CC,EAAOF,EAAA,EAAWC,SAAW,IAAM,IACnCE,EAAOH,EAAA,EAAWC,SAAW,IAAM,IACnCH,EAAS,OAAA3C,GAAA,GAAM7L,EAAW,GAAK6O,EAAMD,EAAMC,GAE3CP,EAAMpnB,SAAS4nB,gBAAgB,6BAA8B,OACnER,EAAI7nB,UAAUW,IAAI,uBAClBknB,EAAIS,eAAe,KAAM,QAAS,GAAKP,GACvCF,EAAIS,eAAe,KAAM,SAAU,GAAKN,GACxCH,EAAIS,eAAe,KAAM,UAAW,OAAOP,KAAUC,KAIrD,MAAMO,EAAY5jB,KAAKJ,OAAO4iB,GACxBqB,EAASrB,EAAS1lB,OAAS0lB,EAAS1lB,OAAS,IAC7CgnB,EAAW9jB,KAAKC,IAAKmjB,EAAS,EAA0B,EAAGS,GAEjE,IAAIE,EAAW,EACf,MAAMC,EAAWX,EArBI,EAuBrB,IAAIY,EAAO,GACX,IAAI,IAAIlnB,EAAI,EAAGmnB,EAAO,EAAGC,EAAO,EAAGpnB,EAAI8mB,IAAU9mB,EAAG,CAClD,MAAM+C,EAAQ0iB,EAASzlB,IAAM,EAC7B,GAAIonB,EAAOL,GAAaD,EAAQ,CAC9BM,EAAOA,EAAOL,EAAWD,EACzBM,GAAQL,EAAW,GAAK,GACvBC,EAAWjkB,IAAOikB,EAAWjkB,GAG9B,MAAMskB,EAAYpkB,KAAKJ,KAAMmkB,EAAWC,GAAcJ,EAAY,GAAK,IAAOA,EAAY,GAhCzE,GAqCjBK,GAHU,oBACCC,SAAYb,EAAee,wBAA0CA,mCAIhFF,GAAQG,EAGNN,EADCI,GAAQL,EAAW,GAAK,EACd,EAEAhkB,OAGVikB,EAAWjkB,IAAOikB,EAAWjkB,GAEhCqkB,GAAQL,EAIZ,MAAMvnB,EAAYT,SAASC,cAAc,OAKzC,OAJAQ,EAAUlB,UAAUW,IAAI,kBACxBO,EAAUC,OAAO0mB,GAEjBA,EAAIoB,mBAAmB,YAAaL,GAC7B,CAACf,MAAK3mB,YAAW6mB,UAgBuBmB,CAAmB/B,EAAUxN,EAAIJ,UAE1E4P,EAAmBrB,EAAa9mB,WAAU,GAChDmoB,EAAiBnpB,UAAUW,IAAI,uBAC/BmnB,EAAa9nB,UAAUW,IAAI,6BAE3B,MAAMyoB,EAAoB3oB,SAASC,cAAc,OACjD0oB,EAAkBppB,UAAUW,IAAI,4BAChCyoB,EAAkBjoB,OAAO2mB,EAAcqB,GAEvC,MAAME,EAAU5oB,SAASC,cAAc,OACvC2oB,EAAQrpB,UAAUW,IAAI,cACtBsmB,EAAQ9lB,OAAOioB,EAAmBC,GAElC,IAAIC,EAAWzB,EAiFf,MA/Ee,KACb,IAAI7O,EAAQiO,EAAQjO,MAEpB,MAQMiN,EAAe,KACnBkD,EAAiBlkB,MAAM3B,MAAS0V,EAAMI,YAAcJ,EAAMO,SAAW,IAAO,OAG1EP,EAAM0C,QAAW1C,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMO,WACxE0M,IAGF,MAAMsD,EAAsBjI,GAAgB2E,GAqD5C,OApDAgB,EAAQuC,iBAAiB,aAAcD,GACvCtC,EAAQuC,iBAAiB,QAASD,GAClCtC,EAAQuC,iBAAiB,OAnBJ,KACnB,aAAc,MACRxQ,IACJiN,KACQjN,EAAM0C,QACbuL,KAgBLA,EAAQwC,aAAahmB,KAAK,KACxB,IAAIwgB,GAAY,EAAOyF,GAAY,EAiCnC,SAASpF,EAAMzkB,GACb,IAAI8pB,EACJ,GAAG9pB,aAAa+pB,WACdD,EAAU9pB,EAAE8pB,YACP,CACL,MAAMpF,EAAQ1kB,EAAE2a,OAAuBgK,wBACvCmF,EAAU9pB,EAAEgqB,cAAc,GAAG1G,MAAQoB,EAAKkB,KAG5C,MAAMe,EAAYmD,EAAU5B,EAAqB/O,EAAMO,SACvDP,EAAMI,YAAcoN,EA1CtB8C,EAASloB,iBAAiB,aAAevB,IACpCokB,IACDjL,EAAM9U,OACN+f,GAAY,GAEdyF,GAAY,IAEdJ,EAASloB,iBAAiB,YAAcvB,IACtC6pB,GAAY,EACTzF,GAAWK,EAAMzkB,KAEtBypB,EAASloB,iBAAiB,YAAcvB,IACtCA,EAAE0H,iBACc,IAAb1H,EAAE2jB,SACDxK,EAAM0C,QACR1C,EAAMjV,QAGRugB,EAAMzkB,GACNokB,GAAY,KAEdqF,EAASloB,iBAAiB,UAAYvB,IACjC6pB,GAAazF,IACdjL,EAAM9U,OACN+f,GAAY,KAGhB,YAAiBqF,EAAWzpB,IAC1B,OAAAiqB,EAAA,GAAYjqB,GACRmZ,EAAM0C,QAAQ4I,EAAMzkB,MAezBkqB,GAAA,GAEI,KACLT,EAASllB,SACTklB,EAAW,KACXtQ,EAAQ,OAwGd,SAASgR,GAA2BC,GAAiB,GACnD,MAAMC,EAAY,IAAI,KAAqB,CAACC,YAAY,EAAMF,mBAQ9D,OAPAC,EAAUE,YAENH,IACFC,EAAUG,OAAO/B,eAAe,KAAM,IAAK,MAC3C4B,EAAUI,YAAc,cAGnBJ,EAxUTxd,EAAA,EAAUtL,iBAAiB,sBAAuB,EAAE2K,OAAMhB,aACxDgB,EAAK1B,QAAQM,IACX,MAAM4f,EAAO,cAAc5f,qBAAuBI,MACjDkB,MAAMC,KAAKzL,SAAS+S,iBAAiB,0BAA0B+W,4BAA+BA,MAA4BlgB,QAAQmgB,IACjIA,EAAKxqB,UAAUoE,OAAO,mBAuUrB,MAAMqmB,GAAmB,CAACxgB,EAAqBygB,KACpD,IAAI7J,EAAmBvY,EAErB,MAAMqiB,GAAa1gB,EAAOjK,UAAUuV,SAAS,qBACvCrU,EAAY,OAAA0pB,GAAA,GAAgB3gB,EAAS0gB,EAAyB,gBAAb,YACvD,GAAGzpB,EAAW,CACZ,MAAMqpB,EAAO,+BACPM,EAAoB,wBAAwBN,EAClD,IAAIO,EAOJ,GAHEA,EAHE7gB,EAAO8gB,QAAQF,GAGL,CAACA,GAFD,CAAC,kBAAkBN,EAAQ,eAAeA,GAKrDI,EAAW,CACZ,MAAMK,EAAS,yBACfF,EAAYA,EAAUve,IAAIqP,GAAKoP,EAASpP,GAG1C,MAAMqP,EAAWH,EAAUI,KAAK,MAE1BC,EAAWlf,MAAMC,KAAKhL,EAAUsS,iBAAiByX,IACjDnjB,EAAMqjB,EAASlG,QAAQhb,GAEvBmhB,EAA0BD,EAAS5e,IAAIsO,IAAW,CAAE9P,OAAQ8P,EAAQ7T,QAAQ+D,OAAOsgB,WAAY1gB,KAAMkQ,EAAQ7T,QAAQ2D,OAE3HkW,EAAOuK,EAAW3lB,MAAM,EAAGqC,GAC3BQ,EAAO8iB,EAAW3lB,MAAMqC,EAAM,GAUlC,OANIQ,EAAK7G,QAAU6G,EAAK,GAAGqC,IAAM+f,GAAe7J,EAAKpf,QAAUof,EAAKA,EAAKpf,OAAS,GAAGkJ,IAAM+f,MACxF7J,EAAMvY,GAAQ,CAACA,EAAKC,UAAWsY,EAAKtY,YAKhC,CAACsY,EAAMvY,IAGD,MAAM,WAAqBgjB,YAA1C,c,oBAIS,KAAAC,UAAW,EACX,KAAAC,cAAe,EAEf,KAAAC,YAAa,EAKZ,KAAA9Z,eAAiB,IAAI,IAKtB,S,QACL7R,KAAKE,UAAUW,IAAI,SAEnBb,KAAKkH,QAAQ2D,IAAM,GAAK7K,KAAK+H,QAAQ8C,IACrC7K,KAAKkH,QAAQ+D,OAAS,GAAKjL,KAAK+H,QAAQkD,OAExC,MAAM4O,EAAkB,IAAmB4E,oBAAoBze,KAAK+H,SAC9D6jB,EAA2B,UAAb/R,EAAIxZ,KAClBgf,GAAWrf,KAAK0rB,cAAgBE,EAChCC,EAAa7rB,KAAK+H,QAAQwW,OAAOuN,YACjCC,EAAYF,GAAc7rB,KAAKoqB,UAE/B4B,EAAc1J,GAAwB,EAAfzI,EAAIJ,UAEjCzZ,KAAKwO,UAAY,wOAQjB,MAAMrO,EAASH,KAAKisB,kBAEdC,EAAcvrB,SAASC,cAAc,OAC3CsrB,EAAYhsB,UAAUW,IAAI,kBAEI,UAAbgZ,EAAIxZ,MAAoBL,KAAK+H,SAAW/H,KAAK+H,QAAQwW,OAAOG,cAE3E1e,KAAKE,UAAUW,IAAI,aAGlBkrB,IACD/rB,KAAKE,UAAUW,IAAI,eACnBb,KAAKqB,OAAO6qB,IAGd,MAAMC,EAAa9M,EAAU6H,GAAiBlnB,MA5MlD,SAAmBmnB,G,MACjB,MAAMsE,EAAWtE,EAAQsE,SAEnB1jB,EAAUof,EAAQpf,QAClB8R,EAAkB,IAAmB4E,oBAAoB1W,GAEzDsX,EAAuB,UAAbxF,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KACtC+rB,EAAgBzrB,SAASC,cAAc,OAC7CwrB,EAAclsB,UAAUW,IAAI,qBAE5B,MAAMwrB,EAAiBxS,EAAIsG,WAAW9L,KAAMoW,GAAoB,2BAAXA,EAAKrf,GAE1D,IAAIiU,EAAS,CACX,MAAMiN,EAA2B,IAC9BD,aAAc,EAAdA,EAAgBhM,YACjBiM,EAAM/iB,KAAK,IAAkBgjB,cAAcF,EAAehM,YAGzDoL,EACDa,EAAM/iB,KAAK,aAAmBxB,EAAQykB,OAC7BF,EAAM3qB,QACf2qB,EAAM/iB,KAAKuY,GAAYjI,EAAI3W,OAG1BikB,EAAQwE,YACTW,EAAM/iB,KAAK,IAAmBkjB,iBAAiB1kB,IAGjDqkB,EAAc/qB,UAAU,YAAiBirB,EAAO,QAQlDnF,EAAQgC,mBAAmB,YALd,wJAOb,MAAMuD,EAAUvF,EAAQ1T,cAAc,gBAEhCkZ,EAAmB,IAAI,KAC7BA,EAAiBzlB,QAAQ0lB,WAAazF,EAAQjgB,QAAQ0lB,WACtDD,EAAiBzlB,QAAQ2lB,SAAW1F,EAAQjgB,QAAQ2lB,SACjDxN,EACDsN,EAAiBtrB,OAAO,IAAmBorB,iBAAiB1kB,IAE5D,OAAA+kB,EAAA,GAAaH,EAAkB,IAAkBJ,cAAmC,QAArB,EAAAF,aAAc,EAAdA,EAAgB3a,aAAK,QAAImI,EAAIuG,YAG9FsM,EAAQrrB,OAAOsrB,GAEZxF,EAAQwE,YACTe,EAAQrrB,OAAO,IAAmB0rB,aAAahlB,IAGjD,MAAMilB,EAAc7F,EAAQ1T,cAAc,mBAuC1C,OAtCAuZ,EAAY3rB,OAAO+qB,GAEJ,KACb,IAAIa,GAAW,EAEXC,EAAe,IAAI,GAAkB/F,EAAQjO,MAAOW,EAAIG,mBAE5DmN,EAAQuC,iBAAiB,QAAS,KAChCvC,EAAQjnB,UAAUoE,OAAO,uBAEzB0oB,EAAYG,UAAUC,YAAYhB,GAClCa,GAAW,IAGb,MAAMxS,EAAS,KACTwS,IACF9F,EAAQjnB,UAAUW,IAAI,uBACtBosB,GAAW,EAERC,GACDF,EAAYG,UAAUC,YAAYF,EAAa9rB,aAWrD,OANA+lB,EAAQuC,iBAAiB,OAAQjP,KAE7B0M,EAAQjO,MAAM0C,QAAUuL,EAAQjO,MAAMI,YAAc,IACtDmB,IAGK,KACLyS,EAAa7G,kBACb6G,EAAa9rB,UAAUkD,SACvB4oB,EAAe,OAkHqCG,CAAUrtB,MAE1DstB,EAAettB,KAAKyT,cAAc,eACxC6Z,EAAa9e,UAAYwd,EAEzB,MAAMuB,EAASvtB,KAAKutB,OAAUjP,IAC5Bte,KAAKutB,YAASllB,EAEd,MAAM6Q,EAAQlZ,KAAKkZ,MAAQ,GAA2B8H,SAAShhB,KAAK+H,QAASuW,GAEvEqL,EAAe3pB,KAAK2pB,aAAe,eACtC3pB,KAAKkZ,MAAMsU,YAAcxtB,KAAKkZ,MAAMuU,kBAAmB9D,EAAazf,UAErElK,KAAK0pB,iBAAiB,UAAW,IAAMC,EAAazf,UAAW,CAAC2U,MAAM,IAGxE7e,KAAK0tB,iBAAmBvB,IAExB,MAAMwB,EAAa,IAAMrL,GAA6B,EAApBpJ,EAAMI,cAAoB+F,EAAW,MAAQ2M,EAAe,IAExFvR,EAAS,KACb6S,EAAaM,UAAYD,IACzBxtB,EAAOD,UAAUC,OAAO,WAAY+Y,EAAM0C,WAGxC1C,EAAM0C,QAAW1C,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMO,WACxEgB,IAGF,MAAMoT,EAAa,CAAC9tB,EAAW6b,EAAS1C,EAAM0C,UAG5C,GAFA7b,GAAK,OAAAiqB,EAAA,GAAYjqB,GAEd6b,EAAQ,CACT,MAAMkS,IAAqB9tB,KAAK8K,cAChC,GAAG,GAA2BwC,iBAAiBtN,KAAK8K,eAAiB,CACnEG,OAAQ,KACRE,YAAa,CAACC,EAAG,4BACjBiC,WAAW,IACT,CACF,MAAO0T,EAAMvY,GAASslB,EAAwBnD,GAAiB3qB,KAAMA,KAAK+H,QAAQ8C,KAAzC,GACzC,GAA2ByQ,WAAW,CAACrQ,OAAQjL,KAAK+H,QAAQkD,OAAQJ,IAAK7K,KAAK+H,QAAQ8C,KAAMkW,EAAMvY,GAGpG0Q,EAAM9U,OAAOsM,MAAM,aAEnBwI,EAAMjV,SAsBV,OAlBA,YAAiB9D,EAASJ,GAAM8tB,EAAW9tB,GAAI,CAAC8R,eAAgB7R,KAAK6R,iBAErE7R,KAAK0pB,iBAAiB,QAAS,KAC7BvpB,EAAOD,UAAUoE,OAAO,WACxBgpB,EAAaM,UAAY5B,IAG3BhsB,KAAK0pB,iBAAiB,aAAc,MAC7BxQ,EAAMI,aAAeJ,EAAM0C,QAAW,GAA2B+K,kBAAkBzN,KACxFoU,EAAaM,UAAYD,OAG3B3tB,KAAK0pB,iBAAiB,QAAS,KAC7BvpB,EAAOD,UAAUoE,OAAO,aAG1BtE,KAAK0pB,iBAAiB,OAAQjP,GAEvBoT,GAGT,GAAa,QAAV,EAAAhU,EAAI0F,cAAM,eAAE5d,OAAQ,CACrB,MAAMosB,EAAsB,GACtBC,EAAUC,GAAU,CACxB9lB,MAAO0R,EACP9R,QAAS,KACT3G,UAAWjB,EACX+tB,SAAU,GACVC,UAAW,GACXC,aAAcpuB,KAAKouB,aACnBC,kBAAkB,EAClBC,cAAetuB,KAAKsuB,gBAEtBnuB,EAAOgF,MAAM3B,MAAQrD,EAAOgF,MAAM1B,OAAS,GACxCuqB,EAAQO,OAAOC,OAAOT,EAAKxkB,KAAKykB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAKxkB,KAAKykB,EAAQO,OAAOE,MAEjDzuB,KAAKE,UAAUW,IAAI,oBACnBktB,EAAKxjB,QAAQmkB,GAAOA,EAAIxuB,UAAUW,IAAI,gBAGxC,GAAIgrB,EA2HME,IACR/rB,KAAKkH,QAAQ2kB,WAAa,IAC1B7rB,KAAKoqB,UAAUuE,OAAOzC,GAAa,QA7HrB,CACd,IAAI9B,EAAkCpqB,KAAKoqB,UAE3C,MAAMwE,EAA4B,UAAb/U,EAAIxZ,KACzBktB,EAAOqB,GAEP,MAAM7I,EAAK8I,IACT,GAAG7uB,KAAKkZ,MAAMmB,IACZ,OAGF,GAA2B6B,2BAA2Blc,KAAK+H,QAAQkD,OAAQjL,KAAK+H,QAAQ8C,IAAK7K,KAAK+H,QAAQwW,OAAOC,cAEjH,MAAMsQ,EAAiB,KAClBD,IACD,GAA2BzN,aAAaphB,KAAKkZ,OAE1C,OAAclZ,KAAKkZ,MAAM3V,WAC1BvD,KAAKkZ,MAAM3V,UAAW,KAO5B,GAFAurB,KAEI1E,EACF,GAAGvQ,EAAIG,kBAAmB,CAGxB,IAAI+U,EAFJ/uB,KAAKE,UAAUW,IAAI,mBAGnB,MAAM4Z,EAAS,KACb,MAAM2P,EAAYF,IAA2B,GACvCpL,EAAW,eACjBA,EAASkQ,UAAU,CAACC,KAAM,GAAIC,MAAO,MACrCpQ,EAASpO,MAAM,KACb1Q,KAAKkZ,MAAMjV,QACX,GAA2Bmd,kBAAa/Y,KAE1CyW,EAASqQ,OAAS,KAChBrQ,EAASqQ,OAASlF,GAAA,EAClB,MAAM3Z,EAAM,IAAI8e,MACf9e,EAAYjQ,KAAO,WACpBye,EAASuQ,OAAO/e,IAElB8Z,EAAUuE,OAAOzC,GAAa,EAAOpN,GAErCiQ,EAAgB/uB,KAAK0pB,iBAAiB,QAAS,KAC7C5K,EAASqQ,UACR,CAACtQ,MAAM,IAEViQ,KAOIQ,EAAoBtvB,KAAK0pB,iBAAiB,OAAQjP,GACxDza,KAAK2pB,aAAahmB,KAAK,KACrB3D,KAAK6R,eAAevN,OAAOgrB,GAC3BtvB,KAAK6R,eAAevN,OAAOyqB,SAExB,CACL3E,EAAYF,KAER2E,IACF7uB,KAAK2pB,aAAe,gBAGtB,MAAMlgB,EAAO,KACXqlB,IAEA,MAAMS,EAAW,IAAetQ,YAAYpF,GAS5C,OAPIgV,GACFU,EAAS5rB,KAAK,KACZ3D,KAAK2pB,aAAazf,YAItBkgB,EAAUuE,OAAOzC,GAAa,EAAOqD,GAC9B,CAACA,aAGVnF,EAAUoF,oBAAoB/lB,GAC9BA,IAIDzJ,KAAKE,UAAUuV,SAAS,mBACzBtV,EAAOkB,OAAO6qB,GAEdlsB,KAAKqB,OAAO6qB,GAGdlsB,KAAKE,UAAUW,IAAI,eAEnBb,KAAK2pB,aAAahmB,KAAK,KACrB3D,KAAKE,UAAUoE,OAAO,eACtB4nB,EAAYhsB,UAAUW,IAAI,cAC1BiP,WAAW,KACToc,EAAY5nB,UACX,KAIE,GAA2Bsc,oBAAsB5gB,KAAKkZ,QACvDlZ,KAAKkZ,MAAM9U,OACX,GAA2Bgd,kBAAa/Y,QAMlC,QAAV,EAAArI,KAAKkZ,aAAK,eAAEmB,OACXuU,EACD7I,GAAE,GAEF,YAAiB5lB,EAAQ,KACvB4lB,GAAE,IACD,CAAClH,MAAM,EAAM4Q,SAAS,EAAMvL,SAAS,EAAOrS,eAAgB7R,KAAK6R,mBAU5E,uBACE,OAAO7R,KAAK6R,eAAehR,IAAIb,KAAKkZ,OAGtC,uBACKlZ,KAAK0vB,cAIL1vB,KAAK0tB,mBACN1tB,KAAK0tB,mBACL1tB,KAAK0tB,iBAAmB,MAGvB1tB,KAAK2pB,cACN3pB,KAAK2pB,aAAa0F,SAGpBrvB,KAAK6R,eAAeO,YACpBpS,KAAK6R,eAAiB,KAEtB7R,KAAKoqB,UAAY,OAIrBuF,eAAeC,OAAO,gBAAiB,I,cC9rBxB,MAAMC,GAOnB,YAAsB7hB,EAA0B8hB,GAA1B,KAAA9hB,YAA0B,KAAA8hB,OAC9C9vB,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAU4M,UAAYA,EAE3BhO,KAAK+vB,OAASpvB,SAASC,cAAc,OACrCZ,KAAK+vB,OAAO7vB,UAAUW,IAAImN,EAAY,WAEtChO,KAAK2R,QAAUhR,SAASC,cAAc,OACtCZ,KAAK2R,QAAQzR,UAAUW,IAAImN,EAAY,YAEvChO,KAAK0R,MAAQ/Q,SAASC,cAAc,OACpCZ,KAAK0R,MAAMxR,UAAUW,IAAImN,EAAY,UACrChO,KAAK0R,MAAMnR,aAAa,MAAO,QAE/BP,KAAKgwB,SAAWrvB,SAASC,cAAc,OACvCZ,KAAKgwB,SAAS9vB,UAAUW,IAAImN,EAAY,aACxChO,KAAKgwB,SAASzvB,aAAa,MAAO,QAElCP,KAAK2R,QAAQtQ,OAAOrB,KAAK0R,MAAO1R,KAAKgwB,UACrChwB,KAAKoB,UAAUC,OAAOrB,KAAK+vB,OAAQ/vB,KAAK2R,UCfrC,SAASse,GAAuBvwB,G,QASrC,IAAI,MAACgS,EAAK,QAAEgb,EAAO,SAAEsD,EAAQ,WAAEE,EAAU,QAAEC,EAAO,QAAEpoB,EAAO,aAAEqmB,GAAgB1uB,OAChE2I,IAAVqJ,IACoB,iBAAZ,IACPA,EAAQ,OAAA0e,GAAA,GAAa1e,EAAO,KAC5BA,EAAQ,IAAkB6a,cAAc7a,IAG1C,OAAAjB,EAAA,GAAeic,EAAShb,IAGtB0c,IACFA,EAAe,IAGjB,IAAI3V,EAAQ1Q,GAAWA,EAAQ0Q,MAC3BoC,GAAW,EAAOwV,GAAU,EAChC,MAAMC,EAAgBH,EAAUhkB,MAAMC,KAAK+jB,EAAQI,UAAU5qB,QAAU,GACvE,IAAI6qB,EACJ,GAAG/X,GAAS0X,GAUV,GATAD,EAAWO,YAAc,GACzBP,EAAW7uB,OAAO,IAAmBqvB,oBAAoB3oB,OAASM,OAAWA,OAAWA,OAAWA,GAAW,IAI3GoQ,EAAMkY,UACPlY,EAAQA,EAAMkY,SAGblY,EAAMtQ,OAAUsQ,EAAM9X,WAAiC,QAArB,EAAA8X,EAAM9X,SAAS4e,cAAM,eAAE5d,QAA0G,CACpK6uB,EAAa,GAAaI,KAAKC,QAAQC,gBACvC,MAAMxC,EAAgB,GAAasC,KAAKC,QAAQvC,cAEhD,GAA4B,aAAX,QAAd,EAAA7V,EAAM9X,gBAAQ,eAAEN,MACjBwa,GAAW,EACXkW,GAAY,CACVlX,IAAKpB,EAAM9X,SACXqwB,IAAKb,EACL7B,gBACA2C,MAAOC,GAEP1tB,MAnDS,GAoDTC,OApDS,GAqDT+sB,aACApC,qBAEG,CACL,MAAMjmB,EAAQsQ,EAAMtQ,OAASsQ,EAAM9X,SAEnC0vB,EAAyB,UAAfloB,EAAM9H,KAEhB,IACE4tB,GAAU,CACR9lB,QACA/G,UAAW+uB,EACXjC,SAjEO,GAkEPC,UAlEO,GAmEPjrB,KAAM,IAAiBiuB,gBAAgBhpB,EAnEhC,OAoEPqoB,aACAlC,gBACA8C,QAAQ,EACR/C,kBAAkB,EAClBD,iBAEFvT,GAAW,EACX,MAAMvK,YAMTvI,GACDmoB,EAAWO,YAAc,GACzBP,EAAW7uB,OAAO,IAAmBqvB,oBAAoB3oB,MAEjC,iBAAf,IACPioB,EAAW,OAAAI,GAAA,GAAaJ,EAAU,KAClCA,EAAW,IAAkBzD,cAAcyD,IAG7C,OAAAvf,EAAA,GAAeyf,EAAYF,GAAY,KAa3C,OATA3qB,QAAQC,IAAI8oB,GAAczqB,KAAK,KAC1B6sB,IAAeA,MAClBF,EAAc/lB,QAAQ8mB,GAASA,EAAM/sB,UAElC6rB,GACDA,EAAQjwB,UAAUC,OAAO,WAAYkwB,MAIlCxV,EAGM,MAAM,WAAuBgV,GAG1C,YAAsB7hB,GACpBrO,MAAMqO,EAAW,CAAC0D,EAAOse,EAAW,GAAIjoB,KAClC/H,KAAKmwB,UACPnwB,KAAKmwB,QAAUxvB,SAASC,cAAc,OACtCZ,KAAKmwB,QAAQjwB,UAAUW,IAAIb,KAAKgO,UAAY,WAG9C,MAAMsjB,EAAarB,GAAuB,CACxCve,QACAgb,QAAS1sB,KAAK0R,MACdse,WACAE,WAAYlwB,KAAKgwB,SACjBG,QAASnwB,KAAKmwB,QACdpoB,YAGF/H,KAAKoB,UAAUlB,UAAUC,OAAO,WAAYmxB,GACzCA,EACDtxB,KAAK2R,QAAQ3Q,QAAQhB,KAAKmwB,SAE1BnwB,KAAKmwB,QAAQ7rB,WApBG,KAAA0J,aC5HT,SAASujB,GAAWtpB,EAAeupB,GAChD,OAAOvpB,EAAIwpB,OAAO,CAACC,EAAK/sB,IAAU+sB,EAAM/sB,EAAO6sB,GCuB1C,MAAMG,GACL,EADKA,GAEN,EAFMA,GAGJ,EAHIA,GAIH,EAJGA,GAKL,EAID,MAAM,GAOX,YAAoBlS,EAAuBmS,EAA0BC,EAA0BC,EAAyBC,EAAYH,GAAhH,KAAAnS,QAAuB,KAAAmS,WAA0B,KAAAC,WAA0B,KAAAC,UAAyB,KAAAC,YACtH/xB,KAAKsI,MAAQmX,EAAM9d,OACnB3B,KAAKgyB,OAAS,GAASC,YAAYxS,GACnCzf,KAAKkyB,YAAc,GAASC,iBAAiBnyB,KAAKgyB,QAClDhyB,KAAKoyB,aAAeb,GAAWvxB,KAAKgyB,OAAQ,GAAKhyB,KAAKsI,MACtDtI,KAAKqyB,aAAeT,EAAW5xB,KAAK+xB,UAG/B,SACL,OAAI/xB,KAAKsI,MAGNtI,KAAKsI,OAAS,GAAKtI,KAAKgyB,OAAO3d,KAAK0R,GAAKA,EAAI,GACvC,IAAI,GAAgB/lB,KAAKgyB,OAAQhyB,KAAKoyB,aAAcpyB,KAAK4xB,SAAU5xB,KAAK6xB,SAAU7xB,KAAK8xB,SAASQ,SAGvF,IAAftyB,KAAKsI,MAAoBtI,KAAKuyB,YACV,IAAfvyB,KAAKsI,MAAoBtI,KAAKwyB,cAC/BxyB,KAAKyyB,aATW,GAYjB,YACN,MAAyB,OAArBzyB,KAAKkyB,aACHlyB,KAAKoyB,aAAe,IAAMpyB,KAAKqyB,cAC/BryB,KAAKgyB,OAAO,GAAKhyB,KAAKgyB,OAAO,GAAK,GAC/BhyB,KAAK0yB,qBACiB,OAArB1yB,KAAKkyB,aAA6C,OAArBlyB,KAAKkyB,YACnClyB,KAAK2yB,0BAEP3yB,KAAK4yB,qBAGN,cAEN,MAA2B,MAAxB5yB,KAAKkyB,YAAY,GACXlyB,KAAK6yB,0BAEP7yB,KAAK8yB,yBAGN,aACN,MAA2B,MAAxB9yB,KAAKkyB,YAAY,GACXlyB,KAAK+yB,wBAEP/yB,KAAKgzB,yBAGN,qBACN,MAAMxvB,EAAQxD,KAAK4xB,SACbnuB,EAASoB,KAAKE,MAAMF,KAAKC,IAC7BtB,EAAQxD,KAAKgyB,OAAO,GACpBntB,KAAKC,IACHtB,EAAQxD,KAAKgyB,OAAO,IACnBhyB,KAAK+xB,UAAY/xB,KAAK8xB,SAAW,KAEtC,MAAO,CACL,CACEmB,SAAU,CAAC7P,EAAG,EAAGE,EAAG,EAAG9f,QAAOC,UAC9ByvB,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAAC7P,EAAG,EAAGE,EAAG7f,EAASzD,KAAK8xB,QAAStuB,QAAOC,UAClDyvB,MAAOvB,GAAgBA,GAAkBA,KAKvC,0BACN,MAAMnuB,GAASxD,KAAK4xB,SAAW5xB,KAAK8xB,SAAW,EACzCruB,EAASoB,KAAKE,MAAMF,KAAKC,IAC7BtB,EAAQxD,KAAKgyB,OAAO,GACpBntB,KAAKC,IAAItB,EAAQxD,KAAKgyB,OAAO,GAAqB,EAAjBhyB,KAAK+xB,aAExC,MAAO,CACL,CACEkB,SAAU,CAAC7P,EAAG,EAAGE,EAAG,EAAG9f,QAAOC,UAC9ByvB,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC7P,EAAG5f,EAAQxD,KAAK8xB,QAASxO,EAAG,EAAG9f,QAAOC,UACjDyvB,MAAOvB,GAAeA,GAAiBA,KAKrC,qBACN,MAAMwB,EAAetuB,KAAKE,MAAsB,IAAhB/E,KAAK6xB,UAC/BuB,EAAcvuB,KAAKC,IACvBD,KAAKE,MAAMF,KAAKJ,IACd,IAAOzE,KAAK4xB,SAAW5xB,KAAK8xB,UAC3B9xB,KAAK4xB,SAAW5xB,KAAK8xB,SAAW9xB,KAAKgyB,OAAO,IACxC,EAAIhyB,KAAKgyB,OAAO,GAAK,EAAIhyB,KAAKgyB,OAAO,MAC5ChyB,KAAK4xB,SAAW5xB,KAAK8xB,QAAUqB,GAC3BE,EAAarzB,KAAK4xB,SACpBwB,EACApzB,KAAK8xB,QACHruB,EAASoB,KAAKC,IAClB9E,KAAK+xB,UACLltB,KAAKE,MAAMF,KAAKC,IACduuB,EAAarzB,KAAKgyB,OAAO,GACzBoB,EAAcpzB,KAAKgyB,OAAO,MAE9B,MAAO,CACL,CACEiB,SAAU,CAAC7P,EAAG,EAAGE,EAAG,EAAG9f,MAAO6vB,EAAY5vB,UAC1CyvB,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC7P,EAAGiQ,EAAarzB,KAAK8xB,QAASxO,EAAG,EAAG9f,MAAO4vB,EAAa3vB,UACnEyvB,MAAOvB,GAAeA,GAAiBA,KAKrC,0BACN,MAAM2B,EAActzB,KAAK+xB,UACnBwB,EAAc1uB,KAAKE,MAAMF,KAAKC,KACjC9E,KAAK+xB,UAAY/xB,KAAK8xB,SAAW,EACjC9xB,KAAKgyB,OAAO,IAAMhyB,KAAK4xB,SAAW5xB,KAAK8xB,UACnC9xB,KAAKgyB,OAAO,GAAKhyB,KAAKgyB,OAAO,MAC9BwB,EAAeF,EACjBC,EACAvzB,KAAK8xB,QACH2B,EAAa5uB,KAAKJ,IACtBzE,KAAK6xB,SACLhtB,KAAKE,MAAMF,KAAKC,KACb9E,KAAK4xB,SAAW5xB,KAAK8xB,SAAW,EACjCjtB,KAAKC,IACHyuB,EAAcvzB,KAAKgyB,OAAO,GAC1BwB,EAAexzB,KAAKgyB,OAAO,OAC3B0B,EAAY7uB,KAAKC,IACrBD,KAAKE,MAAMuuB,EAActzB,KAAKgyB,OAAO,IACrChyB,KAAK4xB,SAAW5xB,KAAK8xB,QAAU2B,GAEjC,MAAO,CACL,CACER,SAAU,CAAC7P,EAAG,EAAGE,EAAG,EAAG9f,MAAOkwB,EAAWjwB,OAAQ6vB,GACjDJ,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC7P,EAAGsQ,EAAY1zB,KAAK8xB,QAASxO,EAAG,EAAG9f,MAAOiwB,EAAYhwB,OAAQ+vB,GACzEN,MAAOvB,GAAeA,IAExB,CACEsB,SAAU,CAAC7P,EAAGsQ,EAAY1zB,KAAK8xB,QAASxO,EAAGkQ,EAAexzB,KAAK8xB,QAAStuB,MAAOiwB,EAAYhwB,OAAQ8vB,GACnGL,MAAOvB,GAAkBA,KAKvB,yBACN,MAAM0B,EAAarzB,KAAK4xB,SAClB0B,EAAczuB,KAAKE,MAAMF,KAAKC,IAClCuuB,EAAarzB,KAAKgyB,OAAO,GACS,KAAjChyB,KAAK+xB,UAAY/xB,KAAK8xB,WACnBsB,GAAepzB,KAAK4xB,SAAW5xB,KAAK8xB,SAAW,EAC/C0B,EAAe3uB,KAAKC,IACxB9E,KAAK+xB,UAAYuB,EAActzB,KAAK8xB,QACpCjtB,KAAKE,MAAMF,KAAKC,IACdsuB,EAAcpzB,KAAKgyB,OAAO,GAC1BoB,EAAcpzB,KAAKgyB,OAAO,MACxB2B,EAAaN,EAAaD,EAAcpzB,KAAK8xB,QAEnD,MAAO,CACL,CACEmB,SAAU,CAAC7P,EAAG,EAAGE,EAAG,EAAG9f,MAAO6vB,EAAY5vB,OAAQ6vB,GAClDJ,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAAC7P,EAAG,EAAGE,EAAGgQ,EAActzB,KAAK8xB,QAAStuB,MAAO4vB,EAAa3vB,OAAQ+vB,GAC5EN,MAAOvB,GAAkBA,IAE3B,CACEsB,SAAU,CAAC7P,EAAGgQ,EAAcpzB,KAAK8xB,QAASxO,EAAGgQ,EAActzB,KAAK8xB,QAAStuB,MAAOmwB,EAAYlwB,OAAQ+vB,GACpGN,MAAOvB,GAAkBA,KAKvB,wBACN,MAAM5S,EAAI/e,KAAK4xB,SACTgC,EAAK/uB,KAAKE,MAAMF,KAAKC,IACzBia,EAAI/e,KAAKgyB,OAAO,GACkB,KAAjChyB,KAAK+xB,UAAY/xB,KAAK8xB,WACnBpS,EAAI7a,KAAKE,OACZ/E,KAAK4xB,SAAW,EAAI5xB,KAAK8xB,UACrB9xB,KAAKgyB,OAAO,GAAKhyB,KAAKgyB,OAAO,GAAKhyB,KAAKgyB,OAAO,KAC/C6B,EAAKhvB,KAAKJ,IACdzE,KAAK6xB,SACLhtB,KAAKE,MAAMF,KAAKC,IACuB,IAApC9E,KAAK4xB,SAAW,EAAI5xB,KAAK8xB,SAC1BpS,EAAI1f,KAAKgyB,OAAO,MACd8B,EAAKjvB,KAAKE,MAAMF,KAAKJ,IACzBI,KAAKJ,IACa,EAAhBzE,KAAK6xB,SACgC,KAApC7xB,KAAK4xB,SAAW,EAAI5xB,KAAK8xB,UAC5BpS,EAAI1f,KAAKgyB,OAAO,KACZ+B,EAAKhV,EAAI8U,EAAKC,EAAK,EAAI9zB,KAAK8xB,QAC5BkC,EAAKnvB,KAAKC,IACd9E,KAAK+xB,UAAY6B,EAAK5zB,KAAK8xB,QAC3BpS,GAEF,MAAO,CACL,CACEuT,SAAU,CAAC7P,EAAG,EAAGE,EAAG,EAAG9f,MAAOub,EAAGtb,OAAQmwB,GACzCV,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAAC7P,EAAG,EAAGE,EAAGsQ,EAAK5zB,KAAK8xB,QAAStuB,MAAOqwB,EAAIpwB,OAAQuwB,GAC1Dd,MAAOvB,GAAkBA,IAE3B,CACEsB,SAAU,CAAC7P,EAAGyQ,EAAK7zB,KAAK8xB,QAASxO,EAAGsQ,EAAK5zB,KAAK8xB,QAAStuB,MAAOuwB,EAAItwB,OAAQuwB,GAC1Ed,MAAOvB,IAET,CACEsB,SAAU,CAAC7P,EAAGyQ,EAAK7zB,KAAK8xB,QAAUiC,EAAK/zB,KAAK8xB,QAASxO,EAAGsQ,EAAK5zB,KAAK8xB,QAAStuB,MAAOswB,EAAIrwB,OAAQuwB,GAC9Fd,MAAOvB,GAAiBA,KAKtB,yBACN,MAAMjS,EAAI1f,KAAK+xB,UACT8B,EAAKhvB,KAAKE,MAAMF,KAAKC,IACzB4a,EAAI1f,KAAKgyB,OAAO,GACiB,IAAhChyB,KAAK4xB,SAAW5xB,KAAK8xB,WAElB/S,EAAIla,KAAKE,OACZ/E,KAAK+xB,UAAY,EAAI/xB,KAAK8xB,UACtB,EAAK9xB,KAAKgyB,OAAO,GAAK,EAAKhyB,KAAKgyB,OAAO,GAAK,EAAKhyB,KAAKgyB,OAAO,KAE9D4B,EAAK/uB,KAAKE,MAAMga,EAAI/e,KAAKgyB,OAAO,IAChCgC,EAAKnvB,KAAKE,MAAMga,EAAI/e,KAAKgyB,OAAO,IAChCiC,EAAKvU,EAAIkU,EAAKI,EAAK,EAAIh0B,KAAK8xB,QAC5BiC,EAAKlvB,KAAKJ,IACdzE,KAAK6xB,SACLhtB,KAAKC,IAAI9E,KAAK4xB,SAAWiC,EAAK7zB,KAAK8xB,QAAS/S,IAE9C,MAAO,CACL,CACEkU,SAAU,CAAC7P,EAAG,EAAGE,EAAG,EAAG9f,MAAOqwB,EAAIpwB,OAAQic,GAC1CwT,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC7P,EAAGyQ,EAAK7zB,KAAK8xB,QAASxO,EAAG,EAAG9f,MAAOuwB,EAAItwB,OAAQmwB,GAC1DV,MAAOvB,GAAeA,IAExB,CACEsB,SAAU,CAAC7P,EAAGyQ,EAAK7zB,KAAK8xB,QAASxO,EAAGsQ,EAAK5zB,KAAK8xB,QAAStuB,MAAOuwB,EAAItwB,OAAQuwB,GAC1Ed,MAAOvB,IAET,CACEsB,SAAU,CAAC7P,EAAGyQ,EAAK7zB,KAAK8xB,QAASxO,EAAGsQ,EAAKI,EAAK,EAAIh0B,KAAK8xB,QAAStuB,MAAOuwB,EAAItwB,OAAQwwB,GACnFf,MAAOvB,GAAkBA,KAKvB,mBAAmBlS,GACzB,OAAOA,EAAMhT,IAAIvJ,GAAQA,EAAK6b,EAAI7b,EAAKwc,GAGjC,wBAAwBsS,GAC9B,OAAOA,EAAOvlB,IAAIynB,GAAUA,EAAQ,IAAO,IAAOA,EAAQ,GAAO,IAAM,KAAK9I,KAAK,KAIrF,MAAM,GAIJ,YAAY4G,EAA0BI,EAA8BR,EAA0BC,EAA0BC,EAAyBC,EAAuB,EAAXH,EAAe,GAAtI,KAAAQ,eAA8B,KAAAR,WAA0B,KAAAC,WAA0B,KAAAC,UAAyB,KAAAC,YAC/I/xB,KAAKgyB,OAAS,GAAgBmC,WAAWnC,EAAQI,GACjDpyB,KAAKsI,MAAQ0pB,EAAOrwB,OAGd,kBAAkBqwB,EAAkBI,GAG1C,OAAOJ,EAAOvlB,IAAIynB,GACT9B,EAAe,IACrB,OAAA9M,GAAA,GAAM4O,EAAO,EAJE,MAKf,OAAA5O,GAAA,GAAM4O,EAJS,MAIS,IAItB,SACL,IAAI5pB,EAAS,IAAI6B,MAAwBnM,KAAKsI,OAE1C8rB,EAAsB,GAC1B,MAAMC,EAAc,CAACC,EAAgBhsB,KACnC,MACMisB,EAAMhD,GADGvxB,KAAKgyB,OAAOrsB,MAAM2uB,EAAQA,EAAShsB,GACnB,GAC/B,OAAQtI,KAAK4xB,UAAYtpB,EAAQ,GAAKtI,KAAK8xB,SAAWyC,GAElDC,EAAeC,IACnB,IAAIC,EAAoB,GACpBJ,EAAS,EACb,IAAI,IAAIhsB,KAASmsB,EACfC,EAAQnrB,KAAK8qB,EAAYC,EAAQhsB,IACjCgsB,GAAUhsB,EAEZ8rB,EAAS7qB,KAAK,CAACkrB,aAAYC,aAG7B,IAAI,IAAIC,EAAQ,EAAGA,IAAU30B,KAAKsI,QAASqsB,EAAO,CAChD,MAAMC,EAAS50B,KAAKsI,MAAQqsB,EACzBA,EAAQ,GAAKC,EAAS,GAGzBJ,EAAY,CAACG,EAAOC,IAEtB,IAAI,IAAID,EAAQ,EAAGA,IAAU30B,KAAKsI,MAAQ,IAAKqsB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAW50B,KAAKsI,MAAQqsB,IAASC,EAAQ,CAC3D,MAAMC,EAAQ70B,KAAKsI,MAAQqsB,EAAQC,EAC/BD,EAAQ,GACNC,GAAW50B,KAAKoyB,aAAe,IAAQ,EAAI,IAC3CyC,EAAQ,GAGdL,EAAY,CAACG,EAAOC,EAAQC,IAGhC,IAAI,IAAIF,EAAQ,EAAGA,IAAU30B,KAAKsI,MAAQ,IAAKqsB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAW50B,KAAKsI,MAAQqsB,IAASC,EACnD,IAAI,IAAIC,EAAQ,EAAGA,IAAU70B,KAAKsI,MAAQqsB,EAAQC,IAAUC,EAAO,CACjE,MAAMC,EAAS90B,KAAKsI,MAAQqsB,EAAQC,EAASC,EAC1CF,EAAQ,GAAKC,EAAS,GAAKC,EAAQ,GAAKC,EAAS,GAGpDN,EAAY,CAACG,EAAOC,EAAQC,EAAOC,IAKzC,IAAIC,EAA0B,KAC1BC,EAAc,EAClB,IAAI,MAAMC,KAAWb,EAAU,CAC7B,MAAM,QAACM,EAASD,WAAYS,GAAUD,EAChCE,EAAYD,EAAOvzB,OACnByzB,EAAc7D,GAAWmD,EAAS,GACpC10B,KAAK8xB,SAAWqD,EAAY,GAC1BE,EAAgBxwB,KAAKC,OAAO4vB,GAE5BY,GADgBzwB,KAAKJ,OAAOiwB,GACpBW,EAAgBr1B,KAAK6xB,SAAY,IAAM,GAC/C0D,EAAO,MACX,IAAI,IAAIC,EAAO,EAAGA,IAASL,IAAaK,EACtC,GAAGN,EAAOM,EAAO,GAAKN,EAAOM,GAC3B,OAAO,IAGX,OAAO,GANI,GAQPC,EAAO5wB,KAAK+B,IAAIwuB,EAAcp1B,KAAK+xB,WAAauD,EAAOC,IACzDR,GAAkBU,EAAOT,KAC3BD,EAAiBE,EACjBD,EAAcS,GAIlB,MAAMC,EAAgBX,EAAeN,WAChCkB,EAAiBZ,EAAeL,QAC/BkB,EAAWF,EAAc/zB,OAE/B,IAAIujB,EAAQ,EACR5B,EAAI,EACR,IAAI,IAAIuS,EAAM,EAAGA,IAAQD,IAAYC,EAAK,CACxC,MAAMC,EAAWJ,EAAcG,GACzBE,EAAaJ,EAAeE,GAC5BpyB,EAASoB,KAAKE,MAAMgxB,GAE1B,IAAI3S,EAAI,EACR,IAAI,IAAI4S,EAAM,EAAGA,IAAQF,IAAYE,EAAK,CACxC,MAAM9C,EAAQvB,IACD,IAARkE,EAAYlE,GAAeA,KAC3BkE,IAAQD,EAAW,EAAIjE,GAAkBA,KACjC,IAARqE,EAAYrE,GAAgBA,KAC5BqE,IAAQF,EAAW,EAAInE,GAAiBA,IAEvCuC,EAAQl0B,KAAKgyB,OAAO9M,GACpB1hB,EAASwyB,IAAQF,EAAW,EAC7B91B,KAAK4xB,SAAWxO,EACjBve,KAAKE,MAAMmvB,EAAQ6B,GACvBzrB,EAAO4a,GAAS,CACd+N,SAAU,CAAC7P,IAAGE,IAAG9f,QAAOC,UACxByvB,SAGF9P,GAAK5f,EAAQxD,KAAK8xB,UAChB5M,EAEJ5B,GAAK7f,EAASzD,KAAK8xB,QAGrB,OAAOxnB,G,uBCraI,MAAM,GAenB,YAAY5K,GAHJ,KAAAu2B,WAAY,EACZ,KAAA7lB,WAAa,IAiEd,KAAA8lB,UAAY,KACjB,GAAGl2B,KAAK6U,aACN,OAAO,EAGT,IAAIshB,EAAgB,EAAGC,EAAiB,EAAGC,EAAsB,EAiBjE,OAhBAr2B,KAAKs2B,YAAY/rB,QAAQ/F,IACpBA,EAAW+xB,YACT/xB,EAAW0xB,eACVC,EAGD3xB,EAAWgyB,YACVH,GAIH7xB,EAAWgyB,YACVJ,IAICA,IAAmBC,GAAuBF,EAAgB,GAG5D,KAAAM,aAAe,KACpBz2B,KAAK4V,QAAQ1V,UAAUC,OAAO,aAAcH,KAAKk2B,cAhFjD,OAAAptB,EAAA,GAAW9I,KAAMN,GAEbM,KAAK4V,QAEE5V,KAAK4V,QAAQ1V,UAAUuV,SAAS,gBACzCzV,KAAKy2B,aAAe,KAClBz2B,KAAK4V,QAAQ8gB,gBAAgB,YAAa12B,KAAKk2B,aAAel2B,KAAKuW,YAHrEvW,KAAK4V,QAAU,EAAa,CAACzE,KAAM,UAOjCzR,EAAQi3B,gBACV32B,KAAK42B,WAAaj2B,SAASC,cAAc,kBACzCZ,KAAK42B,WAAW12B,UAAUW,IAAI,qBAAsB,UAAYb,KAAKoQ,YACrEpQ,KAAK42B,WAAWC,kBAAkB,CAAC5rB,OAAQjL,KAAKiL,SAE5CvL,EAAQo3B,kBACV92B,KAAKgV,WAAa,IAAI,EAAYC,IAChCjV,KAAK6U,aAAeI,EACpBjV,KAAKy2B,eACLz2B,KAAK42B,WAAWtyB,WAGlBtE,KAAKgV,WAAW5T,UAAUC,OAAOrB,KAAK42B,cAI1C52B,KAAKs2B,YAAY/rB,QAAQ/F,IACvBxE,KAAK6R,eAAehR,IAAI2D,EAAWpE,MAAnCJ,CAA0C,QAASA,KAAKy2B,gBAG1Dz2B,KAAKy2B,eAGP,eACE,OAAOz2B,KAAKi2B,UAGd,aAAoBtxB,GAClB3E,KAAKi2B,UAAYtxB,EACjB3E,KAAKs2B,YAAY/rB,QAAQ/F,GAAcA,EAAWpE,MAAMs2B,gBAAgB,WAAY/xB,IACpF3E,KAAKy2B,eAGA,gBAAgBrsB,EAAuB2sB,GAAkB,GAC9D/2B,KAAKuW,UAAW,EAChBnM,EAAQzG,KAAK,KACRozB,IACD/2B,KAAKuW,UAAW,IAEjB,KACDvW,KAAKuW,UAAW,KClFP,SAASygB,GAAUC,EAA6DvnB,GAC7F,MAAMwnB,EAAOv2B,SAASC,cAAc,QAYpC,OAVAq2B,EAAO1sB,QAAQwb,IACb,MAAM,UAAC3kB,EAAS,MAAEhB,GAAS2lB,EAC3BmR,EAAK71B,OAAOD,GACZhB,EAAMkB,iBAAiB,SAAWvB,IAC7BK,EAAM+2B,SACPznB,EAAStP,EAAMuE,MAAO5E,OAKrBm3B,ECJM,MAAM,GAYnB,YAAYx3B,EAgBP,IAlBE,KAAA03B,SAAU,EAmBfp3B,KAAKoB,UAAYT,SAASC,cAAclB,EAAQ23B,YAAc33B,EAAQ43B,cAAgB,QAAU,OAChGt3B,KAAKoB,UAAUlB,UAAUW,IAAI,OAE7Bb,KAAKgwB,SAAWrvB,SAASC,cAAc,OACvCZ,KAAKgwB,SAAS9vB,UAAUW,IAAI,gBAC5Bb,KAAKgwB,SAASzvB,aAAa,MAAO,QAC/Bb,EAAQswB,SACuB,iBAAtBtwB,EAAgB,SACxB,OAAAotB,EAAA,GAAa9sB,KAAKgwB,SAAUtwB,EAAQswB,UAEpChwB,KAAKgwB,SAAS3uB,OAAO3B,EAAQswB,UAEvBtwB,EAAQ63B,iBAChBv3B,KAAKgwB,SAAS3uB,OAAO,YAAK3B,EAAQ63B,gBAAiB73B,EAAQ83B,mBAE7Dx3B,KAAKoB,UAAUC,OAAOrB,KAAKgwB,UAE3B,IAAIyH,IAAgB/3B,EAAQ+3B,YAC5B,GAAG/3B,EAAQ23B,YAAc33B,EAAQ43B,cAAe,CAO9C,GANG53B,EAAQ23B,aACTr3B,KAAKq3B,WAAa33B,EAAQ23B,WAC1Br3B,KAAKoB,UAAUC,OAAOrB,KAAKq3B,WAAWtxB,OACtC0xB,GAAc,GAGb/3B,EAAQ43B,cAAe,CACxBt3B,KAAKs3B,cAAgB53B,EAAQ43B,cAE7B,MAAMI,EAAWh4B,EAAQ43B,cAAcvxB,MAAM7F,UAAUuV,SAAS,yBAC7DiiB,GACD13B,KAAKoB,UAAUlB,UAAUW,IAAI,mBAC7BnB,EAAQi4B,WAAa33B,KAAKs3B,cAAcvxB,QAExC0xB,GAAc,EACdz3B,KAAKoB,UAAUC,OAAOrB,KAAKs3B,cAAcvxB,QAGvCrG,EAAQk4B,oBAAuBF,GACjC13B,KAAKs3B,cAAcl3B,MAAMkB,iBAAiB,SAAU,KAClD,OAAAmP,EAAA,GAAezQ,KAAKgwB,SAAU,YAAKhwB,KAAKs3B,cAAcl3B,MAAM+2B,QAAU,mBAAqB,yBAKvFz3B,EAAQ23B,YAAc33B,EAAQ43B,eACtCvxB,MAAM7F,UAAUW,IAAI,iBAGxB,GAAGnB,EAAQgS,OAAShS,EAAQm4B,aAAc,CACxC,IAAIC,EACJ,MAAMH,EAAaj4B,EAAQi4B,YAAcj4B,EAAQq4B,oBAuBjD,GAtBGJ,GACDG,EAAIn3B,SAASC,cAAc,OAC3Bk3B,EAAE53B,UAAUW,IAAI,iBAChBb,KAAKoB,UAAUC,OAAOy2B,IAEtBA,EAAI93B,KAAKoB,UAGXpB,KAAK0R,MAAQ/Q,SAASC,cAAc,OACpCZ,KAAK0R,MAAMxR,UAAUW,IAAI,aACzBb,KAAK0R,MAAMnR,aAAa,MAAO,QAC5Bb,EAAQgS,MACoB,iBAAnBhS,EAAa,MACrBM,KAAK0R,MAAMlD,UAAY9O,EAAQgS,MAE/B1R,KAAK0R,MAAMrQ,OAAO3B,EAAQgS,OAG5B1R,KAAK0R,MAAMrQ,OAAO,YAAK3B,EAAQm4B,eAEjCC,EAAEz2B,OAAOrB,KAAK0R,OAEXimB,EAAY,CACb,MAAMK,EAAeh4B,KAAK23B,WAAah3B,SAASC,cAAc,OAC9Do3B,EAAa93B,UAAUW,IAAI,YAAa,mBAErCnB,EAAQq4B,qBACTC,EAAa93B,UAAUW,IAAI,6BAGH,iBAAjB,EACPm3B,EAAaxpB,UAAYmpB,EAEzBK,EAAa32B,OAAOs2B,GAGtBG,EAAEz2B,OAAO22B,IAIVt4B,EAAQyR,OACTsmB,GAAc,EACdz3B,KAAK0R,MAAMxR,UAAUW,IAAI,QAAS,SAAWnB,EAAQyR,MACrDnR,KAAKoB,UAAUlB,UAAUW,IAAI,kBAG5B42B,GACDz3B,KAAKoB,UAAUlB,UAAUW,IAAI,oBAG5BnB,EAAQu4B,gBACTv4B,EAAQuO,UAAY,IAAMvO,EAAQu4B,cAAcvjB,SAG/ChV,EAAQuO,WAAavO,EAAQ23B,YAAc33B,EAAQ43B,iBACnB,mBAAvB53B,EAAiB,WACzBM,KAAKoB,UAAUE,iBAAiB,QAAUvB,IACrCC,KAAKo3B,SACP13B,EAAQuO,UAAkBlO,KAI/BC,KAAKoB,UAAUlB,UAAUW,IAAI,gBAAiB,gBAE1CnB,EAAQ+R,UACV,OAAAymB,GAAA,GAAOl4B,KAAKoB,eAAWiH,OAAWA,GAAW,IAS5C,YAAYnF,GACjBlD,KAAKoB,UAAUlB,UAAUW,IAAI,oBAE7B,MAAM4X,EAAQzY,KAAKyY,MAAQ9X,SAASC,cAAc,OASlD,OARA6X,EAAMvY,UAAUW,IAAI,aAEjBqC,GACDuV,EAAMvY,UAAUW,IAAI,aAAeqC,GAGrClD,KAAKoB,UAAUC,OAAOoX,GAEfA,GAIJ,MAAM0f,GAAoB,CAACC,EAAa1oB,IACtCsnB,GAAUoB,EAAK3rB,IAAIsZ,IAAK,CAAE3kB,UAAW2kB,EAAE3kB,UAAWhB,MAAO2lB,EAAEsR,WAAWj3B,SAAUsP,GC1JlF,SAAS2oB,GAAoBC,GAC9BhhB,UAAUihB,UAKdjhB,UAAUihB,UAAUC,UAAUF,GA/BhC,SAAqCA,GACnC,IAAIG,EAAW93B,SAASC,cAAc,YACtC63B,EAAS9zB,MAAQ2zB,EAGjBG,EAAStzB,MAAMuzB,IAAM,IACrBD,EAAStzB,MAAMwgB,KAAO,IACtB8S,EAAStzB,MAAMwzB,SAAW,QAE1Bh4B,SAASgC,KAAKi2B,YAAYH,GAC1BA,EAASx2B,QACTw2B,EAAS11B,SAET,IACEpC,SAASk4B,YAAY,QAIrB,MAAMvoB,IAIR3P,SAASgC,KAAKm2B,YAAYL,GAKxBM,CAA4BT,G,sBCxBjB,MAAM,GAKnB,YAAY54B,GAQV,MAAMqG,EAAQ/F,KAAK+F,MAAQpF,SAASC,cAAc,SAClDmF,EAAM7F,UAAUW,IAAI,eAEjBnB,EAAQs5B,YACTjzB,EAAM7F,UAAUW,IAAI,qBAGtB,MAAMT,EAAQJ,KAAKI,MAAQO,SAASC,cAAc,SAClDR,EAAMC,KAAO,QACID,EAAMI,KAAO,eAAiBd,EAAQc,KAEpDd,EAAQiF,QACTvE,EAAMuE,MAAQjF,EAAQiF,MAEnBjF,EAAQu5B,WACTC,EAAA,EAAgBC,WAAWx1B,KAAKy1B,IAC9Bh5B,EAAM+2B,QAAU,OAAAkC,GAAA,GAAgBD,EAAO15B,EAAQu5B,YAAcv5B,EAAQiF,QAGvEvE,EAAMkB,iBAAiB,SAAU,KAC/B43B,EAAA,EAAgBI,SAAS55B,EAAQu5B,SAAUv5B,EAAQiF,WAKzD,MAAM40B,EAAOv5B,KAAKu5B,KAAO54B,SAASC,cAAc,OAChD24B,EAAKr5B,UAAUW,IAAI,oBAEhBnB,EAAQ44B,KACTiB,EAAK/qB,UAAY9O,EAAQ44B,KAWjB54B,EAAQ85B,SAChB,YAAMD,EAAM75B,EAAQ85B,SAGtBzzB,EAAM1E,OAAOjB,EAAOm5B,GAGtB,cACE,OAAOv5B,KAAKI,MAAM+2B,QAGpB,YAAYA,GACVn3B,KAAK4F,iBAAiBuxB,GAEtB,MAAMhU,EAAQ,IAAIsW,MAAM,SAAU,CAAC5I,SAAS,EAAMxG,YAAY,IAC9DrqB,KAAKI,MAAMkS,cAAc6Q,GAGpB,iBAAiBgU,GACtBn3B,KAAKI,MAAM+2B,QAAUA,GCzEzB,MAAMuC,GAAU/4B,SAASC,cAAc,OAEhC,SAAS+4B,GAAMhoB,GACpB,OAAAlB,EAAA,GAAeipB,GAAS/nB,GACxBhR,SAASgC,KAAKtB,OAAOq4B,IAElBA,GAAQxyB,QAAQ2J,SAASC,cAAc4oB,GAAQxyB,QAAQ2J,SAC1D6oB,GAAQxyB,QAAQ2J,QAAU,GAAKf,WAAW,KACxC4pB,GAAQp1B,gBACDo1B,GAAQxyB,QAAQ2J,SACtB,KAGE,SAAS+oB,GAASl6B,GAIvBi6B,GAAM,YAAKj6B,EAAQm6B,YAAan6B,EAAQo6B,oBAhB1CJ,GAAQx5B,UAAUW,IAAI,S,qBCIf,MAAM,WAA2B,IAatC,YAAYnB,GACVC,MAAMD,GAENM,KAAK+5B,uBAAyB,OAAAC,GAAA,GAASh6B,KAAKi6B,cAAcvzB,KAAK1G,MAAO,KAAK,GAAO,GAElFN,EAAQmS,eAAehR,IAAIb,KAAKI,MAAhCV,CAAuC,QAAS,KAC9C,MAAMiF,EAAQ3E,KAAKk6B,WAGnB,GAAGv1B,IAAU3E,KAAKm6B,gBAAkBx1B,EAAMhD,OAGxC,OAFA3B,KAAKo6B,SAAS,IAAWC,QAASr6B,KAAKN,QAAQqG,YAC/C/F,KAAKN,QAAQgQ,UAAY1P,KAAKN,QAAQgQ,YAE7B,IAAkB4qB,gBAAgB31B,GAG3C3E,KAAKo6B,SAAS,IAAWC,SAFzBr6B,KAAKu6B,SAASv6B,KAAKN,QAAQ86B,aAK1Bx6B,KAAKI,MAAMF,UAAUuV,SAAS,SAC/BzV,KAAKN,QAAQgQ,UAAY1P,KAAKN,QAAQgQ,WAIxC1P,KAAK+5B,uBAAuBp1B,KAIzB,WACL,IAAIA,EAAQ3E,KAAK2E,MAMjB,OALG3E,KAAKN,QAAQ+6B,OACd91B,EAAQA,EAAMgB,MAAM3F,KAAKN,QAAQ+6B,KAAK94B,QACtC3B,KAAK4F,iBAAiB5F,KAAKN,QAAQ+6B,KAAO91B,IAGrCA,EAGD,cAAc+1B,GACjB16B,KAAK26B,uBAEL36B,KAAKN,QAAQuL,OACdjL,KAAK26B,qBAAuB,KAAWC,UAAU,yBAA0B,CACzEC,QAAS,IAAgBC,gBAAgB96B,KAAKN,QAAQuL,OAAO8vB,YAC7DL,aAGF16B,KAAK26B,qBAAuB,KAAWC,UAAU,wBAAyB,CAACF,aAG7E16B,KAAK26B,qBAAqBh3B,KAAKq3B,IAC1Bh7B,KAAKk6B,aAAeQ,IAEpBM,EACDh7B,KAAKo6B,SAAS,IAAWa,MAAOj7B,KAAKN,QAAQw7B,eAE7Cl7B,KAAKu6B,SAASv6B,KAAKN,QAAQy7B,aAE3B7qB,IACF,GAAGtQ,KAAKk6B,aAAeQ,EAEvB,OAAOpqB,EAAIjQ,MACT,IAAK,mBACHL,KAAKu6B,SAASv6B,KAAKN,QAAQ86B,gBAI9B72B,KAAK,KACN3D,KAAK26B,0BAAuBtyB,EAC5BrI,KAAKN,QAAQgQ,UAAY1P,KAAKN,QAAQgQ,WAEtC,MAAM/K,EAAQ3E,KAAKk6B,WAChBv1B,IAAU+1B,GAAY16B,KAAKo7B,mBAAqB,IAAkBd,gBAAgB31B,IACnF3E,KAAKi6B,cAAct1B,O,sBCvEZ,MAAM,WAAkB,KAGrC,YAAoBqJ,EAAmBtO,EAA4B,IAGjE,GAFAC,MAAM,cAAgBqO,EAAY,IAAMA,EAAY,IAAKtO,EAAQ27B,SAAW,aAAgB37B,EAAQ27B,SAAU,OAAF,QAAGC,iBAAiB,GAAS57B,IADvH,KAAAsO,YAGftO,EAAQuL,OAAQ,CACjB,MAAMswB,EAAW,IAAI,GACrBA,EAASr7B,UAAUW,IAAI,aACvB06B,EAAS1E,kBAAkB,CACzB2E,UAAU,EACVvwB,OAAQvL,EAAQuL,SAElBjL,KAAKuR,OAAOvQ,QAAQu6B,GAGlB77B,EAAQ+7B,UACP/7B,EAAQm4B,eAAiBn4B,EAAQgS,MAAO1R,KAAK0R,MAAMrQ,OAAO,YAAK3B,EAAQm4B,cAAgB,UAAWn4B,EAAQg8B,gBACrGh8B,EAAQgS,iBAAiB8Z,YAC/BxrB,KAAK0R,MAAMrQ,OAAO3B,EAAQgS,OACrB1R,KAAK0R,MAAMkc,UAAYluB,EAAQgS,OAAS,IAGjD,MAAMiqB,EAAWh7B,SAASi7B,yBAE1B,GAAGl8B,EAAQm8B,oBAAsBn8B,EAAQo8B,YAAa,CACpD,MAAMC,EAAI/7B,KAAK87B,YAAcn7B,SAASC,cAAc,KACpDm7B,EAAE77B,UAAUW,IAAI,qBACbnB,EAAQm8B,mBAAoBE,EAAE16B,OAAO,YAAK3B,EAAQm8B,mBAAoBn8B,EAAQs8B,sBACzEt8B,EAAQo8B,aAAa,OAAAhP,EAAA,GAAaiP,EAAGr8B,EAAQo8B,aAErDH,EAASt6B,OAAO06B,GAGfr8B,EAAQu8B,aACTj8B,KAAKoB,UAAUlB,UAAUW,IAAI,iBAE7BnB,EAAQu8B,WAAW1xB,QAAQ2xB,IACzBA,EAAEC,YAAa,EACf,MAAM7E,EAAgB,IAAI,KAAc4E,GACxCA,EAAE5E,cAAgBA,EAClBqE,EAASt6B,OAAOi2B,EAAcvxB,SAGhCrG,EAAQ27B,QAAQ9wB,QAAQmZ,IACtB,GAAGA,EAAO0Y,SAAU,CAClB,MAAMC,EAAW3Y,EAAO0Y,SACxB1Y,EAAO0Y,SAAW,KAChB,MAAMtE,EAAsB,IAAInwB,IAChCjI,EAAQu8B,WAAW1xB,QAAQ2xB,IACtBA,EAAE5E,cAAcH,SACjBW,EAAEj3B,IAAIq7B,EAAE5D,QAGZ+D,EAASvE,QAMjB93B,KAAKoB,UAAUH,aAAa06B,EAAU37B,KAAKuR,OAAO+qB,qB,aC9DvC,MAAM,WAAuB,EAIhC,OACRt8B,KAAKoB,UAAUlB,UAAUW,IAAI,sBAAuB,wBAEpD,MAAM07B,EAAc,IAAgBA,YAAYv8B,KAAKkW,QAErDlW,KAAK+U,SAASwnB,EAAc,cAAgB,aAE5C,MAAMrnB,EAAU,IAAI,GAAe,CACjC1U,KAAM+7B,EAAc,cAAgB,cAGhCC,EAAS,eACTC,EAAa,IAAI,GAAI,CACzBpF,WAAY,IAAI,GAAW,CACzBmC,QAAS+C,EAAc,iBAAmB,cAC1C/7B,KAAMg8B,EACN73B,MAAO,YAET4yB,gBAAiBgF,EAAc,qBAAuB,oBAElDG,EAAY,IAAI,GAAI,CACxBrF,WAAY,IAAI,GAAW,CACzBmC,QAAS+C,EAAc,gBAAkB,aACzC/7B,KAAMg8B,EACN73B,MAAO,WAET4yB,gBAAiBgF,EAAc,oBAAsB,mBAEjDrF,EAAOiB,GAAkB,CAACsE,EAAYC,GAAa/3B,IACvD,MAAM2H,EAAI,CAACqwB,EAAgBC,GACd,WAAVj4B,GAAoB2H,EAAE7D,UAEzB6D,EAAE,GAAGlL,UAAUlB,UAAUoE,OAAO,QAChCgI,EAAE,GAAGlL,UAAUlB,UAAUW,IAAI,QAE7B6O,MAGIkhB,EAAa,IAAgBiM,QAAQ78B,KAAKkW,QAEhDhB,EAAQvD,QAAQtQ,OAAO61B,GAEvB,MAAMyF,EAAiB,IAAI,GAAe,IAGpCG,EAAU,IAAI,GAAI,CACtBprB,MAAQ1R,KAAK+8B,SAASC,gBAA0DC,KAChF1F,gBAAiBgF,EAAc,yBAA2B,sBAC1DtuB,UAAW,KACToqB,GAAqBr4B,KAAK+8B,SAASC,gBAA0DC,MAC7FtD,GAAM,IAAK9iB,OAAO,cAAc,OAI9BqmB,EAAY,YAAO,qCAAsC,CAAC/rB,KAAM,SAAUmnB,KAAM,eAEtF,YAAiB4E,EAAW,KAC1B,IAAI,GAAU,cAAe,CAC3B7B,QAAS,CAAC,CACR7B,QAAS,eACT4C,SAAU,KACR,MAAMj8B,EAAS,aAAiB,CAAC+8B,IAAY,GAE7C,UAAkBC,kBAAkBn9B,KAAKkW,QAAQ,GAAMvS,KAAKs5B,IAC1D98B,IACA28B,EAAQprB,MAAMlD,UAAYyuB,OAMhCpF,aAAc,aACdgE,mBAAoB,gBACnBuB,QACF,CAACvrB,eAAgB7R,KAAK6R,iBAEzB8qB,EAAehrB,QAAQtQ,OAAOy7B,EAAQ17B,UAAW87B,GAEjD,MAAMN,EAAgB,IAAI,GAAe,CACvCS,QAASd,EAAc,+BAAiC,6BACxDe,aAAa,IAGTnoB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAEM6O,EAAW,KACf,MAAM9B,EAAW6uB,EAAWpF,WAAWF,SAHrB,UAGiCgD,GAC7CoD,EAAenC,mBAAqBmC,EAAen9B,MAAMF,UAAUuV,SAAS,SAClF+nB,EAASt9B,UAAUC,OAAO,aAAcyN,IAGpC2vB,EAAiB,IAAI,GAAmB,CAC5Cx3B,MAAO,oBACPvF,KAAM,oBACNZ,WAAW,EACXiS,eAAgB7R,KAAK6R,eACrBqpB,cAAe,iBACfV,YAAa,eACbW,UAAW,aACXzrB,SAAUA,EACVzE,OAAQjL,KAAKkW,OAAOqV,UAAS,GAC7BkP,KAlBkB,UAqBdN,EArBc,SAqBkBvJ,EAAsB8J,UAAY,IAExEvlB,EAAa9T,OAAOk8B,EAAen8B,WACnCw7B,EAAcjrB,QAAQtQ,OAAO8T,GAE7B,MAAMqoB,EAAW,EAAa,CAACrsB,KAAM,QAASnD,UAAW,eACzDhO,KAAK2R,QAAQtQ,OAAOm8B,GAEpB,YAAiBA,EAAU,KACC,aAAgBA,GAC1C,MAAM9C,EAAWgC,EAAUrF,WAAWF,QAAUoG,EAAerD,WAAa,GAC5E,IAAgBuD,YAAYz9B,KAAKkW,QAAQvS,KAAK+5B,GACrC,IAAgBC,eAAeD,EAAWhD,IAChD/2B,KAAK,KAEN3D,KAAK49B,WAEN,CAAC/rB,eAAgB7R,KAAK6R,kBAtCL,UAwCnBsoB,EAAgCuC,EAAYD,GAAYpF,WAAWF,SAAU,EAC9EoG,EAAeM,iBAAiB1D,GAEhCn6B,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,UAAWu7B,EAAev7B,UAAWw7B,EAAcx7B,WAElF,CACE,MAAM8T,EAAU,IAAI,GAAe,CACjC1U,KAAM,qBACN68B,QAASd,EAAc,mCAAqC,mCAGxDjF,EAAgB,IAAI,KAAc,CACtCgB,KAAM,wBACN6D,YAAY,IAGdn8B,KAAK6R,eAAehR,IAAIy2B,EAAcl3B,MAAtCJ,CAA6C,SAAU,KACrD,MAAMG,EAASm3B,EAAcwG,kBAAiB,GAC9C,IAAgBC,iBAAiB/9B,KAAKkW,OAAQohB,EAAcH,SAASxzB,KAAK,KACxExD,QAIJ,MAAM69B,EAAe,KACnB1G,EAAc1xB,mBAAoBgrB,EAAsBrS,OAAO0f,aAGjEj+B,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,cAAgBkW,IAC9ClW,KAAKkW,SAAWA,GACjB8nB,MAIJA,IAEA9oB,EAAQvD,QAAQtQ,OAAOi2B,EAAcvxB,OAErC/F,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,a,aCzLtB,MAAM,GAOnB,YAAY1B,GANL,KAAAw+B,SAAU,EAIT,KAAAC,QAAS,EAMf,OAAAr1B,EAAA,GAAW9I,KAAMN,GAEjBA,EAAQ6P,WAAWK,iBAAmB,KACpC5P,KAAKyJ,QAIF,OACL,OAAGzJ,KAAKm+B,OACC94B,QAAQ6E,UAGdlK,KAAKk+B,QACCl+B,KAAKoK,SAGdpK,KAAKk+B,SAAU,OACfl+B,KAAKoK,QAAUpK,KAAKo+B,aAAaz6B,KAAKsrB,IACpCjvB,KAAKk+B,SAAU,EACfl+B,KAAKoK,aAAU/B,EAEZ4mB,GACDjvB,KAAKm+B,QAAS,EACdn+B,KAAKuP,WAAWK,iBAAmB,MAEnC5P,KAAKuP,WAAW8uB,oBAEjB,KACDr+B,KAAKoK,aAAU/B,EACfrI,KAAKk+B,SAAU,O,qWCbN,MAAM,GAmDnB,YAAYx+B,GAlDL,KAAA0B,UAAYT,SAASC,cAAc,OACnC,KAAAwN,KAAO,GAAkBC,iBAIxB,KAAAiwB,eAAiB39B,SAASC,cAAc,OAQzC,KAAA29B,SAAW,IAAI52B,IAEf,KAAAyvB,SAAU,EAET,KAAAprB,SAAW,EACX,KAAAwyB,YAAc,EAGd,KAAApvB,MAAQ,GAGR,KAAAqvB,WAAkG,GAElG,KAAAC,gBAA+B,IAAI/2B,IAInC,KAAAg3B,SAAmC,CAAC,WAGpC,KAAAC,aAAc,EACd,KAAAznB,eAAgB,EAChB,KAAA/G,WAAa,GACb,KAAAyuB,YAAa,EAGb,KAAAC,QAA+D,GAK/D,KAAAC,aAA4B,oBAE5B,KAAAC,gBAAiB,EAgKjB,KAAA73B,QAAU,KAChB,MAAMxC,EAAQ3E,KAAKI,MAAMuE,MACzB,GAAG3E,KAAKoP,QAAUzK,EAAO,EACpB3E,KAAK2+B,SAASM,SAAS,aAAej/B,KAAK2+B,SAASM,SAAS,cAC9Dj/B,KAAKk/B,eAAiB,MAGrBl/B,KAAK2+B,SAASM,SAAS,aACxBj/B,KAAKgM,SAAW,EAChBhM,KAAKw+B,YAAc,GAGrB,IAAI,IAAI58B,KAAK5B,KAAK8+B,UAEd9+B,KAAK8+B,QAAQl9B,GAGjB5B,KAAKoO,KAAO,GAAkBC,iBAE9BrO,KAAKoK,QAAU,KACfpK,KAAKy+B,WAAa,GAClBz+B,KAAKoP,MAAQzK,EACb3E,KAAK0+B,gBAAgB/vB,QACrB3O,KAAKg/B,gBAAiB,EAGtBh/B,KAAKm/B,mBAiLT,KAAAd,iBAAmB,KACjBr+B,KAAKuP,WAAW8uB,oBAvVhB,OAAAv1B,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKoB,UAAUlB,UAAUW,IAAI,YAE7B,MAAMu+B,GAAKp/B,KAAKq/B,mBAAqBr/B,KAAKs/B,eAAe54B,KAAK1G,MAwC9D,GAvCAA,KAAKq/B,kBAAqBhpB,IACrBrW,KAAKg/B,iBACNh/B,KAAKuP,WAAWgwB,QAAQnS,YAAYptB,KAAKoO,MACzCpO,KAAKuP,WAAWE,oBAAoBzP,KAAKoO,MACzCpO,KAAKg/B,gBAAiB,GAGxB3oB,EAAUA,EAAQzK,OAAOX,IACvB,MAAMu0B,GAAex/B,KAAK0+B,gBAAgB/yB,IAAIV,GAE9C,OADGu0B,GAAax/B,KAAK0+B,gBAAgB79B,IAAIoK,GAClCu0B,IAGNx/B,KAAKy/B,mBACNppB,EAAUA,EAAQzK,OAAOX,IACvB,GAAGA,EAAOy0B,WAAY,CAEpB,IADa,IAAgBC,QAAQ10B,GAC5B20B,QACP,OAAO5/B,KAAKy/B,iBAAiBprB,KAAKwrB,GAAU,IAAgBA,GAAQ50B,IAIxE,OAAO,KAIJm0B,EAAE/oB,IAGXrW,KAAKI,MAAQO,SAASC,cAAc,SACpCZ,KAAKI,MAAMF,UAAUW,IAAI,yBACtBb,KAAK2Q,YACN,YAAM3Q,KAAKI,MAAOJ,KAAK2Q,iBAAatI,EAAW,eAE/C,YAAMrI,KAAKI,MAAO,qBAAiBiI,EAAW,eAGhDrI,KAAKI,MAAMC,KAAO,OAEfL,KAAK4+B,YAAa,CACnB,MAAM1pB,EAAU,IAAI,GAAe,IACnCA,EAAQ4qB,eAAe5/B,UAAUW,IAAI,2BACrC,IAAIk/B,EAAep/B,SAASC,cAAc,OAC1Cm/B,EAAa7/B,UAAUW,IAAI,6BAE3Bb,KAAKggC,kBAAoBr/B,SAASC,cAAc,OAChDZ,KAAKggC,kBAAkB9/B,UAAUW,IAAI,mBAErCb,KAAKggC,kBAAkB3+B,OAAOrB,KAAKI,OACnC2/B,EAAa1+B,OAAOrB,KAAKggC,mBACzBhgC,KAAKigC,mBAAqB,IAAI,IAAWF,GAIzC,YAAiB//B,KAAKggC,kBAAoBjgC,IACxC,GAAGC,KAAKo3B,QAAS,OACjB,IAAI1c,EAAS3a,EAAE2a,OAGf,GAFAA,EAAS,OAAAoQ,GAAA,GAAgBpQ,EAAQ,kBAE7BA,EAAQ,OAEZ,MAAMzP,EAASyP,EAAOxT,QAAQE,IACxB84B,EAAKlgC,KAAKs+B,eAAe7qB,cAAc,kBAAoBxI,EAAS,MACtEi1B,EAGFA,EAAGC,QAFHngC,KAAKsE,OAAO2G,EAAOsgB,cAMvBrW,EAAQvD,QAAQtQ,OAAO0+B,GACvB//B,KAAKoB,UAAUC,OAAO6T,EAAQ9T,WAGhCpB,KAAKs+B,eAAep+B,UAAUW,IAAI,sBAElC,MAAMqU,EAAU,IAAI,GAAe,CACjC1U,KAAMR,KAAKogC,uBACXC,UAAU,IAEZnrB,EAAQvD,QAAQtQ,OAAOrB,KAAKoO,MAC5BpO,KAAKs+B,eAAej9B,OAAO6T,EAAQ9T,WACnCpB,KAAKuP,WAAa,IAAI,IAAWvP,KAAKs+B,gBACtCt+B,KAAKuP,WAAWE,oBAAoBzP,KAAKoO,MAEzC,YAAiBpO,KAAKs+B,eAAiBv+B,IACrC,MAAM2a,EAAS,OAAA4lB,GAAA,GAAgBvgC,EAAE2a,OAAQ,gBAGzC,GAFA,OAAAsP,EAAA,GAAYjqB,IAER2a,EAAQ,OACZ,GAAG1a,KAAKo3B,QAAS,OAEjB,IAAIhwB,EAAuBsT,EAAOxT,QAAQ+D,OAG1C,GAFA7D,EAAMA,EAAIs4B,WAAat4B,EAAImkB,WAAankB,GAEpCpH,KAAK4+B,YAEP,YADA5+B,KAAKa,IAAIuG,GAKRpH,KAAKu+B,SAAS5yB,IAAIvE,GACnBpH,KAAKsE,OAAO8C,GAEZpH,KAAKa,IAAIuG,GAGX,MAAMm5B,EAAW7lB,EAAOjH,cAAc,SACtC8sB,EAASpJ,SAAWoJ,EAASpJ,UAG/B,MAAMqJ,EAAiB,OAAAxG,GAAA,GAASh6B,KAAKmH,QAAS,KAAK,GAAO,GAC1DnH,KAAKI,MAAMkB,iBAAiB,QAASk/B,GAErCxgC,KAAKuP,WAAWK,iBAAmB,KACjC5P,KAAKm/B,kBAGPn/B,KAAKuP,WAAWnO,UAAUJ,QAAQy/B,MAElCzgC,KAAKoB,UAAUC,OAAOrB,KAAKs+B,gBAC3Bt+B,KAAK0gC,SAASr/B,OAAOrB,KAAKoB,WAG1B0O,WAAW,KACT,IAAI6wB,EAAoB3gC,KAAKm/B,iBAC1Bz/B,EAAQkhC,eACTD,EAAkBh9B,KAAK,KACrBjE,EAAQkhC,mBAGX,GAiCG,cACF5gC,KAAK6+B,YACN7+B,KAAKw+B,aACY,IAAlBx+B,KAAKgM,WACLhM,KAAK2+B,SAASM,SAAS,YACrBj/B,KAAKoP,QAAS,IAAgByxB,eAAe7gC,KAAKoP,QACpDpP,KAAKq/B,kBAAkB,CAACzyB,EAAA,EAAU+R,OAI9B,UAAUte,GAKhB,YAJ0BgI,IAAvBrI,KAAK8+B,QAAQz+B,KACdL,KAAK8+B,QAAQz+B,GAAQ,KAGdL,KAAK8+B,QAAQz+B,GAGV,iB,0CACZ,GAAGL,KAAKoK,QAAS,OAAOpK,KAAKoK,QAE7B,GAAGpK,KAAKy+B,WAAWqC,SAAW9gC,KAAKy+B,WAAWsC,SAC5C,OAIF,MAAMC,EAAYC,GAAA,EAAWx9B,OAAS,GAAK,KAAO,EAE5Cy9B,EAASlhC,KAAKmhC,UAAU,WACxB/2B,EAAU,IAAmBg3B,iBAAiBphC,KAAKoP,MAAOpP,KAAKw+B,YAAawC,EAAWhhC,KAAKgM,UAAU,GAAM5B,QAClHpK,KAAKoK,QAAUA,EACf,MAAMzF,QAAcyF,EACpB,GAAGpK,KAAK8+B,QAAQgC,UAAYI,EAC1B,OAGFlhC,KAAKoK,QAAU,KAEf,IAAI02B,EAAUn8B,EAAMm8B,QACpB,GAAGA,EAAQn/B,OAAQ,CACjB,MAAM0/B,EAAiBP,EAAQA,EAAQn/B,OAAS,GAAGujB,OAAS,EAE5D4b,EAAUA,EAAQn7B,QAClB,OAAA27B,GAAA,GAAcR,EAASS,GAAKA,EAAEt2B,SAAW2B,EAAA,EAAU+R,MAEhD3e,KAAKwhC,mBACNV,EAAUA,EAAQl1B,OAAO21B,GAAKvhC,KAAKyhC,eAAeF,EAAEt2B,UAGtDjL,KAAK0hC,cAEL1hC,KAAKw+B,YAAc6C,EAKrB,GAFArhC,KAAKq/B,kBAAkByB,EAAQr0B,IAAIyK,GAAUA,EAAOjM,SAEjDtG,EAAMg9B,MAAO,CACd,IAAI3hC,KAAKy+B,WAAWqC,QAOlB,OANA9gC,KAAK0hC,cAEL1hC,KAAKy+B,WAAWqC,SAAU,EAC1B9gC,KAAKw+B,YAAc,EACnBx+B,KAAKgM,SAAW,EAEThM,KAAK4hC,iBAIZ,GAFA5hC,KAAKy+B,WAAWsC,UAAW,GAEvB/gC,KAAKy+B,WAAWoD,SAClB,OAAO7hC,KAAK8hC,sBAMZ,eAAe72B,GACrB,OACEA,EAAO82B,WACoB,kBAA1B/hC,KAAKwhC,kBAAwC,IAAgBQ,cAAc/2B,KACzE,IAAgBg3B,UAAUh3B,EAAO8vB,WAAY/6B,KAAKwhC,kBAG3C,kB,0CACZ,GAAGxhC,KAAKoK,QAAS,OAAOpK,KAAKoK,QAE7B,GAAGpK,KAAKy+B,WAAWoD,SACjB,OAGF,MAAMK,EAAiBliC,KAAK2+B,SAASM,SAAS,YAE9C,IAAIj/B,KAAKk/B,eAAgB,CAQvB,MAAMgC,EAASlhC,KAAKmhC,UAAU,YACxB/2B,EAAU/E,QAAQC,IAAI,CAC1B48B,EAAiB,IAAgBC,mBAAmBniC,KAAKoP,OAAS,GAClEpP,KAAKoP,MAAQ,IAAgBgzB,eAAepiC,KAAKoP,YAAS/G,IAG5DrI,KAAKoK,QAAUA,EACf,IAAK80B,EAAgBmD,SAAsBj4B,EAC3C,GAAGpK,KAAK8+B,QAAQ+C,WAAaX,EAC3B,OAGF,GAAGmB,EAAc,CAEf,IAAIC,EAAgBJ,EAAiBG,EAAaE,WAAW76B,OAAO26B,EAAaG,SAAWH,EAAaE,WAEtGviC,KAAKwhC,mBACNc,EAAgBA,EAAc12B,OAAOX,GAAUjL,KAAKyhC,eAAex2B,KAGjEjL,KAAK2+B,SAASM,SAAS,aACzBqD,EAAgBA,EAAc12B,OAAOX,GAAUA,EAAO82B,WAGxD/hC,KAAKk/B,eAAiB,OAAAuD,GAAA,GAAavD,EAAex3B,OAAO46B,SACpDtiC,KAAKk/B,eAAiBA,EAAev5B,QAE5C,OAAAsO,EAAA,GAAiBjU,KAAKk/B,eAAgBtyB,EAAA,EAAU+R,MAChD3e,KAAKoK,QAAU,KAIf,MAAM42B,EAAYC,GAAA,EAAWx9B,OAAS,GAAK,KAAO,EAC5CwE,EAAMjI,KAAKk/B,eAAe92B,OAAO,EAAG44B,GAC1ChhC,KAAKq/B,kBAAkBp3B,GAGrBjI,KAAKk/B,eAAev9B,SACtB3B,KAAKy+B,WAAWoD,UAAW,MASjB,6B,0CACZ,GAAG7hC,KAAKoK,QAAS,OAAOpK,KAAKoK,QAE7B,GAAGpK,KAAKy+B,WAAWiE,oBACjB,OAGF,MAEMxB,EAASlhC,KAAKmhC,UAAU,uBACxB/2B,EAAU,UAAkBu4B,uBAAuB3iC,KAAKiL,OAAO8vB,WAAY,CAAC3vB,EAAG,4BAA6Bw3B,EAAG5iC,KAAKoP,OAHxG,GAG2HpP,KAAKoO,KAAKK,mBACjJo0B,QAAqBz4B,EAC3B,GAAGpK,KAAK8+B,QAAQ4D,sBAAwBxB,EACtC,OAGF,MAAM7qB,EAAUwsB,EAAaA,aAAap2B,IAAIq2B,GACrC,IAAgBC,qBAAqBD,IAE9C,OAAA7uB,EAAA,GAAiBoC,EAASzJ,EAAA,EAAU+R,MACpC3e,KAAKq/B,kBAAkBhpB,IAEpBrW,KAAKoO,KAAKK,mBAAqBo0B,EAAav6B,OAASu6B,EAAaA,aAAalhC,OAfhE,MAgBhB3B,KAAKy+B,WAAWiE,qBAAsB,MAQlC,iBACN,MAmCMM,EAnCM,MACV,MAAMA,EAA2B,GAejC,OAAIhjC,KAAK2+B,SAASM,SAAS,YAAkDj/B,KAAKy+B,WAAWsC,WAC3FiC,EAASz5B,KAAKvJ,KAAK4hC,kBAEf5hC,KAAKy+B,WAAWsC,YAKlB/gC,KAAK2+B,SAASM,SAAS,cAAej/B,KAAK2+B,SAASM,SAAS,YAAgBj/B,KAAKy+B,WAAWoD,UAC/FmB,EAASz5B,KAAKvJ,KAAK8hC,mBAGlB9hC,KAAK2+B,SAASM,SAAS,yBAA2Bj/B,KAAKy+B,WAAWiE,qBACnEM,EAASz5B,KAAKvJ,KAAKijC,8BAGdD,GAZIA,GAeIrvB,GACXvJ,EAAU/E,QAAQC,IAAI09B,GAK5B,OAJGA,EAASrhC,QACVyI,EAAQzG,KAAK3D,KAAKq+B,kBAGbj0B,EAGD,cAAciM,IAIhBrW,KAAK2+B,SAASM,SAAS,YAAcj/B,KAAKy+B,WAAWoD,WACvDxrB,EAAUA,EAAQzK,OAAOX,GAChB,IAAgBi4B,iBAAiBj4B,KAI5CoL,EAAQ9L,QAAQU,IACd,MAAM,IAAC+L,GAAO,GAAkBC,aAAa,CAC3CC,OAAQjM,EACR7J,UAAWpB,KAAKuP,WAChBY,YAAY,EACZgH,cAAenX,KAAKmX,cACpB/G,WAAYpQ,KAAKoQ,aAGnB,GAAGpQ,KAAK4+B,YAAa,CACnB,MAAML,EAAWv+B,KAAKu+B,SAAS5yB,IAAIV,GAC7BqsB,EAAgB,IAAI,KAEvBiH,IAEDjH,EAAcl3B,MAAM+2B,SAAU,GAGhCngB,EAAImsB,YAAYniC,QAAQs2B,EAAcvxB,OAGxC,IAAImqB,EAEFA,EADCjlB,EAAOm4B,YACK,UAAkBC,qBAAqBp4B,EAAO8vB,YACnD9vB,IAAW2B,EAAA,EAAU+R,KAChB,YAAK3e,KAAK++B,cAEV,IAAgB1nB,oBAAoBpM,GAGnD+L,EAAII,gBAAgB/V,OAAO6uB,KAIxB,IAAI9oB,EAAsBsK,EAA8B4xB,GAAS,GAItE,GAFAtjC,KAAKu+B,SAAS19B,IAAIuG,IAEdpH,KAAK4+B,YAEP,YADA5+B,KAAK0P,SAAS1P,KAAKu+B,SAASr7B,MAI3BlD,KAAKoP,MAAMS,SACZ7P,KAAKI,MAAMuE,MAAQ,GACnB3E,KAAKmH,WAGP,MAAM6pB,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,gBAAiB,YAEnC,MAAM06B,EAAW,IAAI,GAqCrB,OApCAA,EAASr7B,UAAUW,IAAI,uBAAwB,QAAS,aACxD06B,EAASC,UAAW,EAEpBxK,EAAI9pB,QAAQE,IAAM,GAAKA,EACpBA,EAAIs4B,kBACQr3B,IAAVqJ,IACDA,EAAQ,IAAI,KAAU,CAACzG,OAAQ7D,EAAImkB,WAAYrU,QAAQ,IAAO6D,SAGhEwgB,EAAS1E,kBAAkB,CACzB5rB,OAAQ7D,KAITsK,IACoB,iBAAZ,EACPsf,EAAIxiB,UAAYkD,GAEhB,OAAAjB,EAAA,GAAeugB,EAAKtf,GACpBsf,EAAI3vB,OAAOqQ,KAIfsf,EAAIuS,sBAAsB,aAAchI,GAExCv7B,KAAKggC,kBAAkB/+B,aAAa+vB,EAAKhxB,KAAKI,OAE9CJ,KAAK0P,UAAY1P,KAAK0P,SAAS1P,KAAKu+B,SAASr7B,MAE1CogC,GACDtjC,KAAKigC,mBAAmBuD,kBAAkB,CACxCzoB,QAAS/a,KAAKI,MACdu4B,SAAU,WAIP3H,EAGF,OAAO5pB,GACZ,IAAIpH,KAAK4+B,YAAa,OAEtB,MAAM5N,EAAMhxB,KAAKggC,kBAAkBvsB,cAAc,cAAcrM,OAC/D4pB,EAAI9wB,UAAUoE,OAAO,YAChB0sB,EAAIyS,YACTzS,EAAI9wB,UAAUW,IAAI,aAElB,MAAM6iC,EAAiB,KACrB1jC,KAAKu+B,SAASpsB,OAAO/K,GACrB4pB,EAAI1sB,SACJtE,KAAK0P,UAAY1P,KAAK0P,SAAS1P,KAAKu+B,SAASr7B,OAG5C0J,EAAA,EAAU+2B,SAASC,kBACpB5S,EAAI1vB,iBAAiB,eAAgBoiC,EAAgB,CAAC7kB,MAAM,IAE5D6kB,IAIG,cACL,MAAO,IAAI1jC,KAAKu+B,UAGX,WAAWsF,GAChBA,EAAOt5B,QAAQ5F,IACb3E,KAAKa,IAAI8D,OAAO0D,GAAW,KAG7BnG,OAAO8jB,sBAAsB,KAC3BhmB,KAAKigC,mBAAmBuD,kBAAkB,CACxCzoB,QAAS/a,KAAKI,MACdu4B,SAAU,SACVmL,eAAgB,KAAeC,Y,2SC3mBxB,MAAM,WAAsB,KAGzC,YAAYrkC,GAQVC,MAAM,gBAAiB,KAAM,CAACqkC,UAAU,EAAM1I,iBAAiB,EAAM34B,MAAM,IAE3E3C,KAAKmrB,SAAW,IAAI,GAAe,CACjCuV,SAAU1gC,KAAK2C,KACf+M,SAAU,IAAW,mCACnB,MAAM6uB,EAAWv+B,KAAKmrB,SAAS8Y,cACzBh5B,EAASszB,EAASA,EAAS58B,OAAS,GAAG4pB,WAE7C,GAAG7rB,EAAQwkC,SAAU,CACnB,MAAMn0B,EAAMrQ,EAAQwkC,SAASj5B,GAC7B,GAAG8E,aAAe1K,QAChB,UACQ0K,EACN,MAAMO,GACN,QAKNtQ,KAAKmrB,SAAW,KAChBnrB,KAAKmkC,UAEPxF,SAAUj/B,EAAQ0kC,UAClBxD,cAAe,KACb5gC,KAAKo9B,OACLp9B,KAAKmrB,SAASkT,mBAEV,MACFr+B,KAAKmrB,SAAS/qB,MAAM6B,SAGxBu/B,iBAAkB9hC,EAAQ8hC,iBAC1B5C,aAAa,EACbznB,eAAe,EACf/G,WAAY,GACZnF,OAAQvL,EAAQuL,OAChB0F,YAAajR,EAAQiR,YACrBouB,aAAcr/B,EAAQq/B,eAKxB/+B,KAAK0R,MAAMrQ,OAAOrB,KAAKmrB,SAAS/qB,QC9CrB,MAAM,WAA8B,EAKvC,OAIR,IAAIikC,EAHJrkC,KAAKoB,UAAUlB,UAAUW,IAAI,sBAAuB,8BACpDb,KAAK+U,SAAS,oBAId,CACE,MAAMG,EAAU,IAAI,GAAe,CACjC1U,KAAM,0BAGFwwB,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,sBAClBqU,EAAQvD,QAAQ1Q,aAAa+vB,EAAK9b,EAAQxD,OAE1C,MAAMtD,EAAO,GAAkBC,eAAe,CAACuI,KAAK,IACpDoa,EAAI3vB,OAAO+M,GAEX,MAAM,IAAC4I,GAAO,GAAkBC,aAAa,CAC3CC,OAAQlX,KAAK+W,OAAOwU,UAAS,GAC7BnqB,UAAWgN,EACX+B,YAAY,EACZgH,eAAe,EACf/G,WAAY,KAGd4G,EAAII,gBAAgB/V,OAAO,IAAgBgW,oBAAoBrX,KAAK+W,SAEpE,MAAMglB,EAAI,IAAI,GAAgB,CAC5B7lB,OAAQlW,KAAKkW,OACbrE,eAAgB7R,KAAK6R,eACrB6uB,SAAUxrB,EAAQvD,QAClBmxB,YAAoC,6BAAvB9iC,KAAK8iC,YAAY13B,EAAmCpL,KAAK8iC,iBAAcz6B,IAGtFg8B,EAAkB,KAEhB,MAAMC,EAASvI,EAAEwI,UACS,6BAAvBvkC,KAAK8iC,YAAY13B,GAAoC,OAAAyV,GAAA,GAAU7gB,KAAK8iC,YAAY0B,cAAcjmB,OAAQ+lB,EAAO/lB,SAIhH,IAAgBkmB,WAAWzkC,KAAKkW,OAAQlW,KAAK8iC,YAAawB,IAG5DtkC,KAAKqS,cAAc/Q,iBAAiB,UAAW+iC,EAAiB,CAACxlB,MAAM,IAEvE7e,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAGjC,CACE,MAAM8T,EAAU,IAAI,GAAe,IAEnC,GAA0B,6BAAvBlV,KAAK8iC,YAAY13B,EAAkC,CACpD,MAAMs5B,EAAqB,YAAO,qCAAsC,CAACvzB,KAAM,SAAUmnB,KAAM,2BAE/F,YAAiBoM,EAAoB,KACnC,MAAMvkC,EAAS,aAAiB,CAACukC,IAAqB,GACtD,IAAgBC,oCAAoC3kC,KAAKkW,OAAQlW,KAAK8iC,aAAan/B,KAAK,KACtF3D,KAAKqS,cAAcxE,oBAAoB,UAAWw2B,GAClDrkC,KAAK49B,SACJ,KACDz9B,OAED,CAAC0R,eAAgB7R,KAAK6R,iBAEzBqD,EAAQvD,QAAQtQ,OAAOqjC,GAGzB,MAAME,EAAY,YAAO,qCAAsC,CAACzzB,KAAM,aAAcmnB,KAAM,0BAE1F,YAAiBsM,EAAW,KACX,aAAiB,CAACA,IAAY,GAC7C,IAAgBC,gBAAgB7kC,KAAKkW,OAAQlW,KAAK8iC,aAAan/B,KAAK,KAClE3D,KAAKqS,cAAcxE,oBAAoB,UAAWw2B,GAClDrkC,KAAK49B,WAqBN,CAAC/rB,eAAgB7R,KAAK6R,iBAEzBqD,EAAQvD,QAAQtQ,OAAOujC,GAEvB5kC,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,a,2SCjG9B,MAAM,GASX,YAAY1B,GAMVM,KAAK8kC,EAAI,CACP,CAACC,MAAO,CAAC,iBAAkBzM,KAAM,uBAAwB0M,cAAe,0BACxE,CAACD,MAAO,CAAC,cAAezM,KAAM,4BAA6B0M,cAAe,+BAC1E,CAACD,MAAO,CAAC,gBAAiB,aAAczM,KAAM,+BAAgC0M,cAAe,kCAC7F,CAACD,MAAO,CAAC,cAAezM,KAAM,4BAA6B0M,cAAe,+BAC1E,CAACD,MAAO,CAAC,eAAgBzM,KAAM,6BAA8B0M,cAAe,gCAC5E,CAACD,MAAO,CAAC,gBAAiBzM,KAAM,8BAA+B0M,cAAe,iCAC9E,CAACD,MAAO,CAAC,gBAAiBzM,KAAM,8BAA+B0M,cAAe,iCAC9E,CAACD,MAAO,CAAC,eAAgBzM,KAAM,6BAA8B0M,cAAe,iCAG9EhlC,KAAKilC,WAAa,CAChB,cAAiB,CAAC,aAAc,gBAAiB,aAAc,gBAGjE,MAAMrU,EAAiC,IAAgBiM,QAAQn9B,EAAQwW,QACjEgvB,EAAsBtU,EAAKuU,sBAC3Bb,EAAS5kC,EAAQojC,YAAc,IAAgBsC,+BAA+B1lC,EAAQwW,OAAQxW,EAAQojC,YAAY0B,eAAiBU,EAEnIG,EAA+B3lC,EAAQojC,YAAc,2BAA6B,gCACxF,IAAI,MAAMwC,KAAQtlC,KAAK8kC,EAAG,CACxB,MAAMS,EAAWD,EAAKP,MAAM,GAC5BO,EAAKhO,cAAgB,IAAI,KAAc,CACrCgB,KAAMgN,EAAKhN,KACXnB,QAAS,IAAgB8K,UAAUviC,EAAQwW,OAAQqvB,EAAUjB,GAC7DkB,aAAa,EACbrJ,YAAY,KAIVz8B,EAAQojC,aACRoC,EAAoB3mB,OAAOgnB,IAE1B3U,EAAsB8J,WAErB4K,EAAKP,MAAM9F,SAAS,iBACpBqG,EAAKP,MAAM9F,SAAS,mBAIxBqG,EAAKhO,cAAcl3B,MAAMmW,UAAW,EAYpC,YAAiB+uB,EAAKhO,cAAcvxB,MAAQhG,IAC1C45B,GAAM,IAAK9iB,OAAOwuB,GAAiB,KAClC,CAACxzB,eAAgBnS,EAAQmS,kBAG3B7R,KAAKilC,WAAWM,IACjB7lC,EAAQmS,eAAehR,IAAIykC,EAAKhO,cAAcl3B,MAA9CV,CAAqD,SAAU,KAC7D,IAAI4lC,EAAKhO,cAAcH,QAAS,CAChBn3B,KAAK8kC,EAAEl5B,OAAOhK,GAAK5B,KAAKilC,WAAWM,GAAUtG,SAASr9B,EAAEmjC,MAAM,KACtEx6B,QAAQ+6B,IACZA,EAAKhO,cAAcH,SAAU,OAMrCz3B,EAAQghC,SAASr/B,OAAOikC,EAAKhO,cAAcvxB,QAIxC,UACL,MAAMu+B,EAA2B,CAC/Bl5B,EAAG,mBACHq6B,WAAY,WACZlnB,OAAQ,IAGV,IAAI,MAAM+mB,KAAQtlC,KAAK8kC,EAAG,EACRQ,EAAKhO,cAAcH,SAEjCmO,EAAKP,MAAMx6B,QAAQm7B,IAEjBpB,EAAO/lB,OAAOmnB,IAAQ,IAK5B,OAAOpB,GAII,MAAM,WAA+B,EAGlC,O,0CAId,IAAIqB,EAHJ3lC,KAAKoB,UAAUlB,UAAUW,IAAI,sBAAuB,+BACpDb,KAAK+U,SAAS,sBAGd,CACE,MAAMG,EAAU,IAAI,GAAe,CACjC1U,KAAM,6BAGRmlC,EAAkB,IAAI,GAAgB,CACpCzvB,OAAQlW,KAAKkW,OACbrE,eAAgB7R,KAAK6R,eACrB6uB,SAAUxrB,EAAQvD,UAGpB3R,KAAKqS,cAAc/Q,iBAAiB,UAAW,KAC7C,IAAgBskC,4BAA4B5lC,KAAKkW,OAAQyvB,EAAgBpB,YACxE,CAAC1lB,MAAM,IAEV7e,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAGjC,CACE,MAAM8T,EAAU,IAAI,GAAe,CACjC1U,KAAM,sBAGFqlC,EAAkB,IAAI,GAAI,CAC9BhO,aAAc,sBACdN,gBAAiB,UACjBpmB,KAAM,UACNlD,UAAW,KACT,IAAI,GAAc,CAChBm2B,UAAW,CAAC,uBACZF,SAAWj5B,IACT6E,WAAW,KACTg2B,EAAgB76B,IACf,IAEL0F,YAAa,oCACb1F,QAASjL,KAAKkW,YAKd4vB,EAAwB76B,GAAmB,mCAC/C,IAAI63B,EACJ,IACEA,QAAoB,UAAkBiD,sBAAsB/lC,KAAKkW,OAAQjL,GACzE,MAAMqF,GAEN,YADAqpB,GAAM,iCAIR,MAAMvmB,EAAM,IAAI,GAAsBpT,KAAKoR,QAC3CgC,EAAI0vB,YAAcA,EAClB1vB,EAAI8C,OAASlW,KAAKkW,OAClB9C,EAAI2D,OAAS9L,EACbmI,EAAIsB,UAGNQ,EAAQvD,QAAQtQ,OAAOwkC,EAAgBzkC,WAWvC,MAAM02B,EAAI5iB,EAAQ8wB,yBAClBlO,EAAE53B,UAAUW,IAAI,sBAEhB,MAAMuN,EAAO,GAAkBC,eAAe,CAACuI,KAAK,IACpDkhB,EAAEz2B,OAAO+M,GAET,YAAiBA,EAAOrO,IACtB,MAAM2a,EAAS,OAAAurB,GAAA,GAAUlmC,EAAE2a,OAAQ,MACnC,IAAIA,EAAQ,OAEZ,MAAMzP,EAASyP,EAAOxT,QAAQ+D,OAAOsgB,WACrCua,EAAgB76B,IACf,CAAC4G,eAAgB7R,KAAK6R,iBAEzB,MAAMq0B,EAAc,CAAChG,EAAa4C,KAChC,MAAMqD,EAAerD,EAAY0B,cAC3BU,EAAuB,IAAgBrI,QAAQ78B,KAAKkW,QAAyBivB,sBAG7EiB,EAA0B,GAChCT,EAAgBb,EAAEv6B,QAAQ+6B,IACxB,MAAMC,EAAWD,EAAKP,MAAM,GAEzBoB,EAAa5nB,OAAOgnB,KAAcL,EAAoB3mB,OAAOgnB,IAC9Da,EAAS78B,KAAK+7B,EAAKN,iBAOvB,MAAMljC,EAAKo+B,EAAGzsB,cAAc,sBAEzB2yB,EAASzkC,SACVG,EAAG0M,UAAY,GACf1M,EAAGT,UAAU,YAAK+kC,EAAS35B,IAAI6H,GAAK,YAAKA,KAAK,KAKhDxS,EAAG5B,UAAUC,OAAO,QAASimC,EAASzkC,SAGlCd,EAAM,CAACiiC,EAA0DzhC,KACrE,MAAM,IAAC2V,GAAO,GAAkBC,aAAa,CAC3CC,OAAQ,IAAgBmvB,UAAUvD,EAAYwD,MAC9CllC,UAAWgN,EACX+B,YAAY,EACZgH,eAAe,EACf/G,WAAY,GACZ/O,WAGF6kC,EAAYlvB,EAAIuvB,OAAQzD,IAM1B9iC,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,2BAA6BwmC,I,UAC9D,MAAMC,EAAwC,8BAAR,QAAtB,EAAAD,EAAOE,uBAAe,eAAEt7B,KAAqCo7B,EAAOE,gBAAgBlC,cAAcjmB,OAAOooB,cACnHzG,EAAK9xB,EAAKqF,cAAc,kBAAkB+yB,EAAOI,aACpDH,GACGvG,EAGFgG,EAAYhG,EAAIsG,EAAOE,iBAFvB7lC,EAAI2lC,EAAOE,iBAAgE,GAK3C,8BAAR,QAAvB,EAAAF,EAAOK,wBAAgB,eAAEz7B,MACxB07B,IAGD5G,GACDA,EAAG57B,SAG6B,8BAAR,QAAvB,EAAAkiC,EAAOK,wBAAgB,eAAEz7B,MACxB07B,GAINC,MAGF,MAAMA,EAAY,KAChB,OAAAt2B,EAAA,GAAeo1B,EAAgB7V,SAAU,YAAK8W,EAAkB,8BAAgC,2BAA4B,CAACA,MAG/H,IACIE,EADAF,EAAkB,EAEtB,MAAMG,EAAY,KAEhBD,EAAS,IAAI,GAAiB,CAC5Bz3B,WAAYvP,KAAKuP,WACjB6uB,WAAY,IACH,UAAkBuE,uBAAuB3iC,KAAKkW,OAAQ,CAAC9K,EAAG,4BAA6Bw3B,EAAG,IAJlF,GAImGx0B,EAAKK,mBAAmB9K,KAAKoM,IAC7I,IAAI,MAAM+yB,KAAe/yB,EAAI8yB,aAC3BhiC,EAAIiiC,GAA4D,GAMlE,OAHAgE,EAAkB/2B,EAAIzH,MACtBy+B,IAEOh3B,EAAI8yB,aAAalhC,OAZX,IAYkCoO,EAAIzH,QAAU8F,EAAKK,sBAKjEu4B,EAAOv9B,QAGhBzJ,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE5B,IAAgB8lC,UAAUlnC,KAAKkW,cAC1B+wB,KAENF,IAEA/mC,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkB,EAAEmnC,cAAaC,gBAC/DpnC,KAAKkW,SAAWixB,IACjBnnC,KAAKkW,OAASkxB,EACdH,YAOV,qBACEjnC,KAAKuP,WAAW83B,YCvUL,MAAM,GACnB,YACEp8B,EAEA0zB,EAAqB,IAAgB2I,cAAcr8B,GACnDi5B,GAEA,MAAMqD,EAAmB,IAAI,KAAU,CAACt8B,WAAS8P,QAO3CysB,EAAgB,CAACrQ,EAA4CsQ,EAAQxL,KAAgB9E,EAAQj0B,QACjG,IAAIkH,EAAU,IAAgBs9B,MAAMz8B,EAAO8vB,YAExC0M,IACDr9B,EAAUA,EAAQu9B,QAAQ,IACjB,IAAmBC,aAAa38B,KAI3Ci5B,GAAYA,EAAS95B,IAGjBy9B,EAAkB1Q,IACtB,IAAI/sB,EAEJ,GAAGa,EAAO82B,SACR33B,EAAU,IAAmBw9B,aAAa38B,GAAQ,EAAOgxB,IAAe9E,EAAQj0B,UAAOmF,OAClF,CACL,IAAG8uB,EAAQj0B,KAGT,OAAOskC,EAAcrQ,GAFrB/sB,EAAU,IAAgB+H,OAAOlH,EAAO8vB,YAM5CmJ,GAAYA,EAAS95B,IAGvB,IAAIsH,EAAoBoqB,EAA0BgM,EAAwBzM,EAAsCY,EAChH,OAAO0C,GACL,IAAK,UACiC,IAAgBsD,UAAUh3B,EAAO8vB,WAAY,gBAC/E,IAAgBgN,cAChBr2B,EAAQ,oBACRoqB,EAAc,iCACdT,EAAU,CAAC,CACT7B,QAAS,oBACTwO,UAAU,EACV5L,SAAUyL,IAGZ5L,EAAa,CAAC,CACZ3D,KAAM,0BAGR5mB,EAAQ,mBACRoqB,EAAc,4BACdgM,EAAkB,CAACP,GACnBlM,EAAU,CAAC,CACT7B,QAAS,eACTwO,UAAU,EACV5L,SAAUoL,KAId,MAeF,IAAK,OACH91B,EAAQ,iBACRoqB,EAAc,mCACdgM,EAAkB,CAACP,GAEnBlM,EAAU,CAAC,CACT7B,QAAS,iBACTwO,UAAU,EACV5L,SAAUyL,IAGZ5L,EAAa,CAAC,CACZ3D,KAAM,2BACN2P,SAAU,CACR,IAAI,KAAU,CAACh9B,WAAS8P,WAI5B,MAGF,IAAK,QACHrJ,EAAQ,iBACRoqB,EAAc,wCACdT,EAAU,CAAC,CACT7B,QAAS,iBACTwO,UAAU,EACV5L,SAAUyL,IAGZ,MAGF,IAAK,YACL,IAAK,QACiC,IAAgB5F,UAAUh3B,EAAO8vB,WAAY,gBAC/ErpB,EAAQ,iBACRoqB,EAAc,0BACdT,EAAU,CAAC,CACT7B,QAAS,iBACTwO,UAAU,EACV5L,SAAUyL,IAGZ5L,EAAa,CAAC,CACZ3D,KAAM,mCAGR5mB,EAAQ,gBACRoqB,EAAc,8BACdgM,EAAkB,CAACP,GACnBlM,EAAU,CAAC,CACT7B,QAAS,iBACTwO,UAAU,EACV5L,SAAWH,GAAeuL,EAAcvL,GAAY,MAQ5D,IAAI,GAAU,oBAAqB,CACjChxB,SACA4sB,aAAcnmB,EACdmqB,mBAAoBC,EACpBE,oBAAqB8L,EACrBzM,UACAY,eACCmB,Q,qTCtJQ,MAAM,WAA4B,EAG/B,O,gDACdp9B,KAAK+U,SAAS,aAEd,MAAMmzB,QAA2B,KAAoBC,8BAC/CpL,QAAiB,UAAkBqL,YAAYpoC,KAAKkW,QAC1D,IAAImyB,EAAgD,QAA5B,EAAAtL,EAASuL,2BAAmB,QAAI,GACxD,MAAMC,EAAmB,IAAI5gC,IAAI0gC,GAE3BG,EAAgB,IAAI,GAAe,CACvCnL,QAAS,IAAgBd,YAAYv8B,KAAKkW,QAAU,6BAA+B,6BAG/EuyB,EAAsB,IAAI,KAAc,CAACtoC,QAAQ,EAAMg3B,UAAWoR,EAAiBrlC,OACnFwlC,EAAY,IAAI,GAAI,CACxBpR,cAAemR,EACf5Q,aAAc,oBAGhB2Q,EAAc72B,QAAQtQ,OAAOqnC,EAAUtnC,WAEvC,MAAMunC,EAAmB,IAAI,GAAe,CAC1CnoC,KAAM,uBAGFooC,EAAiBV,EAAmBz7B,IAAIo8B,IAC5C,MAAMvR,EAAgB,IAAI,KAAc,CACtCn3B,QAAQ,EACRg3B,QAASoR,EAAiB58B,IAAIk9B,EAAkBC,YAGlD9oC,KAAK6R,eAAehR,IAAIy2B,EAAcl3B,MAAtCJ,CAA6C,SAAU,KAClDs3B,EAAcH,SACfoR,EAAiB1nC,IAAIgoC,EAAkBC,UAEnCL,EAAoBtR,SACtBsR,EAAoB7iC,kBAAiB,KAGvC2iC,EAAiBp2B,OAAO02B,EAAkBC,WAEtCP,EAAiBrlC,MAAQulC,EAAoBtR,SAC/CsR,EAAoB7iC,kBAAiB,IAIzCmjC,MAGF,MAAMlT,EAAM,IAAI,GAAI,CAClByB,gBACA5lB,MAAOm3B,EAAkBn3B,MACzB+lB,aAAa,IAWf,OARAuR,GAAiB,CACfnT,MACAhc,IAAKgvB,EAAkBI,YACvB/lC,KAAM,UAGRylC,EAAiBh3B,QAAQtQ,OAAOw0B,EAAIz0B,WAE7Bk2B,IAGTt3B,KAAK6R,eAAehR,IAAI6nC,EAAUpR,cAAcl3B,MAAhDJ,CAAuD,SAAU,KAC3DyoC,EAAoBtR,QAGdyR,EAAeM,MAAM5R,IAAkBA,EAAcH,WAC7DyR,EAAer+B,QAAQ+sB,GAAiBA,EAAcH,SAAU,GAChE4R,MAJAH,EAAer+B,QAAQ+sB,GAAiBA,EAAcH,SAAU,GAChE4R,OAOJ,MAAMI,EAAgB,KACpB,MAAMC,EAAej9B,MAAMC,KAAKm8B,GAChC,GAAG,IAAIa,GAAc/8B,OAAO+e,SAAW,IAAIid,GAAmBh8B,OAAO+e,OACnE,OAGF,MAAM2R,EAAW,UAAkBsM,kBAAkBrpC,KAAKkW,QACvD6mB,IACDA,EAASuL,oBAAsBc,GAGjC,IAAgBE,0BAA0BtpC,KAAKkW,OAAQkzB,GACvDf,EAAoBe,GAGhBL,EAAyB,OAAA/O,GAAA,GAASmP,EAAe,KAAM,GAAO,GAEpEnpC,KAAKqS,cAAc/Q,iBAAiB,UAAW6nC,EAAe,CAACtqB,MAAM,IAErE7e,KAAKuP,WAAWlO,OAAOmnC,EAAcpnC,UAAWunC,EAAiBvnC,e,2SCvFtD,MAAM,WAAuB,EAO1B,Q,gDAEdpB,KAAK6R,eAAeO,YACpBpS,KAAKuP,WAAWnO,UAAUoN,UAAY,GAC3B,QAAX,EAAAxO,KAAKkhC,cAAM,QAAXlhC,KAAKkhC,OAAW,GAChB,MAAMA,IAAWlhC,KAAKkhC,OAEtBlhC,KAAKoB,UAAUlB,UAAUW,IAAI,sBAAuB,wBACpDb,KAAK+U,SAAS,QAEd,IAAIgoB,QAAiB,UAAkBqL,YAAYpoC,KAAKkW,QAAQ,GAEhE,MAAM0a,EAAiC,IAAgBiM,QAAQ78B,KAAKkW,QAC9DqmB,EAAc,IAAgBA,YAAYv8B,KAAKkW,QAC/CgxB,EAAY,IAAgBA,UAAUlnC,KAAKkW,QAE3CqzB,EAAsC,GACtCC,EAAyBpN,IAC7BmN,EAAoBhgC,KAAK6yB,IAG3Bp8B,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,cAAgBkW,IAC9ClW,KAAKkW,SAAWA,GACjBqzB,EAAoBh/B,QAAQ6xB,GAAYA,OAI5Cp8B,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAqBkW,IACnDlW,KAAKkW,SAAWA,IACjB6mB,EAAW,UAAkBsM,kBAAkBnzB,IAAW6mB,KAI9D,MAAM9xB,EAASjL,KAAKkW,OAAOqV,UAAS,GAC9Bke,EAAgB,IAAgBxH,UAAUjiC,KAAKkW,OAAQ,eACvDwzB,EAAuB,IAAgBzH,UAAUjiC,KAAKkW,OAAQ,sBAEpE,CACE,MAAMhB,EAAU,IAAI,GAAe,CAACooB,aAAa,IAC3ChH,EAA4B,GAE5BnhB,EAAexU,SAASC,cAAc,OA+B5C,GA9BAuU,EAAajV,UAAUW,IAAI,iBAE3Bb,KAAK2pC,mBAAqB,IAAI,IAAW,CACvC5jC,MAAOw2B,EAAc,mBAAqB,yBAC1C/7B,KAAM,YACN6U,UAAW,IACXmhB,UAAU,IAEZx2B,KAAK4pC,sBAAwB,IAAI,IAAW,CAC1C7jC,MAAO,yBACPvF,KAAM,mBACN6U,UAAW,MAGbrV,KAAK2pC,mBAAmB9L,iBAAiBjN,EAAKlf,OAC9C1R,KAAK4pC,sBAAsB/L,iBAAiBd,EAASjnB,OAErDX,EAAa9T,OAAOrB,KAAK2pC,mBAAmBvoC,UAAWpB,KAAK4pC,sBAAsBxoC,WAElFk1B,EAAY/sB,KAAKvJ,KAAK2pC,mBAAoB3pC,KAAK4pC,uBAE/C5pC,KAAK6pC,SAAW,IAAI,GAAS,CAC3B5+B,SACAqrB,cACAzkB,eAAgB7R,KAAK6R,iBAEvB7R,KAAK2R,QAAQtQ,OAAOrB,KAAK6pC,SAASj0B,SAElCV,EAAQvD,QAAQtQ,OAAOrB,KAAK6pC,SAAS70B,WAAW5T,UAAW+T,GAExDs0B,EAAe,CAChB,MAAMK,EAAc,IAAI,GAAI,CAC1BjS,aAAc0E,EAAc,cAAgB,YAC5CtuB,UAAW,KACT,MAAMmF,EAAM,IAAI,GAAepT,KAAKoR,QACpCgC,EAAI8C,OAASlW,KAAKkW,OAClB9C,EAAI2pB,SAAWA,EACf3pB,EAAIsB,OAEJ1U,KAAK6R,eAAehR,IAAIuS,EAAIf,cAA5BrS,CAA2C,UAAW+pC,IAExD54B,KAAM,SAGF44B,EAAsB,KAG1B,IAAI3iC,EAFJ0iC,EAAY9Z,SAASS,YAAc,GAIjCrpB,EADCm1B,EACM3L,EAAsB8J,SAAW,aAAe,cAEhD9J,EAAsB8J,SAAW,kBAAoB,mBAG9DoP,EAAY9Z,SAAS3uB,OAAO,YAAK+F,KAGnC2iC,IACA70B,EAAQvD,QAAQtQ,OAAOyoC,EAAY1oC,WAGrC,GAAGqoC,GAAiBC,EAAsB,CACxC,MAAMM,EAAe,IAAI,GAAI,CAC3BnS,aAAc,YACd1mB,KAAM,YACNlD,UAAW,KACT,MAAMmF,EAAM,IAAI,GAAoBpT,KAAKoR,QACzCgC,EAAI8C,OAASlW,KAAKkW,OAClB9C,EAAIsB,OAAO/Q,KAAK,KACX3D,KAAKkhC,SAAWA,GAInBlhC,KAAK6R,eAAehR,IAAIuS,EAAIf,cAA5BrS,CAA2C,UAAWiqC,QAMtDC,SAD2B,KAAoBC,yBACDv+B,OAAOi9B,IAAsBA,EAAkBtqB,OAAO6rB,UAAUzoC,OAC9GsoC,EAAqB,K,MACzB,MAAMI,EAAwC,QAA5B,EAAAtN,EAASuL,2BAAmB,QAAI,GAClD0B,EAAaha,SAASxhB,UAAY67B,EAAU1oC,OAAS,IAAMuoC,GAG7DD,IAEA/0B,EAAQvD,QAAQtQ,OAAO2oC,EAAa5oC,WAGtC,GAAGsoC,IAAyBnN,EAAa,CACvC,MAAMwI,EAAQ,CACZ,gBACA,aACA,gBACA,aACA,cACA,eACA,eACA,eAGIuF,EAAiB,IAAI,GAAI,CAC7BzS,aAAc,qBACd5pB,UAAW,KACT,MAAMmF,EAAM,IAAI,GAAuBpT,KAAKoR,QAC5CgC,EAAI8C,OAASlW,KAAKkW,OAClB9C,EAAIsB,QAENvD,KAAM,gBAGFo5B,EAAuB,KAC3BD,EAAeta,SAASxhB,UAAYu2B,EAAMtT,OAAO,CAACC,EAAK0N,IAAM1N,IAAO,IAAgBuQ,UAAUjiC,KAAKkW,OAAQkpB,EAAGxO,EAAKuU,uBAAwB,GAAK,IAAMJ,EAAMpjC,QAG9J4oC,IACAr1B,EAAQvD,QAAQtQ,OAAOipC,EAAelpC,WAEtCpB,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,cAAgBkW,IAC9ClW,KAAKkW,SAAWA,GACjBq0B,MA+DN,GAjDAvqC,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,YAAiBpB,KAAK6pC,SAASj0B,QAAS,KACtC5V,KAAK6pC,SAASj0B,QAAQW,UAAW,EAEjC,IAAIysB,EAA2B,GAE/B,MAAMjwB,EAAK/S,KAAKkW,OACblW,KAAK2pC,mBAAmBvO,mBACzB4H,EAASz5B,KAAK,IAAgBihC,UAAUz3B,EAAI/S,KAAK2pC,mBAAmBhlC,QAGnE3E,KAAK4pC,sBAAsBxO,mBAC5B4H,EAASz5B,KAAK,IAAgBkhC,UAAU13B,EAAI/S,KAAK4pC,sBAAsBjlC,QAGtE3E,KAAK6pC,SAASh1B,cACfmuB,EAASz5B,KAAKvJ,KAAK6pC,SAASh1B,eAAelR,KAAKwS,GACvC,IAAgBC,UAAUrD,EAAIoD,KAIzC9Q,QAAQqlC,KAAK1H,GAAU2E,QAAQ,KAC7B3nC,KAAK6pC,SAASj0B,QAAQ+0B,gBAAgB,YACtC3qC,KAAK49B,WAEN,CAAC/rB,eAAgB7R,KAAK6R,iBAuBtB0qB,GAAe,IAAgB0F,UAAUjiC,KAAKkW,OAAQ,eAAgB,CACvE,MAAM00B,EAA4B,IAAI,KAAc,CAClDtS,KAAM,wBACNnB,UAAYvG,EAAsBrS,OAAOssB,WACzC1O,YAAY,IAGdn8B,KAAK6R,eAAehR,IAAI+pC,EAA0BxqC,MAAlDJ,CAAyD,SAAU,KACjE,MAAMG,EAASyqC,EAA0B9M,kBAAiB,GAC1D,IAAgBgN,iBAAiB9qC,KAAKkW,OAAQ00B,EAA0BzT,SAASxzB,KAAK,KACpFxD,QAIJqpC,EAAsB,KACpBoB,EAA0BhlC,mBAAoBgrB,EAAsBrS,OAAOssB,cAG7E31B,EAAQvD,QAAQtQ,OAAOupC,EAA0B7kC,QAIrD,IAAIw2B,EAAa,CACf,MAAMrnB,EAAU,IAAI,GAAe,IAcnC,IAAIqnB,GAAekN,EAAe,CAChC,MAAMsB,EAA+B,IAAI,KAAc,CACrDzS,KAAM,cACN6D,YAAY,IAGdn8B,KAAK6R,eAAehR,IAAIkqC,EAA6B3qC,MAArDJ,CAA4D,SAAU,KACpE,MAAMG,EAAS4qC,EAA6BjN,kBAAiB,GAC7D,IAAgBkN,uBAAuBhrC,KAAKkW,QAAS60B,EAA6B5T,SAASxzB,KAAK,KAC9FxD,QAKJ,MAAM69B,EAAe,KACnB+M,EAA6BnlC,iBAAiBshC,IAAenK,EAAkCxe,OAAO0sB,oBAGxGjN,IACAwL,EAAsBxL,GAEtB9oB,EAAQvD,QAAQtQ,OAAO0pC,EAA6BhlC,OAGnDmP,EAAQvD,QAAQlD,mBACjBzO,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAInC,GAAG,IAAgB6gC,UAAUjiC,KAAKkW,OAAQ,eAAgB,CACxD,MAAMhB,EAAU,IAAI,GAAe,IAE7B0vB,EAAY,YAAO,qCAAsC,CAACzzB,KAAM,SAAUmnB,KAAMiE,EAAc,yBAA2B,wBAE/H,YAAiBqI,EAAW,KAC1B,IAAI,GAAkB35B,OAAwB5C,EAAY+B,IACxD,MAAMjK,EAAS,aAAiB,CAACykC,IAAY,GAC7Cx6B,EAAQzG,KAAK,KACX3D,KAAK49B,SACJ,KACDz9B,SAGH,CAAC0R,eAAgB7R,KAAK6R,iBAEzBqD,EAAQvD,QAAQtQ,OAAOujC,GAEvB5kC,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAG7B8lC,GAEFlnC,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkB,EAAEmnC,cAAaC,gBAC/Dn8B,IAAWk8B,IACZnnC,KAAKkW,OAASkxB,EAAUrM,WACxB/6B,KAAKkrC,cAMH,OACR,OAAOlrC,KAAKkrC,S,cC7UD,MAAM,WAA0B,EAMnC,OACRlrC,KAAKoB,UAAUlB,UAAUW,IAAI,sBAAuB,0BACpD,MAAMsqC,GAAS,IAAgBC,UAAUprC,KAAKiL,OAAOwL,YACrDzW,KAAK+U,SAASo2B,EAAQ,kBAAoB,QAE1C,CACE,MAAMj2B,EAAU,IAAI,GAAe,CAACooB,aAAa,IAC3ChH,EAA4B,GAE5BnhB,EAAexU,SAASC,cAAc,OAe5C,GAdAuU,EAAajV,UAAUW,IAAI,iBAE3Bb,KAAKqrC,eAAiB,IAAI,IAAW,CACnCtlC,MAAO,YACPvF,KAAM,eACN6U,UAAW,GACXmhB,UAAU,IAEZx2B,KAAKsrC,mBAAqB,IAAI,IAAW,CACvCvlC,MAAO,WACPvF,KAAM,mBACN6U,UAAW,KAGVrV,KAAKiL,OAAQ,CACd,MAAMsgC,EAAO,IAAgBC,QAAQxrC,KAAKiL,QAEvCkgC,GACDnrC,KAAKqrC,eAAeI,cAAcF,EAAKG,YACvC1rC,KAAKsrC,mBAAmBG,cAAcF,EAAKI,aAE3C3rC,KAAKqrC,eAAexN,iBAAiB0N,EAAKG,YAC1C1rC,KAAKsrC,mBAAmBzN,iBAAiB0N,EAAKI,YAelD,GAXAx2B,EAAa9T,OAAOrB,KAAKqrC,eAAejqC,UAAWpB,KAAKsrC,mBAAmBlqC,WAC3Ek1B,EAAY/sB,KAAKvJ,KAAKqrC,eAAgBrrC,KAAKsrC,oBAE3CtrC,KAAK6pC,SAAW,IAAI,GAAS,CAC3B5+B,OAAQjL,KAAKiL,OACbqrB,cACAzkB,eAAgB7R,KAAK6R,eACrBilB,iBAAiB,IAEnB92B,KAAK2R,QAAQtQ,OAAOrB,KAAK6pC,SAASj0B,SAE/B5V,KAAKiL,OAAQ,CACd,MAAM+lB,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,eAClBmwB,EAAI3vB,OAAOrB,KAAK6pC,SAASjT,YAEzB,MAAMgV,EAA6B,IAAI,KAAc,CACnDtT,KAAM,kBAGRsT,EAA2BxrC,MAAMkB,iBAAiB,SAAWvB,IACvDA,EAAE2b,WAIN,IAAmBmwB,eAAe7rC,KAAKiL,UAGzCjL,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,kBAAoBwmC,IACrD,GAAqB,eAAlBA,EAAOF,KAAKl7B,EAAoB,OACnC,MAAMH,EAAS,IAAgBo7B,UAAUG,EAAOF,KAAKA,MACrD,GAAGtmC,KAAKiL,SAAWA,EAAQ,CACzB,MAAMsW,GAAW,KAAwBuqB,QAAQtF,EAAOuF,iBACrDxqB,IAAYqqB,EAA2BzU,UACxCyU,EAA2BzU,QAAU5V,MAK3C,MAAMyqB,EAAiBrrC,SAASC,cAAc,OAC9CorC,EAAe9rC,UAAUW,IAAI,gBAC7BmrC,EAAe3qC,OAAO,IAAI,KAAU,CAClC4J,OAAQjL,KAAKiL,SACZ8P,SAGH,MAAMkxB,EAAqBtrC,SAASC,cAAc,OAMlD,GALAqrC,EAAmB/rC,UAAUW,IAAI,oBACjCorC,EAAmB5qC,OAAO,YAAK,6BAE/B6T,EAAQvD,QAAQtQ,OAAO2vB,EAAKgb,EAAgBC,EAAoB92B,GAE5Dg2B,EASG,CACL,MAAMI,EAAO,IAAgBC,QAAQxrC,KAAKiL,QAEpCihC,EAAW,IAAI,GAAI,CACvB/6B,KAAM,QACN0mB,aAAc0T,EAAKY,WAAQ9jC,EAAY,eACvCqJ,MAAO65B,EAAKY,MAAQ,IAAgBC,gBAAgBb,EAAKY,YAAS9jC,EAClEkvB,gBAAiBgU,EAAKY,MAAQ,QAAU,4BACxC3U,iBAAkB+T,EAAKY,WAAQ9jC,EAAY,CAAC,IAAI,KAAU,CAAC4C,OAAQjL,KAAKiL,SAAS8P,WAGnF7F,EAAQvD,QAAQtQ,OAAO6qC,EAAS9qC,eApBvB,CACT,MAAMirC,EAAmB,IAAI,GAAI,CAC/B/U,cAAesU,IAGXrqB,GAAW,KAAwB+qB,iBAAiBtsC,KAAKiL,QAAQ,GACvE2gC,EAA2BzU,QAAU5V,EAErCrM,EAAQvD,QAAQtQ,OAAOgrC,EAAiBjrC,iBAe1C8T,EAAQvD,QAAQtQ,OAAO8T,GAGzBnV,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,YAAiBpB,KAAK6pC,SAASj0B,QAAS,KACtC5V,KAAK6pC,SAASj0B,QAAQW,UAAW,EAEjC,IAAgBg2B,WAAWvsC,KAAKiL,OAAQjL,KAAKqrC,eAAe1mC,MAAO3E,KAAKsrC,mBAAmB3mC,MAAO,IAAgB6mC,QAAQxrC,KAAKiL,QAAQkhC,OACtIxE,QAAQ,KACP3nC,KAAK6pC,SAASj0B,QAAQ+0B,gBAAgB,YACtC3qC,KAAK49B,WAEN,CAAC/rB,eAAgB7R,KAAK6R,iBAG3B,IAAIs5B,EAAO,CACT,MAAMj2B,EAAU,IAAI,GAAe,IAI7B0vB,EAAY,YAAO,qCAAsC,CAACzzB,KAAM,SAAUmnB,KAAM,2BAEtF,YAAiBsM,EAAW,KAC1B,IAAI,GAAU,uBAAwB,CACpC35B,OAAQjL,KAAKiL,OACb4sB,aAAc,gBACdgE,mBAAoB,0BACpBR,QAAS,aAAgB,CAAC,CACxB7B,QAAS,SACT4C,SAAU,KACR,MAAMj8B,EAAS,aAAiB,CAACykC,IAAY,GAE7C,IAAgB4H,eAAe,CAACxsC,KAAKiL,SAAStH,KAAK,KACjD3D,KAAK49B,SACJ,KACDz9B,OAGJ6nC,UAAU,OAEX5K,QACF,CAACvrB,eAAgB7R,KAAK6R,iBAEzBqD,EAAQvD,QAAQtQ,OAAOujC,GAEvB5kC,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,aChLtB,MAAM,WAAyB,EAOlC,OACRpB,KAAKoB,UAAUlB,UAAUW,IAAI,yBAC7Bb,KAAK4V,QAAU,EAAa,CAACzE,KAAM,eACnCnR,KAAK2R,QAAQtQ,OAAOrB,KAAK4V,SACzB5V,KAAKuP,WAAWnO,UAAUkD,SAE1BtE,KAAK4V,QAAQtU,iBAAiB,QAAS,KACrC,MAAM+U,EAAUrW,KAAKmrB,SAAS8Y,cAAcx3B,IAAIjK,GAAOA,EAAI+oB,YAE3D,GAAGvrB,KAAKysC,UACNzsC,KAAKukC,QAAQluB,GACbrW,KAAK49B,YACA,CACL,MAAMxzB,EAAUpK,KAAKukC,QAAQluB,GAE1BjM,aAAmB/E,QACpBrF,KAAK0sC,gBAAgBtiC,QACD/B,IAAZ+B,GACRpK,KAAK49B,WAMN,gBAAgBxzB,GACrB,MAAMuiC,EAAe,aAAgB3sC,KAAK4V,QAAS,cAEnDxL,EAAQzG,KAAK,KACX3D,KAAK49B,SACJ,KACD+O,MAIG,KAAKjtC,GAQV,MAAM8N,EAAM7N,MAAM+U,OAElB1U,KAAK+U,SAASrV,EAAQgS,OACtB1R,KAAK2+B,SAAWj/B,EAAQW,KACxBL,KAAKukC,QAAU7kC,EAAQ6kC,QACvBvkC,KAAKysC,UAAY/sC,EAAQ+sC,UAEzB,MAAMG,EAA8B,YAAlB5sC,KAAK2+B,SAqBvB,OApBA3+B,KAAKmrB,SAAW,IAAI,GAAe,CACjCuV,SAAU1gC,KAAK2R,QACfjC,SAAU1P,KAAKysC,UAAY,KAAQ9qC,IACjC3B,KAAK4V,QAAQ1V,UAAUC,OAAO,eAAgBwB,IAEhDg9B,SAAU,CAACiO,EAAY,UAAY,YACnCj8B,YAAajR,EAAQiR,YACrBkuB,WAAY+N,EACZnN,iBAAkBmN,EAAY,CAAC,aAAc,eAAYvkC,IAGxD3I,EAAQmtC,iBACT7sC,KAAKmrB,SAAS2hB,WAAWptC,EAAQmtC,iBAGnC7sC,KAAK4V,QAAQ1V,UAAUW,IAAI,oBAC3Bb,KAAK4V,QAAQpH,UAAY,GACzBxO,KAAK4V,QAAQW,UAAW,EACxBvW,KAAK4V,QAAQ1V,UAAUC,OAAO,aAAcH,KAAKysC,WAE1Cj/B,GCrFI,QAFgB,OAAc,E,UCA9B,SAASu/B,GAAiBC,GACvC,MAAMC,EAAOtsC,SAASC,cAAc,QAGpC,OAFAqsC,EAAK/sC,UAAUW,IAAI,cACnB,YAAMosC,EAAMD,EAAS,cAAgB,eAC9BC,ECDM,SAASC,GAAmBjiC,G,MACzC,MAAMogB,EAAsB,GACtBib,EAAO,IAAgB3G,QAAQ10B,GASrC,OARe,QAAZ,EAAAq7B,aAAI,EAAJA,EAAM/nB,cAAM,eAAE4uB,WACf9hB,EAAS9hB,KCTE,WACb,MAAMwe,EAAMpnB,SAAS4nB,gBAAgB,6BAA8B,OACnER,EAAIS,eAAe,KAAM,UAAW,aACpCT,EAAIS,eAAe,KAAM,QAAS,MAClCT,EAAIS,eAAe,KAAM,SAAU,MACnCT,EAAI7nB,UAAUW,IAAI,iBAElB,MAAMusC,EAAMzsC,SAAS4nB,gBAAgB,6BAA8B,OACnE6kB,EAAI5kB,eAAe,KAAM,OAAQ,wBACjC4kB,EAAIltC,UAAUW,IAAI,uBAElB,MAAMwsC,EAAO1sC,SAAS4nB,gBAAgB,6BAA8B,OAMpE,OALA8kB,EAAK7kB,eAAe,KAAM,OAAQ,mBAClC6kB,EAAKntC,UAAUW,IAAI,kBAEnBknB,EAAI1mB,OAAO+rC,EAAKC,GAETtlB,EDRSulB,KAGZhH,EAAsB/nB,OAAOgvB,MAASjH,EAAmB/nB,OAAOivB,OAClEniB,EAAS9hB,KAAKwjC,GAAkBzG,EAAmB/nB,OAAOivB,OAGrDniB,EELT,MAAMoiB,GAAY1tC,GACRA,EAAiB6jB,QAAW7jB,EAAiB6jB,QAAQ,GAAK7jB,EAG9D2tC,GAAyBxrC,OAE/B,IAAIyrC,IAAe,EACnB/gC,EAAA,EAAUtL,iBAAiB,sBAAwBssC,IACjDD,GAAeC,IAcF,MAAM,GAenB,YAAYluC,GATJ,KAAAmuC,OAA6M,WAC7M,KAAA7jB,aAAc,EACd,KAAA8jB,iBAAqD,EAGrD,KAAAC,SAAU,EACV,KAAAC,MAAgB,KAChB,KAAAC,MAAgB,KAsCxB,KAAA1gC,MAASxN,IAKJ,KACD2tC,GAAuB7/B,oBAAoB,YAAa7N,KAAKkuC,WAAY,CAACze,SAAS,KAEnFie,GAAuB7/B,oBAAoB,YAAa7N,KAAKkuC,YAC7DluC,KAAKmuC,YAAYhpC,MAAM0oC,OAAS,IAG/B7tC,KAAKouC,SAAWpuC,KAAK+tC,SACtB/tC,KAAKouC,UAGPpuC,KAAKguC,MAAQhuC,KAAKiuC,MAAQ,KAC1BjuC,KAAK+tC,SAAU,GAGjB,KAAAM,YAAeC,IACb,MAAMvuC,EAAI0tC,GAASa,GACnB,GAAGtuC,KAAKuuC,oBAAsBvuC,KAAKuuC,kBAAkBD,GACnD,OAAOtuC,KAAKuN,QAGdvN,KAAKguC,MAAQjuC,EAAE8jB,QACf7jB,KAAKiuC,MAAQluC,EAAE+jB,QAEZ,KACD4pB,GAAuBpsC,iBAAiB,YAAatB,KAAKkuC,WAAY,CAAChqB,SAAS,EAAOuL,SAAS,IAEhGie,GAAuBpsC,iBAAiB,YAAatB,KAAKkuC,YAAY,IAI1E,KAAAA,WAAcI,IACZ,GAAkB,OAAftuC,KAAKguC,OAAiC,OAAfhuC,KAAKiuC,OAAkBN,GAE/C,YADA3tC,KAAKuN,QAIJvN,KAAKgqB,aACN,OAAAA,EAAA,GAAYskB,GAGd,MAAMvuC,EAAI0tC,GAASa,GACbE,EAAMzuC,EAAE8jB,QACR4qB,EAAM1uC,EAAE+jB,QAER4qB,EAAQ1uC,KAAKguC,MAAQQ,EACrBG,EAAQ3uC,KAAKiuC,MAAQQ,EAE3B,IAAIzuC,KAAK+tC,QAAS,CAChB,IAAIW,IAAUC,EACZ,OAGF3uC,KAAK+tC,SAAU,EAEX,MACF/tC,KAAKmuC,YAAYhpC,MAAMqB,YAAY,SAAUxG,KAAK6tC,OAAQ,aAGzD7tC,KAAK4uC,cACN5uC,KAAK4uC,eAmBT,MAAMC,EAAgB7uC,KAAK8uC,QAAQJ,EAAOC,EAAOL,QAC5BjmC,IAAlBwmC,GAA+BA,GAChC7uC,KAAKuN,SAzHP,OAAAzE,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKmuC,YAAcnuC,KAAK+a,QAExB/a,KAAKwmB,eAGA,eACD,MAIFxmB,KAAK+a,QAAQzZ,iBAAiB,aAActB,KAAKquC,YAAaruC,KAAK8tC,iBACnEJ,GAAuBpsC,iBAAiB,WAAYtB,KAAKuN,SAJzDvN,KAAK+a,QAAQzZ,iBAAiB,YAAatB,KAAKquC,YAAaruC,KAAK8tC,iBAClEJ,GAAuBpsC,iBAAiB,UAAWtB,KAAKuN,QAOrD,kBACD,MAIFvN,KAAK+a,QAAQlN,oBAAoB,aAAc7N,KAAKquC,YAAaruC,KAAK8tC,iBACtEJ,GAAuB7/B,oBAAoB,WAAY7N,KAAKuN,SAJ5DvN,KAAK+a,QAAQlN,oBAAoB,YAAa7N,KAAKquC,YAAaruC,KAAK8tC,iBACrEJ,GAAuB7/B,oBAAoB,UAAW7N,KAAKuN,QAOxD,UAAUsgC,GACf7tC,KAAK6tC,OAASA,GAEV,MAAsB7tC,KAAK+tC,SAC7B/tC,KAAKmuC,YAAYhpC,MAAMqB,YAAY,SAAUxG,KAAK6tC,OAAQ,c,2SCnDjD,MAAM,GAkBnB,YAAmBt+B,GAAA,KAAAA,aAwSZ,KAAA9E,YAAeskC,IACpB,MAAMC,EAASruC,SAASC,cAAc,OAGtC,IAAIuH,EAFJ6mC,EAAO9uC,UAAUW,IAAI,GAAmBouC,WAAa,UAAW,mBAG7DF,IACD5mC,EAA4B,iBAAd,EACZ,IAAiB+mC,SAASH,GACzBA,EAAQ7mC,OAAuDC,OAGpE,MAAMumB,EAAM,IAAIygB,MAChBzgB,EAAIxuB,UAAUW,IAAI,gBAClB6tB,EAAI0gB,WAAY,EAEhB,MAAMC,EAAe,KACnB,GAAGlnC,EAAO,CACR,MAAM4H,EAAMke,GAAU,CACpB7sB,UAAW4tC,EACX7mC,QACAjF,KAAM,IAAiBiuB,gBAAgBhpB,EAAO,IAAK,KAAK,GACxDkmB,kBAAkB,IAGpB,CAACte,EAAIwe,OAAOC,MAAOze,EAAIwe,OAAOE,MAAM7iB,OAAOc,SAASnC,QAAQmkB,IAC1DA,EAAIxuB,UAAUW,IAAI,sBAEf,CACL,MAAMsH,EAAQ,IAAgB2X,aAAa9f,KAAKiL,QAChD,IAAkBqkC,UAAUN,EAAQhvC,KAAKiL,OAAQ9C,EAAO,YAAaumB,KAezE,OAXG1uB,KAAKuvC,QAAQ9gC,mBA7VC,EA8Vf4gC,KAEArvC,KAAKwvC,qBAAqBC,QAAQT,GAClChvC,KAAK0vC,cAAcl1B,IAAIw0B,EAAQK,IAGjCrvC,KAAKuvC,QAAQluC,OAAO2tC,GAEpBhvC,KAAK4R,SAEEm9B,GAnVP/uC,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,GAAmBouC,WAAa,cAE7DjvC,KAAKuvC,QAAU5uC,SAASC,cAAc,OACtCZ,KAAKuvC,QAAQrvC,UAAUW,IAAI,GAAmBouC,WAAa,YAE3DjvC,KAAK2vC,SAAWhvC,SAASC,cAAc,OACvCZ,KAAK2vC,SAASzvC,UAAUW,IAAI,GAAmBouC,WAAa,aAE5DjvC,KAAKslC,KAAO3kC,SAASC,cAAc,OACnCZ,KAAKslC,KAAKplC,UAAUW,IAAI,GAAmBouC,WAAa,SAExDjvC,KAAKkS,KAAOvR,SAASC,cAAc,OACnCZ,KAAKkS,KAAKhS,UAAUW,IAAI,GAAmBouC,WAAa,SAExDjvC,KAAK4vC,cAAgBjvC,SAASC,cAAc,OAC5CZ,KAAK4vC,cAAc1vC,UAAUW,IAAI,GAAmBouC,WAAa,SAAU,wBAM3EjvC,KAAK6vC,UAAYlvC,SAASC,cAAc,OACxCZ,KAAK6vC,UAAU3vC,UAAUW,IAAI,GAAmBouC,WAAa,SAAU,GAAmBA,WAAa,cAAe,oBAMtHjvC,KAAKoB,UAAUC,OAAOrB,KAAKuvC,QAASvvC,KAAK2vC,SAAU3vC,KAAKslC,KAAMtlC,KAAKkS,KAAMlS,KAAK4vC,cAAe5vC,KAAK6vC,WAElG7vC,KAAK0vC,cAAgB,IAAIp8B,IACzBtT,KAAK6R,eAAiB,IAAI,IAE1B,MAAMi+B,EAAiB,IACY,IAA9B9vC,KAAKuP,WAAWwgC,YACjB/vC,KAAKuP,WAAWi0B,kBAAkB,CAChCzoB,QAAS/a,KAAKuP,WAAWnO,UAAU6qB,kBACnC0M,SAAU,WAEL,GAOX,IAAIxJ,GAAS,EACT6gB,GAAS,EACb,YAAiBhwC,KAAKoB,UAAiBktC,GAAO,mCAC5C,GAAG0B,EAED,YADA,OAAAhmB,EAAA,GAAYskB,GAId,GAAGnf,EAED,YADAA,GAAS,GAIX,IAAI2gB,IACF,OAGF,MAAMrrB,EAAOzkB,KAAKoB,UAAUsjB,wBAItBtB,EADIkrB,EACEjrB,MAEN4sB,EAAS7sB,EAAIqB,EAAKkB,KACxB,IAAK3lB,KAAKgb,WAAWzS,SAAS5G,SAAW3B,KAAKgb,WAAWxS,KAAK7G,QACxDsuC,EAAUxrB,EAAKjhB,OA1BH,EAAI,IA0BuBysC,EAAUxrB,EAAKjhB,MAAQihB,EAAKjhB,OA1BvD,EAAI,GA0B0E,CAC9F,MAAMyH,EAASjL,KAAKiL,OAEduB,EAAsF,GAC5FxM,KAAKgb,WAAWzS,SAASb,OAAO1H,KAAKgb,WAAWhS,QAAShJ,KAAKgb,WAAWxS,MAAM+B,QAAQ,CAACnB,EAAMpB,KAC5FwE,EAAQjD,KAAK,CACXwR,QAAmB/a,KAAKuvC,QAAQhf,SAASvoB,GACzCoB,WAIJ,MAAM8mC,EAAc1jC,EAAQ7G,MAAM,EAAG3F,KAAKgb,WAAWzS,SAAS5G,QACxDwuC,EAAc3jC,EAAQ7G,MAAM3F,KAAKgb,WAAWzS,SAAS5G,OAAS,GAE9D+Y,EAAS1a,KAAKuvC,QAAQhf,SAASvwB,KAAKgb,WAAWzS,SAAS5G,QAC9DquC,GAAS,EACTI,GAAiB11B,EAAQzP,EAAQ,IAAMA,IAAWjL,KAAKiL,OAAQjL,KAAKgb,WAAWhS,QAASknC,EAAaC,GACrGH,GAAS,MACJ,CACL,MACMK,EAAUjtB,EADAqB,EAAK6rB,MAAS7rB,EAAKjhB,MAAQ,EAQzC,IAAI+sC,EAHJvwC,KAAKuvC,QAAQrvC,UAAUW,IAAI,iBACtBb,KAAKuvC,QAAQiB,WAIwDD,EAD7C,IAA1BvwC,KAAKgb,WAAWkK,OAAgBmrB,EAC3BrwC,KAAKgb,WAAWkK,QAAWllB,KAAKgb,WAAW1S,MAAQ,GAAM+nC,IAAsBrwC,KAAKgb,WAAW1S,MAAQ,GAC/F+nC,EAAU,GAAK,EAFwBrwC,KAAKgb,WAAW1S,MAAQ,EAG/EtI,KAAKgb,WAAWnR,GAAG0mC,GAEnB,aAAQ,KACNvwC,KAAKuvC,QAAQrvC,UAAUoE,OAAO,uBAInC,CAACuN,eAAgB7R,KAAK6R,iBAEzB,MAAM4+B,EAAkB,KACtBthB,GAAS,EACTxuB,SAASgC,KAAKrB,iBAAiB,KAAqB,WAAa,QAAUvB,IACzEovB,GAAS,GACR,CAACtQ,MAAM,KAGZ,IAAIrb,EAAQ,EAAG4f,EAAI,EAAGstB,EAAY,EAAkBC,EAAO,EACtC3wC,KAAK4wC,aAAe,IAAI,GAAa,CACxD71B,QAAS/a,KAAKuvC,QACdT,QAAS,CAACJ,EAAOC,KACf+B,EAAYhC,EACZ,IAAImC,EAAQztB,EAAIsrB,GAAS,GAAmBoC,MAM5C,OALGD,EAAQ,EAAGA,EAAQ,EACdA,EAAQF,IAAME,EAAQF,GAE9B3wC,KAAKuvC,QAAQpqC,MAAMogB,UAAY,GAAmBwrB,mBAAmBrrC,QAAQ,MAAOmrC,EAAQ,OAErF,GAETtC,kBAAoBxuC,GACd+vC,KAIM9vC,KAAKoB,UAAUlB,UAAUuV,SAAS,eAAgBu6B,GAH1DS,IACA,OAAAzmB,EAAA,GAAYjqB,IACL,GAOX6uC,aAAc,KACZ,MAAMnqB,EAAOzkB,KAAKuvC,QAAQ7qB,wBAC1BlhB,EAAQihB,EAAKjhB,MACbmtC,GAAQntC,GAASxD,KAAKkS,KAAKzD,kBAAoB,GAI/C2U,EAAIqB,EAAKkB,KAAO3lB,KAAKoB,UAAUsjB,wBAAwBiB,KAEvD3lB,KAAKuvC,QAAQpqC,MAAMogB,UAAY,GAAmBwrB,mBAAmBrrC,QAAQ,MAAO0d,EAAI,MAExFpjB,KAAKoB,UAAUlB,UAAUW,IAAI,cAC7Bb,KAAKuvC,QAAQrvC,UAAUW,IAAI,iBACtBb,KAAKuvC,QAAQiB,YAEpBpC,QAAS,KACP,MAAM4C,EAAWnsC,KAAKosC,KAAKpsC,KAAK+B,IAAI8pC,IAAcltC,EAAQ,GAAmBstC,SAAWJ,GAAa,EAAI,GAAK,GAC9GD,IAIAzwC,KAAKuvC,QAAQrvC,UAAUoE,OAAO,iBAC9B,aAAQ,KACNtE,KAAKgb,WAAWnR,GAAGmnC,GACnBhxC,KAAKoB,UAAUlB,UAAUoE,OAAO,mBAKtCtE,KAAKwvC,qBAAuB,IAAI0B,qBAAqBC,IACnDA,EAAQ5mC,QAAQ6mC,IACVA,EAAMC,gBAIVrxC,KAAKsxC,oBAAoBF,EAAM12B,YAmB9B,QAAQzP,GACbjL,KAAKiL,OAASA,EAEd,MAAM9C,EAAQ,IAAgB2X,aAAa7U,GAC3C,IAAI9C,EACF,OAGF,MAAM6S,EAA+Chb,KAAKgb,WAAa,IAAI,EAAW,CACpFtS,UAAW,GACX2B,SAAU,CAACF,EAAQF,EAAOvB,KACxB,IAAIuB,EAAO,OAAO5E,QAAQ6E,QAAQ,CAAC5B,WAAOD,EAAWc,MAAO,KAE5D,GAAG8B,EAAO82B,SAAU,CAClB,MAAMn3B,EAA2BT,EACjC,OAAO,IAAiBonC,cAActmC,EAAQL,EAAOlC,GAAW/E,KAAKgB,IAC5D,CACL2D,MAAO3D,EAAM2D,MACba,MAAOxE,EAAM6sC,UAGZ,CACL,MAAMxO,EAA6E,GAenF,OAdIhoB,EAAWhS,SACbg6B,EAASz5B,KAAKlE,QAAQ6E,QAAQ,UAAkBk+B,YAAYn9B,EAAO8vB,cAGrEiI,EAASz5B,KAAK,IAAmByB,UAAU,CACzCC,SACAL,MAAO6mC,OAAOC,iBACdvmC,YAAa,CACXC,EAAG,iCAELF,MAAOxC,EACPiC,UAAW,KAGNtF,QAAQC,IAAI09B,GAAUr/B,KAAM2G,IACjC,MAAM3F,EAAQ2F,EAAOjB,MAIrB,GAFAzB,EAAyBjD,IAErBqW,EAAWhS,QAAS,CACtB,MAAM+zB,EAAWzyB,EAAO,GAClBvC,EAAU,OAAAu5B,GAAA,GAAc38B,EAAMmD,QAAS6pC,GAClCA,EAA6BzpC,OAAuDC,MAAM4K,KAAOgqB,EAAS6U,WAAW7+B,IAGhIiI,EAAWhS,QAAUjB,GAAW,IAAmB8pC,0BAA0B7xC,KAAKiL,OAAQ8xB,EAAS6U,YAIrG,MAAO,CACLtpC,MAAO3D,EAAM2D,MACba,MAAOxE,EAAMmD,aAKrB2C,YAAazK,KAAKyK,YAClBf,OAAQ,CAACN,EAAMa,KACb,MAAM8I,EAAK/S,KAAKgb,WAAWkK,MAErB9B,EAAI,IAAM,GAAmB0tB,MAAQ/9B,EAC3C/S,KAAKuvC,QAAQpqC,MAAMogB,UAAY,GAAmBwrB,mBAAmBrrC,QAAQ,MAAO,IAAI0d,MAExF,MAAM0uB,EAAY9xC,KAAKkS,KAAKuB,cAAc,WACvCq+B,GAAWA,EAAU5xC,UAAUoE,OAAO,UAE7BtE,KAAKkS,KAAKqe,SAASxd,GAC3B7S,UAAUW,IAAI,UAElBb,KAAKsxC,oBAAoBtxC,KAAKuvC,QAAQhf,SAASxd,OAIpC,qBAAZ5K,EAAMiD,IACP4P,EAAWhS,QAAUb,EAAM4pC,UAG7B/xC,KAAKyK,YAAYuQ,EAAWhS,SAG5BgS,EAAWvR,MAAK,GAGX,SACL,MAAM2J,EAAMzS,SAASC,cAAc,OACnCwS,EAAIlT,UAAUW,IAAI,GAAmBouC,WAAa,QAClDjvC,KAAKkS,KAAK7Q,OAAO+R,GAEkB,IAAhCpT,KAAKkS,KAAKzD,mBACX2E,EAAIlT,UAAUW,IAAI,UAGpBb,KAAKoB,UAAUlB,UAAUC,OAAO,YAAaH,KAAKkS,KAAKzD,mBAAqB,GAkDtE,oBAAoBiM,GAC1B,MAAM6V,EAAWpkB,MAAMC,KAAKsO,EAAO3Z,cAAcwvB,UAC3CvoB,EAAMuoB,EAASpL,QAAQzK,GACf6V,EAAS5qB,MAAMd,KAAKJ,IAAI,EAAGuD,EA9WxB,GA8W6CnD,KAAKC,IAAIyrB,EAAS5uB,OAAQqG,EA9WvE,IAgXXuC,QAAQmQ,IACZ,MAAM0hB,EAAWp8B,KAAK0vC,cAAc/7B,IAAI+G,GACrC0hB,IACDA,IACAp8B,KAAK0vC,cAAcv9B,OAAOuI,GAC1B1a,KAAKwvC,qBAAqBwC,UAAUt3B,MAKnC,UACL1a,KAAK6R,eAAeO,YACpBpS,KAAK4wC,aAAavqB,mBAzXL,GAAA4oB,WAAa,kBACb,GAAA6B,MAAQ,GAAwB,EAAI,EACpC,GAAAC,mBAAqB,GAAwB,mCAAmC,GAAmBD,SAAW,oBCE/H,IAAImB,GAAU,CAAC3Z,EAA0CzC,KAErD,OAAA/I,EAAA,GAAa+I,EAAInkB,MAAO4mB,GAAQ,IAChCzC,EAAIz0B,UAAU+D,MAAMC,QAAUkzB,EAAO,GAAK,QAI/B,MAAM,GAqBnB,YACS/oB,EACCsC,EACA2pB,GAAW,GAFZ,KAAAjsB,aACC,KAAAsC,iBACA,KAAA2pB,WAkLH,KAAA0W,cAAgB,CAACC,GAAY,KAClC,MAAMlnC,EAASjL,KAAKiL,OACpBjL,KAAK+a,QAAQ7a,UAAUC,OAAO,QAAS8K,IAAW2B,EAAA,EAAU+R,OACxD1T,GAAW2B,EAAA,EAAU+R,OAAS1T,GAAUjL,KAAKw7B,UAEjD,GAAa0W,cAAclyC,KAAKiL,OAAQjL,KAAKgwB,SAAUmiB,GAAW,EAAM,IAAMlnC,IAAWjL,KAAKiL,QAASjL,KAAKw7B,WArLxG,IACFx7B,KAAKuP,WAAWnO,UAAUlB,UAAUW,IAAI,eAGtCgR,IACF7R,KAAK6R,eAAiB,IAAI,KAIvB,OACL7R,KAAKgS,KAAO,KAGZhS,KAAK+a,QAAUpa,SAASC,cAAc,OACtCZ,KAAK+a,QAAQ7a,UAAUW,IAAI,mBAE3Bb,KAAKkV,QAAU,IAAI,GAAe,CAChCooB,aAAa,IAGft9B,KAAKgvC,OAAS,IAAI,GAClBhvC,KAAKgvC,OAAO9uC,UAAUW,IAAI,iBAAkB,cAC5Cb,KAAKgvC,OAAOxT,SAAWx7B,KAAKw7B,SAC5Bx7B,KAAKgvC,OAAOoD,mBAEZpyC,KAAKQ,KAAOG,SAASC,cAAc,OACnCZ,KAAKQ,KAAKN,UAAUW,IAAI,gBAExBb,KAAKgwB,SAAWrvB,SAASC,cAAc,OACvCZ,KAAKgwB,SAAS9vB,UAAUW,IAAI,oBAE5Bb,KAAKqyC,IAAM,IAAI,GAAI,CACjB3gC,MAAO,IACP6lB,gBAAiB,UACjBpmB,KAAM,OACNlD,UAAYlO,IAC+B,MAArCA,EAAE2a,OAAuB43B,SAI7BjtC,QAAQ6E,QAAQ,UAAkBqoC,mBAAmBvyC,KAAKiL,SAAStH,KAAK8qB,IACtE4J,GAAoB5J,EAAK3Y,OACzB6jB,GAAM,IAAK9iB,OAAO,aAAa,SAKrC7W,KAAKqyC,IAAI3gC,MAAMxR,UAAUW,IAAI,YAE7Bb,KAAK06B,SAAW,IAAI,GAAI,CACtBhpB,MAAO,IACP6lB,gBAAiB,WACjBpmB,KAAM,WACNlD,UAAW,KAEToqB,GAAoB,IADc,IAAgBsH,QAAQ3/B,KAAKiL,QAChCyvB,UAC/Bf,GAAM,IAAK9iB,OAAO,kBAAkB,OAIxC7W,KAAKmsC,MAAQ,IAAI,GAAI,CACnBz6B,MAAO,IACP6lB,gBAAiB,QACjBpmB,KAAM,QACNlD,UAAW,KAEToqB,GAAoB,IADD,IAAgBmT,QAAQxrC,KAAKiL,QACjBkhC,OAC/BxS,GAAM,IAAK9iB,OAAO,eAAe,OAIrC7W,KAAKi9B,KAAO,IAAI,GAAI,CAClBvrB,MAAO,IACP6lB,gBAAiB,oBACjBpmB,KAAM,OACNlD,UAAW,KACToqB,GAAoBr4B,KAAKi9B,KAAKvrB,MAAM+e,aAGlCkJ,GAAM,IAAK9iB,OAAO,cAAc,OAKtC7W,KAAKyX,SAAW,IAAI,GAAI,CACtB/F,MAAO,IACP6lB,gBAAiB,eACjBpmB,KAAM,aAGRnR,KAAKkV,QAAQvD,QAAQtQ,OACnBrB,KAAKmsC,MAAM/qC,UACXpB,KAAK06B,SAASt5B,UACdpB,KAAKyX,SAASrW,UACdpB,KAAKqyC,IAAIjxC,UACTpB,KAAKi9B,KAAK77B,WAGZ,MAAM,eAACyQ,GAAkB7R,KACtBA,KAAKw7B,WACNx7B,KAAKwyC,cAAgB,IAAI,GAAI,CAC3Blb,cAAe,IAAI,KAAc,CAACn3B,QAAQ,IAC1C03B,aAAc,gBACd1mB,KAAM,WAGRU,EAAehR,IAAIb,KAAKwyC,cAAclb,cAAcl3B,MAApDyR,CAA2D,SAAW9R,IAChEA,EAAE2b,WAKN,IAAmBmwB,eAAe7rC,KAAKiL,UAGzC4G,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,yBAA2BqF,IACvD,GAAGlX,KAAKiL,SAAWiM,EAAOjM,OAAQ,CAChC,MAAM8S,EAAQ,KAAwBuuB,iBAAiBtsC,KAAKiL,QAAQ,GACpEjL,KAAKwyC,cAAclb,cAAcH,SAAWpZ,KAIhD/d,KAAKkV,QAAQvD,QAAQtQ,OAAOrB,KAAKwyC,cAAcpxC,YAGjDpB,KAAK+a,QAAQ1Z,OAAOrB,KAAKkV,QAAQ9T,WAE9B,IACDpB,KAAK+a,QAAQ1Z,OAAOo/B,MAGtB5uB,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,eAAgB,EAAE5G,aAC3CjL,KAAKiL,SAAWA,GACjBjL,KAAKkyC,kBAITrgC,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,gBAAkB5G,IAC3CA,IAAWjL,KAAKiL,QACjBjL,KAAKyyC,gBAAe,KAIxB5gC,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,kBAAoB5G,IAC7CA,IAAWjL,KAAKiL,QACjBjL,KAAK0yC,iBAIT7gC,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,cAAgBkF,IACzC/W,KAAKiL,SAAW8L,EAAOwU,YACxBvrB,KAAKkyC,kBAITrgC,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,kBAAoBkF,IAChD,GAAG/W,KAAKiL,SAAW8L,EAAOwU,WAAY,CACvB,IAAgBigB,QAAQz0B,GAC5BwH,OAAOo0B,MAAS3yC,KAAKw7B,UAC5Bx7B,KAAK4yC,mBAKX/gC,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,gBAAkB5G,IAC3CjL,KAAKiL,SAAWA,GAGfjL,KAAK6yC,cAKX7yC,KAAK8yC,sBAAwB5wC,OAAO6wC,YAAY/yC,KAAKkyC,cAAe,KAW/D,cACL,CACElyC,KAAKqyC,IACLryC,KAAKmsC,MACLnsC,KAAK06B,SACL16B,KAAKyX,SACLzX,KAAKi9B,MACL1yB,QAAQsrB,IACRA,EAAIz0B,UAAU+D,MAAMC,QAAU,SAG7BpF,KAAKwyC,gBACNxyC,KAAKwyC,cAAcpxC,UAAU+D,MAAMC,QAAU,GAC7CpF,KAAKwyC,cAAclb,cAAcH,SAAU,GAG1Cn3B,KAAKgzC,wBACN9wC,OAAO4O,aAAa9Q,KAAKgzC,uBACzBhzC,KAAKgzC,sBAAwB,GAIzB,gBACN,OAAOhzC,KAAKiL,SAAW2B,EAAA,EAAU+R,OAAS3e,KAAKw7B,SAG1C,YACL,GAAGx7B,KAAKizC,gBAAiB,CAGvB,GAFc,IAAgBnzB,aAAa9f,KAAKiL,QAEtC,CACR,MAAMioC,EAAalzC,KAAKuvC,QAcxB,OAbAvvC,KAAKuvC,QAAU,IAAI,GAAmBvvC,KAAKuP,YAC3CvP,KAAKuvC,QAAQ4D,QAAQnzC,KAAKiL,QAC1BjL,KAAKuvC,QAAQjK,KAAKjkC,OAAOrB,KAAKQ,KAAMR,KAAKgwB,UAEzChwB,KAAKgvC,OAAO1qC,SAET4uC,EAAYA,EAAW9xC,UAAUgsB,YAAYptB,KAAKuvC,QAAQnuC,WACxDpB,KAAK+a,QAAQ/Z,QAAQhB,KAAKuvC,QAAQnuC,gBAEpC,IACDpB,KAAKuP,WAAWnO,UAAUlB,UAAUW,IAAI,cAO3C,IACDb,KAAKuP,WAAWnO,UAAUlB,UAAUoE,OAAO,YAG1CtE,KAAKuvC,UACNvvC,KAAKuvC,QAAQnuC,UAAUkD,SACvBtE,KAAKuvC,QAAQzhC,UACb9N,KAAKuvC,aAAUlnC,GAGjBrI,KAAKgvC,OAAOnY,kBAAkB,CAAC5rB,OAAQjL,KAAKiL,SAE5CjL,KAAKkV,QAAQvD,QAAQ3Q,QAAQhB,KAAKgvC,OAAQhvC,KAAKQ,KAAMR,KAAKgwB,UAGpD,eACN,MAAM,OAAC/kB,GAAUjL,KACjB,GAAGiL,EAAO82B,UAAY/hC,KAAKizC,gBAAiB,CAC1C,MAAMvY,EAAW,IAAgB0Y,gBAAgBnoC,GACjDgnC,GAAQvX,EAAU16B,KAAK06B,WAInB,gBACN,MAAM,OAACzvB,GAAUjL,KACjB,GAAGiL,EAAO82B,UAAY/hC,KAAKizC,gBAAiB,CAC1C,MAAM1H,EAAO,IAAgBC,QAAQvgC,GACrCgnC,GAAQ1G,EAAKY,MAAQ,IAAgBC,gBAAgBb,EAAKY,YAAS9jC,EAAWrI,KAAKmsC,QAI/E,oBACN,MAAME,EAAmBrsC,KAAKwyC,cAC9B,GAAInG,EAIJ,GAAGrsC,KAAKizC,gBAAiB,CACvB,MAAMl1B,EAAQ,KAAwBuuB,iBAAiBtsC,KAAKiL,QAAQ,GACpEohC,EAAiB/U,cAAcH,SAAWpZ,OAE1C,aAAQ,KACNsuB,EAAiBjrC,UAAU+D,MAAMC,QAAU,SAKzC,WACN,MAAM6F,EAASjL,KAAKiL,OAEpBjL,KAAK0yC,eACL1yC,KAAK4yC,gBACL5yC,KAAKqzC,oBACLrzC,KAAKyyC,iBAEL,OAAAhiC,EAAA,GAAezQ,KAAKQ,KAAM,IAAI,KAAU,CACtCyK,SACAiM,OAAQlX,KAAKw7B,WACZzgB,SAEH/a,KAAKQ,KAAKa,UAAU6rC,GAAmBjiC,IAEvCjL,KAAKkyC,eAAc,GAGd,sBACDlyC,KAAKszC,UACTtzC,KAAKszC,SAAU,EAEftzC,KAAKuzC,cACLvzC,KAAK6yC,YACL7yC,KAAKwzC,YAGA,eAAeC,GACjBzzC,KAAKgzC,wBACN9wC,OAAO4O,aAAa9Q,KAAKgzC,uBACzBhzC,KAAKgzC,sBAAwB,GAG/B,MAAM/nC,EAASjL,KAAKiL,OACdqE,EAAWtP,KAAKsP,SAElBrE,IAAU,IAAgByoC,aAAazoC,IAAYjL,KAAKizC,iBAI5D,OAAAU,GAAA,GAAY,UAAkBpB,mBAAmBtnC,EAAQwoC,GAAYG,IACnE,GAAG5zC,KAAKiL,SAAWA,GAAUjL,KAAKsP,WAAaA,GAAY,IAAgBokC,aAAazoC,GAEtF,OASF,GAHEgnC,GAAQ2B,EAAS99B,MAAQ,IAAkB+9B,aAAaD,EAAS99B,YAASzN,EAAWrI,KAAKqyC,MAGxFpnC,EAAO82B,SAAU,CACnB,MAAMnR,EAAqB,IAAgBiM,QAAQ5xB,EAAO8vB,YAC1D,GAAGnK,EAAK8J,SACNuX,GAAQ,gBAAkBrhB,EAAK8J,SAAU16B,KAAKi9B,UACzC,CACL,MAAM6W,EAAkBF,EAAkC5W,gBACvD8W,GACD7B,GAAQ6B,EAAe7W,KAAMj9B,KAAKi9B,OAKxC,MAAMxlB,EAAYm8B,EAAkCn8B,SAClC,oBAAfA,aAAQ,EAARA,EAAUrM,IACX6mC,GAAQx6B,EAASzB,QAAShW,KAAKyX,UAGjCzX,KAAKgzC,sBAAwB9wC,OAAO4N,WAAW,IAAM9P,KAAKyyC,gBAAe,GAAO,OAI7E,QAAQxnC,EAAgBqE,EAAW,GACrCtP,KAAKiL,SAAWA,GAAUjL,KAAKsP,WAAaA,IAE5CtP,KAAKgS,MACNhS,KAAKgS,OAGPhS,KAAKiL,OAASA,EACdjL,KAAKsP,SAAWA,EAEhBtP,KAAKszC,SAAU,IClZJ,MAAM,WAA0B,EAiB7C,YAAYliC,GACVzR,MAAMyR,GAAQ,GAdR,KAAA9B,SAAW,EAEX,KAAAykC,iBAIJ,GAWG,OAGL/zC,KAAKoB,UAAUlB,UAAUW,IAAI,yBAA0B,qBAGvD,MAAMmzC,EAAc,YAAO,gCAAiC,CAACviC,UAAU,IACvEzR,KAAKwR,SAAS4b,YAAY4mB,GAC1Bh0C,KAAKwR,SAAWwiC,EAEhB,MAAMC,EAAoBtzC,SAASC,cAAc,OACjDqzC,EAAkB/zC,UAAUW,IAAI,uBAChCmzC,EAAY3yC,OAAO4yC,GAEnB,MAAMC,EAAsBvzC,SAASC,cAAc,OACnDszC,EAAoBlmC,UAAY,wBAEhC,MAAMmmC,EAAsBxzC,SAASC,cAAc,OACnDuzC,EAAoBj0C,UAAUW,IAAI,mBAElCb,KAAK0R,MAAMrQ,OAAO,YAAK,YACvBrB,KAAKo0C,QAAU,EAAW,QAG1BD,EAAoB9yC,OAAOrB,KAAK0R,MAAO1R,KAAKo0C,SAE5C,MAAMC,EAAqB1zC,SAASC,cAAc,OAClDyzC,EAAmBn0C,UAAUW,IAAI,mBAEjC,MAAMyzC,EAA2Bt0C,KAAK0R,MAAMxQ,YAC5CozC,EAAYjzC,OAAO,YAAK,yBAExBgzC,EAAmBhzC,OAAOizC,GAE1BJ,EAAoB7yC,OAAO8yC,EAAqBE,GAEhDr0C,KAAKuR,OAAOlQ,OAAO6yC,GAInBl0C,KAAKu0C,QAAU,IAAI,GAAYv0C,KAAKuP,YACpCvP,KAAKu0C,QAAQviC,OAEbhS,KAAKuP,WAAWlO,OAAOrB,KAAKu0C,QAAQx5B,SAGpC/a,KAAKuP,WAAWilC,mBAAqB,KACnC,MAAM/vB,EAAOzkB,KAAKy0C,YAAYC,IAAIhwB,wBAClC,IAAID,EAAKjhB,MAAO,OAEhB,MAAMk1B,EAAMjU,EAAKiU,IAAM,EACvBic,EAAiBjc,GANG,KAStB,MAAMic,EAAoBC,IACxBX,EAAkB/zC,UAAUC,OAAO,aAAcy0C,GACjD50C,KAAKy0C,YAAYrzC,UAAUlB,UAAUC,OAAO,mBAAoBy0C,GAChEC,GAAYD,GAERA,GACF50C,KAAKy0C,YAAYK,wBAIfD,EAAa,YAAiBX,EAAqB,aAAc,IAAK,MAAM,GAElFW,EAAW,GAEX,YAAiB70C,KAAKwR,SAAWzR,IAC5BC,KAAKwR,SAASya,kBAAkB/rB,UAAUuV,SAAS,eACpDzV,KAAKuP,WAAWi0B,kBAAkB,CAChCzoB,QAAS/a,KAAKuP,WAAWnO,UAAU6qB,kBACnC0M,SAAU,UAEZkc,EAAW,GACXZ,EAAkB/zC,UAAUoE,OAAO,eAC1BtE,KAAKuP,WAAWwlC,4BACzB/0C,KAAKoR,OAAOsB,oBAIhB,YAAiB1S,KAAKo0C,QAAUr0C,IAC9B,IAAIqT,EAEFA,EADCpT,KAAKiL,OAAOm4B,YACP,IAAI,GAAepjC,KAAKoR,QAExB,IAAI,GAAkBpR,KAAKoR,QAGhCgC,IACEA,aAAe,GAChBA,EAAI8C,OAASlW,KAAKiL,OAAO8vB,WAEzB3nB,EAAInI,OAASjL,KAAKiL,OAGpBmI,EAAIsB,UAIR9H,EAAA,EAAUtL,iBAAiB,kBAAoByV,IAC1C/W,KAAKiL,SAAW8L,GACjB/W,KAAKg1C,kBAITpoC,EAAA,EAAUtL,iBAAiB,cAAgB4U,IACtClW,KAAKiL,SAAWiL,EAAOqV,UAAS,IACjCvrB,KAAKg1C,kBAITpoC,EAAA,EAAUtL,iBAAiB,sBAAwB2zC,IACjD,IAAI,MAAMhqC,KAAUgqC,EAClBj1C,KAAKk1C,kBAAkBjqC,EAAOsgB,WAAYpf,MAAMC,KAAK6oC,EAAahqC,OAItE2B,EAAA,EAAUtL,iBAAiB,iBAAkB,EAAE2J,SAAQQ,WACrDzL,KAAKm1C,sBAAsBlqC,EAAQkB,MAAMC,KAAKX,MAIhDmB,EAAA,EAAUtL,iBAAiB,eAAgB,EAAEyG,cAC3C/H,KAAKk1C,kBAAkBntC,EAAQkD,OAAQ,CAAClD,EAAQ8C,QAKlD7K,KAAKy0C,YAAc,IAAI,GAAe,CACpCW,UAAW,CAAC,CACVjqC,YAAa,2BACb3K,KAAM,oBACNH,KAAM,WACL,CACD8K,YAAa,gCACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,8BACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,yBACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,2BACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,gCACb3K,KAAM,kBACNH,KAAM,UAERkP,WAAYvP,KAAKuP,WACjB8lC,YAAcC,IACZ,IAAIzkC,EAA4B,YAAlBykC,EAASj1C,MAAsBuM,EAAA,EAAU+2B,SAASC,kBAAoB,IAAM,EAC1F9zB,WAAW,KACTylC,EAAcr1C,UAAUC,OAAO,YAA+B,YAAlBm1C,EAASj1C,OACpDwQ,MAIP7Q,KAAKy0C,YAAYe,oBAAsB,KACrCb,GAAiB,IAGnB30C,KAAKu0C,QAAQx5B,QAAQ1Z,OAAOrB,KAAKy0C,YAAYrzC,WAE7C,MAAMm0C,EAAgB,EAAa,CAACpkC,KAAM,qBAC1CnR,KAAK2R,QAAQtQ,OAAOk0C,GAEpBA,EAAcj0C,iBAAiB,QAAS,KACtC,MAAM2J,EAASjL,KAAKiL,OACd8H,EAAK/S,KAAKiL,OAAO8vB,WACjBmM,EAAY,IAAgBA,UAAUn0B,GAEtC0iC,EAAmB,CAACp/B,EAAmB+lB,KAC3C,IAAIvE,EAA2B6D,EAC7BG,EAAiCG,EACjCC,EAEF,GAAG5lB,EAAQ1U,OAAS,EAClBk2B,EAAe,uBACf6D,EAAgB,CAAC,YAAK,UAAW,CAACrlB,EAAQ1U,UAC1Ck6B,EAAqB,2BACrBG,EAAsB3lB,EAAQ5J,IAAIxB,IAChC,MAAMsB,EAAI5L,SAASC,cAAc,KAEjC,OADA2L,EAAElL,OAAO,IAAI,KAAU,CAAC4J,WAAS8P,SAC1BxO,IAGL26B,IACFjL,EAAa,CAAC,CACZ3D,KAAM,4BACNnB,SAAS,SAGR,CACLU,EAAe,yBACfgE,EAAqB,2BACrB,MAAMtvB,EAAI5L,SAASC,cAAc,KACjC2L,EAAElL,OAAO,IAAI,KAAU,CACrB4J,OAAQoL,EAAQ,KACf0E,SACHihB,EAAsB,CAACzvB,GAEnB26B,IACFjL,EAAa,CAAC,CACZ3D,KAAM,8BACN2P,SAAU,CAAC,IAAI,KAAU,CAACh9B,OAAQoL,EAAQ,KAAK0E,SAC/Coc,SAAS,KAKf6E,EAAoBzyB,KAAK,IAAI,KAAU,CACrC0B,WACC8P,SAEH,IAAI,GAAU,oBAAqB,CACjC9P,SACA4sB,eACAgE,qBACAG,sBACAX,QAAS,CAAC,CACR7B,QAAS,MACT4C,aAEFH,eACCmB,QAGCsY,EAAWplC,IACC,4BAAbA,EAAIjQ,MACLu5B,GAAS,CAACC,YAAa,wBAI3B,GAAGqN,EAAW,CACZ,MAAM9zB,EAAM,IAAI,GAAiBpT,KAAKoR,QACtCgC,EAAIsB,KAAK,CACPrU,KAAM,UACNosC,WAAW,EACXlI,QAAUluB,IACRo/B,EAAiBp/B,EAAS,KACxB,MAAMjM,EAAU,IAAgBkM,gBAAgBvD,EAAIsD,GACpDjM,EAAQsG,MAAMglC,GACdtiC,EAAIs5B,gBAAgBtiC,MAGf,GAETsH,MAAO,kBACPf,YAAa,uBAGf,IAAI,GAAc,CAChByzB,UAAW,CAAC,YACZzzB,YAAa,SACbuzB,SAAWj5B,IACT6E,WAAW,KACT2lC,EAAiB,CAACxqC,GAAUksB,IAC1B,IAAgBwe,YAAY5iC,EAAI9H,EAAQksB,EAAQj0B,UAAOmF,EAAY,GAClEqI,MAAMglC,MAER,QASN,kBAAkBzqC,EAAgBgB,GACvC,IAAGjM,KAAKgS,MAEJhS,KAAK+zC,iBAAiB9oC,GAA1B,CAEAgB,EAAOA,EAAKtG,QAAQ8C,UACpB,IAAI,MAAM6sC,KAAYt1C,KAAKy0C,YAAYW,UAAW,CAChD,MAAMjqC,EAAcmqC,EAASnqC,YACvByqC,EAAW51C,KAAKy0C,YAAYoB,qBAAqB5pC,EAAKQ,IAAI5B,GAAO,IAAmB4V,iBAAiBxV,EAAQJ,IAAOM,GAC1H,GAAGyqC,EAASj0C,OAAQ,CAClB,MAAMmG,EAAU9H,KAAK+zC,iBAAiB9oC,GAAQE,GAC3CrD,GACDA,EAAQwB,WAAWssC,EAASnpC,IAAI1E,IAAW,CAAE8C,IAAK9C,EAAQ8C,IAAKI,OAAQlD,EAAQkD,WAG9EjL,KAAKiL,SAAWA,IAA6D,IAAnDjL,KAAKy0C,YAAYqB,gBAAgB3qC,KAC5DnL,KAAKy0C,YAAYqB,gBAAgB3qC,IAAgByqC,EAASj0C,OAC1D3B,KAAKy0C,YAAYsB,oBAAoBH,EAAUN,GAAU,OAM1D,sBAAsBrqC,EAAgBgB,GAC3C,IAAGjM,KAAKgS,MAEJhS,KAAK+zC,iBAAiB9oC,GAA1B,CAEA,IAAI,MAAMJ,KAAOoB,EACf,IAAI,MAAM5L,KAAQL,KAAKy0C,YAAYW,UAAW,CAC5C,MAAMjqC,EAAc9K,EAAK8K,YAEnBrD,EAAU9H,KAAK+zC,iBAAiB9oC,GAAQE,GAC9C,IAAIrD,EAAS,SAEb,MAAME,EAAMF,EAAQsT,UAAUu2B,GAAKA,EAAE9mC,MAAQA,GAC7C,IAAY,IAAT7C,IACDF,EAAQM,OAAOJ,EAAK,GAEjBhI,KAAKiL,SAAWA,GAAQ,CACzB,MACM+lB,EADYhxB,KAAKy0C,YAAYviC,KAAK/G,GAClBsI,cAAc,cAAc5I,qBAAuBI,OACtE+lB,IACEhxB,KAAKy0C,YAAYuB,UAAUC,aAC5Bj2C,KAAKy0C,YAAYuB,UAAUE,gBAAgBllB,GAG7CA,EAAI1sB,UAGHtE,KAAKy0C,YAAYqB,gBAAgB3qC,IAAiBnD,EAAM,GACzDhI,KAAKy0C,YAAYqB,gBAAgB3qC,MAU3CnL,KAAKuP,WAAW83B,YAGX,cAELrnC,KAAKu0C,QAAQhB,cAEbvzC,KAAKo0C,QAAQl0C,UAAUW,IAAI,QAE3Bb,KAAKy0C,YAAYlB,aAAY,GAE7BvzC,KAAKoB,UAAUlB,UAAUC,OAAO,kBAAmBH,KAAKy0C,YAAY0B,kBAAoB,IAAgBlU,UAAUjiC,KAAKiL,OAAO8vB,WAAY,iBAKrI,aAAa3wB,GAClBpK,KAAKy0C,YAAY2B,UAAYhsC,EAGxB,QAAQa,EAAgBqE,EAAW,G,MACxC,OAAGtP,KAAKiL,SAAWA,GAAUjL,KAAKsP,WAAaA,KAE/CtP,KAAKiL,OAASA,EACdjL,KAAKsP,SAAWA,EAChBtP,KAAKq2C,aAAc,EAEhBr2C,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGdhS,KAAKy0C,YAAY6B,SAAS,CACxBrrC,SAEAsrC,eAA6C,QAA7B,EAAAv2C,KAAK+zC,iBAAiB9oC,UAAO,QAAKjL,KAAK+zC,iBAAiB9oC,GAAU,KAGpFjL,KAAKu0C,QAAQpB,QAAQloC,EAAQqE,IAEtB,GAGF,sBACDtP,KAAKq2C,cAITr2C,KAAKq2C,aAAc,EAEnBr2C,KAAKuzC,cAELvzC,KAAKu0C,QAAQiC,sBAEbx2C,KAAKg1C,iBAGC,gBACN,IAAI5X,EAEFA,EADCp9B,KAAKiL,OAAO82B,SACN/hC,KAAKiL,SAAW2B,EAAA,EAAU+R,MAAQ,IAAgBysB,UAAUprC,KAAKiL,OAAOwL,YAExE,IAAgBwrB,UAAUjiC,KAAKiL,OAAO8vB,WAAY,eAG3D/6B,KAAKo0C,QAAQl0C,UAAUC,OAAO,QAASi9B,GAGlC,iBAAiBqZ,EAAiBC,GAAW,GAClD12C,KAAKy0C,YAAYhrC,KAAKgtC,EAAQC,GAGhC,qBACE12C,KAAKuP,WAAW83B,YChUpB,MAAM,GAAkB,IA7HjB,cAA8B,EAInC,cACE1nC,MAAM,CACJ6T,UAAW7S,SAASg2C,eAAe,gBACnClkC,cAAc,EACdI,eAAgB,UANZ,KAAA+jC,uBAAwB,EAS9BzuB,EAAA,EAAW7mB,iBAAiB,eAAgB,CAAC8K,EAAMyqC,KAC9CA,IAAO,IAAWC,QAAU1qC,IAAS,IAAW2qC,QACjD/2C,KAAKg3C,eAAc,KAIvB7uB,EAAA,EAAW7mB,iBAAiB,SAAU,KACpCtB,KAAKi3C,wBAGPj3C,KAAKk3C,eAAiB,IAAI,GAAkBl3C,MAGvC,WAAW+S,EAAYC,EAAkBC,GAC1CjT,KAAKwS,cAAc7Q,QACrB3B,KAAKg3C,eAAc,EAAOhkC,GAG5BrT,MAAMwT,WAAWJ,EAAIC,EAASC,GAaxB,sBACN,MAAMkkC,EAAan3C,KAAKwT,UAAU4jC,YAAcp3C,KAAKwT,UAAU6jC,uBAAuBD,YACtFz2C,SAAS22C,gBAAgBnyC,MAAMqB,YAAY,4BAA6B,GAAK2wC,GAGxE,cAAcI,EAAkBvkC,GAGrC,MAAMwkC,EAAS72C,SAASgC,KAAKzC,UAAUuV,SApDE,yBAqDzC,IAAIgiC,EAaJ,QAZcpvC,IAAXkvC,EACEA,EACGC,IACFC,GAAa,GAEPD,IACRC,GAAa,GAGfA,GAAa,GAGXA,EAAY,OAAOpyC,QAAQ6E,UAE3BstC,GAAWx3C,KAAKwS,cAAc7Q,QAChC3B,KAAKk3C,eAAexiC,OAIlB1U,KAAK42C,wBACP52C,KAAKi3C,sBACLj3C,KAAK42C,uBAAwB,GAG/B,MAAMc,EAAmB,GAAazlC,UAAUulC,EAAS,EAAI,EAAGxkC,GAEhE,OADArS,SAASgC,KAAKzC,UAAUC,OA/EiB,wBA+EqBo3C,GACvDG,IAgDX,KAAeC,gBAAkB,GAClB,UC7HA,MAAM,WAA0B,EAGnC,OACR33C,KAAKoB,UAAU2R,GAAK,yBACpB/S,KAAKoB,UAAUlB,UAAUW,IAAI,sBAE7Bb,KAAK43C,WAAaj3C,SAASC,cAAc,OACzCZ,KAAK43C,WAAW13C,UAAUW,IAAI,gBAC9Bb,KAAKuP,WAAWlO,OAAOrB,KAAK43C,YAGvB,KAAK7vC,GACV,MAAMyF,EAAM7N,MAAM+U,OACZmjC,EAAO,KAAgBC,QAAQ/vC,EAAQ0Q,MAAMo/B,KAAK9kC,IAExD/S,KAAK+U,SAAS8iC,EAAKA,KAAKt5B,OAAOw5B,KAAO,yBAA2B,0BAEjE,MAAMrmC,EAAQ/Q,SAASC,cAAc,MACrC,OAAAksB,EAAA,GAAapb,EAAO,IAAkB6a,cAAcsrB,EAAKA,KAAKG,WAE9D,MAAM3yB,EAAWwyB,EAAKrV,QAAQA,QAAQ/1B,IAAIq4B,GAAKA,EAAEmT,OAASJ,EAAKrV,QAAQ0V,aAAe,KACtFC,GAAc9yB,GAEd,MAAMsW,EAAWh7B,SAASi7B,yBAyF1B,OAxFAic,EAAKrV,QAAQA,QAAQj4B,QAAQ,CAACD,EAAQtC,KACpC,IAAIsC,EAAO2tC,OAAQ,OAEnB,MAAMG,EAAKz3C,SAASC,cAAc,MAE5By3C,EAASR,EAAKA,KAAKS,QAAQtwC,GAG3BuwC,EAAW53C,SAASC,cAAc,OACxC23C,EAASr4C,UAAUW,IAAI,uBAEvB,MAAM23C,EAAc73C,SAASC,cAAc,OAC3C,OAAAksB,EAAA,GAAa0rB,EAAa,IAAkBjsB,cAAc8rB,EAAO/f,OAEjE,MAAMmgB,EAAiB93C,SAASC,cAAc,OAC9C63C,EAAe7qB,UAAY/oB,KAAKE,MAAMsgB,EAASrd,IAAQ,IAEvDuwC,EAASl3C,OAAOm3C,EAAaC,GAG7B,MAAMrqC,EAAO,GAAkBC,iBAC/BD,EAAKlO,UAAUW,IAAI,uBAEnB,GAAkB0N,qBAAqBH,EAAM,KAC3C,GAAgBsE,wBACfrK,GAAW,GAEd+F,EAAKjJ,MAAMuzC,UAAyC,GAA7B7zC,KAAKC,IAAIwF,EAAO2tC,OAAQ,GAAU,KAEzDtc,EAASt6B,OAAO+2C,EAAIG,EAAUnqC,GAE9B,IAAIkmB,EAAgBppB,EAAQ,EAAGgzB,GAAU,EAAOvY,EAAOrb,EAAO2tC,OAAS,EACvE,MAAMxuC,EAAO,KACRy0B,IACHA,GAAU,EAEV,KAAgBya,SAAS5wC,EAASswC,EAAOO,OAAQtkB,EAAQppB,GAAOvH,KAAKk1C,IACnEA,EAAUC,MAAMvuC,QAAQwuC,IACtB,MAAM,IAAC/hC,GAAO,GAAkBC,aAAa,CAC3CC,OAAQ6hC,EAAKnS,QAAQrb,UAAS,GAC9BnqB,UAAWgN,EACX+B,YAAY,EACZgH,eAAe,EACf9G,WAAW,EACXD,WAAY,KAEd4G,EAAII,gBAAgBrW,cAAcuD,WAGjCgwB,IACD3O,GAAQkzB,EAAUC,MAAMn3C,OACvBq3C,EAASC,iBAAiC7rB,YAAY,YAAK,uBAAwB,CAACvoB,KAAKC,IAAI,GAAI6gB,OAGpG2O,EAASukB,EAAUK,YACnBhuC,EAAQ,GAEJya,GAASkzB,EAAUC,MAAMn3C,QAC3Bq3C,EAAS10C,WAEVqjC,QAAQ,KACTzJ,GAAU,MAMd,GAFAz0B,IAEGkc,GAAQ,EAAG,OAEd,MAAMqzB,EAAWr4C,SAASC,cAAc,OACxCo4C,EAAS94C,UAAUW,IAAI,oBAAqB,YAAa,eACzDm4C,EAAS13C,iBAAiB,QAASmI,GACnC,OAAAyuB,GAAA,GAAO8gB,GACP,MAAMlvC,EAAOnJ,SAASC,cAAc,OACpCkJ,EAAK5J,UAAUW,IAAI,cACnBm4C,EAAS33C,OAAOyI,EAAM,YAAK,uBAAwB,CAACjF,KAAKC,IAAI,GAAI6gB,MAEjEgW,EAASt6B,OAAO23C,KAGlBh5C,KAAK43C,WAAWv2C,OAAOqQ,EAAOiqB,GAE9B,GAAgBqb,eAAc,GAAMrzC,KAAK,QAMlC6J,G,aCpHI,MAAM,GAKnB,YAAY9N,GAIVM,KAAKsuB,cAAgB5uB,EAAQ4uB,cAC7BtuB,KAAKoQ,WAAa1Q,EAAQ0Q,WAE1BpQ,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAjBV,mBAmBfb,KAAKoB,UAAU+D,MAAMqB,YAAY,gBAAiB9G,EAAQ0Q,WAAa,MAOlE,OAAOiG,EAAmB+X,GAC/B,MAAMmC,EAAWvwB,KAAKoB,UAAUmvB,UAChCla,EAAUA,EAAQ1Q,QAAQ8C,WACf9G,OAAS,IAClB0U,EAAUA,EAAQ1Q,OAAO,IAG3B0Q,EAAQ9L,QAAQ,CAACU,EAAQjD,KACvB,IAAImxC,EAAkB5oB,EAASvoB,GAC3BmxC,IACFA,EAAkBx4C,SAASC,cAAc,OACzCu4C,EAAgBj5C,UAAUW,IAnCEu4C,qCAsC9B,IAAIxiB,EAAauiB,EAAgBltB,kBAC7B2K,IACFA,EAAa,IAAI,GACjBA,EAAW12B,UAAUW,IAAI,UAAYb,KAAKoQ,WA1CxBipC,0BA2ClBziB,EAAW0iB,cAAc,CACvB9d,UAAU,EACVpN,kBAIJwI,EAAWC,kBAAkB,CAC3BvI,cAAetuB,KAAKsuB,cACpBrjB,OAAQA,IAGN2rB,EAAW2iB,YACbJ,EAAgB93C,OAAOu1B,GAGrBuiB,EAAgBI,YAClBv5C,KAAKoB,UAAUC,OAAO83C,KAKzBhtC,MAAMC,KAAKmkB,GAA4B5qB,MAAM0Q,EAAQ1U,QAAQ4I,QAAQzI,GAAMA,EAAGwC,WC7CnF,IAAIk1C,GAAkB,EACtB,MAKarB,GAAiB9yB,IAG5B,MAAMkP,EAAMlP,EAASoM,OAAO,CAACC,EAAKqK,IAAMrK,EAAM7sB,KAAKE,MAAMg3B,GAAI,GAC7D,GAAGxH,EAAM,IAAK,CACZ,MAAMkB,EAAOlB,EAAM,IACb5yB,EAAS0jB,EAAS1jB,OACxB,IAAI,IAAIC,EAAI,EAAGA,EAAI6zB,IAAQ7zB,EAAG,CAC5B,IAAI63C,GAAY,EAAGC,EAAe,EAClC,IAAI,IAAIC,EAAI,EAAGA,EAAIh4C,IAAUg4C,EAAG,CAC9B,IAAIC,EAAYv0B,EAASs0B,GAAK,EAC3BC,GAAa,IAAOA,EAAYF,IACjCA,EAAeE,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGFp0B,EAASo0B,IAAaC,QAEnB,GAAGnlB,EAAM,IAAK,CACnB,MAAMkB,EAAO,IAAMlB,EACb5yB,EAAS0jB,EAAS1jB,OACxB,IAAI,IAAIC,EAAI,EAAGA,EAAI6zB,IAAQ7zB,EAAG,CAC5B,IAAI63C,GAAY,EAAGI,EAAe,EAClC,IAAI,IAAIF,EAAI,EAAGA,EAAIh4C,IAAUg4C,EAAG,CAC9B,IAAIC,EAAYv0B,EAASs0B,GAAK,EAC3BC,EAAY,IAAOA,EAAYC,IAChCA,EAAeD,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGFp0B,EAASo0B,IAAa,EAAII,KAqBhCjtC,EAAA,EAAUtL,iBAAiB,cAAe,EAAEu2C,OAAMrV,cAC3Br2B,MAAMC,KAAKzL,SAAS+S,iBAAiB,yBAAyBmkC,EAAK9kC,SAC3ExI,QAAQuvC,IAEnBA,EAAYC,WAAalC,EAAKt5B,OAAOy7B,OACrCF,EAAYG,eAAezX,EAASqV,EAAKqC,mBAI7CttC,EAAA,EAAUtL,iBAAiB,eAAgB,KACtC64C,IACDC,GAAaD,GAAcE,GAAoBC,MAInDnyB,EAAA,EAAW7mB,iBAAiB,SAAU,KACpC,GAAYi5C,eACZ,GAAYC,gBAGdryB,EAAA,EAAW7mB,iBAAiB,eAAgB,KAC1C,GAAYi5C,iBAGd,MAAMH,GAAe,CAACr/B,EAAsB0/B,EAAoB5pC,KAC9DkK,EAAQ7a,UAAUoE,OAAO,UAEzBwM,aAAaD,GACbf,WAAW,KACT2qC,IACA1/B,EAAQzW,SAEL61C,KAAiBp/B,GAAWs/B,KAAuBI,GAAUH,KAAwBzpC,IACtFspC,GAAeE,GAAqB,KACpCC,GAAsB,IAEvB,MAGL,IAAIH,GAA2BE,GAAgCC,GA+BhD,MAAM,WAAoB9uB,YAmCvC,cACE7rB,QApBK,KAAAo6C,UAAW,EACV,KAAAW,QAAS,EACT,KAAAC,aAAc,EACd,KAAAC,UAAW,EACX,KAAAC,YAAa,EACb,KAAAX,cAA0B,GAS1B,KAAAY,eAA2B,GAG3B,KAAAC,UAAW,EAOZ,sBACL,MAAMv3C,EAAQy9B,GAAA,EAAWz9B,OAAS,IAAMy9B,GAAA,EAAWz9B,MAAQ,IAAM2kB,EAAA,EAAWqvB,OAAOK,KAAKr0C,MACxFxD,KAAKg7C,WAAax3C,EApLH,EAoLwBxD,KAAKi7C,YAAc,KAGrD,qBACL,IAAIj7C,KAAKg7C,WAAY,OACA7uC,MAAMC,KAAKzL,SAAS+S,iBAAiB,0BAC7CnJ,QAAQuvC,IACnBA,EAAYoB,SAAS3wC,QAAQ,CAACwd,EAAK/f,KAEjC8xC,EAAYqB,gBAAgBnzC,EAAK,OAKhC,SAIDwxC,KACFA,GAAmB74C,SAASg2C,eAAe,aAAuCyE,iBAElF,GAAYb,gBAGd,MAAMc,EAASr7C,KAAK+H,QAAQ0Q,MAAMo/B,KAAK9kC,IACjC,KAAC8kC,EAAI,QAAErV,GAAW,KAAgBsV,QAAQuD,GAUhD,IAAIC,EANDt7C,KAAK+H,QAAQwW,OAAOC,cACrBxe,KAAKE,UAAUW,IAAI,iBAMlBg3C,EAAKt5B,SACNve,KAAK46C,WAAa/C,EAAKt5B,OAAOg9B,cAC9Bv7C,KAAK06C,SAAW7C,EAAKt5B,OAAOw5B,KAC5B/3C,KAAK+5C,WAAalC,EAAKt5B,OAAOy7B,OAC9Bh6C,KAAK66C,aAAehD,EAAKt5B,OAAOi9B,gBAE7Bx7C,KAAK+5C,UACNuB,EAAU,wBACVt7C,KAAKE,UAAUW,IAAI,cAEnBy6C,EADQt7C,KAAK06C,OACH16C,KAAK46C,SAAW,sBAAwB,+BAExC56C,KAAK46C,SAAW,wBAA0B,4BAIxD56C,KAAKE,UAAUC,OAAO,cAAeH,KAAK66C,YAE1C,MAAMY,EAAiBz7C,KAAK66C,WAAa,yDAA2D,GAC9F/B,EAAQjB,EAAKS,QAAQ7rC,IAAI,CAAC4rC,EAAQrwC,IAC/B,kDACkCA,4PAMjCyzC,8cAUPrwB,KAAK,IAwBR,GAtBAprB,KAAKwO,UAAY,+KAMbsqC,EAEJ,OAAAhsB,EAAA,GAAa9sB,KAAKisB,kBAAmB,IAAkBM,cAAcsrB,EAAKG,WAE1E7rC,MAAMC,KAAKpM,KAAK0T,iBAAiB,sBAAsBnJ,QAAQ,CAACzI,EAAIkG,KAClE,OAAA8kB,EAAA,GAAahrB,EAAI,IAAkByqB,cAAcsrB,EAAKS,QAAQtwC,GAAKswB,SAGrEt4B,KAAK07C,QAAU17C,KAAKisB,kBAAkBqQ,mBACtCt8B,KAAK27C,QAAU37C,KAAK07C,QAAQzvB,kBAC5BjsB,KAAK47C,WAAa57C,KAAK07C,QAAQzC,iBAE5BqC,GACDt7C,KAAK27C,QAAQt6C,OAAO,YAAKi6C,IAGxBt7C,KAAK06C,SACN16C,KAAKE,UAAUW,IAAI,WAEhBg3C,EAAKgE,cAAgBhE,EAAKiE,YAAY,CACvC,MAAMC,EAAcp7C,SAASC,cAAc,OAC3Cm7C,EAAY77C,UAAUW,IAAI,aAC1Bb,KAAK07C,QAAQr6C,OAAO06C,GAEpB,MAAMh0B,EAAMpnB,SAAS4nB,gBAAgB,6BAA8B,OAEnER,EAAI7nB,UAAUW,IAAI,mBAElBb,KAAKg8C,UAAYj0B,EAEjB,MAAMk0B,EAAc,EACdC,EAAS,EACTC,EAAgB,EAAIt3C,KAAKu3C,GAAKF,EAE9B3xB,EAAS5pB,SAAS4nB,gBAAgB,6BAA8B,UACtEgC,EAAOrqB,UAAUW,IAAI,0BACrB0pB,EAAO/B,eAAe,KAAM,KAAM,MAClC+B,EAAO/B,eAAe,KAAM,KAAM,MAClC+B,EAAO/B,eAAe,KAAM,IAAK,GAAK0zB,GACtC3xB,EAAO/B,eAAe,KAAM,eAAgB,GAAKyzB,GAEjDl0B,EAAI1mB,OAAOkpB,GACXvqB,KAAK07C,QAAQr6C,OAAO0mB,GAEpB,MAAMs0B,EAA6B,IAApBxE,EAAKgE,aACdS,EAAqE,KAAxDzE,EAAKiE,WAAa,KAAkBS,kBAavDv8C,KAAKw8C,aAAet6C,OAAO6wC,YAAY,KACrC,MAAM0J,EAAOC,KAAKC,MACZt3B,GAAYi3B,EAAYG,GAAQJ,EAChCO,GAAYN,EAAYG,GAAQ,IAAO,EAAI,EACjDV,EAAYvtC,UAAY8T,GAASs6B,GAE7BA,GAAY,IACdb,EAAY52C,MAAM03C,MAAQ,UAC1BtyB,EAAOplB,MAAM23C,OAAS,WAKxBvyB,EAAOplB,MAAM43C,iBAAmBZ,EAAgB92B,EAAW82B,EAC3D5xB,EAAOplB,MAAM63C,gBAAkB,GAAGb,KAAiBA,IAEhDM,GAAQH,IACTW,cAAcj9C,KAAKw8C,cACnBT,EAAYvtC,UAAY,GAExB+b,EAAOplB,MAAM43C,iBAAmBZ,EAChCn8C,KAAKw8C,aAAe,EAEpB1sC,WAAW,KAET,KAAgBotC,WAAWl9C,KAAK+H,UAC/B,OAEJ,KAIP/H,KAAKm9C,WAAahxC,MAAMC,KAAKpM,KAAK0T,iBAAiB,iBACnD1T,KAAKk7C,SAAW/uC,MAAMC,KAAKpM,KAAK0T,iBAAiB,eACjD1T,KAAKo9C,WAAajxC,MAAMC,KAAKpM,KAAK0T,iBAAiB,0BAEnD,MAAM2pC,EAAY18C,SAASC,cAAc,OACzCy8C,EAAUn9C,UAAUW,IAAI,eAExBb,KAAKs9C,YAAc38C,SAASC,cAAc,OAC1CZ,KAAKs9C,YAAYtvC,UAAY,4CAC7BhO,KAAKs9C,YAAYj8C,OAAO,YAAK,0BAE7BrB,KAAKu9C,eAAiB58C,SAASC,cAAc,OAC7CZ,KAAKu9C,eAAevvC,UAAY,mBAEhCqvC,EAAUh8C,OAAOrB,KAAKs9C,YAAat9C,KAAKu9C,gBACxCv9C,KAAKqB,OAAOg8C,GAEZr9C,KAAKs9C,YAAYh8C,iBAAiB,QAAUvB,IAC1C,OAAAiqB,EAAA,GAAYjqB,GAER,GAAgBy9C,YAAY,KAC9B,IAAI,GAAkB,IAAiB9oC,KAAK1U,KAAK+H,WAGrD,OAAAmwB,GAAA,GAAOl4B,KAAKs9C,aAETt9C,KAAK66C,aACN76C,KAAKy9C,YAAc98C,SAASC,cAAc,OAC1CZ,KAAKy9C,YAAYv9C,UAAUW,IAAI,qBAAsB,kBACrDb,KAAKy9C,YAAYp8C,OAAO,YAAK,yBAC7B,OAAA62B,GAAA,GAAOl4B,KAAKy9C,aAER5F,EAAKqC,cAAcv4C,QACrB3B,KAAKu9C,eAAer9C,UAAUW,IAAI,QAGpC,YAAiBb,KAAKy9C,YAAc19C,IAClC,OAAAiqB,EAAA,GAAYjqB,GAKTC,KAAK86C,eAAen5C,QACrB3B,KAAK09C,UAAU19C,KAAK86C,gBAAgBn3C,KAAK,KACvC3D,KAAK86C,eAAen5C,OAAS,EAC7B3B,KAAKm9C,WAAW5yC,QAAQzI,IACtBA,EAAG5B,UAAUoE,OAAO,oBAM5B+4C,EAAUh8C,OAAOrB,KAAKy9C,cAOxB,MAAME,IAAY9F,EAAKqC,cAAcv4C,QAAU3B,KAAK+5C,UAChD4D,IAAW39C,KAAK46C,UAClB56C,KAAKi6C,eAAezX,EAASqV,EAAKqC,eAAe,GAGhDyD,IACD39C,KAAK49C,eAAepb,GACpB,YAAiBxiC,KAAMA,KAAK69C,eAIhC,aAAarb,GACX,GAAGA,EAAQsb,UAAYtb,EAAQub,kBAAmB,CAChD,MAAMC,EAAar9C,SAASC,cAAc,OAgB1C,GAfAo9C,EAAW99C,UAAUW,IAAI,YAAa,aACtCb,KAAK07C,QAAQr6C,OAAO28C,GAGpB,YAAiBA,EAAaj+C,IAC5B,OAAAiqB,EAAA,GAAYjqB,GAGZi+C,EAAW99C,UAAUW,IAAI,UApUb,EAACi9C,EAAkBC,EAA0BtD,KAC5DN,IACDC,GAAaD,GAAcE,GAAoBC,IAGjD,MAAMv/B,EAAUpa,SAASC,cAAc,OACvCma,EAAQ7a,UAAUW,IAAI,aAEtB,MAAMO,EAAYT,SAASC,cAAc,OACzCQ,EAAUlB,UAAUW,IAAI,YAAa,SAErC,MAAMo9C,EAASt9C,SAASC,cAAc,OACtCq9C,EAAO/9C,UAAUW,IAAI,QAErBO,EAAUC,OAAO48C,GACjBljC,EAAQ1Z,OAAOD,GAEf,OAAA0rB,EAAA,GAAamxB,EAAQ,IAAkBpK,aAAaiK,EAAU,CAACI,SAAUH,KACzE,GAAantB,KAAKC,QAAQstB,iBAAiB98C,OAAO0Z,GAE7CA,EAAQy1B,WACbz1B,EAAQ7a,UAAUW,IAAI,UAEtBs5C,GAAep/B,EACfs/B,GAAqBI,EACrBH,GAAsBp4C,OAAO4N,WAAW,KACtCsqC,GAAar/B,EAAS0/B,EAAQH,KAC7B,KAAqB,IAAO,MA0SzB8D,CAAY5b,EAAQsb,SAAUtb,EAAQub,kBAAmB,KAEvDC,EAAW99C,UAAUoE,OAAO,cAI7BtE,KAAK+6C,SAAU,CAChB,MAAMsD,EAAgB7b,EAAQA,QAAQnuB,KAAK0R,GAAKA,EAAExH,OAAO+/B,SACtDD,IAAkBA,EAAc9/B,OAAOggC,QACxCP,EAAW7d,UAMnB,aAAapgC,GACX,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,eACzC,IAAIA,EACF,OAGF,OAAAsP,EAAA,GAAYjqB,GACZ,MAAMy+C,GAAe9jC,EAAOxT,QAAQge,MACpC,GAAGllB,KAAK66C,WAAY,CAClBngC,EAAOxa,UAAUC,OAAO,cAExB,MAAMs+C,EAAaz+C,KAAK86C,eAAe31B,QAAQq5B,IAC5B,IAAhBC,EACDz+C,KAAK86C,eAAe1yC,OAAOq2C,EAAY,GAEvCz+C,KAAK86C,eAAevxC,KAAKi1C,QAG3Bx+C,KAAK09C,UAAU,CAACc,IAUpB,UAAUE,GACR,GAAG1+C,KAAK2+C,gBAAiB,OAAO3+C,KAAK2+C,gBAErC,MAAMnyC,EAAUxM,KAAKm9C,WAAWvxC,OAAO,CAACR,EAAGpD,IAAQ02C,EAAQzf,SAASj3B,IAOpE,OANAwE,EAAQjC,QAAQmQ,IACdA,EAAOxa,UAAUW,IAAI,eAGvBb,KAAKE,UAAUW,IAAI,iBACnBb,KAAK+6C,UAAW,EACT/6C,KAAK2+C,gBAAkB,KAAgBC,SAAS5+C,KAAK+H,QAAS22C,GAAS/6C,KAAK,KACjF6I,EAAQjC,QAAQmQ,IACdA,EAAOxa,UAAUoE,OAAO,eAG1BtE,KAAKE,UAAUoE,OAAO,mBACrBoM,MAAM,KACP1Q,KAAK+6C,UAAW,IACfpT,QAAQ,KACT3nC,KAAK2+C,gBAAkB,OAI3B,eAAenc,EAAsB0X,EAAyBlnC,GAAU,G,QAKtE,GAJIpG,EAAA,EAAU+2B,SAASC,oBACrB5wB,GAAU,GAGThT,KAAK06C,UAA0B,QAAf,EAAAlY,EAAQA,eAAO,eAAE7gC,SAAU3B,KAAK+5C,UAAW,CAC5D/5C,KAAKm9C,WAAW5yC,QAAQ,CAACzI,EAAIkG,KAC3BlG,EAAG5B,UAAUC,OAAO,eAAgBqiC,EAAQA,QAAQx6B,GAAKuW,OAAO+/B,WAG/Dt+C,KAAK6+C,eACN7+C,KAAK6+C,aAAarc,GAClBxiC,KAAK6+C,aAAe,MAGnB7+C,KAAKw8C,eACNS,cAAcj9C,KAAKw8C,cACnBx8C,KAAKw8C,aAAe,IAGL,QAAd,EAAAx8C,KAAKg8C,iBAAS,eAAEj7C,gBACjBf,KAAKg8C,UAAU13C,SAGjB,MAAMw6C,EAAS9+C,KAAK07C,QAAQjoC,cAAc,cACvCqrC,GACDA,EAAOx6C,SAsBX,GAlBGtE,KAAK+5C,WACN/5C,KAAKE,UAAUW,IAAI,aACnB,OAAA4P,EAAA,GAAezQ,KAAK27C,QAAS,YAAK,4BAIjC37C,KAAKk6C,cAAcv4C,SAAWu4C,EAAcv4C,QAAU3B,KAAK+5C,YAC5D/5C,KAAK26C,YAAc36C,KAAKk6C,cAAcv4C,SAAWu4C,EAAcv4C,OAC/D3B,KAAKk6C,cAAgBA,EAAcv0C,QAEhC3F,KAAK26C,YACN,YAAiB36C,KAAMA,KAAK69C,cAE5B,YAAiB79C,KAAMA,KAAK69C,eAK7B79C,KAAKk6C,cAAcv4C,QAAU3B,KAAK26C,aAAe36C,KAAK+5C,SAAU,CACjE,MAAM10B,EAAWmd,EAAQA,QAAQ/1B,IAAIq4B,GAAKtC,EAAQ0V,aAAepT,EAAEmT,OAASzV,EAAQ0V,aAAe,IAAM,GAEzGl4C,KAAKE,UAAUC,OAAO,iBAAkB6S,GACrCA,GACD,aAAchT,KAAM,IAAKA,KAAK26C,YAAa,KAG7C,aAAQ,KACN36C,KAAK++C,WAAW/+C,KAAK26C,YAAc36C,KAAKqlB,SAAWA,EAAUrlB,KAAKk6C,cAAelnC,GACjFhT,KAAKqlB,SAAWA,EAChBrlB,KAAK26C,aAAc,IAMvB,GAFA36C,KAAK49C,eAAepb,GAEjBxiC,KAAK46C,SAAU,CACZ56C,KAAK66C,aACP76C,KAAKs9C,YAAYp9C,UAAUC,OAAO,QAASqiC,EAAQ0V,eAAiBl4C,KAAKk6C,cAAcv4C,QACvF3B,KAAKu9C,eAAer9C,UAAUC,OAAO,SAAUH,KAAKk6C,cAAcv4C,SAGpE,MAAM0U,GAAWmsB,EAAQwc,eAAiB,IAAIvyC,IAAIsK,GAAUA,EAAOwU,YAC7D0zB,EAAiB,IAAI,GAAe,CAAC7uC,WAAY,KACvD6uC,EAAeC,OAAO7oC,GACtB,OAAA5F,EAAA,GAAezQ,KAAK47C,WAAYqD,EAAe79C,WAGjD,GAAGpB,KAAK66C,WAAY,CAClB,MAAMsE,IAAYn/C,KAAKk6C,cAAcv4C,OAE/By9C,EAAkBp/C,KAAK+5C,UAAYoF,EACnCE,GAAsBr/C,KAAK46C,WAAapY,EAAQ0V,eAAkBiH,IAAYn/C,KAAK+5C,SACzF/5C,KAAKy9C,YAAYv9C,UAAUC,OAAO,OAAQi/C,GAC1Cp/C,KAAKs9C,YAAYp9C,UAAUC,OAAO,OAAQk/C,GAC1Cr/C,KAAKu9C,eAAer9C,UAAUC,OAAO,QAASi/C,IAAoBC,IAItE,WAAWh6B,EAAoB60B,EAAyBlnC,GACtDhT,KAAKk7C,SAAS3wC,QAAQwd,GAAOA,EAAI5iB,MAAMC,QAAU,IAEjDpF,KAAKm9C,WAAW5yC,QAAQ,CAACzI,EAAIkG,KAC3BlG,EAAG5B,UAAUC,OAAO,YAAa+5C,EAAcjb,SAASj3B,MAG1D,MAAM4gB,EAAW/jB,KAAKJ,OAAO4gB,GAK7B,GAHArlB,KAAKs/C,YAAcj6B,EAAS5Y,IAAIsvB,GAAKA,EAAInT,GAGtC5oB,KAAK26C,YACN36C,KAAKk7C,SAAS3wC,QAAQ,CAACwd,EAAK/f,KAC1BhI,KAAKm7C,gBAAgBnzC,GAAM,SAExB,CACL,MAAM2Y,EAAK,KACT3gB,KAAKk7C,SAAS3wC,QAAQ,CAACwd,EAAK/f,KAE1BhI,KAAKm7C,gBAAgBnzC,EAAK,MAI9BgL,EAAU,aAAQ2N,GAAMA,IAK1B,IAAI4+B,EAFJl6B,EAAWA,EAAS1f,QACpBwyC,GAAc9yB,GAEd,MAAMm6B,EAAW59C,IACfyjB,EAAS9a,QAAQ,CAAC8a,EAAUrd,KAC1B,MAAMrD,EAAQ46C,EAAgBl6B,EAAUzjB,GACxC5B,KAAKo9C,WAAWp1C,GAAK4lB,UAAYjpB,EAAQ,OAI7C,GAAG3E,KAAK26C,YAGN,GAFA4E,EAAkB,CAACl6B,EAAUH,IAAUrgB,KAAKE,MAAMsgB,EAhnB1C,GAgnB6DH,GAElElS,EACD,IAAI,IAAIpR,EAAI,EAAa+3C,EAAI,EAAG/3C,GAAK,IAAKA,IAAK+3C,EAC7C7pC,WAAW,KACT0vC,EAAQ59C,IAnnBJ69C,GAonBO9F,QAGf6F,EAAQ,QAKV,GAFAD,EAAkB,CAACl6B,EAAUH,IAAUrgB,KAAKE,MAAMsgB,EA5nB1C,IA4nB8DH,EAAQ,IAE3ElS,EACD,IAAI,IAAIpR,EAAI,EAAGA,EA/nBT,KA+nBsBA,EAC1BkO,WAAW,KACT0vC,EAAQ59C,IA/nBJ69C,GAgoBO79C,QAGf49C,EAAQ,GAIZ,GAAGx/C,KAAK26C,YAAa,CAChB3nC,GACDhT,KAAKE,UAAUW,IAAI,iBAGrBb,KAAKE,UAAUoE,OAAO,YACtB,MAAMqc,EAAK,KACT3gB,KAAKk7C,SAAS3wC,QAAQwd,GAAOA,EAAI5iB,MAAMC,QAAU,SAGhD4N,EACDlD,WAAW,KACT9P,KAAKE,UAAUoE,OAAO,iBACtBqc,KArpBO,KAwpBTA,SAGF3gB,KAAKE,UAAUW,IAAI,YAIvB,eAAe2hC,GACb,MAAMkd,EAAcld,EAAQ0V,cAAgB,EAC5C,IAAI9wC,EAAkB2K,EAAO,CAAC2tC,GAEZt4C,EADfpH,KAAK+5C,SACH/5C,KAAK06C,OAAcgF,EAAc,uBAAyB,kCAClDA,EAAc,wBAA0B,kCAEhD1/C,KAAK06C,OAAcgF,EAAc,uBAAyB,4BAClDA,EAAc,wBAA0B,4BAGrD,OAAAjvC,EAAA,GAAezQ,KAAKu9C,eAAgB,YAAKn2C,EAAK2K,IAGhD,gBAAgBmT,EAAey6B,GAC7B,MAAM53B,EAAM/nB,KAAKk7C,SAASh2B,IAEP,IAAhBy6B,GACD53B,EAAI5iB,MAAM63C,gBAAkB,GAC5Bj1B,EAAI5iB,MAAM43C,iBAAmB,KAG7Bh1B,EAAI5iB,MAAM63C,gBAAmB2C,EAAa3/C,KAAKs/C,YAAYp6B,GAAS,GAAY81B,WAAc,UAE9FjzB,EAAI5iB,MAAM43C,iBAAmB,GAAK4C,EAAa,GAAY1E,aA9iBjD,GAAAA,YAAc,KACd,GAAAD,WAAa,EAojB7BrrB,eAAeC,OAAO,eAAgB,I,mGC9tBvB,SAASgwB,GAAYlgD,EAEhC,IACF,MAAMuZ,EAAQtY,SAASC,cAAc,SAGrC,OAFIlB,EAAQib,MAAK1B,EAAM4mC,yBAA0B,GACjD5mC,EAAM1Y,aAAa,cAAe,QAC3B0Y,E,2SC2DT,IAAI6mC,GAA0B,EAuBvB,SAASC,IAAU,IAAClmC,EAAG,UAAEzY,EAAS,QAAE2G,EAAO,SAAEmmB,EAAQ,UAAEC,EAAS,SAAE6xB,EAAQ,MAAEC,EAAK,WAAEzvB,EAAU,cAAElC,EAAa,OAAE4xB,EAAM,MAAEjvB,EAAK,YAAEkvB,EAAW,iBAAE9xB,EAAgB,aAAED,EAAY,aAAEgyB,EAAY,KAAEl9C,EAAI,cAAE4H,EAAa,aAAE8jB,I,QAoBlN,MAAMyxB,EAAmBzxB,aAAY,EAAZA,EAAc3V,MACvC,IAAIqnC,EAAsC,IAArBD,EACrB,MAAME,IAAgBryB,GAAYC,GAC5BqyB,GAEW,UAAb3mC,EAAIxZ,MACFwZ,EAAI3W,MAnDoB,WAoDvBq9C,KAEc,QAAb1mC,EAAIxZ,KAAiBuM,EAAA,EAAU+2B,SAAS8c,SAASC,KAAO9zC,EAAA,EAAU+2B,SAAS8c,SAASE,QAE5F,IAAIC,EAAuBC,EAE3B,IAAIX,EAAQ,CACVU,EAAWjgD,SAASC,cAAc,QAClCggD,EAAS1gD,UAAUW,IAAI,cACvBO,EAAUC,OAAOu/C,GAEjB,IAAIE,GAAiB,EACL,QAAbjnC,EAAIxZ,MACLugD,EAAShzB,UAAYtL,GAASzI,EAAIJ,UAAU,GAExC2mC,GAA6B,UAAbvmC,EAAIxZ,OACnBmgD,IAAgBF,EACjBM,EAAS1gD,UAAUW,IAAI,QAAS,gBAEhCigD,GAAiB,KAIrBF,EAAShzB,UAAY,MAEjB4yB,GAAgBJ,IAClBU,GAAiB,EACjBR,OAAiBj4C,IAIlBy4C,IACDD,EAAWlgD,SAASC,cAAc,QAClCigD,EAAS3gD,UAAUW,IAAI,aAAc,kBAAmB,aAAc,mBACtEO,EAAUC,OAAOw/C,IAIrB,IAgCIz2B,EAhCAra,EAGA,GAEJ,GAAqB,cAAlB8J,EAAIknC,UAA2B,CAChC,MAAMC,EAAW/yB,GAAU,CACzB9lB,MAAO0R,EACP9R,UACA3G,YACA8sB,WACAC,YACA6xB,WACAC,QACA3xB,gBACAkC,aACAnC,mBACAD,eACAiyB,mBACAn9C,SAKF,OAFA6M,EAAIye,MAAQwyB,EACZjxC,EAAI3M,YAAc49C,EAAS5yB,aAAaK,KACjC1e,EAUT,MAAMkJ,EAAQ2mC,KAGd,GAFA3mC,EAAM/Y,UAAUW,IAAI,eACpBoY,EAAM8E,OAAQ,EACE,UAAblE,EAAIxZ,KAAkB,CACvB,MAAM4gD,EAAWtgD,SAASC,cAAc,OACxCqgD,EAAS/gD,UAAUW,IAAI,cAAe,aACtCogD,EAAS/5C,QAAQ2D,IAAM,GAAK9C,EAAQ8C,IACpCo2C,EAAS/5C,QAAQ+D,OAAS,GAAKlD,EAAQkD,OACtCg2C,EAAiBl5C,QAAUA,EAE5B,MAAM7E,EAAOilB,EAAA,EAAWqvB,OAAOzyC,MACzBm8C,EAAWh+C,EAAKM,MAAQ,EACxBy4C,EAAc,IACdC,EAASgF,EAA0B,EAAdjF,EAC3BgF,EAASzyC,UAAY,qCAAqCtL,EAAKM,kBAAkBN,EAAKM,6IACMy4C,UAAoBiF,UAAiBA,SAAgBhF,sCAGjJ,MAAM3xB,EAAS02B,EAASh1B,kBAAkBA,kBACtC6zB,KACFA,GAA0B,EAAIj7C,KAAKu3C,GAAKF,GAE1C3xB,EAAOplB,MAAM63C,gBAAkB8C,GAA0B,IAAMA,GAC/Dv1B,EAAOplB,MAAM43C,iBAAmB,GAAK+C,GAErCc,EAAS1gD,UAAUW,IAAI,SAENkH,EAAQwW,OAAOG,cAE9BuiC,EAAS/gD,UAAUW,IAAI,aAGzB,MAAMqE,EAASvE,SAASC,cAAc,UACtCsE,EAAO1B,MAAQ0B,EAAOzB,OAASoW,EAAIkF,EAEnCkiC,EAASjgD,QAAQkE,EAAQ07C,GACzBK,EAAS5/C,OAAO4X,GAChB7X,EAAUC,OAAO4/C,GAEjB,MAAME,EAAMj8C,EAAOyP,WAAW,MAKxB4Y,EAAS,KACb,MAAMxlB,EAA4Bk5C,EAAiBl5C,QAC7Cq5C,EAAc,GAA2BpgC,SAASjZ,GAAUu4C,GAC5D3xC,EAAQ,MACX,GAAaiiB,KAAKywB,gBAAkBh8C,QAAQ6E,WAAWy9B,QAAQ,KAC3D,OAAA2Z,GAAA,GAAQF,KAIXA,EAAYvzC,oBAAoB,OAAQ4M,GACxC2mC,EAAYvzC,oBAAoB,aAAc4b,GAC9C23B,EAAYvzC,oBAAoB,QAAS0zC,GACzCH,EAAYvzC,oBAAoB,QAAS4N,OAIvC+lC,EAAU,KACdL,EAAIM,UAAUL,EAAa,EAAG,GAE9B,MAAM9sB,EAASwrB,GAA0BsB,EAAY9nC,YAAc8nC,EAAY3nC,SAAWqmC,GAG1F,OAFAv1B,EAAOplB,MAAM43C,iBAAmB,GAAKzoB,GAE7B8sB,EAAYxlC,QAGhBuK,EAAe,KACfi7B,EAAY3nC,WAIZ,OAAA6nC,GAAA,GAAQF,IAKTA,EAAYxlC,QACb4lC,IAGFZ,EAAShzB,UAAYtL,GAAS8+B,EAAY3nC,SAAW2nC,EAAY9nC,aAAa,IAR5E3K,MAWE8a,EAAsBjI,GAAgB2E,GAEtC1L,EAAS,KACbxB,EAAM/Y,UAAUW,IAAI,QACpBogD,EAAS/gD,UAAUoE,OAAO,aAC1B,aAAck9C,EAASt8C,GAEpBklB,GAAaA,EAAUA,WAAaA,EAAUA,UAAUlqB,UAAUuV,SAAS,WAC5E2U,EAAUs3B,WAIRH,EAAW,KACX,OAAAD,GAAA,GAAQF,GAKZH,EAAS/gD,UAAUW,IAAI,aAJrB8N,KAOE8M,EAAU,KACdxC,EAAM/Y,UAAUoE,OAAO,QACvB28C,EAAS/gD,UAAUW,IAAI,aAEvBoY,EAAMK,YAAc,EACpBsnC,EAAShzB,UAAYtL,GAAS8+B,EAAY3nC,UAAU,GAEjD2nC,EAAY9nC,cACb8nC,EAAY9nC,YAAc,IAI9B8nC,EAAY9/C,iBAAiB,OAAQmZ,GACrC2mC,EAAY9/C,iBAAiB,aAAcmoB,GAC3C23B,EAAY9/C,iBAAiB,QAASigD,GACtCH,EAAY9/C,iBAAiB,QAASma,GAEtC,YAAiBvW,EAASnF,IAaxB,GAZA,OAAAiqB,EAAA,GAAYjqB,GAGTqqB,IAAcA,EAAUu3B,UACzBv3B,EAAUs3B,UAQTN,EAAYxlC,OAAQ,CACrB,MAAMkS,IAAqBhjB,EAC3B,GAAG,GAA2BwC,iBAAiBxC,GAAiB,CAC9DG,OAAQ,KACRE,YAAa,CAACC,EAAG,4BACjBiC,WAAW,IACT,CACF,MAAO0T,EAAMvY,GAASslB,EAAwBnD,GAAiBs2B,EAAUl5C,EAAQ8C,KAAxC,GACzC,GAA2ByQ,WAAW,CAACrQ,OAAQlD,EAAQkD,OAAQJ,IAAK9C,EAAQ8C,KAAMkW,EAAMvY,GAG1F44C,EAAYh9C,YAEZg9C,EAAYn9C,UAIbm9C,EAAYxlC,OACVwlC,EAAY3nC,UAAY2nC,EAAY9nC,cAAgB8nC,EAAY3nC,UAAY2nC,EAAY9nC,YAAc,GACvGkoC,IACAr7B,IACAlN,EAAM/Y,UAAUW,IAAI,SAEpB0gD,IAGF9mC,KAID1S,EAAQwW,OAAOuN,aACfm1B,EAAiB1zB,OAASA,EAC3B0zB,EAAS/5C,QAAQ2kB,WAAa,KAE9B0B,SAGFtU,EAAM1V,UAAW,EAGnB,IAAIy9C,EACJ,GAAGj5C,EAAS,CAmBV,GAlBAi5C,EAAW/yB,GAAU,CACnB9lB,MAAO0R,EACP9R,UACA3G,YACA8sB,WACAC,YACA6xB,WACAC,QACA3xB,gBACAkC,aACAnC,kBAAkB,EAClBD,eACAiyB,iBAAkBzxB,aAAY,EAAZA,EAAczmB,MAChCjF,SAGF6M,EAAIye,MAAQwyB,GAEPR,GAA4B,QAAb3mC,EAAIxZ,MAAmB8/C,EAEzC,OADApwC,EAAI3M,YAAc49C,EAAS5yB,aAAaK,KACjC1e,EAGT,GAAGiwC,EAAU,CACX,MAAM4B,GAAiBZ,EAASzyB,OAAOC,OAASwyB,EAASzyB,OAAOE,MAAM1tB,cACtEkY,EAAMzV,OAASo+C,EAAcC,eAAe,KAAM,SAClD5oC,EAAMxV,QAAUm+C,EAAcC,eAAe,KAAM,UACnDD,EAAcvgD,OAAO4X,QAElB,CACL,MAAM6oC,EAAW,IAAeC,SAASloC,GAAK,GAC3CioC,GACDA,EAAS13C,QAAQzG,KAAK,KACpBsV,EAAM+oC,OAASF,EAAS5nC,aAAaI,OAKvCrB,EAAMlY,eAAiBK,KACxB4/C,aAAQ,EAARA,EAAUiB,WAAY7gD,GAAWC,OAAO4X,GAG3C,MAAMiB,EAAeC,GAAA,EAAmBC,gBAAgBP,GAElDqoC,KAAoC,QAAvB,EAACn6C,aAAO,EAAPA,EAAS0Q,aAAa,eAAE2R,WACzC83B,GACD93B,EAAariB,EAAQ0Q,MAAc2R,UACnCA,EAAUuE,OAAOvtB,GAAW,GAC5Bk/C,OAAiBj4C,GACR6R,EAAaioC,YAAetoC,EAAIG,mBAAsBqU,EAIvDxU,EAAIG,oBACZoQ,EAAY,IAAI,KAAqB,CACnCC,YAAY,EACZ+3B,aAAc,aANhBh4B,EAAY,IAAI,KAAqB,CACnCg4B,aAAc,YASlB,MAAMC,EAAiB,eA2BvB,GA1BAppC,EAAM3X,iBAAiB,QAAUvB,IACP,IAArBkZ,EAAMzI,MAAMvJ,MACbsJ,QAAQC,MAAM,SAAWyI,EAAMzI,MAAMvJ,KAAO,cAAgBgS,EAAMzI,MAAMzI,SAGvEqiB,IAAc83B,GACf93B,EAAUk4B,SAGRD,EAAeE,aACjBF,EAAen4C,WAEhB,CAAC2U,MAAM,IAEV,aAAY5F,GAAOtV,KAAK,KACnBstB,GACDuxB,EAAA,EAAqBC,aAAaxpC,EAAOgY,GAGxC7G,IAAc83B,GACf93B,EAAUk4B,SAGZD,EAAen4C,YAGD,UAAb2P,EAAIxZ,KAAkB,CACvB,MAQMopB,EAAsBjI,GARP,KACfvI,EAAMypC,aAIV9B,EAAShzB,UAAYtL,GAASrJ,EAAMQ,SAAWR,EAAMK,aAAa,MAKpEL,EAAM3X,iBAAiB,aAAcmoB,GAElCo3B,GACD5nC,EAAM3X,iBAAiB,aAAc,KACnCqhD,GAAA,EAAcC,cAAc/B,EAAU,KACpCA,EAASv8C,YAEV,CAACua,MAAM,IAId5F,EAAM8E,OAAQ,EACd9E,EAAM3V,MAAO,EAEb2V,EAAM1V,UAAW,EAEjB,IAAIs/C,EAAqBvC,IAAqC,QAAnB,EAAAU,aAAQ,EAARA,EAAU52B,iBAAS,eAAE04B,UAChE,MAAMr5C,EAAO,KACR2gB,GAAak2B,IAAmBjyB,IACjCjE,EAAUE,YACVF,EAAU24B,aAGZ,IAAI3/C,EAA4BiC,QAAQ6E,UACxC,GAAIkgB,IAAc83B,GAAa7zB,EAC7B,GAAInU,EAAaioC,YAAetoC,EAAIG,kBAK1BH,EAAIG,oBACTsmC,EACDl9C,EAAciC,QAAQgqB,UACbnV,EAAaioC,YAAc/3B,IACpCA,EAAUuE,OAAOvtB,GAAW,EAAO,MACnC6X,EAAM3X,iBAAiB,KAAY,aAAe,UAAW,KAC3D8oB,EAAUk4B,UACT,CAACzjC,MAAM,UAZyC,CACrD,MAAMzU,EAAUhH,EAAc,IAAe6b,YAAYpF,EAAKyU,aAAa,EAAbA,EAAe00B,QAAS1C,GACnFl2B,GACDA,EAAUuE,OAAOvtB,GAAW,EAAOgJ,GAkCzC,OApBIk2C,GAAkBuC,IACpBA,IACAA,EAAqB,MAGvBvC,OAAiBj4C,EAEjBjF,EAAYO,KAAK,MACZ6sB,GAAeA,KAKF,UAAb3W,EAAIxZ,MACL,GAA2B6b,2BAA2BnU,EAAQkD,OAAQlD,EAAQ8C,IAAK9C,EAAQwW,OAAOC,cAGpG,OAAAykC,GAAA,GAAmBhqC,EAAOiB,EAAaI,MARrC+nC,EAAen4C,WAShB,QAEI,CAACqlB,SAAUnsB,EAAa87C,OAAQmD,IAmCzC,OAhCGj4B,IAAc83B,GACf93B,EAAUoF,oBAAoB/lB,GAqBhB,QAAboQ,EAAIxZ,MAAmBmgD,EAOxBzwC,EAAI3M,YAAekrB,GAAiCA,EAAc/kB,KAAK,CAACynB,IAAK5vB,EAAWqI,KAAM,IAAMA,IAAOy1C,SAAU75C,QAAQ6E,WAA1FT,IAAOy1C,OAN1C,YAAiB99C,EAAYrB,IAC3B,OAAAiqB,EAAA,GAAYjqB,GACZ8gD,EAASv8C,SACTmF,KACC,CAACgmB,SAAS,EAAM5Q,MAAM,IAKpB9O,EAYF,SAASmzC,IAAa,QAACn7C,EAAO,SAAE0jB,EAAQ,WAAEmB,EAAU,aAAElB,EAAY,WAAEC,EAAU,cAAE7gB,EAAa,aAAEsjB,EAAY,iBAAEiyB,EAAgB,cAAE/xB,EAAa,SAAEzB,I,QAY/ID,IAAYA,EAAa,KACzBC,IAAUA,EAAW,IACzB,MAAMyzB,EAAsC,IAArBD,EAEjBxmC,EAAQ9R,EAAQ0Q,MAA4C9X,UAAcoH,EAAQ0Q,MAA2CkY,QAA4BhwB,SACzJorB,EAAYhkB,EAAQwW,OAAOuN,cAAqC,QAArB,EAAA/jB,EAAQ0Q,aAAa,eAAE2R,WACxE,GAAgB,UAAbvQ,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KAAkB,CACvE,MAAM8iD,EAAe,IAAI,GAezB,OAdAA,EAAa13B,SAAWA,EACxB03B,EAAap7C,QAAUA,EACvBo7C,EAAa7C,eAAiBA,EAC9B6C,EAAa70B,cAAgBA,EAC7B60B,EAAa/0B,aAAeA,EAEzB1C,IAAcy3B,EAAaz3B,aAAeA,GAC1C5gB,IAAeq4C,EAAar4C,cAAgBA,GAC5C6gB,IAAYw3B,EAAax3B,WAAaA,GACtCI,IAAWo3B,EAAa/4B,UAAariB,EAAQ0Q,MAAc2R,WAE9D+4B,EAAaj8C,QAAQ0lB,WAAa,GAAKA,EACvCu2B,EAAaj8C,QAAQ2lB,SAAWA,EAChCs2B,EAAajE,SACNiE,EAGT,IAAIC,EAAcvpC,EAAIuG,UAAYvG,EAAIuG,UAAUijC,MAAM,KAAO,GACzDC,EAAM,GACVA,EAAMF,EAAYzhD,OAAS,GAAKwK,MAAMo3C,QAAQH,GAC5C,aAAqBA,EAAY/5C,MAAMg6C,MAAM,IAAK,GAAG,GAAGG,eACxD,OAEF,IAAIC,EAAS9iD,SAASC,cAAc,OACpC6iD,EAAOvjD,UAAUW,IAAI,WAAY,OAAOyiD,GACxCG,EAAOv8C,QAAQ6S,MAAQ,GAAKF,EAAI9G,GAEhC,MAAM2wC,EAAS/iD,SAASC,cAAc,OACtC8iD,EAAOxjD,UAAUW,IAAI,gBAErB,MAAMqZ,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxD,IAAc,QAAV,EAAAA,EAAI0F,cAAM,eAAE5d,SAAWoG,EAAQwW,OAAOuN,aAAe5R,EAAaI,KAAoB,UAAbT,EAAIxZ,KAA2D,CAC1IojD,EAAOvjD,UAAUW,IAAI,uBAErB,IAAIktB,EAAiD,GAErD,GAAGhmB,EAAQwW,OAAOuN,aAAe,CAAC,QAAS,SAASmT,SAASplB,EAAIxZ,MAC/DqjD,EAAOl1C,UAAY,aAAa0L,EAAaI,QAC7CyT,EAAKxkB,KAAKm6C,EAAOz3B,uBACZ,CACL,MAAM+B,EAAUC,GAAU,CACxB9lB,MAAO0R,EACP9R,QAAS,KACT3G,UAAWsiD,EACXx1B,SAAU,GACVC,UAAW,GACXC,eACAC,kBAAkB,EAClBC,gBACAprB,KAAM,IAAiBiuB,gBAAgBtX,EAAK,GAAI,IAAI,KAEtD6pC,EAAOv+C,MAAM3B,MAAQkgD,EAAOv+C,MAAM1B,OAAS,GACxCuqB,EAAQO,OAAOC,OAAOT,EAAKxkB,KAAKykB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAKxkB,KAAKykB,EAAQO,OAAOE,MAGnDV,EAAKxjB,QAAQmkB,GAAOA,EAAIxuB,UAAUW,IAAI,wBAEtC6iD,EAAO91B,UAAY01B,EAIrB,IAAIK,EAAW9pC,EAAIuG,UAAY,IAAkBwjC,cAAc/pC,EAAIuG,WAAa,eAC1Dzf,SAASC,cAAc,OAC/BV,UAAUW,IAAI,wBAC5B,MAAMgjD,EAAgE,CAAC/hC,GAAYjI,EAAI3W,OAEpFuoB,GACDo4B,EAAiBt6C,KAAK,aAAmBxB,EAAQykB,OAGhDb,GACDk4B,EAAiBt6C,KAAK,IAAmBkjB,iBAAiB1kB,IAG5D07C,EAAOj1C,UAAY,OAChB0L,EAAaioC,aAAep2B,IAAehkB,EAAQ8C,IAAM,GAAK,wHAKjE,MAAMi5C,EAAUL,EAAOhwC,cAAc,kBAC/BkZ,EAAmB,IAAI,KAC7BA,EAAiBzlB,QAAQ0lB,WAAa,GAAKA,EAC3CD,EAAiBzlB,QAAQ2lB,SAAWA,EACpCF,EAAiB8D,YAAckzB,EAG/BG,EAAQziD,OAAOsrB,GAEZhB,GACDm4B,EAAQziD,OAAO,IAAmB0rB,aAAahlB,IAQjD,GALgB07C,EAAOhwC,cAAc,kBAC7BpS,UAAU,YAAiBwiD,EAAkB,QAErDJ,EAAOziD,QAAQ0iD,IAEX33B,GAAahkB,EAAQwW,OAAOuN,cAAgB/jB,EAAQ8C,IACtD,OAAO44C,EAGT,IAAIv3B,EAA0B9B,EAAkC,KAChE,MAAMmD,EAAS,KACb,GAAGrB,EAAa,CACdA,EAAYhsB,UAAUW,IAAI,cAC1B,MAAMkjD,EAAe73B,EACrBpc,WAAW,KACTi0C,EAAaz/C,UACZ,KACH4nB,EAAc,KAGb9B,IACDA,EAAY,OAIV3gB,EAAQ1J,I,MACZ,MAAMikD,GAAQjkD,GAAKA,EAAE2b,UACf7B,EAAM,IAAeC,OAAO2pC,EAAOv8C,QAAQ6S,OACjD,IAAIwV,EACJ,MAAMyzB,EAAU,GAAapyB,KAAKC,QAAU,GAAaD,KAAKC,QAAQvC,cAAc00B,aAAU36C,EAC9F,GAAI27C,EAEG,GAAgB,QAAbnqC,EAAIxZ,KAAgB,CAC5B,MAAM4jD,EAAe,IAAeC,YAAYv4C,IAAIkO,EAAI9G,KAAOmH,EAAaioC,WAC5E5yB,EAAW,IAAetQ,YAAYpF,EAAKmpC,GACxCiB,GACD10B,EAAS5rB,KAAK,KACZmM,WAAW,KACT,MAAMwK,EAAMH,GAAA,EAAmBC,gBAAgBP,GAAKS,IACpDpY,OAAOwS,KAAK4F,IACX1N,EAAA,EAAU+2B,SAASC,kBAAoB,IAAM,UAIpDrU,EADQ,EAA2B5jB,IAAIkO,EAAIknC,aAAwB,QAAV,EAAAlnC,EAAI0F,cAAM,eAAE5d,QAC1D,IAAesd,YAAYpF,EAAKmpC,GAEhC,IAAemB,YAAYtqC,EAAKmpC,QAf3CzzB,EAAW,IAAetQ,YAAYpF,EAAKmpC,GAuB7C,OALG92B,IACDqD,EAAS5rB,KAAK4pB,GACdnD,EAAUuE,OAAOzC,GAAa,EAAMqD,IAG/B,CAACA,aAoCV,OAjCG,IAAe20B,YAAYv4C,IAAIkO,EAAI9G,KACpCmZ,EAAcu3B,EAAOhwC,cAAc,sBACnC2W,EAAY,IAAI,KAChBA,EAAUuE,OAAOzC,GAAa,EAAO,IAAeg4B,YAAYvwC,IAAIkG,EAAI9G,MAC/DmH,EAAaioC,aAAcp2B,IACpCG,EAAcu3B,EAAOhwC,cAAc,sBACnC2W,EAAariB,EAAQ0Q,MAAc2R,UAE/BA,GAYFA,EAAUuE,OAAOzC,GAChBnkB,EAAQ0Q,MAAcrO,QAAQzG,KAAK4pB,KAZpCnD,EAAY,IAAI,KAEhBA,EAAUE,YACVF,EAAU24B,YACV34B,EAAUuE,OAAOzC,GACjB9B,EAAUoF,oBAAoB/lB,QAENpB,IAArBg4C,GAAkCA,GAAoBxmC,EAAI3W,MAC3D,YAAmBknB,EAAUA,aAQnC,YAAiBq5B,EAAS1jD,IACrBqqB,EACDA,EAAUs3B,QAAQ3hD,GAElB0J,EAAK1J,KAIF0jD,EA8DF,SAASx1B,IAAU,MAAC9lB,EAAK,QAAEJ,EAAO,UAAE3G,EAAS,SAAE8sB,EAAQ,UAAEC,EAAS,SAAE6xB,EAAQ,MAAEC,EAAK,cAAE3xB,EAAa,WAAEkC,EAAU,KAAEttB,EAAI,iBAAEmrB,EAAgB,aAAED,EAAY,iBAAEiyB,EAAgB,OAAEjvB,EAAM,QAAEgzB,EAAO,SAAEC,EAAQ,UAAEC,I,MAmBxM,IAAMn8C,EAAkBsX,QAAUtX,EAAqBoX,OAKrD,OAJG2O,GAAYC,IAAcjrB,GAAoB,aAAZiF,EAAMiD,GACzC,IAAiBm5C,kBAAkBp8C,EAAO/G,EAAW8sB,EAAUC,OAAW9lB,EAAWN,GAGhF,CACLqmB,aAAc,CACZI,MAAOnpB,QAAQ6E,UACfukB,KAAMppB,QAAQ6E,WAEhBqkB,OAAQ,CACNC,MAAO,KACPC,KAAM,MAERrE,UAAW,KACX63B,SAAU,MAId,IAAI3B,EAAsC,IAArBD,EAEjBn9C,SACcmF,IAAb6lB,IAAwBA,EAAW/F,EAAA,EAAWqvB,OAAOgN,QAAQhhD,YAC/C6E,IAAd8lB,IAAyBA,EAAYhG,EAAA,EAAWqvB,OAAOgN,QAAQ/gD,SAGpErC,EAAUlB,UAAUW,IAAI,mBACxB,IAII4jD,EACAC,EACAxqC,EANA+nC,EAAW7gD,EAEXujD,GAAQ,EACRC,EAAiCv/C,QAAQ6E,UAI7C,MAAM26C,EAAoB,aAAZ18C,EAAMiD,GAAwC,cAApBjD,EAAM44C,YAA8B79C,EAM1E,GAFAwhD,EAAQ,IAAIvV,MAETjhB,GAAYC,IAAcjrB,EAAM,CACjC,MAAMsX,EAAM,IAAiB+pC,kBAAkBp8C,EAAO/G,EAAW8sB,EAAUC,OAAW9lB,EAAWN,OAASM,EAAWw8C,EAAQ,CAC3Hz5C,EAAG,YACH2T,EAAG5W,EAAM4W,EACTW,EAAGvX,EAAMuX,EACTxc,KAAMiF,EAAMjF,KACZ7C,KAAM,aACJgI,GAKJ,GAJAnF,EAAOsX,EAAIsqC,UACXH,EAAQnqC,EAAImqC,MACZzqC,EAAeC,GAAA,EAAmBC,gBAAgBjS,EAAOjF,EAAK7C,OAE1DskD,EAAO,CACT1C,EAAWthD,SAASC,cAAc,OAClCqhD,EAAS/hD,UAAUW,IAAI,4BACvBohD,EAAS98C,MAAM3B,MAAQgX,EAAItX,KAAKM,MAAQ,KACxCy+C,EAAS98C,MAAM1B,OAAS+W,EAAItX,KAAKO,OAAS,KAE1C,MAAMq+C,EAAW,IAAiBiD,yBAAyB58C,EAAO+R,GAAekX,GAAQ,GACzF,GAAG0wB,EAAU,CACX8C,EAAmB9C,EAAS1+C,YAC5B,MAAMqhD,EAAa3C,EAAS4C,MAC5BD,EAAWvkD,UAAUW,IAAI,eACzBO,EAAUC,OAAOojD,OACZ,CACOx2B,GAAU,CACpB7sB,YACA2G,UACAI,QACA+lB,SAAU,EACVC,UAAW,EACXjrB,OACAorB,gBACA2xB,QACA7xB,eACAoC,aACAnC,mBACA2xB,WACAK,mBACAjvB,SACAgzB,SAAS,EACTE,WAAW,IAGU/1B,OAAOE,KACnBvuB,UAAUW,IAAI,cAAe,aAI1CO,EAAUlB,UAAUW,IAAI,0BACxBO,EAAUC,OAAO4gD,SAGf/+C,IACFA,EAAO,IAAiBiuB,gBAAgBhpB,EAAO+lB,EAAUC,GAAW,IAGtEjU,EAAeC,GAAA,EAAmBC,gBAAgBjS,EAAOjF,aAAI,EAAJA,EAAM7C,MAGjE,IAAI+jD,EAAS,CACX,MAAMtC,EAAW,IAAiBiD,yBAAyB58C,EAAO+R,GAAekX,GAC9E0wB,IACD8C,EAAmBv/C,QAAQC,IAAI,CAACs/C,EAAkB9C,EAAS1+C,cAC3DqhD,EAAa3C,EAAS4C,MACtBD,EAAWvkD,UAAUW,IAAI,eACzBohD,EAAS5gD,OAAOojD,IAKtBC,EAAMxkD,UAAUW,IAAI,eAIpB,MAAMmkD,GAAcP,IAAevqC,EAAaioC,aAAev1C,EAAA,EAAU+2B,SAASC,oBAAsBygB,EAExG,IAAIj6B,GACa,QAAd,EAAAriB,aAAO,EAAPA,EAAS0Q,aAAK,eAAE2R,aAAciE,GAC/BjE,EAAYriB,EAAQ0Q,MAAM2R,UAC1BA,EAAUuE,OAAOvtB,GACjBk/C,OAAiBj4C,GACR6R,EAAaioC,aACtB/3B,EAAY,IAAI,KAAqB,CACnCg4B,aAAc,aAIlB,MAQM6C,EAAgB3qC,GACb4qC,GAAsB9jD,EAAWsjD,EAAOpqC,EAAK0qC,EAAY/C,EAAUwC,GAGtEl3B,EAAS,KACb,GAAGiD,IAAeA,IAAc,OAAOnrB,QAAQ6E,UAE/C,GAAGo6C,EAAW,CACZ,MAAMh6C,EAAS,aAAK4P,EAAaI,IAAK,IACtC,OAAOhQ,EAAOF,QAAQzG,KAAK,IAElBshD,EAAa36C,EAAOpF,OAAOigD,cAItC,OAAOF,EAAa/qC,EAAaI,MAGnC,IAAIlX,EACJ,MAAMgiD,EACHliD,EAA6B6b,GAAK,KAClC7b,EAA6Bwc,GAAK,KAC9B4gC,EACD72C,EAAO,KACR62C,IAAmBjyB,GAAoBjE,IACxCA,EAAUE,YACVF,EAAU24B,aAGZ,MAAM34C,EApCUy6C,IAAU3hD,EACxB,IAAe+b,YAAY9W,EAAwBmmB,aAAa,EAAbA,EAAe00B,SAClE,IAAiBrjC,aAAaxX,EAAOjF,EAAMorB,aAAa,EAAbA,EAAe00B,QAAS1C,GAoClEl2B,IACAlQ,EAAaioC,aACb9zB,GACD+2B,GAEAh7B,EAAUuE,OAAOvtB,GAAW,EAAOgJ,GAGrCk2C,OAAiBj4C,EAEjB,MAAMg9C,EAAgBj7C,EAAQzG,KAAK4pB,GAEnC,OADA83B,EAAc30C,MAAM,QACb,CAAC6e,SAAUnlB,EAAS80C,OAAQmG,IAsBrC,OAnBGj7B,GACDA,EAAUoF,oBAAoB/lB,GAG7ByQ,EAAaioC,WACdyC,EAAmBxhD,EAAcqG,IAAOy1C,OAEpC5wB,EAKMA,EAAc/kB,KAAK,CAACynB,IAAK5vB,EAAWqI,KAAM,IAAMA,IAAO8lB,WAL9CnsB,EAAcqG,IAAOy1C,OAQvC9wB,GAAgBw2B,GACjBx2B,EAAa7kB,KAAKq7C,GAGb,CACLx2B,aAAc,CACZI,MAAOo2B,EACPn2B,KAAMrrB,GAAeiC,QAAQ6E,WAE/BqkB,OAAQ,CACNC,MAAOi2B,EACPh2B,KAAMi2B,GAERt6B,YACA63B,YAIG,SAASiD,GACd9jD,EACAsjD,EACApqC,EACA0qC,EACA/C,EAAW7gD,EACXqjD,GAMA,OAJGO,GACDN,EAAMxkD,UAAUW,IAAI,WAGf,IAAIwE,QAAe6E,IAMxB,OAAA+4C,GAAA,GAAmByB,EAAOpqC,EAAK,KAC7BqoC,GAAA,EAAcC,cAAcxhD,EAAW,KACrC6gD,EAAS5gD,OAAOqjD,GAEhB,aAAQ,KACNx6C,MAGC86C,GACDN,EAAMpjD,iBAAiB,eAAgB,KACrCqhD,GAAA,EAAc2C,OAAO,KACnBZ,EAAMxkD,UAAUoE,OAAO,WAEpBmgD,GACDA,EAAWngD,YAGd,CAACua,MAAM,UA4Db,SAAS0mC,IAAqB,KACnCriD,EAAI,IACJ2W,EAAG,WACH2W,EAAU,OACV9V,EAAM,KACN8qC,EAAI,UACJC,EAAS,KACTrhD,IAUA,MAAMshD,EAAe/kD,SAASC,cAAc,OAC5C8kD,EAAaxlD,UAAUW,IAAI,mBAG3B6kD,EAAavgD,MAAM3B,MAAQN,EAAO,KAClCwiD,EAAavgD,MAAM1B,OAASP,EAAO,KAEnC,MAAMyiD,EAAiB50B,GAAY,CACjCC,IAAK00B,EACL7rC,MACA2W,aACAo1B,WAAW,EACXZ,YAAY,EACZ1hD,MAAM,EACNE,MAAON,EACPO,OAAQP,EACRkB,OACA6sB,MAAO,OACPw0B,cACC9hD,KAAKE,IACN,OAAAgiD,GAAA,GAA0BhiD,GAC1BA,EAAUvC,iBAAiB,aAAewkD,IACrCA,IAAYjiD,EAAUkiD,WACvBliD,EAAUS,SACVohD,EAAaphD,SACb,GAAassB,KAAKC,QAAQthB,WAAWnO,UAAUyM,oBAAoB,SAAUw5B,MAI9E,MACDxjC,EAAUvC,iBAAiB,aAAc,KACvCgW,UAAU0uC,QAAQ,MACjB,CAACnnC,MAAM,IAGLhb,IAGHoiD,EAAwBxhD,IAC5B,MAAMshB,EAAIlhB,KAAK23B,SAAW/3B,EAAM,EAChC,OAAOshB,EAAIthB,GAAOshB,EAAIthB,EAAMshB,GAGxBmgC,EAAgBD,EAAqB,IACrCE,EAAgBF,EAAqB,GACrCG,EAAgBljD,EAAO,GAAc,UAATsiD,EAAmB,GAAK,GACpDa,EAAc,KAClB,IAAI,OAAA/E,GAAA,GAAQ5mC,GACV,OAGF,MAAM+J,EAAO/J,EAAOgK,wBASdtB,GAHiB,UAAToiC,EAAmB/gC,EAAK6rB,MAAQ7rB,EAAKkB,OAEvB,WAAT6/B,GAAqB/gC,EAAKjhB,MAAQN,GAAQ,GAAc,UAATsiD,GAAoBtiD,EAAO,GAAKkjD,EAAgBF,GAG5G5iC,EAAImB,EAAKiU,KAAQjU,EAAKhhB,OAASP,GAAQ,GAAe,WAATsiD,EAAoB,EAAIW,GAE3ET,EAAavgD,MAAMuzB,IAAMpV,EAAI,KAC7BoiC,EAAavgD,MAAMwgB,KAAOvC,EAAI,MAG1BikB,EAAW7lB,GAAgB6kC,GAQjC,OANA,GAAaz1B,KAAKC,QAAQthB,WAAWnO,UAAUE,iBAAiB,SAAU+lC,GAE1Egf,IAEA,GAAaC,wBAAwBjlD,OAAOqkD,GAErC,CAACA,eAAcC,kBAGjB,SAAS50B,IAAY,IAAClX,EAAG,IAAEmX,EAAG,WAAER,EAAU,cAAElC,EAAa,MAAE2C,EAAK,KAAE7sB,EAAI,UAAEmiD,EAAS,MAAEC,EAAK,MAAEhjD,EAAK,OAAEC,EAAM,UAAEmiD,EAAS,KAAEtiD,EAAI,aAAE8qB,EAAY,WAAE42B,EAAU,YAAEyB,EAAW,UAAEhB,EAAWiB,OAAQC,I,MAmBzL,MAAMC,EAAc/sC,EAAIgtC,QAkBxB,GAjBmB,IAAhBD,IACDD,GAAW,GAGTnjD,IACFA,EAASgjD,OAAcn+C,EAAN,KAGf5E,IACFA,EAAU+iD,OAAcn+C,EAAN,KAGD,IAAhBu+C,GAED,KAAaE,qBAGXF,EAEF,MADAr2C,QAAQC,MAAM,6BAA8BqJ,GACtC,IAAIuV,MAAM,8BAoClB,IAAIlV,EACJ,GAlCA8W,EAAI9pB,QAAQ6S,MAAQ,GAAKF,EAAI9G,GAC7Bie,EAAI9wB,UAAUW,IAAI,yBAiCf8lD,GAA4B,IAAhBC,EAAmB,CAChC,MAAMp4B,EAAQ,IAAiB2C,gBAAgBtX,EAAKrW,EAAOC,GAAQ,GACnEyW,EAAeC,GAAA,EAAmBC,gBAAgBP,EAAK2U,EAAMnuB,WAE7D6Z,EAAeC,GAAA,EAAmBC,gBAAgBP,GAGpD,MAAMktC,EAAYP,EAAQ,aAAkBA,IAAU,EAChDrE,EAAajoC,EAAaioC,aAAe6C,EAEzCgC,GAAcL,IAA6B,IAAhBC,GAAqC,IAAhBA,GAChDK,EAAuBD,EAE7B,IAAIpC,EAAmB,eACnBsC,GAAkB,EACtB,KACc,QAAV,EAAArtC,EAAI0F,cAAM,eAAE5d,SACZkY,EAAIstC,uBAELn2B,EAAI/E,qBACFk2B,GACD8E,GACAV,KACiB,IAAdX,EACL,CACA,IAIInB,EAJAj2B,EAAQ3U,EAAIstC,qBAAuBttC,EAAIstC,oBAAoBJ,IAAcltC,EAAI0F,OAAO,GAKxF,MAAM6nC,EAAc,KACdp2B,EAAIviB,oBACNg2C,EAAWvkD,UAAUW,IAAI,gBAAiB,aAE1C8hD,GAAA,EAAcC,cAAc5xB,EAAK,KAC/BA,EAAI3vB,OAAOojD,GACXG,EAAiB16C,cAKvB,GAAG,QAASskB,EACVi2B,EAAa,IAAItV,MACjB,OAAA8T,GAAA,GAAmBwB,EAAYj2B,EAAMlU,IAAK8sC,GAC1CF,GAAkB,OACb,GAAG,UAAW14B,EAAO,CAC1B,GAAe,kBAAZA,EAAMpjB,EACP,GAAGojB,EAAMhP,MAAM7d,OAAQ,CACrB,MAAM4/B,EAAI,IAAiB8lB,yBAAyB74B,GAC9CzG,EAAMpnB,SAAS4nB,gBAAgB,6BAA8B,OACnER,EAAI7nB,UAAUW,IAAI,iBAAkB,gBAAiB,aACrDknB,EAAIS,eAAe,KAAM,UAAW,OAAO3O,EAAIkF,GAAK,OAAOlF,EAAI6F,GAAK,OACpE,MAAM4nC,EAAO3mD,SAAS4nB,gBAAgB,6BAA8B,QACpE++B,EAAK9+B,eAAe,KAAM,IAAK+Y,GAC/BxZ,EAAI1mB,OAAOimD,GACXt2B,EAAI3vB,OAAO0mB,QAEXyG,EAAQ3U,EAAI0F,OAAOlL,KAAKC,IAAI,MAAC,OAAwC,QAAxC,EAACA,EAAkCkL,aAAK,eAAE7d,UAAW6sB,EAInFA,GAAqB,kBAAZA,EAAMpjB,GAAyB27C,GAAa,IACtDtC,EAAa,IAAItV,MAEb,MAAqBt1B,EAAI0E,OAAOgpC,uBAAyBrtC,EAAaI,KACxE,OAAA2oC,GAAA,GAAmBwB,EAAY,IAAiB+C,uBAAuB3tC,EAAK2U,GAAsC,GAAO44B,GACzHF,GAAkB,GAElBO,GAAA,EAAqBC,QAAQ,GAAK7tC,EAAI9G,GAAKyb,EAAsChP,OAAqB7b,KAAK6b,IACxGgP,EAAsChP,MAAQA,EAC/C3F,EAAI0E,OAAOgpC,uBAAwB,EAEhC/2B,IAAeA,KAEdQ,EAAIviB,mBACN,OAAAw0C,GAAA,GAAmBwB,EAAY,IAAiB+C,uBAAuB3tC,EAAK2U,GAAsC,GAAO44B,KAE1H12C,MAAM,cAGR,IAAqB,IAAhBk2C,GAAqBG,GAAa,GAAsB,IAAhBH,KAAuBhB,GAAaW,GAAY,CAClG9B,EAAa,IAAItV,MAEjB,MAAM1lC,EAAO,KACX,GAAGunB,EAAIviB,mBAAsB+hB,IAAeA,IAAe,OAE3D,MAAMzK,EAAI,KACLiL,EAAIviB,mBAAsB+hB,IAAeA,KAC5C,OAAAyyB,GAAA,GAAmBwB,EAAYvqC,EAAaI,IAAK8sC,IAGnD,OAAGltC,EAAaI,KACdyL,IACO1gB,QAAQ6E,WAER,IAAey9C,YAAY9tC,EAAK2U,GAAsCpkB,QAAQzG,KAAKoiB,IAI9F,GAAGuI,GAAiBi4B,EAElB,OADAj4B,EAAc/kB,KAAK,CAACynB,MAAKvnB,SAClBpE,QAAQ6E,UAEfT,IAEI+kB,EAAclU,MAChB4sC,GAAkB,IAU1B,GAJG94B,GAAgB84B,GACjB94B,EAAa7kB,KAAKq7C,GAGjB2B,EACD,OAAOlhD,QAAQ6E,UAGjB,MAAMT,EAAO,IAAW,mCACtB,IAAG+mB,GAAeA,IAAlB,CAEA,GAAmB,IAAhBo2B,IAAsBD,EAYvB,aAAa,IAAe1nC,YAAYpF,EAAsByU,aAAa,EAAbA,EAAe00B,SAC5Er/C,KAAWikD,GAAS,mCAGnB,GAAGp3B,IAAeA,IAChB,MAAM,IAAIpB,MAAM,4BAGlB,IAAIvrB,QAAkB,KAAagkD,oBAAoB,CACrDzmD,UAAW4vB,EACX1tB,KAAMA,IAASkjD,EACfjjD,SAAUa,EACV0jD,cAAeF,EACfpkD,QACAC,SACAjD,KAAM,MAAQqZ,EAAI9G,GAClB0zC,cACAhB,YACAsB,aACC91B,EAAOT,GA2CV,GAvCA3sB,EAAUvC,iBAAiB,aAAc,KACvC,MAAMyZ,EAAUiW,EAAI/E,mBACF,IAAf+4B,IACDA,GAAcA,IAAejqC,GAA+B,QAApBA,EAAQu3B,UAAsB1lC,EAAA,EAAU+2B,SAASC,mBAG3F,MAAMjjB,EAAK,KACN5F,GAAWA,IAAYlX,EAAUqB,QAClC6V,EAAQzW,UAIR0gD,EAKFrC,GAAA,EAAc2C,OAAO,KACnBzhD,EAAUqB,OAAOhF,UAAUW,IAAI,WAC5Bka,GACDA,EAAQ7a,UAAUW,IAAI,YAGxBgD,EAAUqB,OAAO5D,iBAAiB,eAAgB,KAChDqhD,GAAA,EAAc2C,OAAO,KACnBzhD,EAAUqB,OAAOhF,UAAUoE,OAAO,WAClCqc,OAED,CAAC9B,MAAM,MAfT9D,GACD4nC,GAAA,EAAc2C,OAAO3kC,IAkBR,IAAdilC,GACD,IAAemC,kBAAkBluC,EAAKhW,EAAUqB,OAAQ6hD,IAIzD,CAACloC,MAAM,IAEP2nC,EAAO,CACR,MAAMwB,EAAwC,CAC5C17C,EAAG,GACHw4B,EAAG,GAGL,IAAImjB,EAEJ,KAAmBC,qCAAqC1B,GAExD,YAAiBx1B,EAAWjxB,GAAM,mCAChC,OAAAiqB,EAAA,GAAYjqB,GACZ,MAAM8D,EAAY,KAAaskD,aAAan3B,GAE5C,GAAGntB,EAAU+X,OAAQ,CACnB,MAAM/B,EAAM,KAAmBuuC,8BAA8B5B,GAC7D,GAAG3sC,EAAK,CACN,MAAMX,EAAQvY,SAASC,cAAc,SACrCsY,EAAM/T,MAAMC,QAAU,OACtB4rB,EAAIjwB,cAAcM,OAAO6X,GAEzB,UACQ,IAAe+F,YAAYpF,GAEjC,MAAMK,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxDX,EAAMmB,IAAMH,EAAaI,IACzBpB,EAAM9U,aACA,aAAY8U,OAAO7Q,GAAW,GAEpC6Q,EAAM5X,iBAAiB,QAAS,KAC9B4X,EAAMmB,IAAM,GACZnB,EAAM5U,UACL,CAACua,MAAM,IACV,MAAMvO,KAKVzM,EAAUN,UAAW,EACrBM,EAAUwkD,UAIZ,IADe,GAAaz3B,KAAK3lB,OACtB82B,SACT,OAGF,MAAMloB,EAAM,KAAmByuC,wBAAwB9B,GAAO,GAC9D,IAAI3sC,EACF,OAGF,MAAM0uC,EAAS,OAAAz9B,GAAA,GAAgBkG,EAAK,UAC9BivB,EAAQsI,EAAOroD,UAAUuV,SAAS,WAElC,aAACiwC,GAAgBH,GAAqB,CAC1C1rC,MACA2W,aACAg1B,KAAMvF,EAAQ,QAAU,OACxB/8C,KAAM,IACNwX,OAAQsW,EACR5sB,MAAM,IAGLmkD,IACEtI,EACDyF,EAAaxlD,UAAUW,IAAI,UAE3B6kD,EAAaxlD,UAAUW,IAAI,UAI3BonD,IACFA,EAA2B,OAAAO,GAAA,GAAS,KAElC,IADeR,EAAK17C,EAAE3K,OAEpB,OAGF,MAAM8mD,EAAYT,EAAK17C,EAAE,GAAGgI,EAE5B0zC,EAAK17C,EAAE/B,QAAS+B,IACdA,EAAEgI,GAAKhI,EAAEgI,EAAIm0C,GAAa,MAG5B,MAAMF,EAAS,OAAAz9B,GAAA,GAAgBkG,EAAK,UACpC,IAAmB03B,UAAU,GAAa93B,KAAK3lB,OAAQ,CACrDG,EAAG,8BACHu9C,OAAQ,IAAsBC,oBAAoBL,EAAOrhD,QAAQ2D,KACjEg+C,SAAUrC,EACVsC,YAAa,CACX19C,EAAG,WACH48C,KAAMe,KAAKC,UAAUhB,MAEtB,GAEHA,EAAK17C,EAAE3K,OAAS,GACf,KAAM,IAIR5B,EAAE2b,YACHssC,EAAK17C,EAAE/C,KAAK,CACV3H,EAAG,EACH0S,EAAGooC,KAAKC,QAGVsL,SAKN,OAAOpkD,MAOJ,GAAG8iD,GAA4B,IAAhBC,EAAmB,CACvC,IAAInuC,EACDkuC,EACDluC,EAAQ,IAAI02B,OAEZ12B,EAAQmnC,KACPnnC,EAA2BsF,OAAQ,EAEjC3Z,IACAqU,EAA2BlV,UAAW,EACtCkV,EAA2BnV,MAAO,IAIvC,MAAMmhD,EAAazzB,EAAI/E,oBAAsBxT,GAASuY,EAAI/E,kBAW1D,OAVkB,IAAf+4B,IACDA,GAAcA,IAAe7C,IAAewE,EAAWlC,GAAeA,GAAqC,QAAvBA,EAAWnS,WAAwB1lC,EAAA,EAAU+2B,SAASC,mBAG5InrB,EAAMvY,UAAUW,IAAI,iBAEjBmkD,GACDvsC,EAAMvY,UAAUW,IAAI,WAGf,IAAIwE,QAAc,CAAC6E,EAASmlB,KACjC,MAAMtJ,EAAI,KACR,GAAGyK,IAAeA,IAAc,OAAOtmB,IAEvC,MAAMqjB,EAAS,KACbo1B,GAAA,EAAcC,cAAc5xB,EAAK,KAM/B,GALAA,EAAI3vB,OAAOoX,GACRgsC,GACDA,EAAWvkD,UAAUW,IAAI,YAGR,IAAhB+lD,IAAsB,IAAeqC,sBAAsBpvC,EAAKktC,GAAY,CAE7E,OAAAlB,GAAA,GAA6BptC,GAC7B,MAAMvT,EAASvE,SAASC,cAAc,UACtCsE,EAAO1B,MAAQA,EAAQtB,OAAOoE,iBAC9BpB,EAAOzB,OAASA,EAASvB,OAAOoE,iBACpBpB,EAAOyP,WAAW,MAC1B8sC,UAAUhpC,EAAO,EAAG,EAAGvT,EAAO1B,MAAO0B,EAAOzB,QAChD,IAAeskD,kBAAkBluC,EAAK3U,EAAQ6hD,GAI7B,IAAhBH,GAAqB31B,GACtBuxB,EAAA,EAAqBC,aAAahqC,EAA2BwY,GAG/D/mB,IAEG86C,GACDvsC,EAAMnX,iBAAiB,eAAgB,KACrCmX,EAAMvY,UAAUoE,OAAO,WACpBmgD,GACDA,EAAWngD,UAEZ,CAACua,MAAM,OAKb8nC,EACD,OAAA1D,GAAA,GAAmBxqC,EAAOyB,EAAaI,IAAKiT,IAE3C9U,EAA2B4B,IAAMH,EAAaI,IAC/C,aAAY7B,GAA2B9U,KAAK4pB,KAIhD,GAAGrT,EAAaI,IAAKyL,QAChB,CACH,IAAI3b,EACJ,GAAmB,IAAhBw8C,GAAqBD,EAAU,CAChC,MAAMn4B,EAAQ,IAAiB2C,gBAAgBtX,EAAKrW,EAAOC,GAAQ,GACnE2G,EAAU,IAAeu9C,YAAY9tC,EAAK2U,GAAOpkB,aAEjDA,EAAU,IAAe6U,YAAYpF,EAAsByU,aAAa,EAAbA,EAAe00B,SAG5E54C,EAAQzG,KAAKoiB,EAAG7b,WAMlB9G,GAA6CkrB,GAAmB6zB,IAAc6E,EAElFv9C,KADC6kB,EAAc/kB,KAAK,CAACynB,MAAKvnB,SAAQpE,QAAQ6E,WAU5C,OAPGi4C,GAAc,IACfyC,EAAmBxhD,EAChBgrB,GACDA,EAAa7kB,KAAKq7C,IAIfxhD,EAGF,SAAe8lD,IAAoB,IAAC1uC,EAAG,cAAE8T,EAAa,UAAEltB,EAAS,MAAE6vB,EAAK,SAAE1tB,EAAQ,MAAEC,EAAK,OAAEC,I,gDAShG,GAAa,QAAV,EAAA+W,EAAI+E,cAAM,eAAE5d,OA4Cb,OA3CAP,EAAUlB,UAAUW,IAAI,8BACxBytB,EAAc/kB,KAAK,CACjBynB,IAAK5vB,EACLqI,KAAM,KACJ,MAAM0/C,EAAkB,KAAmBC,kCAAkC5uC,GACvEpQ,EAAU+P,GAAA,EAAmBoV,SAAS45B,GAE5C,GAAG3uC,EAAI+D,OAAO8qC,WAAa7uC,EAAI+D,OAAOoiC,OACpC,OAAOv2C,EACNzG,KAAMikD,IACL0B,GAAA,EAAazB,oBAAoB,CAC/BzmD,YACAkC,MAAM,EACNC,WACAukD,cAAeF,EACfpkD,QACAC,SACAgjD,aAAa,EACbjmD,KAAM,WAAaga,EAAIzH,IACtBke,KAEA,CACL,IAAIxY,EAYJ,OAXG+B,EAAI+D,OAAOoiC,QACZloC,EAAQmnC,KACPnnC,EAA2BlV,UAAW,EACtCkV,EAA2BsF,OAAQ,EACnCtF,EAA2BnV,MAAO,GAEnCmV,EAAQ,IAAI02B,MAGd12B,EAAMvY,UAAUW,IAAI,iBAEbuJ,EAAQzG,KAAKikD,IAClB,OAAA3E,GAAA,GAAmBxqC,EAAO8wC,IAAIC,gBAAgB5B,GAAO,KACnDxmD,EAAUC,OAAOoX,WAU7B,MAAMrO,EAAU,KAAmBq/C,cAAcjvC,GAC3CkvC,QAAmBt/C,EACQ,kBAA9Bs/C,EAAWC,UAAU,GAAGv+C,GACzB2lB,GAAY,CACVlX,IAAK6vC,EAAWC,UAAU,GAC1B34B,IAAK5vB,EACL6vB,MAAOA,EACP3C,qBAKC,SAAS0a,IAAiB,IAACnvB,EAAG,IAAEgc,EAAG,KAAE3yB,IAK1C,MAAM0mD,EAAgB/zB,EAAIpd,MACpBA,EAAQod,EAAIg0B,YAAY,SAE3BD,GACDnxC,EAAMvY,UAAUW,IAAI,QAGtB,MAAMutB,EAA+Bw7B,EAAgB,QAAKvhD,EAEpDyhD,EAAiB,UAAT5mD,EAAmB,GAAK,GAChCoH,EAASymB,GAAY,CACzBC,IAAKvY,EACLoB,IAAKA,EACLrW,MAAOsmD,EACPrmD,OAAQqmD,EACR17B,iBAQF,OALAA,GAAgB/oB,QAAQC,IAAI8oB,GAAczqB,KAAK,KAC7C8U,EAAMvY,UAAUoE,OAAO,QACvBslD,EAActlD,WAGTgG,EAgCF,SAASy/C,GAAUr4C,EAA8Cse,EAAiDjoB,GACvH,MAAMiiD,EAAiB,IAAI,GAAe,SAG1C,OAFAA,EAAel6B,KAAKpe,EAAOse,EAAUjoB,GAE9BiiD,EAAe5oD,UAGjB,SAAS6oD,GAAavqD,GAS3B,MACM4yB,EADW,IAAI,GAAS5yB,EAAQyJ,MAAOzJ,EAAQkyB,SAAUlyB,EAAQmyB,SAAUnyB,EAAQoyB,QAASpyB,EAAQqyB,WAClFO,SAElB43B,EAAY53B,EAAOje,KAAKjL,GAAQA,EAAK8pB,MAAQvB,IAC7CnuB,EAAQ0mD,EAAUj3B,SAASzvB,MAAQ0mD,EAAUj3B,SAAS7P,EAEtD+mC,EAAa73B,EAAOje,KAAKjL,GAAQA,EAAK8pB,MAAQvB,IAC9CluB,EAAS0mD,EAAWl3B,SAASxvB,OAAS0mD,EAAWl3B,SAAS3P,EAE1DliB,EAAY1B,EAAQ0B,UAC1BA,EAAU+D,MAAM3B,MAAQA,EAAQ,KAChCpC,EAAU+D,MAAM1B,OAASA,EAAS,KAClC,MAAM8sB,EAAWnvB,EAAUmvB,SAE3B+B,EAAO/nB,QAAQ,EAAE0oB,WAAUC,SAAQlrB,KACjC,IAAIgpB,EA8BJ,GA7BAA,EAAMT,EAASvoB,GACXgpB,IACFA,EAAMrwB,SAASC,cAAc,OAC7BQ,EAAUC,OAAO2vB,IAGnBA,EAAI9wB,UAAUW,IAAI,aAAc,gBAEhCmwB,EAAI7rB,MAAM3B,MAASyvB,EAASzvB,MAAQA,EAAQ,IAAO,IACnDwtB,EAAI7rB,MAAM1B,OAAUwvB,EAASxvB,OAASA,EAAS,IAAO,IACtDutB,EAAI7rB,MAAMuzB,IAAOzF,EAAS3P,EAAI7f,EAAS,IAAO,IAC9CutB,EAAI7rB,MAAMwgB,KAAQsN,EAAS7P,EAAI5f,EAAQ,IAAO,IAE3C0vB,EAAQvB,IAAiBuB,EAAQvB,KAClCX,EAAI7rB,MAAMilD,oBAAsB,WAG/Bl3B,EAAQvB,IAAiBuB,EAAQvB,KAClCX,EAAI7rB,MAAMklD,uBAAyB,WAGlCn3B,EAAQvB,IAAkBuB,EAAQvB,KACnCX,EAAI7rB,MAAMmlD,qBAAuB,WAGhCp3B,EAAQvB,IAAkBuB,EAAQvB,KACnCX,EAAI7rB,MAAMolD,wBAA0B,WAGnC7qD,EAAQ8qD,SAAU,CACnB,MAAMC,EAAW9pD,SAASC,cAAc,OACxC6pD,EAASvqD,UAAUW,IAAI,oBAEvBmwB,EAAI3vB,OAAOopD,MAiBV,SAASC,IAAU,QAACC,EAAO,cAAEC,EAAa,WAAEp6B,EAAU,UAAEzE,EAAS,cAAEuC,EAAa,MAAE2xB,EAAK,KAAErvB,EAAI,aAAExC,EAAY,aAAEQ,IAWlH,MAAMzlB,EAAiE,GAGjE4D,EAAU,IAAmB89C,eAAeF,GAClD,IAAI,MAAM9/C,KAAOkC,EAAS,CACxB,MAAM4kC,EAAI/gB,EAAKk6B,WAAWjgD,GACpB4N,EAAQk5B,EAAEl5B,MAAMtQ,OAASwpC,EAAEl5B,MAAM9X,SAEjCuC,EAAwB,UAAZuV,EAAMrN,EAAgB,IAAiB+lB,gBAAgB1Y,EAAO,IAAK,KAAO,CAACsG,EAAGtG,EAAMsG,EAAGW,EAAGjH,EAAMiH,GAClHvW,EAAMI,KAAK,CAACrG,OAAMuV,QAAO1Q,QAAS4pC,IAQpCsY,GAAa,CACX7oD,UAAWwpD,EACXzhD,MAAOA,EAAMsD,IAAI7K,IAAK,CAAEmd,EAAGnd,EAAEsB,KAAK6b,EAAGW,EAAG9d,EAAEsB,KAAKwc,KAC/CkS,SAAUzJ,EAAA,EAAWqvB,OAAOuT,MAAMvnD,MAClCquB,SAAU,IACVC,QAAS,EACT04B,UAAU,IAGZrhD,EAAMoB,QAAQ,CAACnB,EAAMpB,KACnB,MAAM,KAAC9E,EAAI,MAAEuV,EAAK,QAAE1Q,GAAWqB,EAEzB4nB,EAAM45B,EAAcr6B,SAASvoB,GACnCgpB,EAAI9pB,QAAQ2D,IAAM,GAAK9C,EAAQ8C,IAC/BmmB,EAAI9pB,QAAQ+D,OAAS,GAAKlD,EAAQkD,OAClC,MAAMw/C,EAAWz5B,EAAI/E,kBACO,UAAZxT,EAAMrN,EAEpB6iB,GAAU,CACR9lB,MAAOsQ,EACP1Q,UACA3G,UAAWqpD,EACXv8B,SAAU,EACVC,UAAW,EACX8xB,QACA3xB,gBACAkC,aACAttB,OACAkrB,eACAiyB,iBAAkBzxB,EAAazmB,QAGjC43C,GAAU,CACRlmC,IAAK9R,EAAQ0Q,MAAM9X,SACnBS,UAAWqpD,EACX1iD,UACAmmB,SAAU,EACVC,UAAW,EACX6xB,UAAU,EACVC,QACA3xB,gBACAkC,aACApC,eACAQ,mBAt7DRzG,EAAA,EAAW7mB,iBAAiB,eAAgB,CAAC8K,EAAMyqC,KACjD,GAAGA,IAAO,IAAWE,QAAU3qC,IAAS,IAAW2qC,OAAQ,CACzD,MAAM1rB,EAAWlf,MAAMC,KAAKzL,SAAS+S,iBAAiB,gCAChDlQ,EAAQ2kB,EAAA,EAAWqvB,OAAOzyC,MAAMvB,MAChC09C,EAAW19C,EAAQ,EACnB04C,EAASgF,EAAW,EAC1BpB,GAA0B,EAAIj7C,KAAKu3C,GAAKF,EACxC7wB,EAAS9gB,QAAQwQ,IACfA,EAAQyN,eAAe,KAAM,QAAS,GAAKhlB,GAC3CuX,EAAQyN,eAAe,KAAM,SAAU,GAAKhlB,GAE5C,MAAM+mB,EAASxP,EAAQkR,kBACvB1B,EAAO/B,eAAe,KAAM,KAAM,GAAK04B,GACvC32B,EAAO/B,eAAe,KAAM,KAAM,GAAK04B,GACvC32B,EAAO/B,eAAe,KAAM,IAAK,GAAK0zB,GAEtC3xB,EAAOplB,MAAM63C,gBAAkB8C,GAA0B,IAAMA,GAC/Dv1B,EAAOplB,MAAM43C,iBAAmB,GAAK+C,QAie3ClzC,EAAA,EAAUtL,iBAAiB,iBAAmByY,IAC3B5N,MAAMC,KAAKzL,SAAS+S,iBAAiB,0BAA0BqG,QACvExP,QAAQwQ,IACZA,EAAQtH,cAAc,gCACvB,YAAmBsH,O,gCChjBV,SAASiwC,GAAuBjwC,EAAsB3Z,EAAwB6pD,EAAaC,GAKxG,YAJe7iD,IAAZ6iD,IACDA,EAAUnwC,EAAQha,gBAAkBK,EAAY,OAAA+pD,GAAA,GAAWpwC,IAAY,GAGtEmwC,IAAYD,KAEQ,IAAbC,GAAkBA,EAAUD,IACpCA,GAAO,GAGLA,EAEM7pD,EAAUqN,kBAAoBw8C,EACtC7pD,EAAUH,aAAa8Z,EAAS3Z,EAAUmvB,SAAS06B,IAEnD7pD,EAAUC,OAAO0Z,GAJjB3Z,EAAUJ,QAAQ+Z,IAOb,G,cCXM,MAAM,GAenB,YAAYrb,GALF,KAAA0rD,kBAAqBhvB,GAAyBA,IAC9C,KAAAivB,eAAkBjvB,GAAuDA,GAAS,GAElF,KAAA5L,WAAa,eAYrB,OAAA1nB,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKqrB,SAAW,IAAI/X,IACpBtT,KAAKkM,OAAS,GAGT,QACLlM,KAAKwwB,WAAW3U,QAChB7b,KAAKqrB,SAAS1c,QACd3O,KAAKkM,OAAOvK,OAAS,EAGb,cACR3B,KAAKqrB,SAAS9gB,QAAQwQ,IACpB/a,KAAKwmC,OAAOzrB,EAAQhI,IAAI,KAGvB/S,KAAKsrD,QACNtrD,KAAKkM,OAAO3B,QAAQ,CAACwQ,EAAS/S,KAC5BhI,KAAKsrD,OAAOvwC,EAAS/S,KAKpB,WAAWo0B,GAChB,MAAM5L,EAAaxwB,KAAKwwB,WAAW7c,MACnC3T,KAAKqrD,eAAgBE,IACnB,IAAI/6B,UAA+BnoB,IAAdkjD,IAA4BA,EAC/C,OAAOnvB,GAAS,GAGlBp8B,KAAKwrD,cAELpvB,GAAS,KAIN,IAAIrpB,GACT,OAAO/S,KAAKqrB,SAAS1f,IAAIoH,GAGpB,IAAIA,GACT,OAAO/S,KAAKqrB,SAAS1X,IAAIZ,GAGpB,SACL,OAAO/S,KAAKqrB,SAGP,IAAItY,EAAqB04C,GAAQ,EAAOL,EAAoEM,EAAcD,GAC/H,IAAI1wC,EAAU/a,KAAK2T,IAAIZ,GACvB,GAAGgI,EACD,OAAOA,EAGT,MAAM4wC,EAA0B,CAC9B54C,KACAmS,MAAO,GAOT,OAJAnK,EAAU/a,KAAK4rD,gBAAgBD,EAAMF,GACrCzrD,KAAKqrB,SAAS7Q,IAAIzH,EAAIgI,GACtB/a,KAAKwmC,OAAOzzB,EAAI24C,EAAa3wC,EAASqwC,GAE/BrwC,EAGF,OAAOhI,EAAqB84C,GACjC,MAAM9wC,EAAU/a,KAAKqrB,SAAS1X,IAAIZ,GAClC,IAAIgI,EACF,OAAO,EAGT/a,KAAKqrB,SAASlZ,OAAOY,GAErB,MAAM/K,EAAMhI,KAAKkM,OAAOiZ,QAAQpK,GAKhC,IAJY,IAAT/S,GACDhI,KAAKkM,OAAO9D,OAAOJ,EAAK,GAGvBhI,KAAK8rD,SACN,GAAGD,EACD7rD,KAAK8rD,SAAS/wC,OACT,CACL,MAAMyV,EAAaxwB,KAAKwwB,WAAW7c,MACnC3T,KAAKorD,kBAAkB,KACjB56B,KAIJxwB,KAAK8rD,SAAS/wC,KAKpB,OAAO,EAGF,OAAOhI,EAAqB04C,GAAQ,EAAO1wC,EAAU/a,KAAK2T,IAAIZ,GAAKq4C,GACxE,IAAIrwC,EACF,OAGFA,EAAQmK,MAAQllB,KAAK+rD,SAAShxC,GAC9B/a,KAAKgsD,UAAYhsD,KAAKgsD,SAASjxC,GAE/B,MAAM/S,EAAM,OAAAikD,GAAA,GAA2BjsD,KAAKkM,OAAQ6O,EAAS,SAC7D,IAAI0wC,GAASzrD,KAAKsrD,OAAQ,CACxB,MAAM96B,EAAaxwB,KAAKwwB,WAAW7c,OAClCy3C,GAAqBprD,KAAKorD,mBAAmB,KACxC56B,KAKJxwB,KAAKsrD,OAAOvwC,EAAS/S,O,2SCvId,MAAM,WAAuB,GAa1C,YAAYtI,EASP,IAsDH,IAAImR,EArDJlR,MAAM,CACJosD,SAAUrsD,EAAQqsD,UAAY,CAAEhxC,GAAY,IAAgBmxC,qBAAqBnxC,EAAQhI,KACzF+4C,SAAW/wC,IACTA,EAAQ/D,IAAIuvB,OAAOjiC,SACnBtE,KAAKmsD,oBAAsBnsD,KAAKmsD,sBAElCH,SAAUtsD,EAAQssD,UAAY,CAAEjxC,IAC9B,MAAMqxC,EAAS,IAAgB/0C,oBAAoB0D,EAAQhI,IAC3D,OAAAtC,EAAA,GAAesK,EAAQ/D,IAAII,gBAAiBg1C,KAE9Cd,OAAQ,CAACvwC,EAAS/S,KAChB,MAAMqkD,EAAmBtxC,EAAQ/D,IAAIuvB,OAAOxlC,gBAAkBf,KAAKoO,KACnE48C,GAAuBjwC,EAAQ/D,IAAIuvB,OAAQvmC,KAAKoO,KAAMpG,GAEnDqkD,GAAoBrsD,KAAKmsD,oBAC1BnsD,KAAKmsD,sBAGTP,gBAAkBD,IAChB,MAAM,IAAC30C,GAAO,GAAkBC,aAAa,CAC3CC,OAAQy0C,EAAK54C,GACb3R,WAAW,EACX+O,YAAY,EACZC,WAAYpQ,KAAKoQ,WACjBlC,WAAYlO,KAAKkO,WACjBmC,WAAW,EACX8G,cAAenX,KAAKmX,cACpBmX,cAAetuB,KAAKsuB,gBAItB,OADCq9B,EAAoB30C,IAAMA,EACpB20C,GAETP,kBAAmB,KACnBC,eAAsBjvB,GAAa,mCACjC,OAAI,OAAAklB,GAAA,GAAQthD,KAAKoO,aAIX,eAEF,OAAAkzC,GAAA,GAAQthD,KAAKoO,WAIjBguB,GAAS,GAHAA,GAAS,IANTA,GAAS,QAtDd,KAAAhsB,WAAa,GACb,KAAA+G,eAAgB,EAChB,KAAAjJ,YAAa,EAiErB,OAAApF,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKoO,KAAO,GAAkBC,eAAerO,KAAKssD,uBAGlD,MAAMC,EAAY,KAChB17C,EAAU3O,OAAO4N,WAAW,KAC1B9P,KAAKwsD,WAAYC,IACZA,GACDF,OAGH,GAAeG,gBAGpBH,KAtFe,GAAAG,cAAgB,I,cCPpB,SAASC,GAAsBjtD,GAC5C,IAAIktD,GAAU,EACd,OAAO,IAAI,GAAa,OAAD,wBAClBltD,GAAO,CACV6uC,kBAAoBxuC,IACV,OAAA+qB,GAAA,GAAgB/qB,EAAE2a,OAAQ,mBAC/B,OAAAmyC,GAAA,GAAoB9sD,MACpBL,EAAQ6uC,mBAAoB7uC,EAAQ6uC,kBAAkBxuC,IAE3D+uC,QAAS,CAACJ,EAAOC,EAAO5uC,KACtB,IAAI6sD,GAAW/nD,KAAK+B,IAAI+nC,GAAS,GAC/B,OAAO,EAGT,GAAG9pC,KAAK+B,IAAI8nC,GAAS7pC,KAAK+B,IAAI+nC,GAC5B,OAAA3kB,EAAA,GAAYjqB,GACZ6sD,GAAU,OACL,IAAIA,GAAW/nD,KAAK+B,IAAI+nC,GAAS9pC,KAAK+B,IAAI8nC,GAC/C,OAAO,EAOT,OAAOhvC,EAAQovC,QAAQJ,EAAOC,EAAO5uC,IAEvCquC,QAAS,KACPwe,GAAU,EACVltD,EAAQ0uC,SAAW1uC,EAAQ0uC,WAE7BpkB,aAAa,KCrCF,SAAS8iC,GAAeptD,GACrC,OAAOitD,GAAsB,OAAD,wBACvBjtD,GAAO,CACVovC,QAAS,CAACJ,EAAOC,EAAO5uC,KACtB,GAAG8E,KAAK+B,IAAI8nC,GAAS,GAInB,OAHAhvC,EAAQovC,QAAQJ,EAAOC,EAAO5uC,GAC9B,gBAEO,M,cCYf,MAAMgtD,GAAkBrtD,IACtB,GAAGA,EAAQqb,QAAS,OAAOrb,EAAQqb,QAEnC,MAAM,KAAC5J,EAAI,KAAEmnB,EAAI,QAAEopB,EAAO,cAAEpqB,EAAa,wBAAE01B,GAA2BttD,EAChEoC,EAAKnB,SAASC,cAAc,OAClCkB,EAAGkM,UAAY,6BAA+BmD,EAAO,UAAYA,EAAO,IAGxE,IAAI87C,EAAcvtD,EAAQutD,YACtBA,IACFA,EAAcvtD,EAAQutD,YAAc30B,EAAO,YAAKA,EAAM54B,EAAQuoC,UAAYtnC,SAASC,cAAc,QAC9FlB,EAAQwtD,cAAaD,EAAYz+C,UAAY9O,EAAQwtD,cAG1DD,EAAY/sD,UAAUW,IAAI,sBAC1BiB,EAAGT,OAAO4rD,GAEV,MAAME,IAAa71B,KAAmB53B,EAAQytD,SA8B9C,OA3BAzL,GAAW,YAAiB5/C,EAAsD/B,IAChF,OAAAiqB,EAAA,GAAYjqB,GAEZ,MAAMqtD,EAAO,OAAAtiC,GAAA,GAAgB/qB,EAAE2a,OAAQ,YACvC,GAAG0yC,IAASA,EAAKltD,UAAUuV,SAAS,UAClC,QAKY,IAFCisC,EAAQ3hD,KAMnBotD,GACF,eAGC71B,IAAkB01B,IACnB11B,EAAcH,QAAuC,UAA7BG,EAAcl3B,MAAMC,OAA2Bi3B,EAAcH,WAEtEz3B,EAAQA,SAExB43B,GACDx1B,EAAGT,OAAOi2B,EAAcvxB,OAGnBrG,EAAQqb,QAAUjZ,GAwBZ,OArBI,CAACu5B,EAAkCxpB,KACpD,MAAM/P,EAAKnB,SAASC,cAAc,OAClCkB,EAAG5B,UAAUW,IAAI,YAEdgR,GACDwpB,EAAQ9wB,QAAQgC,IACXA,EAAE7M,QACH6M,EAAE7M,QAAQmS,eAAiBA,EAE3BtF,EAAE7M,QAAU,CAACmS,oBAKnB,MAAM1I,EAAQkyB,EAAQ5uB,IAAIsgD,IAI1B,OAFAjrD,EAAGT,UAAU8H,GAENrH,G,uSCxFM,MAAM,WAAqB,GACxC,YACEurD,EACAnpB,EACAopB,GAAmB,GAEnB3tD,MAAM,CACJykC,UAAW,CAAC,UAAW,YACvBF,SAAUopB,EAAmBppB,EAAiBj5B,GAAW,mCACvD,GAAGi5B,EAAU,CACX,MAAMn0B,EAAMm0B,EAASj5B,GAClB8E,aAAe1K,gBACV0K,GAIV,GAAaw9C,aAAa,CAACtiD,WAC3B,GAAa2lB,KAAKxwB,MAAMotD,oBAAoBH,MAE9C18C,YAAa,uCACb6wB,iBAAkB,gBAClBzC,aAAc,kBCdL,MAAM,GACnB,YAAY9zB,EAAgBgB,EAAgB5L,EAAgBotD,GAC1D,MAAMlmB,EAAmB,IAAI,KAAU,CAACt8B,WAAS8P,QAEjD9O,EAAOA,EAAKtG,QACZ,MAAMy2B,EAAW,CAACjF,EAA4Cu2B,KAC5DD,GAAaA,IACD,cAATptD,EACD,IAAmBstD,wBAAwB1iD,EAAQgB,GAEnD,IAAmB2hD,eAAe3iD,EAAQgB,IAAQkrB,EAAQj0B,MAAQwqD,IAItE,IAAIh8C,EAAoBm8C,EAAkB/xB,EAA0BgM,EAAwBzM,EAAsCY,EAA6C,GAoB/K,GAnBmB,IAAhBhwB,EAAKtK,OACN+P,EAAQ,6BAERA,EAAQ,sBACRm8C,EAAY,CAAC,YAAK,WAAY,CAAC5hD,EAAKtK,WAIpCm6B,EADC,IAAgBgyB,YAAY7iD,GACC,IAAhBgB,EAAKtK,OAAe,oCAAsC,kCAE1C,IAAhBsK,EAAKtK,OAAe,gCAAkC,8BAGtE05B,EAAU,CAAC,CACT7B,QAAS,SACTwO,UAAU,EACV5L,aAGCnxB,IAAW2B,EAAA,EAAU+R,MAAiB,cAATte,QAG9B,GAAG4K,EAAO82B,SACR9F,EAAW1yB,KAAK,CACd+uB,KAAM,2BACN2P,SAAU,CAACV,SAER,CACL,MAAM3W,EAAO,IAAgBiM,QAAQ5xB,EAAO8vB,YAEtCkH,EAAY,IAAgBA,UAAUh3B,EAAO8vB,WAAY,mBAC/D,GAAc,SAAXnK,EAAKxlB,EAAc,CACpB,MAAM2iD,EAAY9rB,EAAYh2B,EAAKtG,QAAUsG,EAAKL,OAAOf,GACvC,IAAmB4V,iBAAiBxV,EAAQJ,GAC7CoF,SAAWrD,EAAA,EAAU+R,MAGnCovC,EAAUpsD,SACRosD,EAAUpsD,SAAWsK,EAAKtK,OAC3Bs6B,EAAW1yB,KAAK,CACd+uB,KAAM,kBAGR2D,EAAW1yB,KAAK,CACd+uB,KAAM,yBAGRwD,EAAc,0BACdgM,EAAkB,CAAC,YAAK,WAAY,CAACimB,EAAUpsD,iBAKnD05B,EAAQ,GAAGe,SAAYjF,GAAYiF,EAASjF,GAAS,GAK3D,aAAgBkE,GAEF,IAAI,GAAU,oBAAqB,CAC/CpwB,SACA4sB,aAAcnmB,EACdgqB,cAAemyB,EACfhyB,mBAAoBC,EACpBE,oBAAqB8L,EACrBzM,UACAY,eAGImB,Q,cC3FK,MAAM,GACnB,YAAYnyB,EAAgBgB,EAAgBwhD,GAC1C,IAAI/7C,EAAeoqB,EAAqBT,EAAyB,GAEjE3pB,EAAQ,eAAezF,EAAKtK,OAAS,EAAI,IAAM,SAC/Cm6B,EAAc7vB,EAAKtK,OAAS,EAAI,QAAUsK,EAAKtK,OAAS,iBAAmB,oBAO3E05B,EAAQ9xB,KAAK,CACXiwB,QAAS,OACT4C,SAPe,KACfqxB,GAAaA,IACb,IAAmBO,sBAAsB/iD,EAAQgB,MAQrC,IAAI,GAAU,oBAAqB,CAC/ChB,SACAyG,QACAoqB,cACAT,YAGI+B,Q,aC5BK,SAAS6wB,KACnB/rD,OAAOC,aACLD,OAAOC,eAAe+rD,MACvBhsD,OAAOC,eAAe+rD,QACdhsD,OAAOC,eAAeM,iBAC9BP,OAAOC,eAAeM,kBAGhB9B,SAASq1C,WAEjBr1C,SAASq1C,UAAUkY,Q,cCwBvB,MAAMC,GAAoB1hD,GACjB,IAAIA,EAAIo3B,UAAUpS,OAAO,CAACC,EAAKoT,IAAMpT,EAAMoT,EAAE5hC,KAAM,GAK5D,MAAM,WAAqB,IA+BzB,YAAYxD,GAmBV,GANAC,OAAM,GAzCD,KAAAyuD,aAAyC,IAAI96C,IAC7C,KAAA2iC,aAAc,EAiXd,KAAAgY,gBAAmBI,IACrBA,IAAcruD,KAAKquD,cAAe,GACrCruD,KAAKsuD,mBAAqBtuD,KAAKsuD,oBAC/BtuD,KAAKouD,aAAaz/C,QAClB3O,KAAKuuD,kBACLN,KACGI,IAAcruD,KAAKquD,kBAAehmD,IA7UrC,OAAAS,EAAA,GAAW9I,KAAMN,GAEjBM,KAAK6S,eAAiB,eAAiB,eAEpC,KA0BD,OAzBA7S,KAAK6R,eAAehR,IAAIb,KAAKwuD,cAA7BxuD,CAA4C,WAAY,KAClDA,KAAKi2C,cACTj2C,KAAKyuD,aC5FRvsD,OAAOC,aACDD,OAAOC,eAAeusD,WAErB/tD,SAASq1C,UAEVr1C,SAASq1C,UAAU5zC,cAAck2B,KAGnC,WDuFH,aAA0Bt4B,KAAKwuD,cAAgBzuD,IAC7C,GAAGC,KAAKi2C,aAAgBj2C,KAAK2uD,uBAAyB3uD,KAAK2uD,uBAAyB,OAGpFhuD,SAASgC,KAAKzC,UAAUW,IAAI,aAC5Bb,KAAKwuD,cAAcltD,iBAAiB,WAAavB,IAC/C,OAAAiqB,EAAA,GAAYjqB,GACZY,SAASgC,KAAKzC,UAAUoE,OAAO,cAG9B,CAACua,MAAM,EAAM4Q,SAAS,IAEzBw+B,KAEA,MAAMlzC,EAAU/a,KAAK4uD,qBAAqB7uD,EAAE2a,QACzCK,GACD/a,KAAKk2C,gBAAgBn7B,IAEtB/a,KAAK6R,gBAKV,MAAMg9C,EAAqB,CAACl6B,EAAoBm6B,KAC9C,GAAGn6B,IAAUm6B,EACX,MAAO,GAGT,MAAMC,EAAYp6B,EAAMjQ,wBAClBsqC,EAAWF,EAAKpqC,wBAEhBuqC,GADcF,EAAUr2B,IAAMs2B,EAASt2B,KAASq2B,EAAUppC,KAAOqpC,EAASrpC,MAClD,EAExBupC,EAAS,OAAApkC,GAAA,GAAgB6J,EAAO30B,KAAKmvD,8BAC3C,IAAID,EACF,MAAO,GAGT,MAAM7jC,EAAWlf,MAAMC,KAAK8iD,EAAOx7C,iBAAiB1T,KAAKovD,6BACzD,IAAIC,EAAahkC,EAASlG,QAAQwP,GAC9B26B,EAAYjkC,EAASlG,QAAQ2pC,GAE7BG,KACDK,EAAWD,GAAc,CAACA,EAAYC,IAOzC,OAJcjkC,EAAS1lB,MAAM0pD,EAAa,EAAGC,IAO/CtvD,KAAK6R,eAAehR,IAAIb,KAAKwuD,cAA7BxuD,CAA4C,YAAcD,IAExD,MAAMgb,EAAU,OAAA+P,GAAA,GAAgB/qB,EAAE2a,OAAQ1a,KAAKuvD,uBAC/C,GAAgB,IAAbxvD,EAAE2jB,OACH,OAGF,GAAG1jB,KAAKwvD,eAAiBxvD,KAAKwvD,aAAazvD,EAAGgb,GAC5C,OAGF,MAAM00C,EAAqC,IAAIn8C,IAC/C,IAAIo8C,EAaAC,EAAc50C,EAElB,MAAM60C,EAAiB,CAAC70C,EAAsB80C,GAAe,KAC3D,MAAMhlD,GAAOkQ,EAAQ7T,QAAQ2D,IAC7B,IAAIA,IAAQkQ,EAAQ7T,QAAQ+D,OAAQ,OACpC,MAAMA,EAAS8P,EAAQ7T,QAAQ+D,OAAOsgB,WAElC,OAAA+1B,GAAA,GAAQqO,KACVA,EAAc50C,GAGhB,IAAI+0C,EAAUL,EAAK97C,IAAI1I,GAKvB,GAJI6kD,GACFL,EAAKj1C,IAAIvP,EAAQ6kD,EAAU,IAAInoD,MAG7BmoD,EAAQnkD,IAAId,GAAM,CACpB,MAAMklD,EAAa/vD,KAAKgwD,cAAc/kD,EAAQJ,GAQ9C,QAPiBxC,IAAdqnD,IAEDA,GAAaK,GAGfD,EAAQjvD,IAAIgK,GAER6kD,IAAcK,IAAiBL,GAAaK,EAAa,CAC3D,MAAME,EAAa9B,GAAiBsB,GACpC,GAAGzvD,KAAKk2C,iBAAmB2Z,EAAc,CACpCI,EAAa,GACX,OAAAC,GAAA,GAAcn1C,EAAS40C,KACxBA,EAAc50C,GAIlB,MAAMo1C,EAAkBtB,EAAmBc,EAAa50C,GAErDo1C,EAAgBxuD,QACjBwuD,EAAgB5lD,QAAQwQ,IACtB60C,EAAe70C,GAAS,KAK9B,GAAI/a,KAAKouD,aAAalrD,KAQZlD,KAAKk2C,iBACbl2C,KAAKk2C,gBAAgBn7B,QARrB,GAAkB,IAAfk1C,GAAoBjwD,KAAKowD,YAC1B,IAAI,MAAOnlD,EAAQgB,KAASwjD,EAC1B,IAAI,MAAM5kD,KAAOoB,EACfjM,KAAKowD,YAAYnlD,EAAQJ,MAYvC,IAAIwlD,GAAoB,EACxB,MAAMntC,EAAenjB,IACfswD,IACFpC,KACAoC,GAAoB,GAYtB,MAAMt1C,EAAU/a,KAAK4uD,qBAAqB7uD,EAAE2a,QAC5C,GAAIK,EAKJ,OAAG/a,KAAKswD,wBAA0BtwD,KAAKswD,sBAAsBvwD,EAAGgb,EAAS20C,IACvE1vD,KAAK6R,eAAe0+C,aAAavwD,KAAKwuD,cAAe,YAAatrC,QAClEljB,KAAK6R,eAAe0+C,aAAa5vD,SAAU,UAAW6iB,EAAWgtC,SAInEZ,EAAe70C,IAGXyI,EAAazjB,IACd0vD,EAAKvsD,MACN,YAAiBhB,OAAQ8nB,EAAA,EAAa,CAACyF,SAAS,EAAM5Q,MAAM,EAAMqF,SAAS,IAG7ElkB,KAAK6R,eAAe0+C,aAAavwD,KAAKwuD,cAAe,YAAatrC,GAIlE+qC,MAGIuC,EAA0B,CAAC3xC,MAAM,GACvC7e,KAAK6R,eAAehR,IAAIb,KAAKwuD,cAA7BxuD,CAA4C,YAAakjB,GACzDljB,KAAK6R,eAAehR,IAAIF,SAAxBX,CAAkC,UAAWwjB,EAAWgtC,KAIlD,0BAA0Bz1C,GAClC,OAAO/a,KAAKgwD,cAAcj1C,EAAQ7T,QAAQ+D,OAAOsgB,YAAaxQ,EAAQ7T,QAAQ2D,KAGtE,eAAekQ,EAAsBuc,GAC7Cvc,EAAQ/Z,QAAQs2B,EAAcvxB,OAGzB,sBAAsBgV,EAAsBqiB,GACjD,MAAMqzB,IAAgBzwD,KAAK0wD,4BAA4B31C,GACvD,GAAGqiB,EAAM,CACP,GAAGqzB,EACD,OAAO,EAGT,MAAMn5B,EAAgB,IAAI,KAAc,CACtC92B,KAAMua,EAAQ7T,QAAQ2D,IACtB9F,OAAO,IAIN/E,KAAKi2C,aACHj2C,KAAK2wD,0BAA0B51C,KAChCuc,EAAcl3B,MAAM+2B,SAAU,EAC9Bpc,EAAQ7a,UAAUW,IAAI,gBAI1Bb,KAAK4wD,eAAe71C,EAASuc,QACrBm5B,GACRzwD,KAAK0wD,4BAA4B31C,GAASha,cAAcuD,SAG1D,OAAO,EAGC,4BAA4ByW,G,MACpC,MAA8C,WAAd,QAAzB,EAAAA,EAAQkR,yBAAiB,eAAEqmB,UAChCv3B,EAAQkR,kBAAkBA,kBAGpB,gBAAgB4kC,GAAiB,GACzC,MAAM3tD,EAAOlD,KAAKouD,aAAalrD,KAC/B,IAAIA,IAAS2tD,EAAgB,OAE7B,IAAIC,GAAe5tD,EACjB6tD,GAAc7tD,EACd8tD,GAAY9tD,EACd,IAAI,MAAO+H,EAAQgB,KAASjM,KAAKouD,aAAc,CAC7C,MAAMrhD,EAAU/M,KAAKgN,YAAchN,KAAKixD,mBAAmBhkD,4BAA4BhC,GAAUjL,KAAKixD,mBAAmB/jD,mBAAmBjC,GAC5I,IAAI,MAAMJ,KAAOoB,EAAM,CACrB,MAAMlE,EAAU/H,KAAKixD,mBAAmBC,sBAAsBnkD,EAASlC,GASvE,GARIimD,IACFA,GAAe9wD,KAAKixD,mBAAmBE,WAAWppD,IAGhDgpD,IACFA,GAAc/wD,KAAKixD,mBAAmBG,iBAAiBrpD,IAGtD+oD,GAAeC,EAAY,MAGhC,GAAGD,GAAeC,EAAY,MAGhC/wD,KAAKqxD,mBAAqBrxD,KAAKqxD,kBAAkBP,EAAaC,EAAYC,GAGrE,gBAAgBM,GAAmB,EAAMT,GAAiB,GAC/D,MAAMU,EAAevxD,KAAKi2C,YACpB/yC,EAAOlD,KAAKouD,aAAalrD,KAG/B,GAFAlD,KAAKi2C,cAAgB/yC,GAAQ2tD,EAE1BU,IAAiBvxD,KAAKi2C,YAAa,OAAO,EAE7Cj2C,KAAKsS,cAAc,SAAUtS,KAAKi2C,aAY9B,OACFj2C,KAAKwuD,cAActuD,UAAUC,OAAO,YAAaH,KAAKi2C,aAEnDsb,GAEDtD,MAaJ,OAAAuD,GAAA,KAEA,MAAMC,IAAavuD,GAAQ2tD,EAoB3B,OAnBA7wD,KAAK0xD,mBAAqB1xD,KAAK0xD,kBAAkBD,GAAWzxD,KAAKquD,cAE7D,OACCoD,EACD9+C,EAAA,EAAwBmB,SAAS,CAC/BzT,KAAML,KAAK6S,eACXkB,MAAO,KACL/T,KAAKiuD,qBAITt7C,EAAA,EAAwB6B,aAAaxU,KAAK6S,iBAI3Cg+C,GACD7wD,KAAK2xD,gBAAgBd,IAGhB,EAYF,UACL7wD,KAAKquD,cAAe,EACpBruD,KAAKouD,aAAaz/C,QAClB3O,KAAKuuD,iBAAgB,GACrBvuD,KAAKquD,kBAAehmD,EAGZ,uBAAuB0S,EAAsBg1C,GACrD/vD,KAAK4xD,sBAAsB72C,GAAS,GACtB/a,KAAK0wD,4BAA4B31C,GACzCoc,QAAU44B,EAEhB/vD,KAAKuuD,kBACLvuD,KAAK2xD,kBACL,aAAc52C,EAAS,cAAeg1C,EAAY,KAG7C,cAAc9kD,EAAgBJ,GACnC,MAAM2P,EAAMxa,KAAKouD,aAAaz6C,IAAI1I,GAClC,OAAOuP,aAAG,EAAHA,EAAK7O,IAAId,GAGX,SACL,OAAOsjD,GAAiBnuD,KAAKouD,cAGrB,UAAUnjD,EAAgBJ,EAAagnD,GAC/C,IAAIr3C,EAAMxa,KAAKouD,aAAaz6C,IAAI1I,GAChC,GAAG4mD,QAA0BxpD,IAAbwpD,IAA0Br3C,aAAG,EAAHA,EAAK7O,IAAId,IAC9C2P,IACDA,EAAIrI,OAAOtH,GAEP2P,EAAItX,MACNlD,KAAKouD,aAAaj8C,OAAOlH,QAGxB,CAEL,GADa2B,EAAA,EAAUklD,OAAOC,oBAAsB/xD,KAAK2B,SAAW,EAC1D,EAER,OADAg4B,GAAM,IAAK9iB,OAAO,6BAA6B,KACxC,EAgBL2D,IACFA,EAAM,IAAI7S,IACV3H,KAAKouD,aAAa5zC,IAAIvP,EAAQuP,IAGhCA,EAAI3Z,IAAIgK,GAGV,OAAO,EAMF,mBAAmBI,EAAgBgB,GACxC,MAAMuO,EAAMxa,KAAKouD,aAAaz6C,IAAI1I,GAC9BuP,IAIJvO,EAAK1B,QAAQM,IACX2P,EAAIrI,OAAOtH,KAGT2P,EAAItX,MACNlD,KAAKouD,aAAaj8C,OAAOlH,GAG3BjL,KAAK2xD,kBACL3xD,KAAKuuD,oBAIF,MAAM,WAAwB,GASnC,YAAoB9Z,EAA6Bwc,GAC/CtxD,MAAM,CACJsxD,qBACAzC,cAAe/Z,EAAYrzC,UAC3ByQ,eAAgB,IAAI,IACpB29C,aAAc,CAACzvD,EAAG2a,MAAaA,GAAU1a,KAAKi2C,YAC9C2Y,qBAAuBl0C,GAAW,OAAAoQ,GAAA,GAAgBpQ,EAAQ,qBAC1D60C,sBAAuB,oBACvBJ,6BAA8B,WAC9BC,2BAA4B,uBATZ,KAAA3a,cAsCb,KAAAyB,gBAAmBn7B,IACxB,MAAMlQ,GAAOkQ,EAAQ7T,QAAQ2D,IACvBI,EAAS8P,EAAQ7T,QAAQ+D,OAAOsgB,WAElCvrB,KAAKgyD,UAAU/mD,EAAQJ,IAI3B7K,KAAKiyD,uBAAuBl3C,EAAS/a,KAAKgwD,cAAc/kD,EAAQJ,KAG3D,KAAAulD,YAAc,CAACnlD,EAAgBJ,KACpC,MAAMkQ,EAAU/a,KAAKy0C,YAAYa,SAAS4c,WAAWz+C,cAAc,oCAAoCxI,iBAAsBJ,OAC7H7K,KAAKk2C,gBAAgBn7B,IAGb,KAAAs2C,kBAAoB,CAACP,EAAsBC,EAAqBC,KACxE,MAAMrvD,EAAS3B,KAAK2B,SACpB,OAAA8O,EAAA,GAAezQ,KAAKmyD,iBAAkB,YAAK,WAAY,CAACxwD,KACxD3B,KAAKoyD,iBAAiBlyD,UAAUC,OAAO,OAAmB,IAAXwB,GAC/C3B,KAAKqyD,oBAAoBnyD,UAAUC,OAAO,OAAQ2wD,GAClD9wD,KAAKsyD,oBAAsBtyD,KAAKsyD,mBAAmBpyD,UAAUC,OAAO,OAAQ4wD,IAGpE,KAAAW,kBAAoB,CAACD,EAAmBz+C,KAchD,GAbA,aAAchT,KAAKy0C,YAAY8d,uBAAwB,eAAgBd,EAAUz+C,EAAU,IAAM,EAAG,KAC9FhT,KAAKi2C,cACPj2C,KAAKwyD,mBAAmBluD,SACxBtE,KAAKwyD,mBACHxyD,KAAKqyD,oBACLryD,KAAKsyD,mBACL,KACFtyD,KAAKyuD,kBAAepmD,KAIxB,aAAcrI,KAAKy0C,YAAYrzC,UAAW,eAAgBqwD,EAAU,KAEjEzxD,KAAKi2C,cACFj2C,KAAKwyD,mBAAoB,CAC3B,MAAMvjB,EAAa,yBACnBjvC,KAAKwyD,mBAAqB7xD,SAASC,cAAc,OACjDZ,KAAKwyD,mBAAmBtyD,UAAUW,IAAIouC,EAAa,cAEnD,MAAMwjB,EAAY,EAAW,SAASxjB,WAAqB,CAACx9B,UAAU,IACtEzR,KAAK6R,eAAehR,IAAI4xD,EAAxBzyD,CAAmC,QAAS,IAAMA,KAAKiuD,kBAAmB,CAACpvC,MAAM,IAEjF7e,KAAKmyD,iBAAmBxxD,SAASC,cAAc,OAC/CZ,KAAKmyD,iBAAiBjyD,UAAUW,IAAIouC,EAAa,UAEjDjvC,KAAKoyD,iBAAmB,EAAW,WAAWnjB,UAE9C,MAAMyjB,EAAyC,CAAC7gD,eAAgB7R,KAAK6R,gBACrE,YAAiB7R,KAAKoyD,iBAAkB,KACtC,MAAMnnD,EAAS,IAAIjL,KAAKouD,aAAauE,QAAQ,GACvC9nD,EAAM,IAAI7K,KAAKouD,aAAaz6C,IAAI1I,IAAS,GAC/CjL,KAAKiuD,kBAELrhD,EAAA,EAAU0F,cAAc,gBAAiB,CACvCrH,SACAJ,SAED6nD,GAEH1yD,KAAKqyD,oBAAsB,EAAW,WAAWpjB,aACjD,YAAiBjvC,KAAKqyD,oBAAqB,KACzC,MAAMtmD,EAAwC,GAC9C,IAAI,MAAO6mD,EAAY3mD,KAASjM,KAAKouD,aACnCriD,EAAI6mD,GAAczmD,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAGxD,IAAI,GAAaR,EAAK,KACpB/L,KAAKiuD,qBAENyE,GAEA1yD,KAAK6yD,YACN7yD,KAAKsyD,mBAAqB,EAAW,iBAAiBrjB,YACtD,YAAiBjvC,KAAKsyD,mBAAoB,KACxC,MAAMrnD,EAAS,IAAIjL,KAAKouD,aAAauE,QAAQ,GAC7C,IAAI,GAAoB1nD,EAAQ,IAAIjL,KAAKouD,aAAaz6C,IAAI1I,IAAU,OAAQ,KAC1EjL,KAAKiuD,qBAENyE,IAGL1yD,KAAKwyD,mBAAmBnxD,UAAU,CAChCoxD,EACAzyD,KAAKmyD,iBACLnyD,KAAKoyD,iBACLpyD,KAAKqyD,oBACLryD,KAAKsyD,oBACL1mD,OAAOc,UAET,MAAMomD,EAAoB9yD,KAAKwyD,mBAC/BM,EAAkB3tD,MAAM4tD,QAAU,IAClC/yD,KAAKy0C,YAAY8d,uBAAuBlxD,OAAOyxD,GAE1CA,EAAkBtiB,WACvBsiB,EAAkB3tD,MAAM4tD,QAAU,KA7HtC/yD,KAAK6yD,WAAape,EAAY9oB,WAazB,gBAAgB2lC,GAAmB,EAAMT,GAAiB,GAC/D,MAAMrjD,EAAM7N,MAAM4uD,gBAAgB+C,EAAkBT,GAEpD,GAAGrjD,GAAO8jD,EAAkB,CACTnlD,MAAMC,KAAKpM,KAAKy0C,YAAYlhC,cAAcG,iBAAiB,uBACnEnJ,QAAQwQ,IACf/a,KAAK4xD,sBAAsB72C,EAAS/a,KAAKi2C,eAI7C,OAAOzoC,GA4GI,MAAM,WAAsB,GAUzC,YAAoBojB,EAAoBC,EAA8BzwB,EAAkB6wD,GACtFtxD,MAAM,CACJsxD,qBACAzC,cAAe39B,EAAQstB,iBACvBtsC,eAAgBgf,EAAQhf,eACxB+8C,qBAAuBl0C,GAAW,OAAAoQ,GAAA,GAAgBpQ,EAAQ,iBAAmB,OAAAoQ,GAAA,GAAgBpQ,EAAQ,UACrG80C,aAAc,CAACzvD,EAAG2a,OAGH1a,KAAKouD,aAAalrD,OACxBnD,EAAE2a,OAAuBxa,UAAUuV,SAAS,YAC5C1V,EAAE2a,OAAuBxa,UAAUuV,SAAS,uBAC9CiF,GAIP41C,sBAAuB,CAACvwD,EAAGgb,EAAS20C,MACtB3vD,EAAE2a,SAAWK,IACrBhb,EAAE2a,OAAuBxa,UAAUuV,SAAS,4BAChCpN,IAAdqnD,IACC1vD,KAAKouD,aAAalrD,MAGvByrD,qBAAsB,KAAO3uD,KAAK4wB,KAAKxwB,MAAM4yD,UAC7CzD,sBAAuB,SACvBJ,6BAA8B,gBAC9BC,2BAA4B,qDAC5BpiD,YAA2B,cAAd4jB,EAAKvwB,OA3BF,KAAAuwB,OAAoB,KAAAC,UAA8B,KAAAzwB,QAoE/D,KAAA81C,gBAAmBqS,IACxB,IAAIvoD,KAAKizD,gBAAgB1K,GAAS,OAElC,MAAM19C,GAAO09C,EAAOrhD,QAAQ2D,IAG5B,GADkB09C,EAAOroD,UAAUuV,SAAS,cAC9B,CACZ,IAAIzV,KAAKkzD,wBAAwB3K,GAAS,CACxC,MAAM/tC,EAAMxa,KAAKouD,aAAaz6C,IAAI3T,KAAK6wB,QAAQ5lB,QAC/C,GAAGuP,EAAK,CACOxa,KAAK4wB,KAAKuiC,aAAatoD,GAC/BN,QAAQM,GAAO2P,EAAIrI,OAAOtH,KAKnC,YADA7K,KAAK6wB,QAAQuiC,sBAAsB7K,GAAQh+C,QAAQvK,KAAKk2C,iBAI1D,IAAIl2C,KAAKgyD,UAAUhyD,KAAK6wB,QAAQ5lB,OAAQJ,GACtC,OAIF,GADsB09C,EAAOroD,UAAUuV,SAAS,gBAC9B,CAChB,MAAM49C,EAAiB,OAAAvoC,GAAA,GAAgBy9B,EAAQ,UACzC+K,EAAoBtzD,KAAKkzD,wBAAwBG,GACjDE,EAAwBvzD,KAAKuzD,sBAAsB1oD,IAEtC0oD,GAAyBD,IAE1CtzD,KAAKiyD,uBAAuBoB,EAAgBE,GAIhDvzD,KAAKiyD,uBAAuB1J,EAAQvoD,KAAKgwD,cAAchwD,KAAK6wB,QAAQ5lB,OAAQJ,KAGpE,KAAAulD,YAAc,CAACnlD,EAAgBJ,KACvC,MAAM2oD,EAAUxzD,KAAK6wB,QAAQ4iC,iBAAiB5oD,GAC3C2oD,GACDxzD,KAAKk2C,gBAAgBsd,EAAQjL,SAgDvB,KAAAmJ,kBAAoB,CAACD,EAAmBz+C,KAChD,MAAM,eAAC0gD,EAAc,UAAEC,EAAS,QAAEC,GAAW5zD,KAAK4wB,KAAKxwB,MAAMyzD,OAAO7gD,GAEpE,aAAchT,KAAKwuD,cAAe,eAAgBiD,EAAUz+C,EAAU,IAAM,EAAG,KACzEhT,KAAKi2C,cACPj2C,KAAK8zD,sBAAsBxvD,SAC3BtE,KAAK8zD,sBACH9zD,KAAKwyD,mBACLxyD,KAAK+zD,oBACL/zD,KAAKqyD,oBACLryD,KAAKsyD,mBACLtyD,KAAKg0D,cACLh0D,KAAKi0D,eACL,KACFj0D,KAAKyuD,kBAAepmD,KAUxB,MAAM6rD,EAAoBP,EAAYC,OAAUvrD,EAA6B,EAAjBqrD,EAC5D,GAAG1zD,KAAKi2C,aACN,IAAIj2C,KAAKwyD,mBAAoB,CAC3BxyD,KAAK8zD,sBAAwBnzD,SAASC,cAAc,OACpDZ,KAAK8zD,sBAAsB5zD,UAAUW,IAAI,qBAAsB,qBAK/Db,KAAKwyD,mBAAqB7xD,SAASC,cAAc,OACjDZ,KAAKwyD,mBAAmBtyD,UAAUW,IAAI,uBAEtC,MAAM6xD,EAAyC,CAAC7gD,eAAgB7R,KAAK6R,gBAC/D4gD,EAAY,EAAW,QAAS,CAAChhD,UAAU,IACjD,YAAiBghD,EAAW,IAAMzyD,KAAKiuD,kBAAmB,CAACpvC,MAAM,EAAMhN,eAAgB7R,KAAK6R,iBAE5F7R,KAAKmyD,iBAAmBxxD,SAASC,cAAc,OAC/CZ,KAAKmyD,iBAAiBjyD,UAAUW,IAAI,6BAEd,cAAnBb,KAAK4wB,KAAKvwB,MACXL,KAAK+zD,oBAAsB,YAAO,2EAA4E,CAAC5iD,KAAM,UACrHnR,KAAK+zD,oBAAoB1yD,OAAO,YAAK,wBACrC,YAAiBrB,KAAK+zD,oBAAqB,KACzC,IAAI,GAAa/zD,KAAK6wB,QAAQ5lB,OAAQ,IAAIjL,KAAKouD,aAAaz6C,IAAI3T,KAAK6wB,QAAQ5lB,SAAU,KACrFjL,KAAKiuD,qBAENyE,KAEH1yD,KAAKqyD,oBAAsB,YAAO,oEAAqE,CAAClhD,KAAM,YAC9GnR,KAAKqyD,oBAAoBhxD,OAAO,YAAK,YACrC,YAAiBrB,KAAKqyD,oBAAqB,KACzC,MAAMtmD,EAAwC,GAC9C,IAAI,MAAO6mD,EAAY3mD,KAASjM,KAAKouD,aACnCriD,EAAI6mD,GAAczmD,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAGxD,IAAI,GAAaR,EAAK,KACpB/L,KAAKiuD,qBAENyE,IAGL1yD,KAAKsyD,mBAAqB,YAAO,0EAA2E,CAACnhD,KAAM,WACnHnR,KAAKsyD,mBAAmBjxD,OAAO,YAAK,WACpC,YAAiBrB,KAAKsyD,mBAAoB,KACxC,IAAI,GAAoBtyD,KAAK6wB,QAAQ5lB,OAAQ,IAAIjL,KAAKouD,aAAaz6C,IAAI3T,KAAK6wB,QAAQ5lB,SAAUjL,KAAK4wB,KAAKvwB,KAAM,KAC5GL,KAAKiuD,qBAENyE,GAEH,MAAM/sC,EAAO3lB,KAAKg0D,cAAgBrzD,SAASC,cAAc,OACzD+kB,EAAKzlB,UAAUW,IAAI,4BACnB8kB,EAAKtkB,OAAOoxD,EAAWzyD,KAAKmyD,kBAE5B,MAAM7hB,EAAQtwC,KAAKi0D,eAAiBtzD,SAASC,cAAc,OAC3D0vC,EAAMpwC,UAAUW,IAAI,6BACpByvC,EAAMjvC,UAAU,CACdrB,KAAK+zD,oBACL/zD,KAAKqyD,oBACLryD,KAAKsyD,oBACL1mD,OAAOc,eAEgBrE,IAAtB6rD,IACDvuC,EAAKxgB,MAAMogB,UAAY,eAAe2uC,OACtC5jB,EAAMnrC,MAAMogB,UAAY,cAAc2uC,QAGxCl0D,KAAKwyD,mBAAmBnxD,OAAOskB,EAAM2qB,GAGrCtwC,KAAK8zD,sBAAsB3uD,MAAM4tD,QAAU,IAC3C/yD,KAAK8zD,sBAAsBzyD,OAAyBrB,KAAKwyD,oBACzDxyD,KAAKI,MAAM+zD,eAAe9yD,OAAOrB,KAAK8zD,uBAEjC9zD,KAAK8zD,sBAAsBtjB,WAEhCxwC,KAAK8zD,sBAAsB3uD,MAAM4tD,QAAU,GAC3CptC,EAAKxgB,MAAMogB,UAAY,GACvB+qB,EAAMnrC,MAAMogB,UAAY,SAElBvlB,KAAKg0D,oBAAuC3rD,IAAtB6rD,IAC9Bl0D,KAAKg0D,cAAc7uD,MAAMogB,UAAY,eAAe2uC,OACpDl0D,KAAKi0D,eAAe9uD,MAAMogB,UAAY,cAAc2uC,SAI9C,KAAA7C,kBAAoB,CAACP,EAAsBC,EAAqBC,KACxE,OAAAvgD,EAAA,GAAezQ,KAAKmyD,iBAAkB,YAAK,WAAY,CAACnyD,KAAK2B,YAC7D3B,KAAK+zD,qBAAuB/zD,KAAK+zD,oBAAoBr9B,gBAAgB,WAAYs6B,GACjFhxD,KAAKqyD,qBAAuBryD,KAAKqyD,oBAAoB37B,gBAAgB,WAAYo6B,GACjF9wD,KAAKsyD,mBAAmB57B,gBAAgB,WAAYq6B,IAG5C,KAAAzC,kBAAoB,KAC5B,IAAI,MAAOrjD,EAAQgB,KAASjM,KAAKouD,aAC/B,IAAI,MAAMvjD,KAAOoB,EAAM,CACrB,MAAMunD,EAAUxzD,KAAK6wB,QAAQ4iC,iBAAiB5oD,GAC3C2oD,GAEDxzD,KAAKk2C,gBAAgBsd,EAAQjL,UAzP9B,eAAeA,EAAqBjxB,GACzCA,EAAcvxB,MAAM7F,UAAUW,IAAI,0BAE/B0nD,EAAOroD,UAAUuV,SAAS,sBAC3B8yC,EAAO90C,cAAc,4BAA4BpS,OAAOi2B,EAAcvxB,OAEtEpG,MAAMixD,eAAerI,EAAQjxB,GAI1B,gBAAgBg6B,GAAmB,EAAMT,GAAiB,GAC/D,MAAMrjD,EAAM7N,MAAM4uD,gBAAgB+C,EAAkBT,GAEpD,GAAGrjD,GAAO8jD,EACR,IAAI,MAAMzmD,KAAO7K,KAAK6wB,QAAQA,QAAS,CACrC,MAAM03B,EAASvoD,KAAK6wB,QAAQA,QAAQhmB,GACpC7K,KAAK4xD,sBAAsBrJ,EAAQvoD,KAAKi2C,aAI5C,OAAOzoC,EAGF,sBAAsB+6C,EAAqBnrB,GAChD,IAAIp9B,KAAKizD,gBAAgB1K,GAAS,OAElC,MAAM/6C,EAAM7N,MAAMiyD,sBAAsBrJ,EAAQnrB,GAChD,GAAG5vB,EAAK,CACY+6C,EAAOroD,UAAUuV,SAAS,eAE1CzV,KAAK6wB,QAAQuiC,sBAAsB7K,GAAQh+C,QAAQnB,GAAQpJ,KAAK4xD,sBAAsBxoD,EAAMg0B,IAIhG,OAAO5vB,EAgDF,0BAA0BuN,GAC/B,MAAMq5C,EAAYr5C,EAAQ7a,UAAUuV,SAAS,cAC7C,OAAO9V,MAAMgxD,0BAA0B51C,MAAcq5C,GAAap0D,KAAKuzD,uBAAuBx4C,EAAQ7T,QAAQ2D,MAGtG,wBAAwB09C,GAChC,MAAM8L,EAAuBr0D,KAAK0wD,4BAA4BnI,GAC9D,OAAO8L,aAAoB,EAApBA,EAAsBl9B,QAGrB,sBAAsBtsB,GAC9B,MAAMoB,EAAOjM,KAAK4wB,KAAKuiC,aAAatoD,GAC9BujD,EAAeniD,EAAKL,OAAOf,GAAO7K,KAAKgwD,cAAchwD,KAAK6wB,QAAQ5lB,OAAQJ,IAChF,OAAOoB,EAAKtK,SAAWysD,EAAazsD,OAG5B,4BAA4B4mD,GAgBpC,OAAOA,EAAOroD,UAAUuV,SAAS,sBAC/B8yC,EAAO90C,cAAc,eACrB9T,MAAM+wD,4BAA4BnI,GAG/B,gBAAgBA,GACrB,QAAQA,EAAOroD,UAAUuV,SAAS,YAC/B8yC,EAAOroD,UAAUuV,SAAS,gBAC1B8yC,EAAOroD,UAAUuV,SAAS,iBAC1B8yC,EAAOroD,UAAUuV,SAAS,qB,yUE1uBjC,MAAM,GAQJ,YACU6+C,EACA7f,GADA,KAAA6f,WACA,KAAA7f,cAmGF,KAAA8f,YAAc,KACpB3nD,EAAA,EAAU0F,cAAc,gBAAiB,CACvCrH,OAAQjL,KAAKiL,OACbJ,IAAK7K,KAAK6K,IACVyE,SAAUtP,KAAKy0C,YAAY3pC,cAAcwE,YAIrC,KAAAklD,eAAiB,KACpBx0D,KAAKy0C,YAAYuB,UAAUC,YAC5B,YAAmBj2C,KAAKy0C,YAAYuB,UAAUqc,qBAE9C,IAAI,GAAa,CACf,CAACryD,KAAKiL,QAAS,CAACjL,KAAK6K,QAKnB,KAAA4pD,cAAgB,KACtBz0D,KAAKy0C,YAAYuB,UAAUE,gBAAgBl2C,KAAK0a,SAG1C,KAAAg6C,sBAAwB,KAC9B10D,KAAKy0C,YAAYuB,UAAUiY,mBAGrB,KAAA0G,cAAgB,KACnB30D,KAAKy0C,YAAYuB,UAAUC,YAC5B,YAAmBj2C,KAAKy0C,YAAYuB,UAAUsc,oBAE9C,IAAI,GAAoBtyD,KAAKiL,OAAQ,CAACjL,KAAK6K,KAAM,SA/HnD,MAAM+pD,EAAiB70D,IAMrB,IAAIqJ,EALDpJ,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAId,IACE5I,EAAO,OAAA0hB,GAAA,GAAgB/qB,EAAE2a,OAAQ,qBACjC,MAAM3a,IAER,GAAIqJ,EAAJ,CAGA,GADGrJ,aAAa+pB,YAAY/pB,EAAE0H,iBAC3BzH,KAAK+a,QAAQ7a,UAAUuV,SAAS,UACjC,OAAO,EAEN1V,aAAa+pB,aAAY/pB,EAAE80D,cAAe,GAE7C70D,KAAK0a,OAAStR,EACdpJ,KAAKiL,OAAS7B,EAAKlC,QAAQ+D,OAAOsgB,WAClCvrB,KAAK6K,KAAOzB,EAAKlC,QAAQ2D,IACzB7K,KAAK+vD,WAAatb,EAAYuB,UAAUga,cAAchwD,KAAKiL,OAAQjL,KAAK6K,KAExE7K,KAAKq7B,QAAQ9wB,QAAQmZ,IACnB,IAAI+oC,EAGFA,IADCzsD,KAAK+vD,aAAersC,EAAOoxC,kBAGrBpxC,EAAO5I,QAAS4I,EAAO5I,UAGhC4I,EAAO3I,QAAQ7a,UAAUC,OAAO,QAASssD,KAG3CrjD,EAAKlJ,UAAUW,IAAI,aAEnB,aAAad,EAAGC,KAAK+a,SACrB,aAAY/a,KAAK+a,QAAS,KACxB3R,EAAKlJ,UAAUoE,OAAO,iBAIvB,MAGD,aAA0BgwD,EAAUM,GAIhC,OACN50D,KAAKq7B,QAAU,CAAC,CACdlqB,KAAM,UACNmnB,KAAM,UACNopB,QAAS1hD,KAAKw0D,eACd15C,OAAQ,IAAM,IAAmBq2C,WAAW,IAAmB1wC,iBAAiBzgB,KAAKiL,OAAQjL,KAAK6K,OACjG,CACDsG,KAAM,UACNmnB,KAAM,oCACNopB,QAAS1hD,KAAKw0D,eACd15C,OAAQ,IAAM9a,KAAK+vD,aAChB/vD,KAAKy0C,YAAYuB,UAAUqc,oBAAoBnyD,UAAUuV,SAAS,QACrEq/C,eAAe,GACd,CACD3jD,KAAM,UACNmnB,KAAM,uBACNopB,QAAS1hD,KAAKu0D,YACdO,eAAe,GACd,CACD3jD,KAAM,SACNmnB,KAAM,yBACNopB,QAAS1hD,KAAKy0D,eACb,CACDtjD,KAAM,SACNmnB,KAAM,kCACNopB,QAAS1hD,KAAK00D,sBACd55C,OAAQ,IAAM9a,KAAK+vD,WACnB+E,eAAe,GACd,CACD3jD,KAAM,gBACNmnB,KAAM,SACNopB,QAAS1hD,KAAK20D,cACd75C,OAAQ,IAAM,IAAmBs2C,iBAAiB,IAAmB3wC,iBAAiBzgB,KAAKiL,OAAQjL,KAAK6K,OACvG,CACDsG,KAAM,gBACNmnB,KAAM,mCACNopB,QAAS1hD,KAAK20D,cACd75C,OAAQ,IAAM9a,KAAK+vD,aAAe/vD,KAAKy0C,YAAYuB,UAAUsc,mBAAmBpyD,UAAUuV,SAAS,QACnGq/C,eAAe,IAGjB90D,KAAK+a,QAAU,GAAW/a,KAAKq7B,SAC/Br7B,KAAK+a,QAAQ7a,UAAUW,IAAI,qBAAsB,eACjDF,SAASg2C,eAAe,cAAct1C,OAAOrB,KAAK+a,UA+CvC,MAAM,GAgEnB,YAAYrb,GA/DL,KAAAwS,KAAiD,GAUhD,KAAA6iD,WAAa,EAEb,KAAAzmC,cAAgB,IAAI,IACrB,KAAAkC,WAAa,eAEb,KAAA+lB,eAAwF,GACxF,KAAAT,gBAAgE,GAChE,KAAAkf,aAAyB,GAGzB,KAAA5e,UAA0B/wC,QAAQ6E,UAEjC,KAAA+qD,UAA0D,GAC1D,KAAA7mC,aAAoE,GACpE,KAAA+P,OAAwD,GACxD,KAAA+2B,aAAc,EACd,KAAAC,WAAY,EAEZ,KAAAjzC,IAAM,OAAAkzC,EAAA,GAAO,gBAGb,KAAAC,gBAOH,GAIE,KAAAC,aAA+D,IAAIhiD,IAUnE,KAAAiiD,YAAc,EACd,KAAAC,cAAgB,EAChB,KAAAC,eAAiB,EAEjB,KAAA9pC,YAAc,EA4Qb,KAAA+pC,kBAAoB,KAC1B11D,KAAKoB,UAAUlB,UAAUW,IAAI,YAGvB,KAAA80D,gBAAkB,KACxB31D,KAAKoB,UAAUlB,UAAUoE,OAAO,YAzQhC,OAAAwE,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,gBAE7Bb,KAAK41D,kBAAoB,IAAI,GAAkB51D,KAAKoB,UAAWpB,MAC/DA,KAAKg2C,UAAY,IAAI,GAAgBh2C,KAAM,KAE3C,MAAMuyD,EAAyBvyD,KAAKuyD,uBAAyB5xD,SAASC,cAAc,OACpF2xD,EAAuBryD,UAAUW,IAAI,+BAAgC,6BAA8B,UAEnG,MAAMg1D,EAAgB71D,KAAK61D,cAAgB,IAAI,IAAYtD,GAC3DsD,EAAcz0D,UAAUlB,UAAUW,IAAI,+BAEtC,MAAM6zC,EAAM10C,KAAK00C,IAAM/zC,SAASC,cAAc,OAC9C8zC,EAAIx0C,UAAUW,IAAI,oBAAqB,uBACvCb,KAAK81D,SAAWphB,EAEhBmhB,EAAcz0D,UAAUC,OAAOqzC,GAE/B,IAAI,MAAMY,KAAYt1C,KAAKo1C,UAAW,CACpC,MAAM2gB,EAAUp1D,SAASC,cAAc,OACvCm1D,EAAQ71D,UAAUW,IAAI,4BACtB,MAAMosC,EAAOtsC,SAASC,cAAc,QAC9BgB,EAAIjB,SAASC,cAAc,KAEjCqsC,EAAK5rC,OAAO,YAAKi0C,EAAS90C,OAC1BysC,EAAK5rC,OAAOO,GAEZm0D,EAAQ10D,OAAO4rC,GAEf,OAAA/U,GAAA,GAAO69B,GAEP/1D,KAAK81D,SAASz0D,OAAO00D,GAErB/1D,KAAKs1D,aAAa96C,IAAI86B,EAASj1C,KAAMi1C,GAErCA,EAASygB,QAAUA,EAMrB,IAAIC,EAHJh2D,KAAKuT,cAAgB5S,SAASC,cAAc,OAC5CZ,KAAKuT,cAAcrT,UAAUW,IAAI,8BAA+B,kBAG7D,MACDisD,GAAe,CACb/xC,QAAS/a,KAAKuT,cACdu7B,QAAS,CAACJ,EAAOC,EAAO5uC,KACtB,MAAMk2D,EAASj2D,KAAKiS,UAAUgkD,SACxB1lC,EAAWpkB,MAAMC,KAAKpM,KAAK81D,SAASvlC,UAC1C,IAAIvoB,EACJ,GAAG0mC,EAAQ,GACT,IAAI,IAAI9sC,EAAIq0D,EAAS,EAAGr0D,EAAI2uB,EAAS5uB,SAAUC,EAC7C,IAAI2uB,EAAS3uB,GAAG1B,UAAUuV,SAAS,QAAS,CAC1CzN,EAAMpG,EACN,YAIJ,IAAI,IAAIA,EAAIq0D,EAAS,EAAGr0D,GAAK,IAAKA,EAChC,IAAI2uB,EAAS3uB,GAAG1B,UAAUuV,SAAS,QAAS,CAC1CzN,EAAMpG,EACN,WAKKyG,IAARL,IACDguD,EC7WG,SAAyB50D,GACtC,MAAMuiB,EAAe5jB,IACnB,OAAAiqB,EAAA,GAAYjqB,IAGd,IAAIm2D,EAAU,EACd,MAAMv1C,EAAK,OACHu1C,GACJ90D,EAAUyM,oBAAoB,YAAa8V,EAAa,CAAC8L,SAAS,KAOtE,OAHAruB,EAAUE,iBAAiB,YAAaqiB,EAAa,CAAC8L,SAAS,EAAMvL,SAAS,IAC9E9iB,EAAUE,iBAAiB,WAAYqf,EAAI,CAAC9B,MAAM,IAE3C8B,ED8VkBw1C,CAAgBn2D,KAAKuT,eACpCvT,KAAKiS,UAAUjK,OAMvB,IAAI,MAAMstC,KAAYt1C,KAAKo1C,UAAW,CACpC,MAAMh0C,EAAYT,SAASC,cAAc,OACzCQ,EAAUlB,UAAUW,IAAI,0BAA4By0C,EAASj1C,KAAM,YAEnE,MAAMsR,EAAUhR,SAASC,cAAc,OACvC+Q,EAAQzR,UAAUW,IAAI,wBAA0By0C,EAASj1C,MAEzDe,EAAUC,OAAOsQ,GAEjB3R,KAAKuT,cAAclS,OAAOD,GAE1BpB,KAAKkS,KAAKojC,EAASnqC,aAAewG,EAElC2jC,EAAS4c,WAAavgD,EAGxB3R,KAAKoB,UAAUC,OAAOkxD,EAAwBvyD,KAAKuT,eAInDvT,KAAKo2D,iBAAmB,IAAI,GAAY,EAAO,YAAY,GAE3Dp2D,KAAKuP,WAAWK,iBAAmB,KAC9B5P,KAAKs1C,SAAS4c,aAAelyD,KAAKm+B,OAAOn+B,KAAKs1C,SAASnqC,cAExDnL,KAAKyJ,MAAK,IAKdzJ,KAAKiS,UAAY,OAAAokD,EAAA,GAAer2D,KAAK81D,SAAU91D,KAAKuT,cAAe,CAACR,EAAIujD,EAAYtjD,KAClF,GAAGhT,KAAK+0D,YAAchiD,IAAO/S,KAAKu2D,WAMhC,YALAv2D,KAAKuP,WAAWi0B,kBAAkB,CAChCzoB,QAAS/a,KAAKoB,UACdu3B,SAAU,QACV69B,cAAex2D,KAAKw1C,sBAKxB,MAAMihB,EAAcz2D,KAAKo1C,UAAUriC,GAChC/S,KAAKq1C,aACNr1C,KAAKq1C,YAAYohB,GAGnB,MAAMC,EAAe12D,KAAKs1C,SAO1B,GANAt1C,KAAKs1C,SAAWmhB,GAEO,IAApBz2D,KAAK+0D,WAAoB/hD,GAC1BhT,KAAK01D,oBAGJ11D,KAAKu2D,WACNv2D,KAAKu2D,YAAa,MACb,CACL,MAAMI,EAAY32D,KAAKoB,UAAUu1D,UACjC,IAAI5mB,EAAY/vC,KAAKuP,WAAWwgC,UAYhC,GAXGA,EAAY4mB,IACb32D,KAAKuP,WAAWi0B,kBAAkB,CAChCzoB,QAAS/a,KAAKoB,UACdu3B,SAAU,QACV69B,cAAex2D,KAAKw1C,sBAEtBzF,EAAY4mB,GAGdD,EAAapzB,OAAS,CAACyM,UAAWA,EAAW6mB,aAAc52D,KAAKuP,WAAWqnD,mBAEjDvuD,IAAvBouD,EAAYnzB,OAAsB,CACnC,MAAM7e,EAAOzkB,KAAKoB,UAAUsjB,wBACtBmyC,EAAQ72D,KAAKoB,UAAUL,cAAc2jB,wBACrC+Q,EAAOhR,EAAKnB,EAAIuzC,EAAMvzC,EAEzBysB,EAAYta,IACbghC,EAAYnzB,OAAS,CAACyM,UAAWta,EAAMmhC,aAAc,IAIzD,GAAGH,EAAYnzB,OAAQ,CACrB,MAAM7N,EAAOihC,EAAapzB,OAAOyM,UAAY0mB,EAAYnzB,OAAOyM,UAI7Dta,IAKCghC,EAAYvE,WAAW/sD,MAAMogB,UAAY,cAAckQ,UAaxC,IAApBz1B,KAAK+0D,WAAqB0B,EAAYvE,WAAWzjD,mBAElDzO,KAAKyJ,MAAK,GAGZzJ,KAAK+0D,UAAYhiD,GAChB,KACD/S,KAAKuP,WAAW83B,gBAGYh/B,IAAzBrI,KAAKs1C,SAAShS,SACftjC,KAAKs1C,SAAS4c,WAAW/sD,MAAMogB,UAAY,GAC3CvlB,KAAKuP,WAAWwgC,UAAY/vC,KAAKs1C,SAAShS,OAAOyM,WAGhDimB,IACDA,IACAA,OAAe3tD,GAGjBrI,KAAK21D,wBACJttD,EAAWwtD,GAEd,YAAiB71D,KAAKuT,cAAgBxT,IACjCC,KAAKg2C,UAAUC,cAChB,OAAAjsB,EAAA,GAAYjqB,GACZC,KAAKg2C,UAAUE,gBAAgB,OAAAprB,GAAA,GAAgB/qB,EAAE2a,OAAQ,wBAE1D,CAAC+U,SAAS,EAAMvL,SAAS,IAE5B,MAAM4yC,EAAe,CAAC9oD,EAAmB+oD,EAAyB5rD,EAAoCpL,KACpG,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAA0B1M,GAC3D,IAAI0M,EAAQ,OAEZ,MAAM7P,GAAO6P,EAAOxT,QAAQ2D,IAC5B,IAAIA,EAEF,YADA7K,KAAKkiB,IAAI3E,KAAK,mCAAoC7C,GAIpD,MAAMzP,EAASyP,EAAOxT,QAAQ+D,OAAOsgB,WAE/B/e,EAAWL,MAAMC,KAAKpM,KAAKkS,KAAK/G,GAAauI,iBAAiB,IAAMqjD,IAAoCtqD,IAAI3K,IAChH,MAAMqhC,EAAc,OAAArY,GAAA,GAAgBhpB,EAAIkM,GACxC,MAAO,CACL+M,QAASjZ,EACT+I,KAAMs4B,EAAYj8B,QAAQ2D,IAC1BI,OAAQk4B,EAAYj8B,QAAQ+D,OAAOsgB,cAKjCvjB,EAAMwE,EAAQ4O,UAAUhS,GAAQA,EAAKyB,MAAQA,GAAOzB,EAAK6B,SAAWA,GAEpElD,EAAU,IAAmB0Y,iBAAiBxV,EAAQJ,IAC5D,IAAI,IACHyC,iBAAiBtN,KAAKg3D,kBAAkB7rD,IACxC8rD,UAAUlvD,EAASyE,EAAQxE,GAAK+S,QAAS,GAAG,EAAOvO,EAAQ7G,MAAM,EAAGqC,GAAMwE,EAAQ7G,MAAMqC,EAAM,KAGjG,YAAiBhI,KAAKkS,KAAKglD,8BAA+BJ,EAAapwD,KAAK,KAAM,YAAa,YAAa,kCAC5G,YAAiB1G,KAAKkS,KAAKilD,4BAA6BL,EAAapwD,KAAK,KAAM,sBAAuB,kBAAmB,gCAc1H1G,KAAKs1C,SAAWt1C,KAAKo1C,UAAU,GAE/B,OAAAgiB,GAAA,GAAuB,KACrBp3D,KAAKsuB,cAAc+oC,QAClB,KACDr3D,KAAKsuB,cAAcgpC,qBAYhB,qBAAqB9nD,EAAiBnP,GAC3C,OAAO,IAAmBk3D,4BAA4Bl3D,EAAMmP,EAAUA,EAAS7N,QAGzE,oBAAmB,QAACoG,EAAO,YAAEiI,IACnC,MAAM,OAACkH,EAAM,IAAEF,GAAO,GAAkBC,aAAa,CACnDC,OAAQnP,EAAQkD,OAChB7J,UAAW4O,EAAY5B,KACvB+B,YAAY,EACZC,WAAY,KAGd,GAAkBonD,eAAetgD,EAAQnP,EAASiP,EAAKhX,KAAK8K,cAAcsE,OAGpE,yBAAwB,QAACrH,EAAO,SAAEi7B,EAAQ,WAAExS,EAAU,cAAEinC,IAC9D,MAAMh/C,EAAQ,IAAmBgG,oBAAoB1W,GAE/CipB,EAAMrwB,SAASC,cAAc,OAInC,IAAIotB,EAHJgD,EAAI9wB,UAAUW,IAAI,aAIlB,MAAMqC,EAAO,IAAiBiuB,gBAAgB1Y,EAAO,IAAK,KAExDuV,EADa,UAAZvV,EAAMrN,EACG20C,GAAU,CAClBlmC,IAAKpB,EACL1Q,UACA3G,UAAW4vB,EACX9C,SAAU,EACVC,UAAW,EACXG,cAAetuB,KAAKsuB,cACpBkC,aACA2vB,aAAa,EACb9xB,kBAAkB,EAClB+xB,cAAc,EACdl9C,SACCsrB,MAEOP,GAAU,CAClB9lB,MAAOsQ,EACP1Q,UACA3G,UAAW4vB,EACX9C,SAAU,EACVC,UAAW,EACXG,cAAetuB,KAAKsuB,cACpBkC,aACAnC,kBAAkB,EAClB+C,QAAQ,EACRluB,SAIJ,CAAC8qB,EAAQO,OAAOC,MAAOR,EAAQO,OAAOE,MAAM7iB,OAAOc,SAASnC,QAAQm6C,IAClEA,EAAMxkD,UAAUW,IAAI,qBAGtBmiC,EAASz5B,KAAKykB,EAAQI,aAAaI,OAEnCipC,EAAcluD,KAAK,CAACwR,QAASiW,EAAKjpB,YAG5B,uBAAsB,QAACA,EAAO,cAAE0vD,EAAa,YAAEtsD,IACrD,MAAMxK,EAAW,IAAmB8d,oBAAoB1W,GAClD4jB,EAAa3rB,KAAK2rB,YAAe,CAAC,QAAS,SAAkCsT,SAASt+B,EAASN,MAC/F2wB,EAAMkyB,GAAa,CACvBn7C,UACA0jB,UAAWE,EACXiB,WAAY,IACZlB,cAAc,EACdC,aACA7gB,cAAe9K,KAAKg3D,kBAAkB7rD,GACtCmjB,cAAetuB,KAAKsuB,cACpB+xB,iBAAkB,IAGhB,CAAC,QAAS,QAAS,SAAkCphB,SAASt+B,EAASN,OACzE2wB,EAAI9wB,UAAUW,IAAI,YAGpB42D,EAAcluD,KAAK,CAACwR,QAASiW,EAAKjpB,YAG5B,kBAAiB,QAACA,EAAO,SAAEi7B,EAAQ,WAAExS,EAAU,cAAEinC,I,MACvD,IAAI9mC,EAA6D,QAAlD,EAAA5oB,EAAQ0Q,aAA0C,eAAEkY,QAEnE,IAAIA,EAAS,CACX,MAAM+mC,EAAS3vD,EAAQ4vD,cAAgB5vD,EAAQ4vD,cAActjD,KAAMtU,GAAmB,qBAARA,EAAEqL,GAAoC,yBAARrL,EAAEqL,GAAgC,KAC9I,IAAIkP,EAAas9C,EAAqBC,EAEtC,GAAIH,EAUFG,EAAS9vD,EAAQA,QAAQpC,MAAM+xD,EAAOpjC,OAAQojC,EAAOpjC,OAASojC,EAAO/1D,YAV3D,CAEV,MAAM4W,EAAQ,IAAkBu/C,SAAS/vD,EAAQA,SACjD,IAAIwQ,EAEF,OAGF+B,EAAM/B,EAAM,GAMZ+B,EADe,0BAAdo9C,aAAM,EAANA,EAAQtsD,GACHssD,EAAOp9C,IAGPA,GAAOu9C,EAGfD,EAAct9C,EAEd,MAAMy9C,EAAOhwD,EAAQA,UAAYuS,EAC7BA,EAAI/B,MAAM,4BACZq/C,EAAc,WAAat9C,EAC3BA,EAAMA,EAAI2kB,SAAS,KAAO3kB,EAAM,WAAaA,GAG/Cs9C,EAAc,IAAIrO,IAAIqO,GAAaI,SAEnCrnC,EAAU,CACRvlB,EAAG,UACHkP,MACAs9C,cACA7kD,GAAI,GACJklD,KAAM,GAGJF,IACFpnC,EAAQmL,YAAc/zB,EAAQA,SAIlC,IAAImwD,EAAav3D,SAASC,cAAc,OAKxC,GAJAs3D,EAAWh4D,UAAUW,IAAI,UAAW,aAIjC8vB,EAAQxoB,MAAO,CACJ8lB,GAAU,CACpB7sB,UAAW82D,EACXnwD,QAAS,KACTI,MAAOwoB,EAAQxoB,MACf+lB,SAAU,EACVC,UAAW,EACXE,kBAAkB,EAClBC,cAAetuB,KAAKsuB,cACpBkC,aACAttB,KAAM,IAAiBiuB,gBAAgBR,EAAQxoB,MAAsB,GAAI,IAAI,GAC7EimB,aAAc4U,EACd5R,QAAQ,SAGV8mC,EAAWh4D,UAAUW,IAAI,SACzB,OAAAisB,EAAA,GAAaorC,EAAY,IAAkBC,gBAAgBxnC,EAAQjf,OAASif,EAAQinC,aAAejnC,EAAQmL,aAAenL,EAAQrW,KAAK,IAGzI,IAAI5I,EAAQ,KAAmB0mD,UAAUznC,GAEzC,MAAM0nC,EAAmB,KAAmBC,gBAAgB3nC,GAEtDrkB,EADY,OAAAisD,GAAA,GAAuB,IAAkB1kB,aAAaljB,EAAQrW,KAAO,KACnE2R,kBACpB,GAAG3f,aAAaksD,kBACd,IACElsD,EAAEshB,UAAY6qC,mBAAmBnsD,EAAEosD,MACnC,MAAMpoD,IAKP+nD,EAAiBM,YAClBN,EAAiBh3D,OAAO,MAG1Bg3D,EAAiBh3D,OAAOiL,GAErBtM,KAAK2rB,YACN0sC,EAAiBh3D,OAAO,KAAM,IAAmBorB,iBAAiB1kB,IAGhE2J,EAAM+e,aAER/e,EAAMrQ,OAAO,IAAkBuiD,cAAcjzB,EAAQinC,YAAYvU,MAAM,IAAK,GAAG,KAGjF,MAAMxtB,EAAM,IAAI,GAAI,CAClBnkB,QACAimB,WAAY,IAAmB5K,aAAahlB,GAC5CioB,SAAUqoC,EACV5gC,aAAa,EACbxpB,WAAW,EACXwD,UAAU,IAMZokB,EAAIz0B,UAAUC,OAAO62D,GAWlBriC,EAAIz0B,UAAUwsB,UAAU/d,OAAOlO,QAChC81D,EAAcluD,KAAK,CAACwR,QAAS8a,EAAIz0B,UAAW2G,YAInC,oBAAoByH,EAAiB8lC,EAA+Bj0C,GAAS,G,0CACxF,MAAMo2D,EAAwD,GACxDmB,EAA8BtjB,EAAS4c,WACvClvB,EAA2B,GAC3BxS,EAAaxwB,KAAKwwB,WAAW7c,MACnC,IAII3D,EAJA7E,EAAcmqC,EAASnqC,kBAErB,eAGa,kCAAhBA,GAAqDnL,KAAK8K,cAAcsE,MAAMS,QAC/E1E,EAAc,2BACd6E,EAAchQ,KAAKo2D,iBACnBwC,EAAev3D,OAAO2O,EAAY5O,YACV,6BAAhB+J,IACR6E,EAAchQ,KAAK6O,aAAaW,UAGlC,MAAM9P,EAAoC,CACxC+3D,gBACAtsD,cACApD,aAASM,EACTmoB,aACAwS,WACAhzB,eAGF,IAAI6oD,EAGJ,OAAO1tD,GACL,IAAK,2BACH0tD,EAAkB74D,KAAK84D,mBACvB,MAGF,IAAK,gCACHD,EAAkB74D,KAAK+4D,wBACvB,MAGF,IAAK,2BACL,IAAK,gCACL,IAAK,2BACL,IAAK,8BACHF,EAAkB74D,KAAKg5D,sBACvB,MAGF,IAAK,yBACHH,EAAkB74D,KAAKi5D,iBAS3B,GAAGJ,EAAiB,CAClBA,EAAkBA,EAAgBnyD,KAAK1G,MAEvC,IAAI,MAAM+H,KAAWyH,EACnB,IACE9P,EAAQqI,QAAUA,EAClB8wD,EAAgBn5D,GAChB,MAAM4Q,GACNtQ,KAAKkiB,IAAI1R,MAAM,yBAA0BrF,EAAazL,EAASqI,EAASuI,IAa9E,GARGN,GAAeA,EAAY5B,KAAKK,mBACjCuB,EAAYtB,YAGX1O,KAAKo2C,WACNpT,EAASz5B,KAAKvJ,KAAKo2C,YAGlBpT,EAASrhC,eACJ0D,QAAQC,IAAI09B,GACdxS,KAFN,CAQA,GAAGinC,EAAc91D,OAAQ,CACvB,MAAMk+B,EAASx+B,EAAS,SAAW,UACnCo2D,EAAcltD,QAAQ6O,IACpB,MAAM,QAAC2B,EAAO,QAAEhT,GAAWqR,EACrB8/C,EAAiBl5D,KAAKm5D,6BAA6Bn5D,KAAKw1D,aAAeztD,EAAQykB,KAAO,EAAGrhB,GAC/F4P,EAAQ7a,UAAUW,IAAI,qBACtBka,EAAQ7T,QAAQ2D,IAAM,GAAK9C,EAAQ8C,IACnCkQ,EAAQ7T,QAAQ+D,OAAS,GAAKlD,EAAQkD,OACtCiuD,EAAe/vD,MAAM02B,GAAQ9kB,GAE1B/a,KAAKg2C,UAAUC,aAChBj2C,KAAKg2C,UAAU4b,sBAAsB72C,GAAS,KAMlD/a,KAAKo5D,gBAAgC,6BAAhBjuD,EAA6C,EAAIqE,EAAS7N,OAAQi3D,OAInF,gBAAgBj3D,EAAgBuwD,GACtC,GAAGA,EAAY,CACb,MAAMhD,EAASgD,EAAWnxD,cAO1B,GANAoL,MAAMC,KAAK8iD,EAAO3+B,UAAU5qB,MAAM,GAAG4E,QAAQ8mB,IAC3CA,EAAM/sB,YAKJ3C,IAAWuwD,EAAWzjD,kBAAmB,CAC3C,MAAMuiB,EAAMrwB,SAASC,cAAc,OACnCowB,EAAIpD,UAAY,kCAChBoD,EAAI9wB,UAAUW,IAAI,kBAAmB,cAAe,gBAAiB,aAErEquD,EAAO7tD,OAAO2vB,KAKZ,YACN,MAAM0N,EAA+B,IAAI/2B,IACnC6oB,EAAaxwB,KAAKwwB,WAAW7c,MAEnC,IAAI,IAAI/R,KAAK5B,KAAK6O,aAAc,CAC9B,MAAMoiB,EAAQjxB,KAAK6O,aAAajN,GAChC5B,KAAKkS,KAAKmnD,yBAAyBh4D,OAAO4vB,EAAM7vB,WAChD6vB,EAAMtiB,QAGR,MAAMS,EAAQpP,KAAK8K,cAAcsE,MACjC,GAAGA,EAAO,CACR,MAAM2vC,EAAa,CAACvc,EAAmBvR,EAAoBqoC,GAAmB,KAC5E92B,EAAQj4B,QAASU,IACf,GAAGyzB,EAAgB/yB,IAAIV,GACrB,OAGFyzB,EAAgB79B,IAAIoK,GAEpB,MAAMq7B,EAAO,IAAgB3G,QAAQ10B,IAI/B,IAAC+L,GAAO,GAAkBC,aAAa,CAC3CC,OAAQjM,EACR7J,UAAW6vB,EAAM7iB,KACjB+B,YAAY,EACZC,WAAY,GACZlC,WAAY+iB,EAAM/iB,aAGpB,GAAGorD,IAAqBhzB,EAAKizB,oBAAsBjzB,EAAKzD,cAAe,CACrE,MAAM22B,EAAS,IAAIC,OAAO,IAAI,OAAAC,GAAA,GAAatqD,MAAU,OAAAsqD,GAAA,GAAa,OAAAC,GAAA,GAAgBvqD,OAAY,MAC9F4H,EAAI4iD,UAAUprD,UAAYwI,EAAI4iD,UAAUprD,UAAU9I,QAAQ8zD,EAAQ,aAClExiD,EAAII,gBAAgB/V,OAAO,UAAkBgiC,qBAAqBp4B,EAAO8vB,kBACpE,GAAG9vB,IAAW2B,EAAA,EAAU+R,KAC7B3H,EAAII,gBAAgB/V,OAAO,YAAK,0BAC3B,CACL,IAAIq5B,EAAW,IAAgB0Y,gBAAgBnoC,GAC/C,GAAIyvB,EAMFA,EAAW,IAAMA,MANL,CACZ,MAAM6Q,EAAO,IAAgBC,QAAQvgC,GAClCsgC,GAAQA,EAAKY,QACdzR,EAAW,IAAM,OAAAm/B,GAAA,GAAkBtuB,EAAKY,OAAOtlC,WAMnDmQ,EAAII,gBAAgB5I,UAAY,MAAQksB,EAAW,UAIvDzJ,EAAM9wB,UAGFotB,EAAausC,IACjB,GAAItpC,IAMJ,OAAOspC,GAGT,OAAOz0D,QAAQC,IAAI,CACjB,IAAgB68B,mBAAmB/yB,GAAO,GACzCzL,KAAK4pB,GACL5pB,KAAMk+B,IACFA,GACDkd,EAAWld,EAAU7hC,KAAK6O,aAAagzB,UAAU,KAIrD,IAAgBO,eAAehzB,EAAO,IACrCzL,KAAK4pB,GACL5pB,KAAMk+B,IACL,GAAGA,IACDkd,EAAWld,EAASU,WAAYviC,KAAK6O,aAAagzB,UAAU,GAC5Dkd,EAAWld,EAASW,QAA4ExiC,KAAK6O,aAAakrD,gBAElH/5D,KAAK6O,aAAakrD,eAAe34D,UAAUlB,UAAUW,IAAI,YAEtDb,KAAK6O,aAAakrD,eAAezrD,OAAO2qC,mBAAqBj5C,KAAK6O,aAAakrD,eAAezrD,OAAO2d,mBACtGjsB,KAAK6O,aAAakrD,eAAezrD,OAAO2qC,iBAAiB30C,SAGxDtE,KAAK6O,aAAakrD,eAAe3rD,KAAKK,kBAAoB,GAAG,CAC9D,MAAMuqC,EAAWr4C,SAASC,cAAc,OACxCo4C,EAAS94C,UAAUW,IAAI,2BACvB,MAAMm5D,EAAc,IAAI,IAAKC,YAAY,CACvC7yD,IAAK,uBAEP4xC,EAAS33C,OAAO24D,EAAYj/C,SAC5B/a,KAAK6O,aAAakrD,eAAezrD,OAAOjN,OAAO23C,GAC/C,YAAiBA,EAAU,KACzB,MAAMkhB,EAAUl6D,KAAK6O,aAAakrD,eAAe34D,UAAUlB,UAAUC,OAAO,YAC5E65D,EAAY5yD,IAAM8yD,EAAU,qBAAuB,qBACnDF,EAAYxzB,cAMpB,IAAmBpF,iBAAiBhyB,EAAO,EAAG,GAAI,GAAGhF,QACpDzG,KAAK4pB,GACL5pB,KAAKgB,IACDA,GACDo6C,EAAWp6C,EAAMm8B,QAAQr0B,IAAI80B,GAAKA,EAAEt2B,QAASjL,KAAK6O,aAAagzB,UAAU,OAI1E,GAAI7hC,KAAK8K,cAAcG,QAAWjL,KAAK8K,cAAcqvD,QA0DrD,OAAO90D,QAAQ6E,UA1D+C,CACnE,MAAMkwD,EAAqB,CAAC1rD,GAAY,IAC/BwqB,EAAA,EAAgBC,WAAWx1B,KAAKy1B,IACjC5I,MAIJxwB,KAAK6O,aAAawrD,OAAOjsD,KAAKI,UAAY,GAE1C4qB,EAAMkhC,aAAa30D,MAAM,EAAG,IAAI4E,QAAQU,IACtC,IAAI,OAACiM,EAAM,IAAEF,GAAO,GAAkBC,aAAa,CACjDC,OAAQjM,EACR7J,UAAWpB,KAAK6O,aAAawrD,OAAOjsD,KACpC+B,YAAY,EACZE,WAAW,EACXD,WAAY,GACZlC,YAAY,IAGd8I,EAAII,gBAAgB/V,OAAO4J,EAAO82B,SAAW,IAAgB1qB,oBAAoBpM,GAAU,UAAkBo4B,qBAAqBp4B,EAAO8vB,eAGvI3B,EAAMkhC,aAAa34D,OAEb+M,GACR1O,KAAK6O,aAAawrD,OAAO3rD,YAFzB1O,KAAK6O,aAAawrD,OAAO1rD,WAO/B,OAAOtJ,QAAQC,IAAI,CACjB,IAAgBi1D,YAAY,kBAAkB52D,KAAK62D,IACjD,IAAIhqC,IAAc,OAElB,MAAMxoB,EAAMwyD,EAAMp/C,UAAUkrB,GAAQA,EAAKvzB,KAAOnG,EAAA,EAAU+R,OAC9C,IAAT3W,IACDwyD,EAAQA,EAAM70D,SACRyC,OAAOJ,EAAK,GAGjBwyD,EAAM74D,QACP64D,EAAMjwD,QAAS+7B,IACb,GAAkBrvB,aAAa,CAC7BC,OAAQovB,EAAKvzB,GACb3R,UAAWpB,KAAK6O,aAAa4rD,OAAOrsD,KACpC+B,YAAY,EACZuqD,eAAe,EACftqD,WAAY,GACZlC,YAAY,MAKlBlO,KAAK6O,aAAa4rD,OAAO/rD,cAG3B0rD,OAKE,YAAY9kB,GAClB,MAAMviC,EAAK/S,KAAK8K,cAAcG,OAAO8vB,WAC/BvK,EAAaxwB,KAAKwwB,WAAW7c,MACnC,IAAIvJ,EAEJ,MAAMuwD,EAA2B93B,GAA2D,mCACvF7iC,KAAKo2C,kBACAp2C,KAAKo2C,WAEP5lB,OAKFxwB,KAAK46D,cACP56D,KAAK46D,YAAc,IAAI,GAAe,CAACtsC,cAAetuB,KAAKsuB,cAAenX,eAAe,IACzF,YAAiBnX,KAAK46D,YAAYxsD,KAAOrO,IACvC,MAAMmgC,EAAK,OAAA+F,GAAA,GAAUlmC,EAAE2a,OAAQ,MAC/B,IAAIwlB,EACF,OAGF,MAAMj1B,EAASi1B,EAAGh5B,QAAQ+D,OAAOsgB,WACjC,IAAInhB,EAAwB/E,QAAQ6E,UACjCie,EAAA,EAAWC,WACZhe,EAAU,GAAgB4sC,eAAc,IAG1C5sC,EAAQzG,KAAK,KACX,GAAa4pD,aAAa,CAACtiD,eAG/BqqC,EAAS4c,WAAW7wD,OAAOrB,KAAK46D,YAAYxsD,MAC5CpO,KAAKo5D,gBAAgB,EAAG9jB,EAAS4c,aAGnCrvB,EAAat4B,QAAQu4B,IACnB,MAAM73B,EAAS,IAAgB83B,qBAAqBD,GACpD,GAAG73B,EAAOm4B,YACR,OAGW,IAAgBoI,QAAQvgC,GAC7BsT,OAAOqhB,SAIf5/B,KAAK46D,YAAY/5D,IAAIoK,SAIzB,GAAG,IAAgBi8B,UAAUn0B,GAAK,CAChC,MAAM8nD,EAAc76D,KAAK46D,YAAmB,IAAL,GACvCxwD,EAAU,UAAkBu4B,uBAAuB5vB,OAAI1K,EAAWwyD,EAAY76D,KAAKi1D,UAAU3f,EAASnqC,cAAcxH,KAAKk/B,IACvH,IAAIrS,IACF,OAGF,IAAIpiB,EAAOknC,EAAS4c,WAAWjmC,kBAO/B,OANAjsB,KAAKi1D,UAAU3f,EAASnqC,cAAgBiD,EAAOA,EAAKK,kBAAoB,GAAKo0B,EAAaA,aAAalhC,OAEpGkhC,EAAaA,aAAalhC,OAASk5D,IACpC76D,KAAKm+B,OAAOmX,EAASnqC,cAAe,GAG/BwvD,EAAmB93B,EAAaA,qBAGzCz4B,EAAU/E,QAAQ6E,QAAQ,UAAkBk+B,YAAYr1B,IAAKpP,KAAKo5B,IAChE,IAAIvM,IACF,OAIFxwB,KAAKm+B,OAAOmX,EAASnqC,cAAe,EACpC,MAAM03B,EAAgB9F,EAA+B8F,aACrD,MAAsB,8BAAnBA,EAAaz3B,EAITuvD,EAAmB93B,EAAaA,mBAJvC,IAQJ,OAAO7iC,KAAKouB,aAAaknB,EAASnqC,aAAef,EAAQu9B,QAAQ,KAC3DnX,MAIJxwB,KAAKouB,aAAaknB,EAASnqC,aAAe,QAItC,SAASmqC,EAA+BoB,EAAmBhuC,EAAmB8nB,G,QACpF,MAAMnwB,EAAOi1C,EAASnqC,YAEtB,GAAGnL,KAAKouB,aAAa/tB,GACnB,OAAOL,KAAKouB,aAAa/tB,GAG3B,GAAqB,YAAlBi1C,EAASj1C,KACV,OAAOL,KAAK86D,YAAYxlB,GAG1B,MAAMxtC,EAAmC,QAAzB,EAAA9H,KAAKu2C,eAAel2C,UAAK,QAAKL,KAAKu2C,eAAel2C,GAAQ,GAE1E,KAAY,6BAATA,GAAwCyH,EAAQnG,SAC7C3B,KAAKk1D,cACPl1D,KAAK+6D,YACL/6D,KAAKk1D,aAAc,GAGjBl1D,KAAK8K,cAAcsE,MAAMS,QAAW7P,KAAK8K,cAAcG,QAAWjL,KAAK8K,cAAcqvD,UAEvF,OADAn6D,KAAKm+B,OAAO99B,IAAQ,EACbgF,QAAQ6E,UAInB,MAAM8wD,EAAS,SAAW36D,EAAO,MAGjC,GAAGyH,EAAQnG,QAAU3B,KAAK81C,gBAAgBz1C,GAAQyH,EAAQnG,SAAW+0C,EAAU,CAC7E,IAAIlnC,EAAkB,GAClByrD,EAAOp2D,KAAKJ,IAAI,EAAGzE,KAAK81C,gBAAgBz1C,IACxC66D,EAAe,EAEnB,EAAG,CACD,IAAIC,EAAMrzD,EAAQnC,MAAMs1D,EAAMA,EAAOvyD,GAErCuyD,GAAQE,EAAIx5D,OACZu5D,GAAgBC,EAAIx5D,OAEpB6N,EAASjG,QAAQvJ,KAAK61C,qBAAqBslB,EAAI1uD,IAAIklC,GAAK,IAAmBlxB,iBAAiBkxB,EAAE1mC,OAAQ0mC,EAAE9mC,MAAOxK,UACzG66D,EAAexyD,GAAauyD,EAAOnzD,EAAQnG,QAWjD,OAFF3B,KAAK81C,gBAAgBz1C,GAAQ46D,EAEpBj7D,KAAK+1C,oBAAoBvmC,EAAU8lC,GAAU3N,QAAQ,KAC1D73B,WAAW,KACT9P,KAAKuP,WAAW8uB,oBACf,KAOT,IAAIzzB,EAAQ9C,EAAQnG,OAASmG,EAAQA,EAAQnG,OAAS,GAAGkJ,IAAM,EAK/D,OAAO7K,KAAKouB,aAAa/tB,GAAQ,IAAmB2K,UAAU,OAAD,wBACxDhL,KAAK8K,eAAa,CACrBK,YAAa,CAACC,EAAG/K,GACjBuK,QACAM,MAAOxC,EACP4C,SAA8B,QAApB,EAAAtL,KAAKi1D,UAAU50D,UAAK,QAAKL,KAAKi1D,UAAU50D,GAAQ,KACzDsD,KAAKgB,IAKN,GAJAmD,EAAQyB,QAAQ5E,EAAMmD,QAAQ2E,IAAIklC,IAAK,CAAE9mC,IAAK8mC,EAAE9mC,IAAKI,OAAQ0mC,EAAE1mC,WAE/DjL,KAAKkiB,IAAI84C,EAAS,wBAAyB36D,EAAMsE,GAE7C6rB,IAcJ,OARG7rB,EAAMmD,QAAQnG,OAAS+G,QAA8CL,IAAhCrI,KAAK8K,cAAckB,WAA2BrH,EAAM0G,WAAc1G,EAAMmD,QAAQnG,SAAWgD,EAAM2D,SAGvItI,KAAKm+B,OAAO99B,IAAQ,GAGtBL,KAAKi1D,UAAU50D,GAAQsE,EAAM0G,UAE1BqrC,EACMrxC,QAAQ6E,WAGjBlK,KAAK81C,gBAAgBz1C,GAAQyH,EAAQnG,OAEjC3B,KAAKm+B,OAAO99B,KACbL,KAAKouB,aAAa/tB,IAASgF,QAAQ6E,WAAWvG,KAAK,KAClDmM,WAAW,KACT,GAAI0gB,KAEDxwB,KAAKs1C,WAAaA,EAAU,CAC7B,MAAMlrC,EAAUpK,KAAKyJ,MAAK,GAAM,GAC7BW,GACDA,EAAQzG,KAAK,KACP6sB,KAEJ1gB,WAAW,KACT9P,KAAKuP,WAAW8uB,oBACf,OAIR,KAKEr+B,KAAK+1C,oBAAoB/1C,KAAK61C,qBAAqBlxC,EAAMmD,QAASzH,GAAOi1C,MAEjF5kC,MAAMJ,IACPtQ,KAAKkiB,IAAI1R,MAAM,cAAeF,KAC7Bq3B,QAAQ,KACT3nC,KAAKouB,aAAa/tB,GAAQ,OAIjB,KAAKo2C,GAAS,EAAOC,GAAW,G,0CAO3C,MAAMzrC,EAASjL,KAAK8K,cAAcG,OAClCjL,KAAKkiB,IAAI,OAAQu0B,EAAQxrC,EAAQjL,KAAKouB,cACtC,MAAMoC,EAAaxwB,KAAKwwB,WAAW7c,MAEnC,GAAG3T,KAAKm1D,UAAW,CACjB,GAAGn1D,KAAKy1D,cAAe,CACrB,MAAMrgB,EAAYp1C,KAAKo1C,UAAUxpC,OAAO0pC,GAAqC,6BAAzBA,EAASnqC,aACvDiwD,EAAUhmB,EAAU3oC,IAAI6oC,IAAY,CAAElqC,EAAGkqC,EAASnqC,eAElDkwD,QAAiB,IAAmBC,kBAAkBrwD,EAAQmwD,GACpE,IAAI5qC,IACF,OAGF,GAAGxwB,KAAKo2C,kBACAp2C,KAAKo2C,WAEP5lB,KACF,OAIJ,IAAI+qC,EACAjzD,EAAQ,EACZ8sC,EAAU7qC,QAAQ+qC,IAChB,MAAMkmB,EAAUH,EAAShnD,KAAKyjB,GAAKA,EAAElsB,OAAOR,IAAMkqC,EAASnqC,aAE3DmqC,EAASygB,QAAQ71D,UAAUC,OAAO,QAASq7D,EAAQlzD,OACnDgtC,EAASygB,QAAQ71D,UAAUoE,OAAO,UAG/Bk3D,EAAQlzD,YAA2BD,IAAlBkzD,IAClBA,EAAgBjmB,GAGfkmB,EAAQlzD,SAASA,IAGtB,MAAMmzD,EAAaz7D,KAAKs1D,aAAa3hD,IAAI,WACnCwiC,EAAiBn2C,KAAKm2C,iBAC5BslB,EAAW1F,QAAQ71D,UAAUC,OAAO,QAASg2C,GAE1CA,IACDolB,EAAgBE,GAGlBz7D,KAAKoB,UAAUlB,UAAUC,OAAO,QAASo7D,GACzCv7D,KAAKoB,UAAUL,cAAcb,UAAUC,OAAO,gBAAiBo7D,GAC5DA,IACDv7D,KAAKu2D,YAAa,EAClBv2D,KAAKiS,UAAUjS,KAAKo1C,UAAUjwB,QAAQo2C,IAAgB,GACtDA,EAAcxF,QAAQ71D,UAAUW,IAAI,UAEpCb,KAAKuyD,uBAAuBryD,UAAUC,OAAO,OAAQmI,GAAS,IAIlEtI,KAAKm1D,WAAY,EAGnB,IAAIuG,EAASjlB,EAAS,CAACz2C,KAAKs1C,UAAYt1C,KAAKo1C,UAAUxpC,OAAO0I,GAAKA,IAAMtU,KAAKs1C,UAU9E,GATAomB,EAASA,EAAO9vD,OAAO0pC,IACrB,MAAMnqC,EAAcmqC,EAASnqC,YAC7B,OAAQnL,KAAKm+B,OAAOhzB,IAAiBnL,KAAKu2C,eAAeprC,IAAgBnL,KAAK81C,gBAAgB3qC,GAAenL,KAAKu2C,eAAeprC,GAAaxJ,SAG7IsJ,EAAO82B,UACR,OAAAT,GAAA,GAAco6B,EAAQpmB,GAA8B,YAAlBA,EAASj1C,OAGzCq7D,EAAO/5D,OACT,OAGF,MAAM+G,EAAYguC,EAAW,GAAK7xC,KAAKE,MAAsC,GAA/Bk8B,GAAA,EAAWx9B,OAAS,IAAM,GAAS,MAE3Eu/B,EAA2B04B,EAAOjvD,IAAI6oC,GACnCt1C,KAAK27D,SAASrmB,EAAUoB,EAAUhuC,EAAW8nB,IAGtD,OAAOnrB,QAAQC,IAAI09B,GAAUtyB,MAAMJ,IACjCtQ,KAAKkiB,IAAI1R,MAAM,2BAA4BF,QAIxC,6BAA6BsrD,EAAmBv7D,G,MACrD,MAAMmsB,EAAO,IAAIkwB,KAAiB,IAAZkf,GACtBpvC,EAAKqvC,SAAS,EAAG,EAAG,GACpBrvC,EAAKsvC,QAAQ,GACb,MAAMC,EAAgBvvC,EAAKwvC,UACrBC,EAAuC,QAA1B,EAAAj8D,KAAKq1D,gBAAgBh1D,UAAK,QAAKL,KAAKq1D,gBAAgBh1D,GAAQ,GAC/E,KAAK07D,KAAiBE,GAAa,CACjC,MAAM76D,EAAYT,SAASC,cAAc,OACzCQ,EAAU4M,UAAY,qBAEtB,MAAMxN,EAAOG,SAASC,cAAc,OACpCJ,EAAKN,UAAUW,IAAI,2BAEnB,MAAMnB,EAAsC,CAC1Cw8D,MAAO,QAGN1vC,EAAK2vC,iBAAkB,IAAIzf,MAAOyf,gBACnCz8D,EAAQ08D,KAAO,WAGjB,MAAMC,EAAc,IAAI,IAAKC,gBAAgB,CAC3C9vC,OACA9sB,YACCqb,QACHva,EAAKa,OAAOg7D,GAEZj7D,EAAUC,OAAOb,GAEjB,MAAM2I,EAAQxI,SAASC,cAAc,OACrCuI,EAAMjJ,UAAUW,IAAI,4BAEpBO,EAAUC,OAAOb,EAAM2I,GAEvB,MAAMozD,EAAiB,OAAAC,GAAA,GAAqBP,EAAY,QACxD,IAAIr6D,EAAI,EACR,KAAMA,EAAI26D,EAAe56D,SAAUC,EAAG,CAEpC,GAAGm6D,EADOQ,EAAe36D,GAEvB,MAIJq6D,EAAWF,GAAiB,CAAC36D,YAAW+H,SACxC6hD,GAAuB5pD,EAAWpB,KAAKkS,KAAK7R,GAAOuB,GAGrD,OAAOq6D,EAAWF,GAGb,iBACL,OAAO/7D,KAAK8K,cAAcG,OAAOm4B,cAAgB,IAAgB7G,YAAYv8B,KAAK8K,cAAcG,OAAO8vB,aAAe,IAAgBkH,UAAUjiC,KAAK8K,cAAcG,OAAO8vB,WAAY,qBAGjL,UACL/6B,KAAKouB,aAAe,GACpBpuB,KAAKm+B,OAAS,GACdn+B,KAAKk1D,aAAc,EACnBl1D,KAAKi1D,UAAY,GACjBj1D,KAAKm1D,WAAY,EAEjBn1D,KAAKsuB,cAAc3f,QAEnB3O,KAAKo1C,UAAU7qC,QAAQ+qC,IACrBt1C,KAAK81C,gBAAgBR,EAASnqC,cAAgB,IAG7CnL,KAAKg2C,UAAUC,aAChBj2C,KAAKg2C,UAAUiY,kBAUjBjuD,KAAKwwB,WAAW3U,QAChB7b,KAAK80C,uBACL90C,KAAK46D,iBAAcvyD,EAGd,uBACLrI,KAAKo1C,UAAU7qC,QAAQ+qC,IACrBA,EAAShS,YAASj7B,IAIf,YAAYo0D,GAAU,GACxBz8D,KAAKg1D,aAAarzD,SACnB3B,KAAKg1D,aAAazqD,QAAQ+P,IACxBivC,IAAImT,gBAAgBpiD,KAEtBta,KAAKg1D,aAAarzD,OAAS,GAG7B3B,KAAKo1C,UAAU7qC,QAAS6I,IAStB,GARAA,EAAI8+C,WAAW1jD,UAAY,GAExBxO,KAAKy1D,gBAENz1D,KAAKoB,UAAUlB,UAAUW,IAAI,QAC7Bb,KAAKoB,UAAUL,cAAcb,UAAUW,IAAI,iBAG7B,UAAbuS,EAAI/S,OAIHL,KAAKu2C,eAAenjC,EAAIjI,aAAc,CACxC,MAAM+jD,EAAS97C,EAAI8+C,WAAWnxD,cAExBmuD,EAAOz7C,cAAc,eACvB,aAAay7C,GAAQ,GAIzB,MAAMhB,EAAQgB,EAAOz7C,cAAc,kBAChCy6C,GACDA,EAAM5pD,YAiBZtE,KAAKq1D,gBAAkB,GACvBr1D,KAAKo2D,iBAAiBznD,QACtB3O,KAAKuP,WAAWwgC,UAAY,EActB,kBAAkB4sB,GACxB,MAAMvvD,EAAU,OAAA0T,GAAA,GAAK9gB,KAAK8K,eAG1B,OAFAsC,EAAQjC,YAAc,CAACC,EAAGuxD,GAC1BvvD,EAAQ9B,SAAWtL,KAAKi1D,UAAU0H,GAC3BvvD,EAGF,UAAS,OAACnC,EAAM,MAAEmE,EAAK,SAAEE,EAAQ,eAAEinC,EAAc,SAAEvqC,EAAQ,QAAEmuD,EAAO,QAAEyC,IAS3E58D,KAAK8K,cAAgB,CACnBG,SACAmE,MAAOA,GAAS,GAChBjE,YAAa,CAACC,EAAGpL,KAAKs1C,SAASnqC,aAC/BmE,WACAtD,WACAmuD,UACAyC,WAGF58D,KAAKu2C,eAAiBA,UAAkB,GAExCv2C,KAAK8N,WEjiDT,MAyBM+uD,GAA0B,CAAC/6D,EAAiB8R,EAA6BlU,EAA8B+U,OAC/F/U,aAAO,EAAPA,EAASmS,gBAAiBnS,EAAQmS,eAAehR,IAAIiB,GAAMA,EAAGR,iBAAiBoF,KAAK5E,IAG5F,IAAmB/B,IAErB,IAAI+B,EAAG5B,UAAUuV,SAAS,mBAAoB,OAAO,EAGrD,MAAMqnD,EAAah7D,EAAG2R,cAAc,aACpC,OAAAuW,EAAA,GAAYjqB,GAET+B,EAAG5B,UAAUuV,SAAS,aACvB,gBAEA7B,GAAUA,EAAO7T,GACjB,aAAY+8D,EAAYroD,OAMf,IC7CHsoD,GD6CG,GA/CU,CACvBr9D,EAMK,GACLqE,EACAs3B,EACAznB,EACAa,K,MAEA/U,EAAQs9D,OAAQ,EAChB,MAAMt5C,EAA0B,QAAjB,EAAAhkB,EAAQ0B,iBAAS,QAAI,EAAW,OAAQ1B,GACvDgkB,EAAOxjB,UAAUW,IAAI,mBAErB,MAAMo8D,EAAU,GAAW5hC,EAAS37B,EAAQmS,gBAI5C,OAHAorD,EAAQ/8D,UAAUW,IAAIkD,GACtB84D,GAAwBn5C,EAAQ9P,EAAQlU,EAAS+U,GACjDiP,EAAOriB,OAAO47D,GACPv5C,G,oBCnBT,SAAYq5C,GACV,6BACA,2BACA,uBAHF,CAAYA,QAAW,KA6GvB,MAAMG,GAAoB,IAvGnB,MAKL,cAJQ,KAAAC,QAEH,GAGHvwD,EAAA,EAAUwwD,2BAA2B,CACnCC,cAAgB72B,IACd,MAAMp/B,EAAMo/B,EAAOp/B,IAAIgE,EACvBpL,KAAKm9D,QAAQ/1D,GAAOo/B,EAAO82B,MAC3B1wD,EAAA,EAAU0F,cAAc,iBAAkBk0B,MAKzC,WAAW+2B,EAAgCD,GAChD,OAAO,KAAW1iC,UAAU,qBAAsB,CAChDxzB,IAAK,CACHgE,EAAGmyD,GAELD,UACC35D,KAAK65D,IACN,IAAgBC,aAAaD,EAAaE,OAC1C,IAAgBC,aAAaH,EAAaI,OAE1CC,GAAA,EAAkBC,mBAAmB,CACnC1yD,EAAG,gBACHhE,IAAK,CACHgE,EAAG,OAAA2yD,GAAA,GAAqBR,IAE1BD,MAAOA,EAAM7wD,IAAIuxD,IACf,MAAMC,EAAoB,GAG1B,OAFAtgD,OAAOugD,OAAOD,EAAMD,GACpBC,EAAK7yD,EAAI,OAAA2yD,GAAA,GAAqBE,EAAK7yD,GAC5B6yD,MAMJT,EAAaF,QAIjB,WAAWC,GAChB,MAAMY,EAA8B,OAAAJ,GAAA,GAAqBR,GACnDD,EAAQt9D,KAAKm9D,QAAQgB,GAC3B,OAAGb,EACMj4D,QAAQ6E,QAAQozD,GAGlBt9D,KAAKm9D,QAAQgB,GAAc,KAAWvjC,UAAU,qBAAsB,CAC3ExzB,IAAK,CACHgE,EAAGmyD,KAEJ55D,KAAK65D,IACN,IAAgBC,aAAaD,EAAaE,OAC1C,IAAgBC,aAAaH,EAAaI,OAInC59D,KAAKm9D,QAAQgB,GAAcX,EAAaF,QAI5C,uBAAuBA,GAC5B,MAAMc,EAAuB,GAG7B,IAAIC,EAAoB,CAACX,MAAO,GAAIE,MAAO,IAAKU,EAAuB,CAACZ,MAAO,GAAIE,MAAO,IA8B1F,OA7BAN,EAAM/yD,QAAQ0zD,IACZ,OAAOA,EAAK7yD,GACV,IAAK,uBACHgzD,EAAM70D,KAAK,GACX,MACF,IAAK,0BACH60D,EAAM70D,KAAK,GACX,MACF,IAAK,4BACH60D,EAAM70D,KAAK,GACX,MAIF,IAAK,oCACH80D,EAAWT,MAAMr0D,QAAQ00D,EAAKL,OAC9B,MACF,IAAK,yBACHS,EAAWX,MAAMn0D,QAAQ00D,EAAKP,OAC9B,MACF,IAAK,uCACHY,EAAcV,MAAMr0D,QAAQ00D,EAAKL,OACjC,MACF,IAAK,4BACHU,EAAcZ,MAAMn0D,QAAQ00D,EAAKP,UAKhC,CAACr9D,KAAM+9D,EAAM,GAAIE,gBAAeD,gBAK3C,KAAenB,kBAAoBA,GACpB,UC1GA,MAAM,GAiBnB,YAAmBx9D,GAAA,KAAAA,UA8KX,KAAA6+D,cAAiB55D,IACvBA,GAASA,EACT3E,KAAKK,KAAOsE,EAEZ,MAAM04B,EAAUr9B,KAAKN,QAAQ8+D,SAASx+D,KAAKK,MACrCo+D,EAAiBz+D,KAAK0+D,aAAarhC,QACrCA,EAEMA,aAAmB7R,YAC3B,OAAA/a,EAAA,GAAeguD,EAAgBphC,GAE/B,YAAMohC,EAAgBphC,GAJtBohC,EAAejwD,UAAY,GAM7BiwD,EAAev+D,UAAUC,OAAO,QAASk9B,GAEtCr9B,KAAK2+D,aACN3+D,KAAK2+D,WAAWhrD,IAAI,SAASkiB,IAAIz0B,UAAUlB,UAAUC,OAAO,OAAQH,KAAKK,OAAS08D,GAAY6B,WAC9F5+D,KAAK2+D,WAAWhrD,IAAI,YAAYkiB,IAAIz0B,UAAUlB,UAAUC,OAAO,OAAQH,KAAKK,OAAS08D,GAAY8B,SAGnG7+D,KAAKN,QAAQ6+D,eAAiBv+D,KAAKN,QAAQ6+D,cAAc55D,IAvLtDjF,EAAQ8+D,UACT9+D,EAAQ8+D,SAAS/1D,UAGnBzI,KAAK0+D,aAAe,IAAI,GAAe,CAACl+D,KAAMd,EAAQgS,MAAO2rB,SAAS,IAEtEr9B,KAAK8+D,UAAY,IAAIxrD,IAErB,IAAIyS,EAAsD,CAAC,CACzD1lB,KAAM08D,GAAY6B,UAClBplC,QAAS,sCACR,CACDn5B,KAAM08D,GAAYgC,SAClBvlC,QAAS,wCACR,CACDn5B,KAAM08D,GAAY8B,OAClBrlC,QAAS,qCAGR95B,EAAQs/D,YACTj5C,EAAIA,EAAEna,OAAOma,IAAMrmB,EAAQs/D,UAAU//B,SAASlZ,EAAE1lB,QAGlD,MAAMm8B,EAAS,eACfzW,EAAExb,QAAQ,EAAElK,OAAMm5B,cAChB,MAAM3D,EAAM,IAAI,GAAI,CAClBwB,WAAY,IAAI,GAAW,CACzBmC,UACAh5B,KAAMg8B,EACN73B,MAAO,GAAKtE,MAIhBL,KAAK8+D,UAAUtkD,IAAIna,EAAMw1B,KAG3B,MAAMqB,EAAOiB,GAAkB,IAAIn4B,KAAK8+D,UAAUj7B,UAAW7jC,KAAKu+D,eAOlE,GALAv+D,KAAK0+D,aAAa/sD,QAAQtQ,OAAO61B,GAC9Bx3B,EAAQghC,UACThhC,EAAQghC,SAASr/B,OAAOrB,KAAK0+D,aAAat9D,YAGxC1B,EAAQu/D,aAAc,CACxB,MAAM79D,EAAY89D,GAAgBx/D,EAAQghC,SAAU,oBAAqB,sCAEzE1gC,KAAK2+D,WAAa,IAAIrrD,IAAI,CAAC,CACzB,WACA,CACEukB,aAAcn4B,EAAQy/D,eAAe,GACrC/3D,IAAK,WACLyuB,IAAK,KACL1kB,KAAM,aACNomB,gBAAiB,qCACjBtpB,WAAW,IAEZ,CACD,QACA,CACE4pB,aAAcn4B,EAAQy/D,eAAe,GACrC/3D,IAAK,QACLyuB,IAAK,KACL1kB,KAAM,UACNomB,gBAAiB,qCACjBtpB,WAAW,MAIfjO,KAAK2+D,WAAWp0D,QAAS60D,IACvBA,EAAUvpC,IAAM,IAAI,GAAIupC,GAExBA,EAAUvpC,IAAIz0B,UAAUE,iBAAiB,QAAS,KAChD8I,EAAQzG,KAAK,KACX,MAAM07D,EAAWr/D,KAAKqW,QAAQ+oD,EAAUh4D,KACxC,IAAI,GAAiB1H,EAAQ0T,IAAIhC,QAAQsD,KAAK,CAC5CrU,KAAM,UACNosC,WAAW,EACX/6B,MAAO0tD,EAAUvnC,aACjBlnB,YAAa,kCACb4zB,QAAU+6B,IACRD,EAAS19D,OAAS,EAClB09D,EAAS91D,QAAQ+1D,GACjBF,EAAUvpC,IAAI7F,SAASxhB,UAAY,GACnC4wD,EAAUvpC,IAAI7F,SAAS3uB,UAAUrB,KAAKu/D,YAAYv/D,KAAKw/D,iBAAiBF,MAE1EzyB,gBAAiBwyB,QAKvBj+D,EAAUC,OAAO+9D,EAAUvpC,IAAIz0B,aAQnC,MAAMgJ,EAAU,GAAkBq1D,WAAW//D,EAAQ69D,UAAU55D,KAAK25D,IAClE,MAAMlkD,EAAU,GAAkBsmD,uBAAuBpC,GACzDt9D,KAAK2/D,SAASvmD,EAAQ/Y,MAEnBL,KAAK2+D,aACN3+D,KAAKqW,QAAU,GACf,CAAC,QAAkB,YAAqB9L,QAAQovC,IAC9C,MAAM1xC,EAAM,GACNmE,EAAa,UAANutC,EAAgBvgC,EAAQilD,WAAajlD,EAAQklD,cAC1Dr2D,EAAIsB,QAAQ6C,EAAKsxD,MAAMjxD,IAAIsG,GAAMA,EAAGwY,aACpCtjB,EAAIsB,QAAQ6C,EAAKwxD,MAAMnxD,IAAIsG,GAAMA,EAAGwY,UAAS,KAC7CvrB,KAAKqW,QAAQsjC,GAAK1xC,EAClB,MAAM6T,EAAI9b,KAAK2+D,WAAWhrD,IAAIgmC,GAAG9jB,IAAI7F,SACrClU,EAAEtN,UAAY,GACdsN,EAAEza,UAAUrB,KAAKu/D,YAAYnzD,OAIjC1M,EAAQ0T,IAAIf,cAAc/Q,iBAAiB,UAAW,KACpD,MAAMg8D,EAA4B,GAElC,OAAOt9D,KAAKK,MACV,KAAK08D,GAAY6B,UACftB,EAAM/zD,KAAK,CAAC6B,EAAG,8BACf,MACF,KAAK2xD,GAAYgC,SACfzB,EAAM/zD,KAAK,CAAC6B,EAAG,mCACf,MACF,KAAK2xD,GAAY8B,OACfvB,EAAM/zD,KAAK,CAAC6B,EAAG,iCAIhBpL,KAAK2+D,YACL,CACC,CAAC,QAAa,yCAA8C,+BAC5D,CAAC,WAAa,4CAA8C,mCAK1Dp0D,QAAQ,EAAEovC,EAAGimB,EAASC,GAAW73D,KACnC,GAAGhI,KAAK2+D,WAAWhrD,IAAIgmC,GAAG9jB,IAAIz0B,UAAUlB,UAAUuV,SAAS,QACzD,OAGF,MAAM4pD,EAAWr/D,KAAKqW,QAAQsjC,GAC9B,GAAG0lB,EAAU,CACX,MAAMS,EAAW9/D,KAAKw/D,iBAAiBH,GACpCS,EAASlC,MAAMj8D,QAChB27D,EAAM/zD,KAAK,CAAC6B,EAAGw0D,EAAShC,MAAOkC,EAASlC,QAGvCkC,EAASpC,MAAM/7D,QAChB27D,EAAM/zD,KAAK,CAAC6B,EAAGy0D,EAAUnC,MAAOoC,EAASpC,MAAMjxD,IAAIsG,GAAM,IAAgBgtD,aAAahtD,SAM9F,GAAkBitD,WAAWtgE,EAAQ69D,SAAUD,IAC9C,CAACz+C,MAAM,MA2BP,SAASxe,GACd,MAAMw1B,EAAM71B,KAAK8+D,UAAUnrD,IAAItT,GAC/BL,KAAKu+D,cAAcl+D,GACnBw1B,EAAIwB,WAAWj3B,MAAM+2B,SAAU,EAGzB,iBAAiB9gB,GACvB,MAAMmkD,EAAQ,CAACkD,MAAO,GAAgBE,MAAO,IAK7C,OAJAvnD,EAAQ9L,QAAQU,IACduvD,EAAMvvD,EAAOm4B,YAAc,QAAU,SAAS75B,KAAK0B,EAAOm4B,YAAcn4B,EAAO8vB,WAAa9vB,KAGvFuvD,EAGD,YAAYA,GAClB,OAAIA,EAAMkD,MAAM/7D,QAAW64D,EAAMoD,MAAMj8D,OAIhC,YAAK,CACV64D,EAAMkD,MAAM/7D,OAAS,YAAK,QAAS,CAAC64D,EAAMkD,MAAM/7D,SAAW,KAC3D64D,EAAMoD,MAAMj8D,OAAS,YAAK,QAAS,CAAC64D,EAAMoD,MAAMj8D,SAAW,MAC3DiK,OAAOc,UAAU,GANV,CAAC,YAAK,wCC9OJ,MAAM,WAAiC,EAC1C,OACR1M,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,cAAe,wBAC5Cb,KAAK+U,SAAS,gBAEd,MAAMlO,EAAY,IAAM,IAAgBo5D,UAAU9zB,MAC5C+zB,EAAYv/D,SAASC,cAAc,OACzCs/D,EAAU7+D,OACR,YAAK,oBACLV,SAASC,cAAc,MACvBD,SAASC,cAAc,MACvB,YAAK,qBACLD,SAASC,cAAc,MCfd,SAAoBlB,EAG9B,IACH,MAAMyK,EAASxJ,SAASC,cAAc,KAGtC,GAFAuJ,EAAOjK,UAAUW,IAAI,eAElBnB,EAAQygE,OAAQ,CACjB,MAAMzH,EAAO,gBAAkBh5D,EAAQygE,OACvCh2D,EAAOuuD,KAAOvuD,EAAOyjB,UAAY8qC,EASnC,OANA,YAAiBvuD,EAASpK,IACxB,OAAAiqB,EAAA,GAAYjqB,GACZs4B,GAAoBluB,EAAOuuD,MAC3B9+B,GAAS,CAACC,YAAa,iBAGlB1vB,EDFHi2D,CAAW,CACTD,OAAQt5D,KAIZ,MAAMw5D,EAAe,IAAI,GAAe,CACtCjtD,IAAKpT,KACL0R,MAAO,oBACP6rD,SAAU,6BACViB,SAAU,CAAC0B,EAAWA,EAAW,IACjCf,eAAgB,CAAC,uCAAwC,yCACzDz+B,SAAU1gC,KAAKuP,WACfgvD,cAAgBl+D,IACdyb,EAAE6jD,SAAS5C,GAAY6B,WACvB9iD,EAAE4iD,aAAat9D,UAAUlB,UAAUC,OAAO,OAAQE,IAAS08D,GAAY8B,WAKrE/iD,EAAI,IAAI,GAAe,CAC3B1I,IAAKpT,KACL0R,MAAO,qBACP6rD,SAAU,8BACViB,SAAU,CALkB,wCAKG,IAC/BS,cAAc,EACdD,UAAW,CAACjC,GAAY8B,UAG1B7+D,KAAKuP,WAAWnO,UAAUH,aAAa6a,EAAE4iD,aAAat9D,UAAWi/D,EAAa3B,aAAat9D,UAAUD,c,aEzC1F,MAAM,WAAqC,EAC9C,OACRnB,KAAKoB,UAAUlB,UAAUW,IAAI,wBAAyB,6BACtDb,KAAK+U,SAAS,kCAEd,MAAMG,EAAU,IAAI,GAAe,CACjCmoB,QAAS,qCACTC,aAAa,IAITzjB,EAAM,KAAmByuC,wBADjB,MAERgY,EAAmB3/D,SAASC,cAAc,OAE7CiZ,EACDkX,GAAY,CACVlX,MACAmX,IAAKsvC,EACLh9D,MAAM,EACNc,MAAM,EACNZ,MAAO,IACPC,OAAQ,MACPE,KAAK,QAIR28D,EAAiBpgE,UAAUW,IAAI,yBAGjCqU,EAAQvD,QAAQtQ,OAAOi/D,GAEvB,MAAMC,EAAerrD,EAAQ8wB,yBAEvB7wB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAAM2/D,EAAY,YAAO,gCAAiC,CAACloC,KAAM,8CAEjE,YAAiBkoC,EAAYzgE,IAC3BC,KAAK49B,UAGP59B,KAAKoR,OAAOqvD,kBAAkB,GAAgBzgE,MAE9CmV,EAAa9T,OAAOm/D,GAEpBD,EAAal/D,OAAO8T,GAEpBnV,KAAKuP,WAAWnO,UAAUC,OAAO6T,EAAQ9T,Y,cCtDtC,SAASs/D,GAASC,GACvB,OAAQ,OAAqBA,ECchB,MAAM,WAAmD,EAAxE,c,oBAKS,KAAAC,SAAU,EAEP,OACR5gE,KAAKoB,UAAUlB,UAAUW,IAAI,wBAAyB,4CACtDb,KAAK+U,SAAS,6BAEd,MAAMG,EAAU,IAAI,GAAe,CACjCmoB,SAAS,EACTC,aAAa,IAGf,YAAMpoB,EAAQmoB,QAAS,mCAAoC,CAACr9B,KAAK6gE,QAEjE,MACMhnD,EAAM,KAAmByuC,wBADjB,MAERgY,EAAmB3/D,SAASC,cAAc,OAE7CiZ,EACDkX,GAAY,CACVlX,MACAmX,IAAKsvC,EACLh9D,MAAM,EACNc,MAAM,EACNZ,MAAO,IACPC,OAAQ,IACR+iD,MAZU,OAaT7iD,KAAK,QAIR28D,EAAiBpgE,UAAUW,IAAI,yBAGjCqU,EAAQvD,QAAQtQ,OAAOi/D,GAEvB,MAAMC,EAAerrD,EAAQ8wB,yBAEvB7wB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAAM2D,EAAaxE,KAAK8gE,eAAiB,IAAI,KAAe,CAC1DtgE,KAAM,sBACNuF,MAAO,2BACPpE,OAAQ3B,KAAK2B,OACbkE,OAASoB,IACP+oC,GAAO,GAEP+wB,GAAA,EAAgBC,qBAAqB,GAAK/5D,GACzCtD,KAAKgB,IAKJs8D,MAEDvwD,MAAMJ,IACL,OAAOA,EAAIjQ,MACT,IAAK,eACHmE,EAAWpE,MAAMF,UAAUW,IAAI,SAC/B,OAAA4P,EAAA,GAAejM,EAAWuB,MAAO,YAAK,oCACtC,MAEF,IAAK,qBACHvB,EAAWpE,MAAMF,UAAUW,IAAI,SAC/B,OAAA4P,EAAA,GAAejM,EAAWuB,MAAO,YAAK,oCACtC,MAEF,QACEwK,QAAQC,MAAM,gBAAiBF,GAInC0/B,GAAO,QAKPkxB,EAAY,YAAO,8CAA+C,CAAC5oC,KAAM,qCACzE6oC,EAAY,YAAO,4DAA6D,CAAC7oC,KAAM,eAEvF2oC,EAAS,KACb,IAAI,GAA6BjhE,KAAKoR,QAAQsD,QAG1Cs7B,EAAUoxB,IACd,aAAiB,CAAC58D,EAAWpE,MAAO8gE,EAAWC,GAAYC,IAG7D,YAAiBF,EAAYnhE,IAC3BiwC,GAAO,GACP+wB,GAAA,EAAgBM,sBAAsB19D,KAAKgB,IACzC3E,KAAKoR,OAAOqvD,kBAAkB,GAAgCzgE,MAC9DA,KAAK49B,SACJ,KACDoS,GAAO,OAIX,YAAiBmxB,EAAYphE,IAC3BiwC,GAAO,GACP,MAAMzO,EAAI,aAAa4/B,GACvBJ,GAAA,EAAgBO,sBAAsB39D,KAAKgB,IACzC48B,EAAEj9B,SACF0rC,GAAO,OAIX76B,EAAa9T,OAAOmD,EAAWpD,UAAW8/D,EAAWC,GAErDZ,EAAal/D,OAAO8T,GAEpBnV,KAAKuP,WAAWnO,UAAUC,OAAO6T,EAAQ9T,WAG3C,qBACMs/D,GAAS1gE,KAAK4gE,UAClB5gE,KAAK8gE,eAAe1gE,MAAM6B,SCzHf,MAAM,WAAuC,EAA5D,c,oBAMS,KAAA2+D,SAAU,EAEP,OACR5gE,KAAKoB,UAAUlB,UAAUW,IAAI,wBAAyB,+BACtDb,KAAK+U,SAAS,sBAEd,MAAMG,EAAU,IAAI,GAAe,CACjCmoB,SAAS,EACTC,aAAa,IAITzjB,EAAM,KAAmByuC,wBADjB,MAERgY,EAAmB3/D,SAASC,cAAc,OAE7CiZ,EACDkX,GAAY,CACVlX,MACAmX,IAAKsvC,EACLh9D,MAAM,EACNc,MAAM,EACNZ,MAAO,IACPC,OAAQ,IACR+iD,MAZU,OAaT7iD,KAAK,QAIR28D,EAAiBpgE,UAAUW,IAAI,yBAGjCqU,EAAQvD,QAAQtQ,OAAOi/D,GAEvB,MAAMC,EAAerrD,EAAQ8wB,yBAEvB7wB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAAM2D,EAAaxE,KAAKwE,WAAa,IAAI,IAAW,CAClDhE,KAAM,iBACNuF,MAAO,gBACPnG,WAAW,IAGb4E,EAAWpE,MAAMkB,iBAAiB,WAAavB,IAC7C,GAAa,UAAVA,EAAEqH,IAEH,OADA,OAAA4iB,EAAA,GAAYjqB,GACLwhE,MAIX/8D,EAAWpE,MAAMkB,iBAAiB,QAAUvB,IAC1CyE,EAAWpE,MAAMF,UAAUoE,OAAO,WAGpC,MAAMk9D,EAAc,YAAO,gCAAiC,CAAClpC,KAAM,aAC7DmpC,EAAU,YAAO,4DAA6D,CAACnpC,KAAM,kBAErF2oC,EAAS,KACb,IAAI,GAA6BjhE,KAAKoR,QAAQsD,QAG1C6sD,EAAkB,KACtB,MAAMV,EAAQr8D,EAAWG,MAAMkL,OACzB0I,EAAQ,IAAkBmpD,WAAWb,GAC3C,IAAItoD,GAASA,EAAM,GAAG5W,SAAWk/D,EAAMl/D,OAErC,YADA6C,EAAWpE,MAAMF,UAAUW,IAAI,SAIjC8gE,GAAc,GACd,MAAMpgC,EAAI,aAAaigC,GAEvBT,GAAA,EAAgBa,eAAe,CAC7BC,KAAM7hE,KAAK6hE,KACXC,gBAAiB9hE,KAAK+hE,cACtBC,YAAahiE,KAAKgiE,YAClBnB,UACCl9D,KAAMgB,IACPs8D,KACE3wD,IACF,GAAGA,EAAIjQ,KAAK4+B,SAAS,qBAAsB,CACzC,MAAMgjC,GAAW3xD,EAAIjQ,KAAKkY,MAAM,4BAA4B,GAEtDnF,EAAM,IAAI,GAA2CpT,KAAKoR,QAChEgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAIytD,MAAQA,EACZztD,EAAIzR,OAASsgE,EACb7uD,EAAIsB,YAEJnE,QAAQ2R,IAAI,qBAAsB5R,GAGpCqxD,GAAc,GACdpgC,EAAEj9B,YAGN,YAAiBk9D,EAAaD,GAE9B,MAAMI,EAAiB3xB,IAClBA,GACDwxB,EAAYjhE,aAAa,WAAY,QACrCkhE,EAAQlhE,aAAa,WAAY,UAEjCihE,EAAY72B,gBAAgB,YAC5B82B,EAAQ92B,gBAAgB,cAI5B,YAAiB82B,EAAU1hE,IACX,IAAI,GAAU,mBAAoB,CAC9Cs7B,QAAS,CAAC,CACR7B,QAAS,SACT0oC,UAAU,GACT,CACD1oC,QAAS,gBACT4C,SAAU,KAERulC,GAAc,GACd,aAAaF,GACbV,GAAA,EAAgBa,eAAe,CAC7BC,KAAM7hE,KAAK6hE,KACXC,gBAAiB9hE,KAAK+hE,cACtBC,YAAahiE,KAAKgiE,YAClBnB,MAAO,KACNl9D,KAAK,KACNs9D,KACE3wD,IACFqxD,GAAc,MAGlB35B,UAAU,IAEZnQ,aAAc,uBACdgE,mBAAoB,6BAGhBuB,SAGRjoB,EAAa9T,OAAOmD,EAAWpD,UAAWogE,EAAaC,GAEvDlB,EAAal/D,OAAO8T,GAEpBnV,KAAKuP,WAAWnO,UAAUC,OAAO6T,EAAQ9T,WAG3C,qBACMs/D,GAAS1gE,KAAK4gE,UAClB5gE,KAAKwE,WAAWpE,MAAM6B,S,kCC/JX,MAAM,WAAsC,EAM/C,OACRjC,KAAKoB,UAAUlB,UAAUW,IAAI,wBAAyB,8BACtDb,KAAK+U,SAAS,8BAEd,MAAMG,EAAU,IAAI,GAAe,CACjCooB,aAAa,IAITzjB,EAAM,KAAmByuC,wBADjB,MAERgY,EAAmB3/D,SAASC,cAAc,OAE7CiZ,EACDkX,GAAY,CACVlX,MACAmX,IAAKsvC,EACLh9D,MAAM,EACNc,MAAM,EACNZ,MAAO,IACPC,OAAQ,IACR+iD,MAZU,OAaT7iD,KAAK,QAIR28D,EAAiBpgE,UAAUW,IAAI,yBAGjCqU,EAAQvD,QAAQtQ,OAAOi/D,GAEvB,MAAMnrD,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAAM2D,EAAaxE,KAAKwE,WAAa,IAAI,IAAW,CAClDhE,KAAM,OACNuF,MAAO,qCAGTvB,EAAWpE,MAAMkB,iBAAiB,WAAavB,IAC7C,GAAa,UAAVA,EAAEqH,IAEH,OADA,OAAA4iB,EAAA,GAAYjqB,GACLyE,EAAWG,MAAQ48D,IAAoBY,MAIlD,MAAMlB,EAAS,CAAClhE,EAAWqiE,KACtBriE,GACD,OAAAiqB,EAAA,GAAYjqB,GAGd,MAAM8hE,EAAOO,EAAW59D,EAAWG,WAAQ0D,EAC3C,GAAGw5D,GAAQ7hE,KAAKgiE,cAAgBH,EAE9B,YADAloC,GAAM,IAAK9iB,OAAO,uBAAuB,IAI3C,MAAMzD,EAAM,IAAI,GAA+BpT,KAAKoR,QACpDgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAI2uD,cAAgB/hE,KAAK+hE,cACzB3uD,EAAI4uD,YAAchiE,KAAKgiE,YACvB5uD,EAAIyuD,KAAOA,EAEXzuD,EAAIsB,QAGA8sD,EAAc,YAAO,gCAAiC,CAAClpC,KAAM,aAC7DmpC,EAAU,YAAO,4DAA6D,CAACnpC,KAAM,kBAErFipC,EAAmBxhE,GAAckhE,EAAOlhE,GAAG,GAC3CoiE,EAAepiE,GAAckhE,EAAOlhE,GAAG,GAC7C,YAAiByhE,EAAaD,GAC9B,YAAiBE,EAASU,GAE1BhtD,EAAa9T,OAAOmD,EAAWpD,UAAWogE,EAAaC,GAEvDvsD,EAAQvD,QAAQtQ,OAAO8T,GAEvBnV,KAAKuP,WAAWnO,UAAUC,OAAO6T,EAAQ9T,WAG3C,qBACEpB,KAAKwE,WAAWpE,MAAM6B,SCzFX,MAAM,WAAiD,EAM1D,OACRjC,KAAKoB,UAAUlB,UAAUW,IAAI,wBAAyB,uCAAwC,2CAC9Fb,KAAK+U,SAAS,yBAEd,MAAMG,EAAU,IAAI,GAAe,CACjCooB,aAAa,IAGTnoB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAAMoC,EAAqBjD,KAAKiD,mBAAqB,IAAI,KAAmB,CAC1EzC,KAAM,oBACNuF,MAAO,0BAGHs8D,EAAS,IAAI,KAAep/D,EAAoB,KAEhDu+D,EAAc,YAAO,gCAAiC,CAAClpC,KAAM,aAEnEnjB,EAAa9T,OAAO4B,EAAmB7B,UAAWogE,GAClDtsD,EAAQvD,QAAQtQ,OAAOghE,EAAOjhE,UAAW+T,GAEzCnV,KAAKuP,WAAWnO,UAAUC,OAAO6T,EAAQ9T,WAEzC6B,EAAmB7C,MAAMkB,iBAAiB,WAAavB,IAKrD,GAJGkD,EAAmB7C,MAAMF,UAAUuV,SAAS,UAC7CxS,EAAmBm3B,SAAS,IAAWC,SAG5B,UAAVt6B,EAAEqH,IACH,OAAOm6D,MAIX,MAAMe,EAAc,IACftiE,KAAKgiE,cAAgB/+D,EAAmB0B,QACzC1B,EAAmBs3B,YACZ,GAMLgnC,EAAmBxhE,IAKvB,GAJGA,GACD,OAAAiqB,EAAA,GAAYjqB,IAGVuiE,IAAe,OAEnB,MAAMlvD,EAAM,IAAI,GAA8BpT,KAAKoR,QACnDgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAI2uD,cAAgB/hE,KAAK+hE,cACzB3uD,EAAI4uD,YAAchiE,KAAKgiE,YACvB5uD,EAAIsB,QAIN,OAFA,YAAiB8sD,EAAaD,GAEvBc,EAAO54D,OAGhB,qBACEzJ,KAAKiD,mBAAmB7C,MAAM6B,SC9DnB,MAAM,WAA+C,EAApE,c,oBAIS,KAAA2+D,SAAU,EAEP,OACR,MAAMz1B,GAASnrC,KAAKo5B,MAAM7a,OAAOgkD,cAAgBviE,KAAK+hE,cACtD/hE,KAAKoB,UAAUlB,UAAUW,IAAI,wBAAyB,wCACtDb,KAAK+U,SAASo2B,EAAQ,2BAA6B,8BAEnD,MAAMj2B,EAAU,IAAI,GAAe,CACjCooB,aAAa,IAGTnoB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAAMoC,EAAqBjD,KAAKiD,mBAAqB,IAAI,KAAmB,CAC1EzC,KAAM,iBACNuF,MAAOolC,EAAQ,2BAA8BnrC,KAAKo5B,MAAMyoC,UAAOx5D,EAAY,gBAC3Em6D,WAAYr3B,GAASnrC,KAAKo5B,MAAMyoC,KAAO,IAAkBt1C,cAAcvsB,KAAKo5B,MAAMyoC,WAAQx5D,IAGtFg6D,EAAS,IAAI,KAAep/D,EAAoB,KAEhDu+D,EAAc,YAAO,iCACrBvjB,EAAS,IAAI,IAAKgc,YAAY,CAAC7yD,IAAK,aAE1Co6D,EAAYngE,OAAO48C,EAAOljC,SAE1B5F,EAAa9T,OAAO4B,EAAmB7B,UAAWogE,GAClDtsD,EAAQvD,QAAQtQ,OAAOghE,EAAOjhE,UAAW+T,GAEzCnV,KAAKuP,WAAWnO,UAAUC,OAAO6T,EAAQ9T,WAEzC6B,EAAmB7C,MAAMkB,iBAAiB,WAAavB,IAOrD,GANGkD,EAAmB7C,MAAMF,UAAUuV,SAAS,WAC7CxS,EAAmB7C,MAAMF,UAAUoE,OAAO,SAC1C25C,EAAO72C,IAAM,WACb62C,EAAOzX,UAGI,UAAVzmC,EAAEqH,IACH,OAAOm6D,MAIX,MAAMe,EAAc,MACdr/D,EAAmB0B,MAAMhD,SAC3BsB,EAAmB7C,MAAMF,UAAUW,IAAI,UAChC,GAMX,IAAI0gE,EACJ,GAAIp2B,EAkEFo2B,EAAmBxhE,IAKjB,GAJGA,GACD,OAAAiqB,EAAA,GAAYjqB,IAGVuiE,IAAe,OAEnB,MAAMlvD,EAAM,IAAI,GAAyCpT,KAAKoR,QAC9DgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAI4uD,YAAc/+D,EAAmB0B,MACrCyO,EAAI2uD,cAAgB/hE,KAAK+hE,cACzB3uD,EAAIsB,YA7EG,CACT,IAAI+tD,EAEAtpC,EAAW,KAETspC,IACFA,EAAmBvgE,OAAO6wC,YAAY5Z,EAAU,MAG3C4nC,GAAA,EAAgB5nC,WAAWx1B,KAAK++D,IACrC1iE,KAAKo5B,MAAQspC,EAEV1iE,KAAKo5B,MAAMyoC,KACZ,OAAA/0C,EAAA,GAAa7pB,EAAmB8C,MAAO,IAAkBwmB,cAAcvsB,KAAKo5B,MAAMyoC,OAElF,OAAApxD,EAAA,GAAexN,EAAmB8C,MAAO,YAAK,qBA+CpDw7D,EA1CgBxhE,IACd,IAAIuiE,IAEF,YADA,OAAAt4C,EAAA,GAAYjqB,GAIdyhE,EAAYjhE,aAAa,WAAY,QACrC09C,EAAO72C,IAAM,aACb62C,EAAOzX,SACP,MAAMpc,EAAY,aAAao3C,GAEzBO,EAAgB9+D,EAAmB0B,MACzCo8D,GAAA,EAAgB4B,MAAM1/D,EAAmB0B,MAAO3E,KAAKo5B,OAAOz1B,KAAKi/D,IAG/D,GAFAryD,QAAQ2R,IAAI0gD,GAEE,uBAAXA,EAAKx3D,EAA4B,CAClC6xC,cAAcwlB,GACXJ,GAAQA,EAAO/9D,SAClB,MAAM8O,EAAM,IAAI,GAA0BpT,KAAKoR,QAC/CgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAI2uD,cAAgBA,EACpB3uD,EAAIsB,OACJ1U,KAAKoR,OAAOgD,qBAAqBpU,QAEjCsQ,IACFkxD,EAAY72B,gBAAgB,YAC5B1nC,EAAmB7C,MAAMF,UAAUW,IAAI,SAEhCyP,EAAIjQ,KAGP49C,EAAO72C,IAAM,8BACb62C,EAAOzX,SACPpc,EAAU9lB,SACVrB,EAAmBF,SAIvBo2B,OAMJA,IAmBF,OAFA,YAAiBqoC,EAAaD,GAEvBc,EAAO54D,OAGhB,qBACMi3D,GAAS1gE,KAAK4gE,UAClB5gE,KAAKiD,mBAAmB7C,MAAM6B,SCtJnB,MAAM,WAAkC,EAI3C,OACRjC,KAAKoB,UAAUlB,UAAUW,IAAI,wBAAyB,8BACtDb,KAAK+U,SAAS,4BAEd,MAAMG,EAAU,IAAI,GAAe,CACjCmoB,SAAS,EACTC,aAAa,IAITzjB,EAAM,KAAmByuC,wBADjB,MAERgY,EAAmB3/D,SAASC,cAAc,OAE7CiZ,EACDkX,GAAY,CACVlX,MACAmX,IAAKsvC,EACLh9D,MAAM,EACNc,MAAM,EACNZ,MAAO,IACPC,OAAQ,IACR+iD,MAZU,OAaT7iD,KAAK,QAIR28D,EAAiBpgE,UAAUW,IAAI,yBAGjCqU,EAAQvD,QAAQtQ,OAAOi/D,GAEvB,MAAMxoC,EAAI5iB,EAAQ8wB,yBAClB,GAAGhmC,KAAKo5B,MAAM7a,OAAOgkD,aAAc,CACjC,YAAMrtD,EAAQmoB,QAAS,2BAEvB,MAAMwlC,EAAoB,YAAO,8BAA+B,CAAC1xD,KAAM,OAAQmnB,KAAM,+BAC/EwqC,EAAqB,YAAO,8BAA+B,CAAC3xD,KAAM,cAAemnB,KAAM,+BACvFyqC,EAAsB,YAAO,8BAA+B,CAAC5xD,KAAM,QAASmnB,KAAMt4B,KAAKo5B,MAAM7a,OAAOykD,aAAe,0BAA4B,2BAErJ,YAAiBH,EAAmB,KAClC,MAAMzvD,EAAM,IAAI,GAAuCpT,KAAKoR,QAC5DgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAI2uD,cAAgB/hE,KAAK+hE,cACzB3uD,EAAIsB,SAGN,YAAiBouD,EAAoB,KACrB,IAAI,GAAU,yBAA0B,CACpDznC,QAAS,CAAC,CACR7B,QAAS,UACT4C,SAAU,KACR2kC,GAAA,EAAgBa,eAAe,CAACE,gBAAiB9hE,KAAK+hE,gBAAgBp+D,KAAK,KACzE3D,KAAKoR,OAAOqvD,kBAAkB,GAAgBzgE,MAC9CA,KAAK49B,WAGToK,UAAU,IAEZnQ,aAAc,+BACdgE,mBAAoB,4BAGhBuB,SAGR,YAAiB2lC,EAAqB,KACpC,MAAM3vD,EAAM,IAAI,GAA+BpT,KAAKoR,QACpDgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAIyuD,KAAO7hE,KAAKo5B,MAAMyoC,KACtBzuD,EAAI2uD,cAAgB/hE,KAAK+hE,cACzB3uD,EAAI4uD,YAAchiE,KAAK+hE,cACvB3uD,EAAIwtD,SAAU,EACdxtD,EAAIsB,SAGNojB,EAAEz2B,OAAOwhE,EAAmBC,EAAoBC,OAC3C,CACL,YAAM7tD,EAAQmoB,QAAS,+BAEvB,MAAMloB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3B,MAAMoiE,EAAiB,YAAO,gCAAiC,CAAC3qC,KAAM,mCAEtEnjB,EAAa9T,OAAO4hE,GACpBnrC,EAAEz2B,OAAO8T,GAET,YAAiB8tD,EAAiBljE,IAChC,MAAMqT,EAAM,IAAI,GAAuCpT,KAAKoR,QAC5DgC,EAAIgmB,MAAQp5B,KAAKo5B,MACjBhmB,EAAIsB,SAIR1U,KAAKuP,WAAWnO,UAAUC,OAAO6T,EAAQ9T,YC5G9B,MAAM,WAA8B,EACvC,OACRpB,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,cAAe,qBAC5Cb,KAAK+U,SAAS,mBAEd,MAAMsoB,EAAuB,gDAC7B,IAAI,GAAe,CACjBjqB,IAAKpT,KACL0R,MAAO,gBACP6rD,SAAU,iCACViB,SAAU,CAACnhC,EAASA,EAASA,GAC7B8hC,eAAgB,CAAC,uCAAwC,yCACzDz+B,SAAU1gC,KAAKuP,cCZN,MAAM,WAAkC,EAC3C,OACRvP,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,cAAe,yBAC5Cb,KAAK+U,SAAS,uBAEd,MAAMsoB,EAAuB,oDAC7B,IAAI,GAAe,CACjBjqB,IAAKpT,KACL0R,MAAO,2BACP6rD,SAAU,8BACViB,SAAU,CAACnhC,EAASA,EAASA,GAC7B8hC,eAAgB,CAAC,uCAAwC,yCACzDz+B,SAAU1gC,KAAKuP,WACfyvD,UAAW,CAACjC,GAAY8B,WCff,MAAM,WAAqC,EAC9C,OACR7+D,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,cAAe,4BAC5Cb,KAAK+U,SAAS,4BAEd,MAAMsoB,EAAuB,gDAC7B,IAAI,GAAe,CACjBjqB,IAAKpT,KACL0R,MAAO,uBACP6rD,SAAU,0BACViB,SAAU,CAACnhC,EAASA,EAASA,GAC7B8hC,eAAgB,CAAC,uCAAwC,yCACzDz+B,SAAU1gC,KAAKuP,cCZN,MAAM,WAAiC,EAC1C,OACRvP,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,cAAe,yBAC5Cb,KAAK+U,SAAS,0BAEd,MAAMsoB,EAAuB,6CAC7B,IAAI,GAAe,CACjBjqB,IAAKpT,KACL0R,MAAO,cACP6rD,SAAU,4BACViB,SAAU,CAACnhC,EAASA,EAASA,GAC7B8hC,eAAgB,CAAC,uCAAwC,yCACzDz+B,SAAU1gC,KAAKuP,WACfyvD,UAAW,CAACjC,GAAY8B,WCff,MAAM,WAA2B,EACpC,OACR7+D,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,cAAe,iBAC5Cb,KAAK+U,SAAS,8BAEd,MAAMsoB,EAAuB,iDAC7B,IAAI,GAAe,CACjBjqB,IAAKpT,KACL0R,MAAO,eACP6rD,SAAU,2BACViB,SAAU,CAACnhC,EAASA,EAASA,GAC7B8hC,eAAgB,CAAC,uCAAwC,yCACzDz+B,SAAU1gC,KAAKuP,aAGjB,CACE,MAAM8tB,EAAuB,qCAC7B,IAAI,GAAe,CACjBjqB,IAAKpT,KACL0R,MAAO,mBACP6rD,SAAU,0BACViB,SAAU,CAACnhC,EAASA,EAASA,GAC7B8hC,eAAgB,CAAC,uCAAwC,yCACzDz+B,SAAU1gC,KAAKuP,eCTR,MAAM,WAA6B,EAItC,OACRvP,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,6BAC7Bb,KAAK+U,SAAS,iBAEd,MAAMmuD,EAAWN,IACf,MAAM/sC,EAAM,IAAI,GAAI,CAClBnkB,MAAO,CAACkxD,EAAKO,SAAUP,EAAKQ,aAAah4C,KAAK,KAC9C4E,SAAU,CAAC4yC,EAAKS,GAAIT,EAAK97D,SAASskB,KAAK,OACvCnd,WAAW,EACX0pB,WAAYirC,EAAKrkD,OAAOvV,aAAUX,EAAY,aAA8B,IAAIq0C,KAAqD,IAAhD73C,KAAKJ,IAAIm+D,EAAKU,YAAaV,EAAKW,kBAGvH1tC,EAAIz0B,UAAU8F,QAAQ+wD,KAAO,GAAK2K,EAAK3K,KAEvC,MAAMuL,EAAW7iE,SAASC,cAAc,OAMxC,OALA4iE,EAAStjE,UAAUW,IAAI,gBACvB2iE,EAASh1D,UAAY,CAACo0D,EAAKa,aAAcb,EAAKc,gBAAkBd,EAAKe,UAAU/3D,OAAOc,SAAS0e,KAAK,MAEpGyK,EAAI7F,SAASjvB,cAAcE,aAAauiE,EAAU3tC,EAAI7F,UAE/C6F,GAGH+tC,EAAiB5jE,KAAK4jE,eAAej+D,QAE3C,CACE,MAAMuP,EAAU,IAAI,GAAe,CACjC1U,KAAM,iBACN68B,QAAS,2BAGLulC,EAAO,OAAAthC,GAAA,GAAcsiC,EAAgBhB,GAAQA,EAAKrkD,OAAOvV,SACzD66D,EAAUX,EAAQN,GAIxB,GAFA1tD,EAAQvD,QAAQtQ,OAAOwiE,EAAQziE,WAE5BwiE,EAAejiE,OAAQ,CACxB,MAAMmiE,EAAe,YAAO,qCAAsC,CAAC3yD,KAAM,OAAQmnB,KAAM,yBACvF,YAAiBwrC,EAAe/jE,IAC9B,IAAI,GAAU,iBAAkB,CAC9Bs7B,QAAS,CAAC,CACR7B,QAAS,YACTwO,UAAU,EACV5L,SAAU,KACR,MAAMj8B,EAAS,aAAiB,CAAC2jE,IAAe,GAChD,KAAWlpC,UAAU,4BAA4Bj3B,KAAKgB,IAEpDm/D,EAAax/D,SACby/D,EAAa3iE,UAAUkD,UACtBoxC,GAAS/N,QAAQ,KAClBxnC,SAIN03B,aAAc,0BACdgE,mBAAoB,uBACnBuB,SAGLloB,EAAQvD,QAAQtQ,OAAOyiE,GAGzB9jE,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAGjC,IAAIwiE,EAAejiE,OACjB,OAGF,MAAMoiE,EAAe,IAAI,GAAe,CACtCvjE,KAAM,gBACN68B,QAAS,qBAGXumC,EAAer5D,QAAQq4D,IACrBmB,EAAapyD,QAAQtQ,OAAO6hE,EAAQN,GAAMxhE,aAG5CpB,KAAKuP,WAAWlO,OAAO0iE,EAAa3iE,WAEpC,MAAMs0C,EAAWplC,IACC,wCAAbA,EAAIjQ,MACLs5B,GAAM,IAAK9iB,OAAO,mCAAmC,KAIzD,IAAI6D,EACJ,MAAMspD,EAAmB,KACvB,MAAM/L,EAAOv9C,EAAOxT,QAAQ+wD,KAE5B,IAAI,GAAU,iBAAkB,CAC9B58B,QAAS,CAAC,CACR7B,QAAS,YACTwO,UAAU,EACV5L,SAAU,KACR,KAAWxB,UAAU,6BAA8B,CAACq9B,SACnDt0D,KAAKgB,IACDA,GACD+V,EAAOpW,UAERoxC,MAGP7d,aAAc,yBACdgE,mBAAoB,yBACnBuB,QAGCriB,EAAU/a,KAAKikE,YAAc,GAAW,CAAC,CAC7C9yD,KAAM,OACNmnB,KAAM,YACNopB,QAASsiB,KAEXjpD,EAAQhI,GAAK,8BACbgI,EAAQ7a,UAAUW,IAAI,eAEtBF,SAASg2C,eAAe,cAAct1C,OAAO0Z,GAE7C,aAA0B/a,KAAKuP,WAAWnO,UAAYrB,IACpD2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOxT,QAAQ+wD,OAI1Bl4D,aAAa+pB,YAAY/pB,EAAE0H,iBAE3B1H,aAAa+pB,aAAY/pB,EAAE80D,cAAe,GAE7C,aAAa90D,EAAGgb,GAChB,aAAYA,MAGd,YAAiB/a,KAAKuP,WAAWnO,UAAYrB,IAC3C2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOxT,QAAQ+wD,MAI7B+L,MAIJ,sBAKE,OAJGhkE,KAAKikE,aACNjkE,KAAKikE,YAAY3/D,SAGZ3E,MAAM4S,uBC/JF,MAAM,WAA2B,EAIpC,OACRvS,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,2BAC7Bb,KAAK+U,SAAS,gBAEd,MAAMG,EAAU,IAAI,GAAe,CACjCmoB,QAAS,qBAGXnoB,EAAQmoB,QAAQt8B,cAAcC,QAAQkU,EAAQmoB,SAE9Cr9B,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,MAAM8iE,EAAS,EAAa,CAAC/yD,KAAM,MAAOnD,UAAW,eACrDhO,KAAK2R,QAAQtQ,OAAO6iE,GAEpB,YAAiBA,EAASnkE,IACxB,IAAI,GAAc,CAChBqkC,UAAW,CAAC,YACZzzB,YAAa,gCACbuzB,SAAWj5B,IAET,IAAgBk5D,YAAYl5D,GAAQ,OAGvC,CAAC4G,eAAgB7R,KAAK6R,iBAEzB,MAAMzD,EAAO,GAAkBC,iBAC/BrO,KAAKuP,WAAWnO,UAAUlB,UAAUW,IAAI,sBACxCqU,EAAQvD,QAAQtQ,OAAO+M,GAEvB,MAAMvN,EAAM,CAACoK,EAAgB5J,KAC3B,MAAM,IAAC2V,GAAO,GAAkBC,aAAa,CAC3CC,OAAQjM,EACR7J,UAAWgN,EACX+B,YAAY,EACZgH,eAAe,EACf/G,WAAY,GACZ/O,WAGIkqC,EAAO,IAAgBC,QAAQvgC,GAClCsgC,EAAKhtB,OAAO6lD,IACbptD,EAAII,gBAAgB/V,OAAO,IAAMkqC,EAAK7Q,UAEnC6Q,EAAKY,MAAOn1B,EAAII,gBAAgB5I,UAAY,IAAgB49B,gBAAgBb,EAAKY,OAC/En1B,EAAII,gBAAgB/V,OAAOkqC,EAAK7Q,SAAW,IAAM6Q,EAAK7Q,SAAW,IAAgBrjB,oBAAoBpM,KAO9G,IAAI,MAAMA,KAAUjL,KAAKqW,QACvBxV,EAAIoK,GAAQ,GAGd,IAAIyP,EACJ,MAKMK,EAAU/a,KAAKikE,YAAc,GAAW,CAAC,CAC7C9yD,KAAM,UACNmnB,KAAM,UACNopB,QARgB,KAChB,MAAMz2C,EAASyP,EAAOxT,QAAQ+D,OAAOsgB,WACrC,IAAgB44C,YAAYl5D,GAAQ,IAOpCvL,QAAS,CAACmS,eAAgB7R,KAAK6R,mBAEjCkJ,EAAQhI,GAAK,4BACbgI,EAAQ7a,UAAUW,IAAI,eAEtBF,SAASg2C,eAAe,cAAct1C,OAAO0Z,GAE7C,aAA0B/a,KAAKuP,WAAWnO,UAAYrB,IACpD2a,EAAS,OAAAurB,GAAA,GAAUlmC,EAAE2a,OAAQ,MACzBA,IAID3a,aAAa+pB,YAAY/pB,EAAE0H,iBAE3B1H,aAAa+pB,aAAY/pB,EAAE80D,cAAe,GAE7C,aAAa90D,EAAGgb,GAChB,aAAYA,KACX/a,KAAK6R,gBAER7R,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,aAAewmC,IAChD,MAAM,OAACv7B,EAAM,QAAEo5D,GAAW79B,EACpBtG,EAAK9xB,EAAKqF,cAAc,kBAAkBxI,OAC7Co5D,EACGnkC,GACFr/B,EAAIoK,GAAQ,GAGXi1B,GACDA,EAAG57B,WAMT,IAAI45B,GAAU,EACdl+B,KAAKuP,WAAWK,iBAAmB,KAC9BsuB,IAIHA,GAAU,EACV,IAAgBomC,WAAWl2D,EAAKK,kBARf,IAQ8C9K,KAAKoM,IAClE,IAAI,MAAM9E,KAAU8E,EAAIsG,QACtBxV,EAAIoK,GAAQ,IAGX8E,EAAIsG,QAAQ1U,OAbA,IAauByM,EAAKK,oBAAsBsB,EAAIzH,SACnEtI,KAAKuP,WAAWK,iBAAmB,MAGrC5P,KAAKuP,WAAW8uB,qBACfsJ,QAAQ,KACTzJ,GAAU,MAKhB,qBACEl+B,KAAKuP,WAAW83B,WAGlB,sBAKE,OAJGrnC,KAAKikE,aACNjkE,KAAKikE,YAAY3/D,SAGZ3E,MAAM4S,uB,cC7JF,SAASgyD,GAAqBn9D,GAG3C,OADAA,EAAM,SADNA,EAAMA,EAAI,GAAGo9D,cAAgBp9D,EAAIzB,MAAM,ICkC1B,MAAM,WAAiC,EAI1C,OACR3F,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,wBAC7Bb,KAAK+U,SAAS,mBAId,CACE,MAAMG,EAAU,IAAI,GAAe,CAACooB,aAAa,EAAMD,QAAS,iBAEhE,IAAIonC,EACJ,MAAMC,EAAkB,IAAI,GAAI,CAC9BvzD,KAAM,aACN0mB,aAAc,eACdN,gBAT0B,UAU1BtpB,UAAW,KACT,MAAMmF,EAAM,IAAI,GAAmBpT,KAAKoR,QACxCgC,EAAIiD,QAAUouD,EACdrxD,EAAIsB,UAKR,IAAIiwD,EAFJD,EAAgBttC,SAAU,EAG1B,MAuBMwtC,EAAe,IAAI,GAvBG,CAC1BzzD,KAAM,OACN0mB,aAAc,sBACdN,gBAtB0B,UAuB1BtpB,UAAYlO,IACV,IAAIqT,EACDuxD,EAAcpmD,OAAOgkD,aACtBnvD,EAAM,IAAI,GAAuCpT,KAAKoR,QAC9CuzD,EAAcE,2BACtBzxD,EAAM,IAAI,GAA2CpT,KAAKoR,QAC1DgC,EAAIytD,MAAQ8D,EAAcE,0BAC1BzxD,EAAIzR,OAAS,EACbyR,EAAIwtD,SAAU,EACdG,GAAA,EAAgBO,uBAEhBluD,EAAM,IAAI,GAA0BpT,KAAKoR,QAG3CgC,EAAIgmB,MAAQurC,EACZvxD,EAAIsB,UAKRkwD,EAAaxtC,SAAU,EAEvB,MAAM0tC,EAAoB9kE,KAAK8kE,kBAAoB,IAAI,GAAI,CACzD3zD,KAAM,iBACN0mB,aAAc,gBACdN,gBAhD0B,UAiD1BtpB,UAAW,KACT,MAAMmF,EAAM,IAAI,GAAqBpT,KAAKoR,QAC1CgC,EAAIwwD,eAAiB5jE,KAAK4jE,eAC1BxwD,EAAIf,cAAc/Q,iBAAiB,UAAW,KAC5CtB,KAAK+kE,wBACJ,CAAClmD,MAAM,IACVzL,EAAIsB,UAGRowD,EAAkB1tC,SAAU,EAE5BliB,EAAQvD,QAAQtQ,OAAOqjE,EAAgBtjE,UAAWwjE,EAAaxjE,UAAW0jE,EAAkB1jE,WAC5FpB,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,MAAM4jE,EAAmB18D,IACpBA,EACD,OAAAmI,EAAA,GAAei0D,EAAgB10C,SAAU,YAAK,sCAAuC,CAAC1nB,KAEtF,OAAAmI,EAAA,GAAei0D,EAAgB10C,SAAU,YAAK,eAAgB,CAAC1nB,MAInEtI,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,aAAc,KAM/CilE,MAGF,MAAMA,EAAgB,KACpB,IAAgBX,aAAa3gE,KAAKoM,IAChC20D,EAAgBttC,SAAU,EAC1B4tC,EAAgBj1D,EAAIzH,OACpBm8D,EAAiB10D,EAAIsG,WAIzB4uD,IAEAlE,GAAA,EAAgB5nC,WAAWx1B,KAAKy1B,IAC9BurC,EAAgBvrC,EAChB,OAAA3oB,EAAA,GAAem0D,EAAa50C,SAAU,YAAKoJ,EAAM7a,OAAOgkD,aAAe,6BAA+B,gCACtGqC,EAAaxtC,SAAU,IAKzBp3B,KAAK+kE,uBAGP,CACE,MAAM7vD,EAAU,IAAI,GAAe,CAAC1U,KAAM,eAAgB68B,QAAS,0BAEnEnoB,EAAQvD,QAAQzR,UAAUW,IAAI,gCAE9B,MAAMqkE,EAED,GAECC,EAAsBD,EAAuC,2BAAI,IAAI,GAAI,CAC7ErtC,aAAc,oBACdN,gBAhH0B,UAiH1BtpB,UAAW,KACT,IAAI,GAAyBjO,KAAKoR,QAAQsD,UAIxC0wD,EAAkBF,EAA2C,+BAAI,IAAI,GAAI,CAC7ErtC,aAAc,gBACdN,gBAxH0B,UAyH1BtpB,UAAW,KACT,IAAI,GAAsBjO,KAAKoR,QAAQsD,UAIrC2wD,EAAqBH,EAAwC,4BAAI,IAAI,GAAI,CAC7ErtC,aAAc,2BACdN,gBAhI0B,UAiI1BtpB,UAAW,KACT,IAAI,GAA0BjO,KAAKoR,QAAQsD,UAIzC4wD,EAAUJ,EAAqC,yBAAI,IAAI,GAAI,CAC/DrtC,aAAc,eACdN,gBAxI0B,UAyI1BtpB,UAAW,KACT,IAAI,GAAmBjO,KAAKoR,QAAQsD,UAIlC6wD,EAAiBL,EAAoC,wBAAI,IAAI,GAAI,CACrErtC,aAAc,uBACdN,gBAhJ0B,UAiJ1BtpB,UAAW,KACT,IAAI,GAA6BjO,KAAKoR,QAAQsD,UAI5C8wD,EAAmBN,EAAsC,0BAAI,IAAI,GAAI,CACzErtC,aAAc,cACdN,gBAxJ0B,UAyJ1BtpB,UAAW,KACT,IAAI,GAAyBjO,KAAKoR,QAAQsD,UAIxC+wD,EAAoBr+D,IACxB,MAAMyuB,EAAMqvC,EAAW99D,GACnByuB,GAIJ,GAAkB4pC,WAAWr4D,GAAKzD,KAAK25D,IACrC,MAAMlkD,EAAU,GAAkBsmD,uBAAuBpC,GACnD9jC,EAAUpgB,EAAQ/Y,OAAS08D,GAAY6B,UAAY,qCAAwCxlD,EAAQ/Y,OAAS08D,GAAYgC,SAAW,uCAAyC,mCAC5K2G,EAAiBtsD,EAAQklD,cAAcZ,MAAM/7D,OAASyX,EAAQklD,cAAcV,MAAMj8D,OAClFgkE,EAAcvsD,EAAQilD,WAAWX,MAAM/7D,OAASyX,EAAQilD,WAAWT,MAAMj8D,OAE/Ek0B,EAAI7F,SAASxhB,UAAY,GACzB,MAAMsN,EAAI,YAAK0d,GACf3D,EAAI7F,SAAS3uB,OAAOya,IACjB4pD,GAAkBC,IACnB9vC,EAAI7F,SAAS3uB,OAAO,KAAK,EAAEqkE,EAAgBC,EAAc,IAAMA,EAAc,GAAG/5D,OAAOc,SAAS0e,KAAK,aAK3GlW,EAAQvD,QAAQtQ,OACd8jE,EAAoB/jE,UACpBgkE,EAAgBhkE,UAChBikE,EAAmBjkE,UACnBkkE,EAAQlkE,UACRmkE,EAAenkE,UACfokE,EAAiBpkE,WAEnBpB,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,IAAI,MAAMgG,KAAO89D,EACfO,EAAiBr+D,GAGnBwF,EAAA,EAAUtL,iBAAiB,iBAAmBklC,IAC5Ci/B,EAAiBlB,GAAqB/9B,EAAOp/B,IAAIgE,MAIrD,MAAM43B,EAA2B,GACjC,CACE,MAAM9tB,EAAU,IAAI,GAAe,CAAC1U,KAAM,6BAC1C0U,EAAQ9T,UAAUlB,UAAUW,IAAI,QAEhCmiC,EAASz5B,KAAK,KAAWqxB,UAAU,8BAA8Bj3B,KAAKggC,IACpE,IAAIA,EAASplB,OAAOqnD,qBAClB,OAGF,MAAMrkD,EAAUoiB,EAASplB,OAAOsnD,kBAE1BC,EAAe,IAAI,GAAI,CAC3BxuC,cAAe,IAAI,KAAc,CAACgB,KAAM,mCAAoCnB,QAAS5V,IACrFgW,gBAAiB,mCACjBK,oBAAoB,IAGtB1iB,EAAQvD,QAAQtQ,OAAOykE,EAAa1kE,WACpC8T,EAAQ9T,UAAUlB,UAAUoE,OAAO,QAEnCtE,KAAKqS,cAAc/Q,iBAAiB,UAAW,KAC7C,MAAMykE,EAAWD,EAAaxuC,cAAcH,QAC1B4uC,IAAaxkD,GAK/B,KAAWqZ,UAAU,6BAA8B,CACjDirC,kBAAmBE,KAEpB,CAAClnD,MAAM,OAGZ7e,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAGjC,CACE,MAAM8T,EAAU,IAAI,GAAe,CAAC1U,KAAM,gBAEpCm0D,EAAgB,KACN,IAAI,GAAU,sBAAuB,CACjDt5B,QAAS,CAAC,CACR7B,QAAS,SACT4C,SAAU,KACR,MAAMj8B,EAAS,aAAiB,CAAC6lE,IAAe,GAChD,KAAiBC,iBAAiBtiE,KAAK,KACrCxD,OAGJ6nC,UAAU,IAEZnQ,aAAc,6BACdgE,mBAAoB,0BAGhBuB,QAGF4oC,EAAe,YAAO,8BAA+B,CAAC70D,KAAM,SAAUmnB,KAAM,6BAClFt4B,KAAK6R,eAAehR,IAAImlE,EAAxBhmE,CAAsC,QAAS20D,GAC/Cz/C,EAAQvD,QAAQtQ,OAAO2kE,GAcvBhmE,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAGjC,OAAOiE,QAAQC,IAAI09B,GAGd,uBACL,KAAWpI,UAAU,6BAA6Bj3B,KAAKuiE,IACrDlmE,KAAK8kE,kBAAkB1tC,SAAU,EACjCp3B,KAAK4jE,eAAiBsC,EAAMtC,eAC5B,YAAM5jE,KAAK8kE,kBAAkB90C,SAAU,kBAAmB,CAAChwB,KAAK4jE,eAAejiE,YC/T9E,SAASwkE,GAAuBjhE,GACrC,MAAMkI,EAAUlI,EAAOyP,WAAW,MAE5ByxD,EAAQ,IAAIj6D,MAAM,GAAG2jB,KAAK,GAC1Bu2C,EAASj5D,EAAQk5D,aAAa,EAAG,EAAGphE,EAAO1B,MAAO0B,EAAOzB,QAAQukD,KACvE,IAAI,IAAIpmD,EAAI,EAAGA,EAAIykE,EAAO1kE,OAAQC,GAAK,EACrCwkE,EAAM,IAAMC,EAAOzkE,GACnBwkE,EAAM,IAAMC,EAAOzkE,EAAI,GACvBwkE,EAAM,IAAMC,EAAOzkE,EAAI,GACvBwkE,EAAM,IAAMC,EAAOzkE,EAAI,GAGzB,MAAM2kE,EAAeF,EAAO1kE,OAAS,EAC/B6kE,EAAW,IAAIC,kBAAkB,GAKvC,OAJAD,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EAClBC,ECPF,SAASE,GAAW3gD,EAAW4gD,EAAWp6D,EAAWD,EAAY,GACtEyZ,GAAK,IAAK4gD,GAAK,IAAKp6D,GAAK,IACzB,MAAM9H,EAAMI,KAAKJ,IAAIshB,EAAG4gD,EAAGp6D,GACrBzH,EAAMD,KAAKC,IAAIihB,EAAG4gD,EAAGp6D,GAC3B,IAAImT,EAAG5D,EAAG8qD,GAAKniE,EAAMK,GAAO,EAE5B,GAAGL,IAAQK,EACT4a,EAAI5D,EAAI,MACH,CACL,IAAIylB,EAAI98B,EAAMK,EAEd,OADAgX,EAAI8qD,EAAI,GAAMrlC,GAAK,EAAI98B,EAAMK,GAAOy8B,GAAK98B,EAAMK,GACvCL,GACN,KAAKshB,EACHrG,GAAKinD,EAAIp6D,GAAKg1B,GAAKolC,EAAIp6D,EAAI,EAAI,GAC/B,MACF,KAAKo6D,EACHjnD,GAAKnT,EAAIwZ,GAAKwb,EAAI,EAClB,MACF,KAAKh1B,EACHmT,GAAKqG,EAAI4gD,GAAKplC,EAAI,EAGtB7hB,GAAK,EAGP,MAAO,CACLA,EAAO,IAAJA,EACH5D,EAAO,IAAJA,EACH8qD,EAAO,IAAJA,EACHt6D,KAgBG,SAASu6D,GAAWnnD,EAAW5D,EAAW8qD,EAAWt6D,GAE1D,IAAIyZ,EAAW4gD,EAAWp6D,EAE1B,GAHAmT,GAAK,IAAeknD,GAAK,IAGhB,KAHC9qD,GAAK,KAIbiK,EAAI4gD,EAAIp6D,EAAIq6D,MACP,CACL,MAAME,EAAU,SAAiB/qC,EAAW6G,EAAWtuB,GAGrD,OAFGA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAE,EAAUynB,EAAc,GAAT6G,EAAI7G,GAASznB,EAClCA,EAAI,GAAYsuB,EAChBtuB,EAAI,EAAE,EAAUynB,GAAK6G,EAAI7G,IAAM,EAAE,EAAIznB,GAAK,EACtCynB,GAGH6G,EAAIgkC,EAAI,GAAMA,GAAK,EAAI9qD,GAAK8qD,EAAI9qD,EAAI8qD,EAAI9qD,EACxCigB,EAAI,EAAI6qC,EAAIhkC,EAClB7c,EAAI+gD,EAAQ/qC,EAAG6G,EAAGljB,EAAI,EAAE,GACxBinD,EAAIG,EAAQ/qC,EAAG6G,EAAGljB,GAClBnT,EAAIu6D,EAAQ/qC,EAAG6G,EAAGljB,EAAI,EAAE,GAG1B,MAAO,CAAC7a,KAAKE,MAAU,IAAJghB,GAAUlhB,KAAKE,MAAU,IAAJ4hE,GAAU9hE,KAAKE,MAAU,IAAJwH,GAAU1H,KAAKE,MAAU,IAAJuH,IAiB7E,SAASy6D,GAAWC,GACzB,MAAM/+D,EAAiB,GACjBqsB,EAAqB,MAAZ0yC,EAAK,GAAa,EAAI,EAKrC,GAJGA,EAAKrlE,SAAY,EAAI2yB,IACtB0yC,GAAQ1yC,EAAS,IAAM,IAAM,IAAM0yC,EAAKrhE,MAAM2uB,IAG7C0yC,EAAKrlE,SAAY,EAAI2yB,EACtB,IAAI,IAAI1yB,EAAI0yB,EAAQ1yB,EAAIolE,EAAKrlE,SAAUC,EACrCqG,EAAIsB,KAAKmZ,SAASskD,EAAKplE,GAAKolE,EAAKplE,GAAI,UAElC,GAAGolE,EAAKrlE,SAAY,EAAI2yB,EAAS,CACtC,IAAI,IAAI1yB,EAAI0yB,EAAQ1yB,EAAKolE,EAAKrlE,OAAS,IAAMC,EAC3CqG,EAAIsB,KAAKmZ,SAASskD,EAAKplE,GAAKolE,EAAKplE,GAAI,KAGvCqG,EAAIsB,KAAKmZ,SAASskD,EAAKA,EAAKrlE,OAAS,GAAI,UAEzC,IAAI,IAAIC,EAAI0yB,EAAQ1yB,EAAIolE,EAAKrlE,OAAQC,GAAK,EACxCqG,EAAIsB,KAAKmZ,SAASskD,EAAKrhE,MAAM/D,EAAGA,EAAI,GAAI,KAI5C,OAAOqG,EAGF,SAASg/D,GAASC,GACvB,OAAOH,GAAWG,EAAIvhE,MAAM,EAAG,IAQ1B,SAASwhE,GAAWC,GACzB,MAAO,IAAMA,EAAK36D,IAAIq4B,IAAM,IAAMA,EAAE4pB,SAAS,KAAK/oD,OAAO,IAAIylB,KAAK,IAG7D,SAASi8C,GAAiBC,GAC/B,OAAOH,GAtDF,SAA0BG,GAC/B,MAAMxH,EAAWwH,EAAK3hE,MAAM,GAAI,GAAG09C,MAAM,MACnCkkB,GAASzH,EAASz2D,MAClBpB,EAAM63D,EAASrzD,IAAK+6D,GACrBA,EAAIC,SAAS,MACND,EAAI7hE,MAAM,GAAI,IAGhB6hE,GAGV,OAAOX,GAAW5+D,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIs/D,GA2CxBG,CAAiBJ,IC7ItB,SAASK,GAAmBP,GACzC,IAAI,EAAC1nD,EAAC,EAAE5D,EAAC,EAAE8qD,GAAKF,GAAWU,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC/CtrD,EAAI,IACLA,EAAIjX,KAAKC,IAAI,IAAKgX,EAAI,EAAI,IAAO,IAAMA,KAEzC8qD,EAAI/hE,KAAKJ,IAAI,EAAO,IAAJmiE,GAGhB,MADa,QAAQlnD,MAAM5D,OAAO8qD,UCErB,MAAM,GAkDnB,cAjDiB,KAAAgB,OAJL,GAKK,KAAAC,QALL,GAQK,KAAAC,OAAS,GACT,KAAAC,aAAe,GAUf,KAAAC,OAAS,CACxB,EAAI,IAAO,GAAO,IAAO,EAAI,IAAM,EAAI,IAAM,EAAI,IAAM,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,GAAK,GACzF,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KACtF,GAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,GAAO,KAAO,KACpF,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,IAGrE,KAAAC,WAAa,CAC5B,CAAE7kD,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,IAAME,EAAG,KACd,CAAEF,EAAG,IAAME,EAAG,IACd,CAAEF,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,GAAME,EAAG,IACd,CAAEF,EAAG,IAAME,EAAG,KACd,CAAEF,EAAG,IAAME,EAAG,KAEC,KAAA4kD,QAAUloE,KAAKioE,WAAWtmE,OAiGnC,KAAAwmE,QAAWpoE,IACdC,KAAKooE,2BAIRpoE,KAAKqoE,cAAgBtoE,EAAEuoE,YACCjgE,IAArBrI,KAAKuoE,cACNvoE,KAAKuoE,YAAcviD,sBAAsBhmB,KAAKwoE,gBAI1C,KAAAA,YAAc,KACpB,IAAI/yC,EAAOz1B,KAAKqoE,aAAeroE,KAAK+nE,aAGpC,GAFA/nE,KAAKqoE,cAAgBroE,KAAK+nE,aAC1BtyC,EAAOA,EAAO,EAAI5wB,KAAKod,MAAMwT,GAAQ5wB,KAAKosC,KAAKxb,GAC5CA,EAAM,CACPz1B,KAAKyoE,WAAWhzC,GAChB,MAAMizC,EAAS1oE,KAAK2oE,YAAY3oE,KAAK4oE,OAAQ5oE,KAAK6oE,OAClD7oE,KAAK8oE,aAAaJ,GAEpB1oE,KAAKuoE,iBAAclgE,GAGb,KAAA0gE,yBAA2B,KACjC,MAAMC,EAAShpE,KAAKipE,QACdl2D,EAAKi2D,EAAOx/D,QACfuJ,GACD/S,KAAKkpE,cAAcn2D,GAGrB,MAAMnJ,EAAao/D,EAAOrnE,OAK1B,OAJIiI,IACF5J,KAAKooE,8BAA2B//D,KAGzBuB,GAlHT,MAAM6rB,EAAOz1B,KAAK8nE,OAAS9nE,KAAKgoE,OAAOhoE,KAAKgoE,OAAOrmE,OAAS,GAE5D,IAAI,IAAIC,EAAI,EAAGD,EAAS3B,KAAKgoE,OAAOrmE,OAAQC,EAAID,IAAUC,EACxD5B,KAAKgoE,OAAOpmE,GAAK5B,KAAKgoE,OAAOpmE,GAAK6zB,EAGpCz1B,KAAKmpE,kBAAoBnpE,KAAKgoE,OAAOv7D,IAAI,CAACq4B,EAAGljC,EAAGqG,K,MAC9C,OAAO68B,GAAe,QAAV,EAAA78B,EAAIrG,EAAI,UAAE,QAAI,KAItB,SAASslE,GACf,MAAM58D,EAAS28D,GAASC,GACxB,MAAO,CAACnhD,EAAGzb,EAAO,GAAIq8D,EAAGr8D,EAAO,GAAIiC,EAAGjC,EAAO,IAGxC,aAAad,GACnB,MAAM4/D,EAAYppE,KAAKioE,WAAWtiE,QAClC,KAAM6D,EAAQ,GACZ4/D,EAAU7/D,KAAK6/D,EAAU5/D,WACvBA,EAGJ,MAAMc,EAA2B,GACjC,IAAI,IAAI1I,EAAI,EAAGA,EAAIwnE,EAAUznE,OAAQC,GAAK,EACxC0I,EAAOf,KAAK6/D,EAAUxnE,IAExB,OAAO0I,EAGD,iBAAiB++D,EAAeC,EAAkBC,GACxD,MAAMte,EAAMjrD,KAAKwpE,aAAaH,GAC9B,IAAIE,EAAM,IAAuB,IAAjBA,EAAM5nE,OACpB,MAAO,CAACspD,GAGV,MACMwe,EADUzpE,KAAKwpE,eAAeH,EAAQrpE,KAAKkoE,SACvBz7D,IAAI,CAACi9D,EAAS1hE,KAC/B,CACLob,GAAIsmD,EAAQtmD,EAAI6nC,EAAIjjD,GAAKob,GAAKkmD,EAC9BhmD,GAAIomD,EAAQpmD,EAAI2nC,EAAIjjD,GAAKsb,GAAKgmD,KAalC,OATkBC,EAAM98D,IAAK9H,GACpB8kE,EAAUh9D,IAAI,CAAC8jC,EAAUvoC,KACvB,CACLob,EAAG6nC,EAAIjjD,GAAKob,EAAImtB,EAASntB,EAAIze,EAC7B2e,EAAG2nC,EAAIjjD,GAAKsb,EAAIitB,EAASjtB,EAAI3e,MAQ7B,YAAY0kE,EAAeM,GAEjC,OADkB3pE,KAAK4pE,iBAAiBP,EAAOrpE,KAAK8nE,OAAQ,CAAC6B,IAC5C,GAGX,WAAWl0C,GAGjB,IAFAz1B,KAAK6oE,OAASpzC,EAERz1B,KAAK6oE,OAAS7oE,KAAK8nE,QACvB9nE,KAAK6oE,OAAS7oE,KAAK8nE,SACd9nE,KAAK4oE,QAAU5oE,KAAKkoE,UACvBloE,KAAK4oE,QAAU5oE,KAAKkoE,SAIxB,KAAMloE,KAAK6oE,MAAQ,GACjB7oE,KAAK6oE,OAAS7oE,KAAK8nE,SACd9nE,KAAK4oE,OAAS,IACjB5oE,KAAK4oE,QAAU5oE,KAAKkoE,SA2ClB,qBAAqBkB,GAC3B,MAAMr2D,EAAK/S,KAAK6pE,MAAMC,gBAAgB9pE,KAAK4nE,OAAQ5nE,KAAK6nE,SAClDxB,EAAStzD,EAAGi1C,KAElB,IAAI1zB,EAAS,EACb,IAAI,IAAIhR,EAAI,EAAGA,EAAItjB,KAAK6nE,UAAWvkD,EAAG,CACpC,MACMymD,EADezmD,EAAItjB,KAAK6nE,QACS,GACjCmC,EAAmBD,EAAkBA,EAE3C,IAAI,IAAI3mD,EAAI,EAAGA,EAAIpjB,KAAK4nE,SAAUxkD,EAAG,CACnC,MAEM6mD,EAFe7mD,EAAIpjB,KAAK4nE,OAES,GAGjCsC,EAAc,IAFGrlE,KAAKslE,KAAKF,EAAkBA,EAAkBD,GAG/DI,EAAQF,EAAcA,EAAc,GAAM,EAC1CG,EAAWxlE,KAAKylE,IAAIF,GACpBG,EAAW1lE,KAAK2lE,IAAIJ,GAEpBK,EAAS5lE,KAAKJ,IAAI,EAAKI,KAAKC,IAAI,EAAK,GAAMmlE,EAAkBM,EAAWR,EAAkBM,IAC1FK,EAAS7lE,KAAKJ,IAAI,EAAKI,KAAKC,IAAI,EAAK,GAAMmlE,EAAkBI,EAAWN,EAAkBQ,IAEhG,IAAII,EAAc,EAEd5kD,EAAI,EACJ4gD,EAAI,EACJp6D,EAAI,EAER,IAAI,IAAI3K,EAAI,EAAGA,EAAI5B,KAAK4qE,QAAQjpE,OAAQC,IAAK,CAC3C,MAGMipE,EAAYJ,EAHHrB,EAAUxnE,GAAGwhB,EAItB0nD,EAAYJ,EAHHtB,EAAUxnE,GAAG0hB,EAK5B,IAAIitB,EAAW1rC,KAAKJ,IAAI,EAAK,GAAMI,KAAKslE,KAAKU,EAAYA,EAAYC,EAAYA,IACjFv6B,GAAWA,EAAWA,EAAWA,EACjCo6B,GAAep6B,EAEfxqB,GAAKwqB,EAAWvwC,KAAK4qE,QAAQhpE,GAAGmkB,EAAI,IACpC4gD,GAAKp2B,EAAWvwC,KAAK4qE,QAAQhpE,GAAG+kE,EAAI,IACpCp6D,GAAKgkC,EAAWvwC,KAAK4qE,QAAQhpE,GAAG2K,EAAI,IAGtC85D,EAAO/xC,KAAYvO,EAAI4kD,EAAc,IACrCtE,EAAO/xC,KAAYqyC,EAAIgE,EAAc,IACrCtE,EAAO/xC,KAAY/nB,EAAIo+D,EAAc,IACrCtE,EAAO/xC,KAAY,KAGvB,OAAOvhB,EAGD,cAAcA,GACpB/S,KAAK6pE,MAAMkB,aAAah4D,EAAI,EAAG,GAC/B/S,KAAKgrE,KAAKvpB,UAAUzhD,KAAKirE,IAAK,EAAG,EAAGjrE,KAAK4nE,OAAQ5nE,KAAK6nE,SAGhD,aAAauB,GACnBppE,KAAKkpE,cAAclpE,KAAKkrE,qBAAqB9B,IAyBxC,KAAKtnE,GACV9B,KAAKipE,QAAU,GACfjpE,KAAK4oE,OAAS,EACd5oE,KAAK6oE,MAAQ,EACb7oE,KAAKqoE,aAAe,OACIhgE,IAArBrI,KAAKuoE,cACNtiD,qBAAqBjmB,KAAKuoE,aAC1BvoE,KAAKuoE,iBAAclgE,GAGrB,MAAM8iE,EAASrpE,EAAGspE,aAAa,eAAe/nB,MAAM,KAAK56C,UACzDzI,KAAK4qE,QAAUO,EAAO1+D,IAAIowC,GACjB78C,KAAKinE,SAASpqB,IAGnB78C,KAAKirE,MACPjrE,KAAKirE,IAAMtqE,SAASC,cAAc,UAClCZ,KAAKirE,IAAIznE,MAAQxD,KAAK4nE,OACtB5nE,KAAKirE,IAAIxnE,OAASzD,KAAK6nE,QACvB7nE,KAAK6pE,MAAQ7pE,KAAKirE,IAAIt2D,WAAW,OAGnC3U,KAAKqrE,QAAUvpE,EACf9B,KAAKgrE,KAAOhrE,KAAKqrE,QAAQ12D,WAAW,MACpC3U,KAAKwmC,SAGA,SACL,GAAGxmC,KAAK4qE,QAAQjpE,OAAS,EAAG,CAC1B,MAAMk7C,EAAQ78C,KAAK4qE,QAAQ,GAG3B,OAFA5qE,KAAKgrE,KAAKM,UAAY,OAAOzuB,EAAM92B,MAAM82B,EAAM8pB,MAAM9pB,EAAMtwC,UAC3DvM,KAAKgrE,KAAKO,SAAS,EAAG,EAAGvrE,KAAK4nE,OAAQ5nE,KAAK6nE,SAI7C,MAAM5c,EAAMjrD,KAAK2oE,YAAY3oE,KAAK4oE,OAAQ5oE,KAAK6oE,OAC/C7oE,KAAK8oE,aAAa7d,GAGb,iB,MACL,GAAGjrD,KAAK4qE,QAAQjpE,OAAS,EACvB,OAGF,MAAMgoE,EAAO3pE,KAAK6oE,MACZ2C,EAAQxrE,KAAK8nE,OAEnB,IAAI2D,EAEJ,MAAMlC,EAAkB,GACxB,IAAI,IAAI3nE,EAAI,EAAGD,EAAS3B,KAAKmpE,kBAAkBxnE,OAAQC,EAAID,IAAUC,EAAG,CACtE,MAAM8pE,EAAM1rE,KAAKmpE,kBAAkBvnE,GACnC,IAAI+C,GAAqB,QAAZ,EAAA4kE,EAAM3nE,EAAI,UAAE,QAAI+nE,GAAQ+B,GAEjC/mE,EAAM0d,QAAQ,GAAKmpD,QAA4BnjE,IAAnBojE,IAC9BA,EAAiB7pE,EACjB+C,GAAS6mE,GAGXjC,EAAMhgE,KAAK5E,GAMb,CAH0B4kE,EAAM5jE,MAAM,EAAG8lE,QACCpjE,IAAnBojE,EAA+BlC,EAAM5jE,MAAM8lE,GAAkB,IAEhDlhE,QAAQ,CAACg/D,EAAOvhE,EAAK2jE,KACvD,MAAM7c,EAAOya,EAAMA,EAAM5nE,OAAS,GAOlC,QANY0G,IAATymD,GAAsBA,EAAO0c,IAC9BjC,EAAMA,EAAM5nE,OAAS,IAAMmtD,EAAKzsC,QAAQ,IAG1CriB,KAAK6oE,MAAQ/Z,UAAQ,GAEjBya,EAAM5nE,OACR,OAGF,MAAMynE,EAAYppE,KAAK4pE,iBAAiB5pE,KAAK4oE,OAAQ4C,EAAOjC,GACzDvhE,IAAS2jE,EAAOhqE,OAAS,KACrB3B,KAAK4oE,QAAU5oE,KAAKkoE,UACvBloE,KAAK4oE,QAAU5oE,KAAKkoE,SAIxB,MAAM/M,EAAMiO,EAAU38D,IAAKw+C,GAClBjrD,KAAKkrE,qBAAqBjgB,IAGnCjrD,KAAKipE,QAAQ1/D,QAAQ4xD,KAGvBn7D,KAAKooE,0BAA2B,EAChC,aAAQpoE,KAAK+oE,0BAGR,cAAc9hD,GAChBjnB,KAAK4qE,QAAQjpE,OAAS,GAAKslB,IAI3BA,IAAUjnB,KAAK4rE,sBAChBjrE,SAASW,iBAAiB,QAAStB,KAAKmoE,SACxCnoE,KAAK4rE,sBAAuB,IACnB3kD,GAASjnB,KAAK4rE,uBACvBjrE,SAASkN,oBAAoB,QAAS7N,KAAKmoE,SAC3CnoE,KAAK4rE,sBAAuB,IAIzB,UACL5rE,KAAK6rE,eAAc,GAId,oBAAoBV,GACzB,MAAMjmE,EAASvE,SAASC,cAAc,UAOtC,OANAsE,EAAO1B,MArXG,GAsXV0B,EAAOzB,OAtXG,QAuXI4E,IAAX8iE,IACDjmE,EAAOgC,QAAQikE,OAASA,GAGnBjmE,EAGF,cAAcimE,GACnB,MAAMjmE,EAASlF,KAAK8rE,aAAaX,GAC3BY,EAAmB,IAAI,GAG7B,OAFAA,EAAiB/5D,KAAK9M,GAEf,CAAC6mE,mBAAkB7mE,WC7Xf,MAAM,GAyBnB,cAhBO,KAAA8mE,IAAM,EACN,KAAAC,WAAa,IACb,KAAAC,UAAY,GACZ,KAAA3E,MAAQ,EACP,KAAAl8C,SAOJ,GAoGI,KAAA8gD,YAAc,KACpBxrE,SAAS22C,gBAAgBnyC,MAAM0oC,OAAS7tC,KAAKqrB,SAAS+gD,WAAWjnE,MAAM0oC,OAAS,YAG1E,KAAAw+B,UAAY,KAClB1rE,SAAS22C,gBAAgBnyC,MAAM0oC,OAAS7tC,KAAKqrB,SAAS+gD,WAAWjnE,MAAM0oC,OAAS,IAnGhF7tC,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,GAAYouC,YAEzC,MAAMnmB,EAAO,uBACG,GAAYmmB,WAAa,g+BAgBvB,GAAYA,WAAa,cAAc,GAAYA,WAAa,mKAIlE,GAAYA,WAAa,qCACvB,GAAYA,WAAa,6tBAavB,GAAYA,WAAa,cAAc,GAAYA,WAAa,mLAOpFjvC,KAAKoB,UAAUoN,UAAYsa,EAE3B9oB,KAAKqrB,SAASihD,IAAMtsE,KAAKoB,UAAU6qB,kBACnCjsB,KAAKqrB,SAAS+gD,WAAapsE,KAAKqrB,SAASihD,IAAIrzB,iBAC7Cj5C,KAAKqrB,SAAS4gD,WAAajsE,KAAKqrB,SAASihD,IAAIrgD,kBAAkBA,kBAE/DjsB,KAAKqrB,SAASkhD,QAAUvsE,KAAKqrB,SAASihD,IAAIhwC,mBAE1Ct8B,KAAKqrB,SAAS2gD,IAAMhsE,KAAKqrB,SAASkhD,QAAQtgD,kBAC1CjsB,KAAKqrB,SAASmhD,WAAaxsE,KAAKqrB,SAAS2gD,IAAI/yB,iBAE7Cj5C,KAAKysE,cAAgB,IAAI,IAAW,CAAC7sE,WAAW,EAAMmG,MAAO,yBAC7D/F,KAAK0sE,cAAgB,IAAI,IAAW,CAAC9sE,WAAW,EAAMmG,MAAO,yBAE7D,MAAM4mE,EAAShsE,SAASC,cAAc,OACtC+rE,EAAO3+D,UAAY,GAAYihC,WAAa,UAC5C09B,EAAOtrE,OAAOrB,KAAKysE,cAAcrrE,UAAWpB,KAAK0sE,cAActrE,WAC/DpB,KAAKoB,UAAUC,OAAOsrE,GAEtB3sE,KAAKysE,cAAcrsE,MAAMkB,iBAAiB,QAAS,KACjD,IAAIqD,EAAQ3E,KAAKysE,cAAc9nE,MAAMe,QAAQ,KAAM,IAAIC,MAAM,EAAG,GAEhE,MAAM4S,EAAQ5T,EAAM4T,MAAM,iBACpBq0D,EAAQr0D,GAASA,EAAM,GAAG5W,SAAWgD,EAAMhD,QAAU,CAAa,GAAGs9B,SAASt6B,EAAMhD,QAC1F3B,KAAKysE,cAAcryC,SAASwyC,EAAQ,IAAWvyC,QAAU,IAAWjL,OAEpEzqB,EAAQ,IAAMA,EACd3E,KAAKysE,cAAc7mE,iBAAiBjB,GAEjCioE,GACD5sE,KAAK6sE,SAASloE,GAAO,GAAO,KAKhC,MAAMmoE,EAAY,wHAClB9sE,KAAK0sE,cAActsE,MAAMkB,iBAAiB,QAAS,KACjD,MAAMiX,EAAQvY,KAAK0sE,cAAc/nE,MAAM4T,MAAMu0D,GAC7C9sE,KAAK0sE,cAActyC,SAAS7hB,EAAQ,IAAW8hB,QAAU,IAAWjL,OAEjE7W,GACDvY,KAAK6sE,SAASnG,IAAYnuD,EAAM,IAAKA,EAAM,IAAKA,EAAM,KAAK,GAAM,KAIrEvY,KAAK+sE,qBACL/sE,KAAKgtE,qBAWC,qBACNlqD,GAAoB9iB,KAAKqrB,SAASihD,IAAY,KAC5CtsE,KAAKmsE,cACLnsE,KAAKitE,QAAUjtE,KAAKqrB,SAASihD,IAAI5nD,yBAE/BumC,IACFjrD,KAAKktE,kBAAkBjiB,EAAI7nC,EAAG6nC,EAAI3nC,IACjC,KACDtjB,KAAKqsE,cAID,qBACNvpD,GAAoB9iB,KAAKqrB,SAAS2gD,IAAY,KAC5ChsE,KAAKmsE,cACLnsE,KAAKmtE,QAAUntE,KAAKqrB,SAAS2gD,IAAItnD,yBAE/BumC,IACFjrD,KAAKotE,WAAWniB,EAAI7nC,IACnB,KACDpjB,KAAKqsE,cAIF,SAASxvB,EAA2BwwB,GAAiB,EAAMC,GAAiB,GACjF,QAAajlE,IAAVw0C,EACDA,EAAQ,CACNn9B,EAAG,EACH5D,EAAG,IACH8qD,EAAG,GACHt6D,EAAG,QAEA,GAAqB,iBAAZ,EACd,GAAgB,MAAbuwC,EAAM,GACPA,EH3CD,SAAoBmqB,GACzB,MAAMI,EAAOL,GAAWC,GACxB,OAAON,GAAWU,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IGyCpCmG,CAAW1wB,OACd,CACL,MAAM2wB,EAAM3wB,EAAMtkC,MAAM,YACxBskC,EAAQ6pB,IAAY8G,EAAI,IAAKA,EAAI,IAAKA,EAAI,QAAenlE,IAAXmlE,EAAI,GAAmB,GAAKA,EAAI,IAKlFxtE,KAAKitE,QAAUjtE,KAAKqrB,SAASihD,IAAI5nD,wBAEjC,MAAM+oD,EAAOztE,KAAKitE,QAAQzpE,MAAQ,IAAMq5C,EAAM/gC,EACxC4xD,EAAW,IAAO7wB,EAAM+pB,GAAK,IAAM/pB,EAAM/gC,EAAI,GAAM,IACnD6xD,EAAO3tE,KAAKitE,QAAQxpE,OAAS,IAAMiqE,EAEzC1tE,KAAKktE,kBAAkBltE,KAAKitE,QAAQtnD,KAAO8nD,EAAMztE,KAAKitE,QAAQv0C,IAAMi1C,GAAM,GAG1E3tE,KAAKmtE,QAAUntE,KAAKqrB,SAAS2gD,IAAItnD,wBAEjC,MAAMkpD,EAAa/wB,EAAMn9B,EAAI,IACvBmuD,EAAO7tE,KAAKmtE,QAAQxnD,KAAO3lB,KAAKmtE,QAAQ3pE,MAAQoqE,EAEtD5tE,KAAKotE,WAAWS,GAAM,GAGtB7tE,KAAKgsE,IAAMnvB,EAAMn9B,EACjB1f,KAAKisE,WAAapvB,EAAM/gC,EACxB9b,KAAKksE,UAAYrvB,EAAM+pB,EACvB5mE,KAAKunE,MAAQ1qB,EAAMvwC,EAEnBtM,KAAK8tE,aAAaT,EAAgBC,GAG7B,kBACL,MAAMS,EAAYlH,GAAW7mE,KAAKgsE,IAAKhsE,KAAKisE,WAAYjsE,KAAKksE,UAAWlsE,KAAKunE,OACvEP,EAAOG,GAAW4G,GAClB7G,EAAMF,EAAKrhE,MAAM,GAAI,GAE3B,MAAO,CACLqoE,IAAK,OAAOhuE,KAAKgsE,QAAQhsE,KAAKisE,gBAAgBjsE,KAAKksE,cACnDsB,IAAK,OAAOO,EAAU,OAAOA,EAAU,OAAOA,EAAU,MACxD7G,IAAKA,EACLI,KAAM,QAAQtnE,KAAKgsE,QAAQhsE,KAAKisE,gBAAgBjsE,KAAKksE,eAAelsE,KAAKunE,SACzEH,KAAM,QAAQ2G,EAAU,OAAOA,EAAU,OAAOA,EAAU,OAAOA,EAAU,MAC3E/G,KAAMA,EACN+G,UAAWA,GAIR,aAAaV,GAAiB,EAAMC,GAAiB,GAC1D,MAAMzwB,EAAQ78C,KAAKiuE,kBACnBjuE,KAAKqrB,SAAS+gD,WAAW5jD,eAAe,KAAM,OAAQq0B,EAAMqqB,KAEzDmG,IACDrtE,KAAKysE,cAAc7mE,iBAAiBi3C,EAAMqqB,KAC1ClnE,KAAKysE,cAAcryC,SAAS,IAAWC,UAGtCizC,IACDttE,KAAK0sE,cAAc9mE,iBAAiBi3C,EAAMkxB,UAAUpoE,MAAM,GAAI,GAAGylB,KAAK,OACtEprB,KAAK0sE,cAActyC,SAAS,IAAWC,UAGtCr6B,KAAK0P,UACN1P,KAAK0P,SAASmtC,GAIV,WAAWx5B,EAAemjB,GAAS,GACzC,MAEMnhB,EAFS,OAAAC,GAAA,GAAMjC,EAAQrjB,KAAKmtE,QAAQxnD,KAAM,EAAG3lB,KAAKmtE,QAAQ3pE,OAEtCxD,KAAKmtE,QAAQ3pE,MACvCxD,KAAKgsE,IAAMnnE,KAAKE,MAAM,IAAMsgB,GAE5B,MAAMiiD,EAAO,QAAQtnE,KAAKgsE,mBAAmBhsE,KAAKunE,SAElDvnE,KAAKqrB,SAASmhD,WAAWhkD,eAAe,KAAM,IAAiB,IAAXnD,EAAkB,KACtErlB,KAAKqrB,SAASmhD,WAAWhkD,eAAe,KAAM,OAAQ8+C,GAEtDtnE,KAAKqrB,SAAS4gD,WAAWhzB,iBAAiBzwB,eAAe,KAAM,aAAc8+C,GAE1E9gC,GACDxmC,KAAK8tE,eAID,kBAAkBzqD,EAAeE,EAAeijB,GAAS,GAC/D,MAAM0nC,EAAOluE,KAAKitE,QAAQzpE,MACpB2qE,EAAOnuE,KAAKitE,QAAQxpE,OAKpB2qE,EAHS,OAAA9oD,GAAA,GAAMjC,EAAQrjB,KAAKitE,QAAQtnD,KAAM,EAAGuoD,GAG7BA,EAAO,IACvBG,EAHS,OAAA/oD,GAAA,GAAM/B,EAAQvjB,KAAKitE,QAAQv0C,IAAK,EAAGy1C,GAG5BA,EAAO,IAEvB/B,EAAapsE,KAAKqrB,SAAS+gD,WACjCA,EAAW5jD,eAAe,KAAM,IAAK4lD,EAAO,KAC5ChC,EAAW5jD,eAAe,KAAM,IAAK6lD,EAAO,KAE5C,MAAMpC,EAAa,OAAA3mD,GAAA,GAAM8oD,EAAM,EAAG,KAE5BE,EAAa,IAAMrC,EAAa,EAChCsC,EAAa,IAAM,OAAAjpD,GAAA,GAAM+oD,EAAM,EAAG,KAElCnC,EAAY,OAAA5mD,GAAA,GAAMipD,EAAa,IAAMD,EAAY,EAAG,KAE1DtuE,KAAKisE,WAAaA,EAClBjsE,KAAKksE,UAAYA,EAEd1lC,GACDxmC,KAAK8tE,gBAhRM,GAAA7+B,WAAa,eCEf,MAAM,WAA8B,EAAnD,c,oBA2FU,KAAAu/B,YAAc,CAACtH,EAAauH,GAAoB,KACtD,GAAGA,EACDzuE,KAAK0uE,YAAY7B,SAAS3F,OACrB,CACL,MAAME,EAAOL,GAAWG,GAClByH,EAAa3uE,KAAK4uE,MAAMD,WACxBrH,EAAOK,GAAmBP,GAEhCuH,EAAW57D,GAAK,IAChB47D,EAAWE,UAAY,EACvBF,EAAWG,KAAO,GAClBH,EAAW9xB,MAAQqqB,EAAI1jB,cACvBmrB,EAAWhH,mBAAqBL,EAChCpuC,EAAA,EAAgB61C,YAAY,WAAYniE,EAAA,EAAU+2B,UAElD,GAAaqrC,uBAAkB3mE,OAAWA,GAAW,GACrDrI,KAAK0O,cAID,KAAAugE,cAAiBpyB,IACvB78C,KAAKkvE,WAAWryB,EAAMqqB,KAAK,IA1G7B,OACElnE,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,uBAAwB,8BACrDb,KAAK+U,SAAS,YAEd/U,KAAK4uE,MAAQhiE,EAAA,EAAUuiE,WAEvB,MAAMj6D,EAAU,IAAI,GAAe,IACnClV,KAAK0uE,YAAc,IAAI,GAEvBx5D,EAAQvD,QAAQtQ,OAAOrB,KAAK0uE,YAAYttE,WAExCpB,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,MAAMguE,EAAc,IAAI,GAAe,IAEjCC,EAAOrvE,KAAKqvE,KAAO1uE,SAASC,cAAc,OAChDyuE,EAAKnvE,UAAUW,IAAI,QAEJ,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGK0J,QAAQsyC,IACb,MAAMzzC,EAAOzI,SAASC,cAAc,OACpCwI,EAAKlJ,UAAUW,IAAI,aACnBuI,EAAKlC,QAAQ21C,MAAQA,EAAM2G,cAG3B,MAAM/qC,EAAQ9X,SAASC,cAAc,OACrC6X,EAAMvY,UAAUW,IAAI,mBACpB4X,EAAMtT,MAAMmqE,gBAAkBzyB,EAE9BzzC,EAAK/H,OAAOoX,GACZ42D,EAAKhuE,OAAO+H,KAGd,YAAiBimE,EAAOtvE,IACtB,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,aACzC,IAAIA,GAAUA,EAAOxa,UAAUuV,SAAS,UACtC,OAGF,MAAMonC,EAAQniC,EAAOxT,QAAQ21C,MACzBA,GAIJ78C,KAAKkvE,WAAWryB,IACf,CAAChrC,eAAgB7R,KAAK6R,iBAEzBu9D,EAAYz9D,QAAQtQ,OAAOguE,GAC3BrvE,KAAKuP,WAAWlO,OAAO+tE,EAAYhuE,WAEnCpB,KAAKkvE,WAAa,OAAA1mB,GAAA,GAASxoD,KAAKwuE,YAAa,IAAI,GAG3C,YACN,MAAMh3B,EAASx3C,KAAKqvE,KAAK57D,cAAc,WACjCk7D,EAAa3uE,KAAK4uE,MAAMD,WACxBj0D,EAASi0D,EAAW9xB,MAAQ78C,KAAKqvE,KAAK57D,cAAc,0BAA0Bk7D,EAAW9xB,WAAa,KACzGrF,IAAW98B,IAIX88B,GACDA,EAAOt3C,UAAUoE,OAAO,UAGvBoW,GACDA,EAAOxa,UAAUW,IAAI,WA4BzB,SACEiP,WAAW,KACT,MAAM6+D,EAAa3uE,KAAK4uE,MAAMD,WAExB9xB,GAAS8xB,EAAW9xB,OAAS,IAAIwG,MAAM,KAAK,GAC5CksB,IAAc1yB,IAAU8xB,EAAWG,KAGtCS,IACDvvE,KAAK0uE,YAAYh/D,SAAW1P,KAAKivE,eAGnCjvE,KAAK0uE,YAAY7B,SAAShwB,GAAS,WAE/B0yB,IACFvvE,KAAK0uE,YAAYh/D,SAAW1P,KAAKivE,gBAElC,GAGL,sBAIE,OAHAjvE,KAAK0uE,YAAYh/D,cAAWrH,EAC5BrI,KAAK0uE,iBAAcrmE,EAEZ1I,MAAM4S,uBC7HjB,IAAIi9D,GAAe,EAEJ,MAAM,WAAyB,EAA9C,c,oBAEU,KAAAtuC,OAAS,EAET,KAAAuuC,QAAsB,IAAI9nE,IAG1B,KAAA+nE,oBAAmD,IAAIp8D,IACvD,KAAAq8D,cAA0C,IAAIr8D,IAsE9C,KAAAs8D,cAAgB,KACtB,aAAY,oCAAoCjsE,KAAKksE,IACnD,MAAM98D,EAAK,uBAAwBy8D,GAE7BhhD,EAAQ,CACZpjB,EAAG,YACHsU,EAAG,EACHX,EAAG,EACHtH,SAAU,GACVvU,KAAM2sE,EAAK3sE,KACX7C,KAAM,QAER,IAAIM,EAAuB,CACzByK,EAAG,WACH0kE,YAAa,GACb3vD,WAAY,GACZ4vD,MAAO,EACPC,eAAgB,GAChBj9D,KACAguC,UAAW8uB,EAAKxvE,KAChB6C,KAAM2sE,EAAK3sE,KACXspB,KAAMkwB,KAAKC,MAAQ,IACnBp+B,OAAQ,GACRgB,OAAQ,CAACiP,GACTpO,UAAWyvD,EAAKrvE,MAGlBG,EAAW,IAAesvE,QAAQtvE,GAElC,MAAMuZ,EAAeC,GAAA,EAAmBC,gBAAgBzZ,GACxDuZ,EAAaioC,WAAa0tB,EAAK3sE,KAC/BgX,EAAaI,IAAMivC,IAAIC,gBAAgBqmB,GAEvC,IAAIK,EAAiC,CACnC9kE,EAAG,YACH0kE,YAAa,GACbnvE,SAAUA,EACVoS,KACA+7D,KAAM/7D,EACNwL,OAAQ,IAGV,MAAM4xD,EAASh2D,GAAA,EAAmBg2D,OAAON,EAAMA,EAAKrvE,MAE9Cse,EAAW,eACjBA,EAASsxD,kBAAoBD,EAAOC,kBACpCtxD,EAASqQ,OAASghD,EAAOhhD,OAEzBghD,EAAOxsE,KAAKwS,IACV,KAAWykB,UAAU,0BAA2B,CAC9Ci1C,KAAM15D,EACN4qC,UAAW8uB,EAAKxvE,KAChBsjC,SAAU,CACRv4B,EAAG,uBAEJzH,KAAK0sE,IACN,MAAMC,EAAUD,EAAmC1vE,SAC7C4vE,EAAkBp2D,GAAA,EAAmBC,gBAAgBk2D,GAC3D3yD,OAAOugD,OAAOqS,EAAiBr2D,GAE/Bg2D,EAAYG,EACZH,EAAUvvE,SAAW,IAAesvE,QAAQC,EAAUvvE,UAEtDX,KAAKwwE,sBAAsBN,GAAWvsE,KAAKmb,EAAS5U,QAAS4U,EAASuQ,SACrEvQ,EAASuQ,SACXvQ,EAASuQ,QAEZ,MAAMjoB,EAAMpH,KAAKywE,gBAAgBP,GACjCpxD,EAASnb,KAAK,KACZ3D,KAAKyvE,QAAQt9D,OAAO/K,IAClBkJ,IACFlP,EAAUkD,WAIZ,MAAM8lB,EAAY,IAAI,KAAqB,CACzC83B,UAAU,EACV73B,YAAY,EACZF,gBAAgB,IAGZ/oB,EAAYpB,KAAK0wE,aAAaR,GAAW,GAC/ClwE,KAAKyvE,QAAQ5uE,IAAIuG,GAEjBgjB,EAAUuE,OAAOvtB,GAAW,EAAO0d,MAI/B,KAAA6xD,aAAe,KACrB,MAAMC,EAAe,IAAWjtC,SAASktC,OAAOx8D,KAAKC,GAAKA,EAAE9T,OAASR,KAAK4uE,MAAMpuE,MAC7EowE,MACC5wE,KAAKkhC,OACPlhC,KAAK4uE,MAAMD,WAAa,OAAA7tD,GAAA,GAAK8vD,EAAajC,YAC1Cz1C,EAAA,EAAgB61C,YAAY,WAAYniE,EAAA,EAAU+2B,UAClD,GAAaqrC,uBAAkB3mE,OAAWA,GAAW,GACrDrI,KAAK8wE,kBAAkBlrE,iBAAiB5F,KAAK4uE,MAAMD,WAAWoC,QAwG1D,KAAAC,YAAejxE,IACrB,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,aACzC,IAAIA,EAAQ,OAEZ,MAAMw1D,EAAYlwE,KAAK0vE,oBAAoB/7D,IAAI+G,GAC/C,GAAmB,oBAAhBw1D,EAAU9kE,EAEX,YADApL,KAAKwwE,sBAAsBN,GAI7B,MAAM9oE,EAAMpH,KAAKywE,gBAAgBP,GACjC,GAAGlwE,KAAKyvE,QAAQ9jE,IAAIvE,GAAM,OAC1BpH,KAAKyvE,QAAQ5uE,IAAIuG,GAEjB,MAAMyS,EAAMq2D,EAAUvvE,SAChBypB,EAAY,IAAI,KAAqB,CACzCC,YAAY,EACZF,gBAAgB,IAGZ1gB,EAAO,KACX,MAAMW,EAAUpK,KAAKwwE,sBAAsBN,GACtB/1D,GAAA,EAAmBC,gBAAgBP,GACvCS,MAAOta,KAAK4uE,MAAMD,WAAWoC,MAC5C3mD,EAAUuE,OAAOjU,GAAQ,EAAMtQ,IAInCggB,EAAUE,YAEV,YAAiB5P,EAAS3a,IACrBqqB,EAAUA,UAAUrpB,eACrBqpB,EAAUs3B,QAAQ3hD,GAClBqqB,EAAUk4B,UAEV74C,KAED,CAACoI,eAAgB7R,KAAK6R,iBAEzBpI,KAKM,KAAAwnE,YAAc,CAACnC,EAAcx0D,KACnCtC,MAAMsC,GAAK3W,KAAKsU,IACdkC,GAAA,EAAmB+2D,aAAaltB,KAAK,eAAiB8qB,EAAM72D,MAIxD,KAAAu4D,sBAAyBN,IAC/B,IAAIiB,IAAYnxE,KAAKkhC,OACrB,MAAM1Q,EAAa,IAAM2gD,IAAYnxE,KAAKkhC,OAEpCrnB,EAAOq2D,EAAkCvvE,SACzCme,EAAW,eACjB,IAAIyQ,EA2EJ,OA1EG1V,GACD0V,EAAW,IAAetQ,YAAYpF,EAAK,GAAa+W,KAAKC,QAAU,GAAaD,KAAKC,QAAQvC,cAAc00B,QAAU,GACzHlkC,EAASsxD,kBAAoB7gD,EAAS6gD,kBACtCtxD,EAASqQ,OAASI,EAASJ,QAE3BI,EAAWlqB,QAAQ6E,UAGrBqlB,EAAS5rB,KAAK,KACZ,IAAI6sB,IAEF,YADA1R,EAAS5U,UAIX,MAAMykE,EAAa3uE,KAAK4uE,MAAMD,WACxByC,EAAW92D,IAEf,IAAI+2D,EACJ,GAAG/2D,IAAQta,KAAK4uE,MAAMD,WAAW9xB,MAC/Bw0B,ENtWH,SAAsBC,GAC3B,MAAM5iD,EAAM/tB,SAASC,cAAc,OACnC,OAAO,IAAIyE,QAA4B6E,IACrC,OAAA+4C,GAAA,GAAmBv0B,EAAK4iD,EAAU,KAChC,MAAMpsE,EAASvE,SAASC,cAAc,UAChCszB,EAAQxF,EAAI6iD,aAAe7iD,EAAI8iD,cAExB,IAAVt9C,GACDhvB,EAAO1B,MAFU,GAGjB0B,EAAOzB,OAASyB,EAAO1B,MAAQ0wB,GACvBA,EAAQ,GAChBhvB,EAAOzB,OALU,GAMjByB,EAAO1B,MAAQ0B,EAAOzB,OAASywB,GAE/BhvB,EAAO1B,MAAQ0B,EAAOzB,OARL,GAWHyB,EAAOyP,WAAW,MAC1B8sC,UAAU/yB,EAAK,EAAG,EAAGA,EAAI6iD,aAAc7iD,EAAI8iD,cAAe,EAAG,EAAGtsE,EAAO1B,MAAO0B,EAAOzB,QAC7FyG,EAAQi8D,GAAuBjhE,QMmVTusE,CAAan3D,OAC1B,CACL,MAAM,OAACpV,GAAU,GAA+BwsE,OAAO1xE,KAAK2xE,uBAAuBzB,IACnFmB,EAAkBhsE,QAAQ6E,QAAQi8D,GAAuBjhE,IAG3DmsE,EAAgB1tE,KAAMyiE,I,UACpB,IAAI51C,IAEF,YADA1R,EAAS5U,UAIX,MAAMo9D,EAAOK,GAAmBx7D,MAAMC,KAAKg6D,IAIrC0I,EAA8C,QAAtC,EAAAoB,EAAkCpB,YAAI,QAAI,GACxDH,EAAW57D,GAAKm9D,EAAUn9D,GAC1B47D,EAAWE,UAAyC,QAA7B,EAAkB,QAAlB,EAAAqB,EAAUvsC,gBAAQ,eAAEkrC,iBAAS,QAAI,EACxDF,EAAW9xB,MAAQ78C,KAAK2xE,uBAAuBzB,GAC/CvB,EAAWG,KAAOA,EAClBH,EAAWhH,mBAAqBL,EAChCpuC,EAAA,EAAgB61C,YAAY,WAAYniE,EAAA,EAAU+2B,UAE/CmrC,GACD9uE,KAAKixE,YAAYnC,EAAMx0D,GAGzB,GAAa00D,kBAAkBF,EAAMx0D,GAAK,GAAM3W,KAAKmb,EAAS5U,YAIlE,IAAI2P,EAEF,YADAu3D,IAIF,MAAMl3D,EAAeC,GAAA,EAAmBC,gBAAgBP,GACrD80D,EAAWoC,KACZjhE,WAAW,KACT,MAAM,OAAC5K,EAAM,QAAEkF,GAAW,aAAK8P,EAAaI,IAAK,GAAI,GACrDlQ,EAAQzG,KAAK,KACP6sB,IAKJ4gD,EAAQlsE,EAAOigD,aAJbrmC,EAAS5U,aAMZ,KAEHknE,EAAQl3D,EAAaI,OAIlBwE,GAGD,KAAApQ,UAAY,KAClB,MAAM8oC,EAASx3C,KAAKqvE,KAAK57D,cAAc,WACjCiH,EAAS1a,KAAK2vE,cAAch8D,IAAI3T,KAAK4xE,yBAAyB5xE,KAAK4uE,QACtEp3B,IAAW98B,IAIX88B,GACDA,EAAOt3C,UAAUoE,OAAO,UAGvBoW,GACDA,EAAOxa,UAAUW,IAAI,YA7ZzB,OACEb,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,uBAAwB,8BACrDb,KAAK+U,SAAS,kBAEd/U,KAAK4uE,MAAQhiE,EAAA,EAAUuiE,WAEvB,CACE,MAAM/tE,EAAY89D,GAAgBl/D,KAAKuP,YAEjCsiE,EAAe,YAAO,8BAA+B,CAAC1gE,KAAM,YAAamnB,KAAM,mCAC/Ew5C,EAAc,YAAO,8BAA+B,CAAC3gE,KAAM,WAAYmnB,KAAM,aAC7Ey5C,EAAc,YAAO,8BAA+B,CAAC5gE,KAAM,aAAcmnB,KAAM,qBAErF,YAAiBu5C,EAAc7xE,KAAK4vE,cAAe,CAAC/9D,eAAgB7R,KAAK6R,iBAEzE,YAAiBigE,EAAa,KAC5B,IAAI,GAAsB9xE,KAAKoR,QAAQsD,QACtC,CAAC7C,eAAgB7R,KAAK6R,iBAEzB,YAAiBkgE,EAAa/xE,KAAK2wE,aAAc,CAAC9+D,eAAgB7R,KAAK6R,iBAEvE,MAAMi/D,EAAoB9wE,KAAK8wE,kBAAoB,IAAI,KAAc,CACnEx4C,KAAM,sBACN93B,KAAM,OACN22B,QAASn3B,KAAK4uE,MAAMD,WAAWoC,KAC/B50C,YAAY,IAGdn8B,KAAK6R,eAAehR,IAAIiwE,EAAkB1wE,MAA1CJ,CAAiD,SAAU,KACzDA,KAAK4uE,MAAMD,WAAWoC,KAAOD,EAAkB1wE,MAAM+2B,QACrD+B,EAAA,EAAgB61C,YAAY,WAAYniE,EAAA,EAAU+2B,UAGlD7zB,WAAW,KACT,MAAM0nC,EAAS63B,EAAK57D,cAAc,WAClC,IAAI+jC,EAAQ,OAEZ,MAAM04B,EAAYlwE,KAAK0vE,oBAAoB/7D,IAAI6jC,GAC3C04B,EAAkC3xD,OAAOyzD,SAA2B,oBAAhB9B,EAAU9kE,GAIlEpL,KAAKwwE,sBAAsBN,IAC1B,OAGL9uE,EAAUC,OAAOwwE,EAAcC,EAAaC,EAAajB,EAAkB/qE,OAG7E6G,EAAA,EAAUtL,iBAAiB,oBAAqBtB,KAAK0O,WAErD,KAAWujE,kBAAkB,CAACpyC,OAAQ,0BAA0Bl8B,KAAMuuE,IAChDA,EAA0DC,WACnE5nE,QAAS2lE,IAClBlwE,KAAK0wE,aAAaR,OAMtB,MAAMkC,EAAgBlT,GAAgBl/D,KAAKuP,YACrC8/D,EAAOrvE,KAAKqvE,KAAO1uE,SAASC,cAAc,OAChDyuE,EAAKnvE,UAAUW,IAAI,QACnB,YAAiBwuE,EAAMrvE,KAAKgxE,YAAa,CAACn/D,eAAgB7R,KAAK6R,iBAC/DugE,EAAc/wE,OAAOguE,GAsGf,uBAAuBa,GAC7B,OAAOA,EAAUvsC,SAAW,CAC1BusC,EAAUvsC,SAAS0uC,iBACnBnC,EAAUvsC,SAAS2uC,wBACnBpC,EAAUvsC,SAAS4uC,uBACnBrC,EAAUvsC,SAAS6uC,yBACnB5mE,OAAOc,SAASD,IAAIowC,GAAS,IAAMA,EAAM6R,SAAS,KAAKtjC,KAAK,KAAO,GAG/D,gBAAgB8kD,GACtB,MAAO,GAAKA,EAAUn9D,GAGhB,yBAAyB67D,GAC/B,MAAO,GAAKA,EAAMD,WAAW57D,GAGvB,aAAam9D,EAAsB7uE,GAAS,G,MAClD,MAAM8pE,EAASnrE,KAAK2xE,uBAAuBzB,GACrCuC,EAA0B,cAAhBvC,EAAU9kE,EAC1B,GAAIqnE,GAAWvC,EAAU3xD,OAAOyzD,UAAY7G,EAE1C,OAGF,MAAMuH,IAAWxC,EAAU3xD,OAAOo0D,KAE5B94D,EAAkB44D,EAAWvC,EAAUvvE,SAAW,IAAesvE,QAAQC,EAAUvvE,eAAa0H,EAEhGjH,EAAYT,SAASC,cAAc,OACzCQ,EAAUlB,UAAUW,IAAI,aAExBO,EAAU8F,QAAQ6L,GAAK,GAAKm9D,EAAUn9D,GAEtC,MAAM3L,EAAMpH,KAAKywE,gBAAgBP,GACjClwE,KAAK0vE,oBAAoBl1D,IAAIpZ,EAAW8uE,GACxClwE,KAAK2vE,cAAcn1D,IAAIpT,EAAKhG,GAE5B,MAAMqX,EAAQ9X,SAASC,cAAc,OAGrC,IAAIotB,EAAuC9qB,EAkC3C,GApCAuV,EAAMvY,UAAUW,IAAI,mBAGjB4xE,GACDvvE,EAAO,IAAiBiuB,gBAAgBtX,EAAK,IAAK,KAClDmU,EAAUC,GAAU,CAClB9lB,MAAO0R,EACP9R,QAAS,KACT3G,UAAWqX,EACX4V,kBAAkB,EAClBnrB,KAAMA,EACNmhD,SAAU6rB,EAAU3xD,OAAOyzD,WAG5BhkD,EAAQI,aAAaI,OAASR,EAAQI,aAAaK,MAAM9qB,KAAK,KAC7Dg/C,GAAA,EAAc2C,OAAO,KACnBlkD,EAAUC,OAAOoX,OAIlBy3D,EAAU3xD,OAAOyzD,UAClBv5D,EAAMvY,UAAUW,IAAI,cAEjB6xE,GACD1kD,EAAQO,OAAOE,KAAKtpB,MAAMC,QAAU,OACjC4oB,EAAQO,OAAOC,QAChBR,EAAQO,OAAOC,MAAMrpB,MAAMC,QAAU,UAEb,QAAlB,EAAA8qE,EAAUvsC,gBAAQ,eAAEkrC,aAC5B7gD,EAAQO,OAAOE,KAAKtpB,MAAM4tD,QAAU,GAAKluD,KAAK+B,IAAIspE,EAAUvsC,SAASkrC,WAAa,OAItFztE,EAAUC,OAAOoX,GAGhBy3D,EAAUvsC,eAAoDt7B,IAAxC6nE,EAAUvsC,SAAS0uC,iBAAgC,CAC1E,MAAM,OAACntE,GAAU,GAA+BwsE,OAAOvG,GAGvD,GAFAjmE,EAAOhF,UAAUW,IAAI,4BAElB6xE,GAAUD,EAAS,CACpB,MAAMv4D,EAAeC,GAAA,EAAmBC,gBAAgBP,EAAK3W,EAAK7C,MAClE2tB,EAAQI,aAAaK,KAAK9qB,KAAK,KAC7BuB,EAAOC,MAAMytE,gBAAkB,OAAO14D,EAAaI,OACnDpV,EAAOC,MAAM4tD,QAAU,GAAKluD,KAAK+B,IAAIspE,EAAUvsC,SAASkrC,WAAa,IACrEp2D,EAAMpX,OAAO6D,UAGfuT,EAAMpX,OAAO6D,GAUjB,OANGlF,KAAK4xE,yBAAyB5xE,KAAK4uE,SAAWxnE,GAC/ChG,EAAUlB,UAAUW,IAAI,UAG1Bb,KAAKqvE,KAAKhuE,EAAS,SAAW,WAAWD,GAElCA,GCzRI,MAAM,WAAsB,KAOzC,YAAoByxE,GAClBlzE,MAAM,iBAAkB,KAAM,CAACqkC,UAAU,EAAM1I,iBAAiB,EAAM34B,MAAM,IAD1D,KAAAkwE,kBA0CZ,KAAAC,gBAAmB/yE,IACzB,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,uBACzC,IAAIA,EAAQ,OAEZ,MAAMq4D,EAASr4D,EAAOxT,QAAQ6S,MAC3B,GAAa6W,KAAKxwB,MAAM4yE,wBAAwBD,GACjD/yE,KAAKmkC,OAEL5zB,QAAQgN,KAAK,oBAAqBw1D,IA/CpC/yE,KAAKizE,GAAKtyE,SAASC,cAAc,MACjCZ,KAAKizE,GAAG5xE,OAAO,YAAK,YAEpBrB,KAAKuR,OAAOlQ,OAAOrB,KAAKizE,IAExBjzE,KAAKsB,iBAAiB,QAAS,KAC7BkhD,EAAA,EAAqB0wB,wBAAwB,MAG/C,MAAMliD,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,eAElBb,KAAKmzE,YAAcxyE,SAASC,cAAc,OAC1CZ,KAAKmzE,YAAYjzE,UAAUW,IAAI,uBAAwB,cAEvD,YAAiBb,KAAKmzE,YAAanzE,KAAK8yE,gBAAiB,CAACjhE,eAAgB7R,KAAK6R,iBAE/E,aAAa7R,KAAKmzE,aAAa,GAE/BnzE,KAAKozE,eAAiBzyE,SAASC,cAAc,OAC7CZ,KAAKozE,eAAelzE,UAAUW,IAAI,sBAElCmwB,EAAI3vB,OAAOrB,KAAKmzE,aAEhB,MAAME,EAAM,YAAO,oDAAqD,CAAC5hE,UAAU,EAAM6mB,KAAM,YAC/Ft4B,KAAKozE,eAAe/xE,OAAOgyE,GAE3BrzE,KAAK2C,KAAKtB,OAAO2vB,GACE,IAAI,IAAWhxB,KAAK2C,MACvC3C,KAAK2C,KAAKtB,OAAOrB,KAAKozE,gBAOtBpzE,KAAKszE,iBAeC,iBACN,OAAO,KAAmB7pB,cAAczpD,KAAK6yE,iBAAiBlvE,KAAK6W,IACjE,IAAIA,EAGF,OAFAof,GAAS,CAACC,YAAa,8BACvB75B,KAAKmkC,OAYP,IAAIzgB,EAPJ1jB,KAAKwa,IAAMA,EAAIA,IAEfgoC,EAAA,EAAqB0wB,wBA1EH,kBA4ElB,OAAApmD,EAAA,GAAa9sB,KAAKizE,GAAI,IAAkB1mD,cAAc/R,EAAIA,IAAI9I,QAC9D1R,KAAKozE,eAAelzE,UAAUC,OAAO,OAAQqa,EAAIA,IAAI+4D,gBAGlD/4D,EAAIA,IAAI+4D,gBACT7vD,EAAS,YAAO,6CAA8C,CAACjS,UAAU,IACzEiS,EAAOriB,OAAO,YAAK,sBAAuB,CAAC,YAAK,WAAY,CAACmZ,EAAIA,IAAIlS,aAErEob,EAAS,YAAO,gCAAiC,CAACjS,UAAU,IAC5DiS,EAAOriB,OAAO,YAAK,mBAAoB,CAAC,YAAK,WAAY,CAACmZ,EAAIA,IAAIlS,YAGpEtI,KAAKozE,eAAe3iD,YAAc,GAClCzwB,KAAKozE,eAAe/xE,OAAOqiB,GAE3B,YAAiBA,EAAQ,KACvB,MAAMvjB,EAAS,aAAiB,CAACujB,IAAS,GAE1C,KAAmB8vD,iBAAiBxzE,KAAKwa,KAAK7W,KAAK,KACjD3D,KAAKmkC,SACJzzB,MAAM,KACPvQ,QAIJ,MAAMmuB,EAAgB,IAAI,IAE1BtuB,KAAKmzE,YAAYjzE,UAAUoE,OAAO,cAClCtE,KAAKmzE,YAAY3kE,UAAY,GAC7B,IAAI,IAAIqL,KAAOW,EAAImvC,UAAW,CAC5B,GAAa,kBAAV9vC,EAAIzO,EACL,SAGF,MAAM4lB,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,uBAElB,MAAMqC,EAAOilB,EAAA,EAAWqvB,OAAOi8B,WAAWjwE,MAE1CutB,GAAY,CACVlX,MACAmX,MACA1C,gBACA2C,MAvHc,iBAwHd7sB,MAAM,EACNd,MAAM,EACNE,MAAON,EACPO,OAAQP,IAGVlD,KAAKmzE,YAAY9xE,OAAO2vB,O,gBC9IjB,SAAS0iD,GAAWt3C,EAAqBu3C,GAAW,GACjE,OCAa,SAAqBv3C,EAAqBw3C,EAA8BD,GAAW,GAChG,MAKME,EAAYz3C,EAKlB,IAAIvrB,EAQJ,OAZI8iE,IACFv3C,EAAWnS,GAAA,GAIb,SAAU6pD,IACR13C,IACAvrB,EAAU,KAAIf,WAAWgkE,EAAKF,KAFhC,GAKAx3C,EAAWy3C,EAhBI,KACb/iE,aAAaD,IDFRkjE,CAAY33C,EAAU,IAAuC,KAAhC,IAAK,IAAIsgB,MAAOs3B,cAAsBL,GER7D,UAF0C,QAAtB,GAAS,OAATr8D,gBAAS,IAATA,eAAS,EAATA,UAAWC,mBAAW,iBAAEC,sBAAsB,ECalE,MAAM,WAA4B,EACrC,OAKR,OAJAxX,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAK+U,SAAS,oBACd/U,KAAKoB,UAAUlB,UAAUW,IAAI,4BAEtBwE,QAAQC,IAAI,CACjB,KAAoB2uE,mBACpB,KAAoB9pC,0BACnBxmC,KAAK,EAAEuwE,EAAehsC,MACvBA,EAAqBA,EAAmBt8B,OAAOk9B,IAAaA,EAASvqB,OAAO6rB,UAE5E,MAAMl1B,EAAU,IAAI,GAGdkjB,EAAO8P,EAAmBz7B,IAAKo8B,IACnC,MAAMxR,EAAa,IAAI,GAAW,CAChC72B,KAHS,iBAIT83B,KAAMuQ,EAAkBn3B,MACxB/M,MAAOkkC,EAAkBC,SACzB9P,YAAY,IAGRnD,EAAM,IAAI,GAAI,CAClBwB,aACAI,aAAa,IAef,OAZAJ,EAAWkC,KAAKr5B,UAAUW,IAAI,wBAE9BmoC,GAAiB,CACfnT,MACAhc,IAAKgvB,EAAkBI,YACvB/lC,KAAM,UAGL2lC,IAAsBqrC,GACvB78C,EAAWzxB,kBAAiB,GAGvBiwB,IAGHqB,EAAOiB,GAAkBC,EAAOzzB,IACpC,KAAoBwvE,mBAAmBxvE,KAGzCuQ,EAAQvD,QAAQtQ,OAAO61B,GACvBl3B,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,cC9B9B,MAAM,GAOX,YACEZ,EACAukB,EACAyM,EACA4iD,EACAxrD,EACAyrD,GAAa,GAEb,MAAMplC,EAAa,yBACnBjvC,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAIouC,GAE7B,MAAM71B,EAAUzY,SAASC,cAAc,OACvCwY,EAAQlZ,UAAUW,IAAIouC,EAAa,YAEnC,MAAM6U,EAAUnjD,SAASC,cAAc,OACvCkjD,EAAQ5jD,UAAUW,IAAIouC,EAAa,SACnC,YAAM6U,EAAStjD,GAEf,MAAM8zE,EAAWt0E,KAAKu0E,eAAiB5zE,SAASC,cAAc,OAC9D0zE,EAASp0E,UAAUW,IAAIouC,EAAa,UAEjColC,IACDC,EAAS9lE,UAAY,GAAKgjB,GAG5BpY,EAAQ/X,OAAOyiD,EAASwwB,GAExBt0E,KAAKqC,MAAQ,IAAI,GAAc,CAC7B0iB,OACAjgB,IAAKsvE,EACL3vE,IAAKmkB,GACJ4I,GACHxxB,KAAKqC,MAAMmkB,eACXxmB,KAAKqC,MAAMokB,YAAY,CACrB5B,QAASlgB,IACJ3E,KAAK0P,UACN1P,KAAK0P,SAAS/K,GAGb0vE,IAEDC,EAAS1mD,UAAY,GAAKjpB,MAKhC3E,KAAKoB,UAAUC,OAAO+X,EAASpZ,KAAKqC,MAAMjB,YAI/B,MAAM,WAA8B,EACjD,OACEpB,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,8BAC7Bb,KAAK+U,SAAS,WAEd,MAAMG,EAAUgqD,GAAgBx4D,KAAK,KAAM1G,KAAKuP,YAEhD,CACE,MAAMnO,EAAY8T,EAAQ,YAEpB7S,EAAQ,IAAI,GAAqB,WAAY,EAAGuK,EAAA,EAAU+2B,SAAS6wC,iBAAkB,GAAI,IAC/FnyE,EAAMqN,SAAY/K,IAChBu0B,EAAA,EAAgBI,SAAS,4BAA6B30B,IAGxD,MAAM8vE,EAAuB,YAAO,8BAA+B,CAACtjE,KAAM,QAASmnB,KAAM,mBAEzF,YAAiBm8C,EAAsB,KACrC,IAAI,GAAiBz0E,KAAKoR,QAAQsD,SAGpC,MAAMggE,EAA0B,IAAI,KAAc,CAChDp8C,KAAM,mBACN93B,KAAM,aACNy4B,SAAU,6BACVkD,YAAY,IAGd/6B,EAAUC,OAAOgB,EAAMjB,UAAWqzE,EAAsBC,EAAwB3uE,OAGlF,CACE,MAAM3E,EAAY8T,EAAQ,oBAEpBgiB,EAAOv2B,SAASC,cAAc,QAE9BJ,EAAO,gBACPy4B,EAAW,wBAEX07C,EAAW,IAAI,GAAI,CACvBt9C,WAAY,IAAI,GAAW,CACzBmC,QAAS,6BACTh5B,OACAmE,MAAO,QACPs0B,aAEF1B,gBAAiB,4CAGbq9C,EAAe,IAAI,GAAI,CAC3Bv9C,WAAY,IAAI,GAAW,CACzB72B,OACAmE,MAAO,YACPs0B,aAEF1B,gBAAiB,uCAEnB,YAAMq9C,EAAav9C,WAAWkC,KAAM,iCAAkC,CAAC,KAAW,IAAM,SAExFrC,EAAK71B,OAAOszE,EAASvzE,UAAWwzE,EAAaxzE,WAC7CA,EAAUC,OAAO61B,GAGnB,GAAG,GAA0B,CAC3B,MAAM91B,EAAY8T,EAAQ,sBAEpBgiB,EAAOv2B,SAASC,cAAc,QAE9BJ,EAAO,gBACPy4B,EAAW,wBAEX47C,EAAgB,IAAI,GAAI,CAC5Bx9C,WAAY,IAAI,GAAW,CACzBmC,QAAS,0BACTh5B,OACAmE,MAAO,aACPs0B,eAIE67C,EAAW,IAAI,GAAI,CACvBz9C,WAAY,IAAI,GAAW,CACzBmC,QAAS,qBACTh5B,OACAmE,MAAO,QACPs0B,eAIJ/B,EAAK71B,OAAOwzE,EAAczzE,UAAW0zE,EAAS1zE,WAC9CA,EAAUC,OAAO61B,GAGnB,CACE,MAAM91B,EAAY8T,EAAQ,sBAEpBgiB,EAAOv2B,SAASC,cAAc,QAE9BJ,EAAO,cACPy4B,EAAW,sBAEX87C,EAA4D,CAChE,CAAC,MAAO,0BACR,CAAC,MAAO,2BAGJ38C,EAAO28C,EAAQtoE,IAAI,EAAEoK,EAAQgjB,KACrB,IAAI,GAAI,CAClBxC,WAAY,IAAI,GAAW,CACzBmC,QAASK,EACTr5B,OACAmE,MAAOkS,EACPoiB,gBAOA9J,EAASukD,GAAW,KACxB,MAAMlnD,EAAO,IAAIkwB,KAEjBq4B,EAAQxqE,QAAQ,EAAEsM,GAAS7O,KACzB,MAAMua,EAAMiK,EAAKwoD,mBAAmB,cAAgBn+D,EAAQ,CAC1Do+D,KAAM,UACNC,OAAQ,YAGV98C,EAAKpwB,GAAKgoB,SAASS,YAAclO,MAIrCviB,KAAKqS,cAAc/Q,iBAAiB,UAAW6tB,GAE/C+H,EAAK71B,UAAU+2B,EAAK3rB,IAAIopB,GAAOA,EAAIz0B,YACnCA,EAAUC,OAAO61B,GAGnB,CACE,MAAM91B,EAAY8T,EAAQ,SAEpBigE,EAAuB,IAAI,KAAc,CAC7C78C,KAAM,kCACN93B,KAAM,gBACNy4B,SAAU,yBACVkD,YAAY,IAERi5C,EAAmB,IAAI,KAAc,CACzC98C,KAAM,2BACN93B,KAAM,YACNy4B,SAAU,qBACVkD,YAAY,IAGd/6B,EAAUC,OAAO8zE,EAAqBpvE,MAAOqvE,EAAiBrvE,OAGhE,CACE,MAAMmP,EAAU,IAAI,GAAe,CAAC1U,KAAM,2CAA4C68B,QAAS,oBAEzF2M,EAAe,IAAI,GAAI,CAC3BnS,aAAc,mBACdJ,aAAa,EACbxpB,UAAW,KACT,IAAI,GAAoBjO,KAAKoR,QAAQsD,UAInC2gE,EAAsB,KAC1BhwE,QAAQ6E,QAAQ,KAAoB+pE,oBAAoBtwE,KAAKmlC,IAC3DE,GAAiB,CACfnT,IAAKmU,EACLnwB,IAAKivB,EAASG,YACd/lC,KAAM,aAKZmyE,IAEAr1E,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkBq1E,GAErD,MAAMF,EAAuB,IAAI,KAAc,CAC7C78C,KAAM,2BACN93B,KAAM,UACNy4B,SAAU,4BACVkD,YAAY,IAERm5C,EAAoB,IAAI,KAAc,CAC1Ch9C,KAAM,iCACN93B,KAAM,OACNy4B,SAAU,yBACVkD,YAAY,IAGRo5C,EAAmC,GAEnCC,EAAkBtgE,EAAQ8wB,yBAE1B1X,EAAgB,IAAI,IACpBmnD,EAAmB,CAAC/rB,EAAmC7pB,EAA+B,YAC1F,MAAMhK,EAAM,IAAI,GAAI,CAClBnkB,MAAO,IAAkB6a,cAAcm9B,EAAWh4C,OAClD6lB,gBAAiB,WACjBC,iBAAkB,CAACkyB,EAAWphD,OAC9BmvB,aAAa,EACbxpB,UAAW,KACT,IAAI,GAAc,CAAC8E,GAAI22C,EAAW32C,GAAI+8D,YAAapmB,EAAWomB,cAAc1yC,UAIhFm4C,EAAY7rB,EAAW32C,IAAM8iB,EAE7B,MAAM7E,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,aAElBqoD,GAAoB,CAClB1uC,IAAKkvC,EACLtoD,UAAW4vB,EACXC,MAAO,mBACP3C,gBACA9qB,MAAO,GACPC,OAAQ,GACRF,UAAU,IAGZsyB,EAAIz0B,UAAUC,OAAO2vB,GAErBwkD,EAAgB31C,GAAQhK,EAAIz0B,YAG9B,KAAmBs0E,iBAAiB/xE,KAAKgyE,IACvC,OAAA9vB,GAAA,GAAoD8vB,GACpD,IAAI,MAAMjsB,KAAcisB,EAAYC,KAClCH,EAAiB/rB,KAIrB1pD,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,qBAAuBD,IACxD,MAAMya,EAA6Bza,EAE/Bw1E,EAAY/6D,EAAIzH,KAClB0iE,EAAiBj7D,EAAK,aAI1Bxa,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAqBD,IACtD,MAAMya,EAA6Bza,EAEhCw1E,EAAY/6D,EAAIzH,MACjBwiE,EAAY/6D,EAAIzH,IAAI3R,UAAUkD,gBACvBixE,EAAY/6D,EAAIzH,OAI3BmC,EAAQvD,QAAQtQ,OAAO2oC,EAAa5oC,UAAW+zE,EAAqBpvE,MAAOuvE,EAAkBvvE,OAC7F/F,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,YAInC,SACKpB,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,O,2SC9UH,MAAM,WAA0B,EAW7B,O,0CACdhS,KAAKoB,UAAUlB,UAAUW,IAAI,0BAC7Bb,KAAK+U,SAAS,qBAEd,MAAMuhB,EAA4B,GAElC,CACE,MAAMphB,EAAUgqD,GAAgBl/D,KAAKuP,gBAAYlH,EAAW,mBACtD8M,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3Bb,KAAK61E,oBAAsB,IAAI,IAAW,CACxC9vE,MAAO,6BACPvF,KAAM,aACN6U,UAAW,KAEbrV,KAAKsrC,mBAAqB,IAAI,IAAW,CACvCvlC,MAAO,sCACPvF,KAAM,YACN6U,UAAW,KAEbrV,KAAK81E,cAAgB,IAAI,IAAW,CAClC/vE,MAAO,uBACPvF,KAAM,MACN6U,UAAW,KAGbF,EAAa9T,OAAOrB,KAAK61E,oBAAoBz0E,UAAWpB,KAAKsrC,mBAAmBlqC,UAAWpB,KAAK81E,cAAc10E,WAE9G,MAAMi8B,EAAU18B,SAASC,cAAc,OACvCy8B,EAAQn9B,UAAUW,IAAI,WACtB,YAAM,CAACka,QAASsiB,EAASj2B,IAAK,oBAE9BkvB,EAAY/sB,KAAKvJ,KAAK61E,oBAAqB71E,KAAKsrC,mBAAoBtrC,KAAK81E,eAEzE91E,KAAK6pC,SAAW,IAAI,GAAS,CAC3B5+B,OAAQ2B,EAAA,EAAU+R,KAClB2X,cACAzkB,eAAgB7R,KAAK6R,iBAGvB7R,KAAK2R,QAAQtQ,OAAOrB,KAAK6pC,SAASj0B,SAElCV,EAAQ7T,OAAOrB,KAAK6pC,SAAS70B,WAAW5T,UAAW+T,GAGrD,CACE,MAAMD,EAAU,IAAI,GAAe,CACjC1U,KAAM,uBACN68B,SAAS,IAGLloB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3Bb,KAAK+1E,mBAAqB,IAAI,GAAmB,CAC/ChwE,MAAO,6BACPvF,KAAM,WACNZ,WAAW,EACXiS,eAAgB7R,KAAK6R,eACrBnC,SAAU,KACR1P,KAAK6pC,SAASpT,eACdz2B,KAAKg2E,iBAEP96C,cAAe,iCACfC,UAAW,6BACXX,YAAa,iCAGfrlB,EAAa9T,OAAOrB,KAAK+1E,mBAAmB30E,WAE5C,MAAMi8B,EAAUnoB,EAAQmoB,QACxBA,EAAQh8B,OAAO,YAAK,uCACpBg8B,EAAQh8B,OAAOV,SAASC,cAAc,MAAOD,SAASC,cAAc,OAEpE,MAAMq1E,EAAsBj2E,KAAKi2E,oBAAsBt1E,SAASC,cAAc,OAC9Eq1E,EAAoB/1E,UAAUW,IAAI,yBAElC,MAAMq1E,EAAmBl2E,KAAKk2E,iBAAmBv1E,SAASC,cAAc,KACxEs1E,EAAiBh2E,UAAUW,IAAI,eAC/Bq1E,EAAiBxd,KAAO,IACxBwd,EAAiBx7D,OAAS,SAE1Bu7D,EAAoB50E,OAAO,YAAK,mBAAoB,CAAC60E,KAErD74C,EAAQh8B,OAAO40E,GAEf3/C,EAAY/sB,KAAKvJ,KAAK+1E,oBACtB7gE,EAAQvD,QAAQtQ,OAAO8T,GACvBnV,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAGjC,YAAiBpB,KAAK6pC,SAASj0B,QAAS,KACtC5V,KAAK6pC,SAASj0B,QAAQW,UAAW,EAEjC,IAAIysB,EAA2B,GAE/BA,EAASz5B,KAAK,UAAkB4sE,cAAcn2E,KAAK61E,oBAAoBlxE,MAAO3E,KAAKsrC,mBAAmB3mC,MAAO3E,KAAK81E,cAAcnxE,OAAOhB,KAAK,KAC1I3D,KAAK49B,SACHttB,IACFC,QAAQC,MAAM,uBAAwBF,MAGrCtQ,KAAK6pC,SAASh1B,cACfmuB,EAASz5B,KAAKvJ,KAAK6pC,SAASh1B,eAAelR,KAAKwS,GACvC,UAAkBigE,mBAAmBjgE,KAI7CnW,KAAK+1E,mBAAmB36C,mBACzB4H,EAASz5B,KAAK,IAAgBo0B,eAAe39B,KAAK+1E,mBAAmBpxE,QAGvEU,QAAQqlC,KAAK1H,GAAU2E,QAAQ,KAC7B3nC,KAAK6pC,SAASj0B,QAAQ+0B,gBAAgB,eAEvC,CAAC94B,eAAgB7R,KAAK6R,iBAEzB,MAAM05B,EAAO,IAAgB00B,UAEvBoW,QAAiB,UAAkBC,WAAW/qC,EAAKx4B,IAAI,GAE7D/S,KAAK61E,oBAAoBh4C,iBAAiB0N,EAAKG,YAAY,GAC3D1rC,KAAKsrC,mBAAmBzN,iBAAiB0N,EAAKI,WAAW,GACzD3rC,KAAK81E,cAAcj4C,iBAAiBw4C,EAASvgE,OAAO,GACpD9V,KAAK+1E,mBAAmBl4C,iBAAiB0N,EAAK7Q,UAAU,GAExD16B,KAAKg2E,gBACLh2E,KAAK6pC,SAASpT,kBAGR,gBACN,GAAGz2B,KAAK+1E,mBAAmB31E,MAAMF,UAAUuV,SAAS,WAAazV,KAAK+1E,mBAAmBpxE,MAAMhD,OAC7F3B,KAAKi2E,oBAAoB9wE,MAAMC,QAAU,WACpC,CACLpF,KAAKi2E,oBAAoB9wE,MAAMC,QAAU,GACzC,IAAIkV,EAAM,gBAAkBta,KAAK+1E,mBAAmBpxE,MACpD3E,KAAKk2E,iBAAiBtoD,UAAYtT,EAClCta,KAAKk2E,iBAAiBxd,KAAOp+C,I,2SC/IpB,MAAM,WAA4B,EAAjD,c,oBAwGE,KAAAglB,cAAsBjpB,GAAsB,yCAGpC,IAAgBkgE,cACtBlgE,EAAQ9L,QAAQU,IAGd,MAAM,IAAC+L,GAAO,GAAkBC,aAAa,CAC3CC,OAAQjM,EACR7J,UAAWpB,KAAKmrB,SAAS5b,WACzBY,YAAY,EACZgH,eAAe,EACf/G,WAAY,KAGRmuB,EAAWv+B,KAAKmrB,SAASoT,SAAS5yB,IAAIV,GAC5C+L,EAAImsB,YAAY9hC,OAAOrB,KAAKugC,SAAShC,IAGrC,MAAMi4C,EAAgC,GACtCx2E,KAAKy2E,iBAAiBlsE,QAAQ,CAACu2B,EAASl1B,KACtC,GAAGk1B,EAAQn1B,IAAIV,GAAS,CACtB,MAAMgiC,EAAOtsC,SAASC,cAAc,QACpC,OAAAksB,EAAA,GAAamgB,EAAM,IAAkB1gB,cAAc3gB,EAAO8F,QAC1D8kE,EAAejtE,KAAK0jC,MAIT,YAAKupC,GAAgB,GAC7BjsE,QAAQzI,IACbkV,EAAII,gBAAgB/V,OAAOS,UAmGjC,KAAA40E,eAAkB/0E,IAEC,aAAd3B,KAAKK,OACNL,KAAK22E,WAAWxxE,MAAMC,QAAUzD,EAAS,GAAK,SAjOxC,OA2ER,OA1EA3B,KAAK2R,QAAQrN,SACbtE,KAAKoB,UAAUlB,UAAUW,IAAI,+BAC7Bb,KAAK22E,WAAa,EAAW,yBAA0B,CAACllE,UAAU,IAClEzR,KAAK22E,WAAWxxE,MAAMC,QAAU,OAEhCpF,KAAKuR,OAAOlQ,OAAOrB,KAAK22E,YAExB32E,KAAK22E,WAAWr1E,iBAAiB,QAAS,KACxC,MAAMi9B,EAAWv+B,KAAKmrB,SAAS8Y,cAI/B,GAAiB,aAAdjkC,KAAKK,KACN,IAAI,MAAM+G,KAAOpH,KAAK4L,OAAO2S,OACI,IAA5BnX,EAAI+d,QAAQ,oBAKRnlB,KAAK4L,OAAO2S,OAAOnX,QAG5B,IAAI,MAAMA,KAAOpH,KAAK4L,OAAO2S,OACI,IAA5BnX,EAAI+d,QAAQ,oBAKRnlB,KAAK4L,OAAO2S,OAAOnX,GAI9B,MAAMiP,EAAoB,GAC1B,IAAI,MAAMjP,KAAOm3B,EACZn3B,EAAIs4B,WACLrpB,EAAQ9M,KAAKnC,EAAImkB,YAGjBvrB,KAAK4L,OAAO2S,OAAOnX,IAAO,EAI9B,IAAIwvE,EAEFA,EADe,aAAd52E,KAAKK,KACC4K,GAAWoL,EAAQ4oB,SAASh0B,GAE5BA,IAAYoL,EAAQ4oB,SAASh0B,GAGtC,OAAApD,EAAA,GAAe7H,KAAK4L,OAAOirE,cAAe,CAAC5rE,EAAQjD,KAC7C4uE,EAAI3rE,KACNjL,KAAK4L,OAAOirE,cAAczuE,OAAOJ,EAAK,GACtChI,KAAK4L,OAAOkrE,aAAa1uE,OAAOJ,EAAK,MAIzC,MAAM+uE,EAAsB,aAAd/2E,KAAKK,KAAsB,iBAAmB,iBACtD22E,EAA4B,aAAdh3E,KAAKK,KAAsB,gBAAkB,gBACjE,OAAAwH,EAAA,GAAe7H,KAAK4L,OAAOmrE,GAAQ,CAAC9rE,EAAQjD,KACvCqO,EAAQ4oB,SAASh0B,KAClBjL,KAAK4L,OAAOmrE,GAAO3uE,OAAOJ,EAAK,GAC/BhI,KAAK4L,OAAOorE,GAAa5uE,OAAOJ,EAAK,MAIzChI,KAAK4L,OAAqB,aAAd5L,KAAKK,KAAsB,iBAAmB,kBAAoBgW,EAC9ErW,KAAK4L,OAAqB,aAAd5L,KAAKK,KAAsB,gBAAkB,iBAAmBgW,EAAQ5J,IAAIxB,GAAU,IAAgBgsE,iBAAiBhsE,IAGnIjL,KAAKk3E,cAAcC,UAAUn3E,KAAK4L,QAAQ,GAC1C5L,KAAK49B,UAGP59B,KAAKy2E,iBAAmB,IAAInjE,IACrB,IAAmB8jE,eAAeC,mBAAmB1zE,KAAKy3D,IAC/D,IAAI,MAAMxvD,KAAUwvD,EAClBp7D,KAAKy2E,iBAAiBj8D,IAAI5O,EAAQ,IAAIjE,IAAI,IAAmB2vE,eAAeC,iBAAiB3rE,EAAOmH,IAAItG,IAAI80B,GAAKA,EAAEt2B,YAKzH,SAASszB,GACP,MAAMjH,EAAgB,IAAI,KAAc,CACtCvyB,OAAO,IAMT,OAJGw5B,IACDjH,EAAcl3B,MAAM+2B,QAAUoH,GAGzBjH,EAAcvxB,MAsCvB,SACK/F,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGdhS,KAAK22E,WAAWxxE,MAAMC,QAAwB,aAAdpF,KAAKK,KAAsB,GAAK,OAChEL,KAAK+U,SAAuB,aAAd/U,KAAKK,KAAsB,mBAAqB,mBAE9D,MAAMuL,EAAS5L,KAAK4L,OAEd4rE,EAAoB,IAAI,GAAe,CAC3Cl6C,aAAa,EACb98B,KAAM,oBAKR,IAAI4Y,EAFJo+D,EAAkBp2E,UAAUlB,UAAUW,IAAI,qBAIxCuY,EADe,aAAdpZ,KAAKK,KACI,CACRo3E,cAAe,CAACC,IAAK,OAAQp/C,KAAM,8BACnCq/C,iBAAkB,CAACD,IAAK,UAAWp/C,KAAM,2BACzCs/C,aAAc,CAACF,IAAK,YAAap/C,KAAM,8BAG/B,CACRuJ,SAAU,CAAC61C,IAAK,aAAcp/C,KAAM,4BACpCu/C,aAAc,CAACH,IAAK,cAAep/C,KAAM,+BACzCw/C,OAAQ,CAACJ,IAAK,QAASp/C,KAAM,0BAC7By/C,WAAY,CAACL,IAAK,aAAcp/C,KAAM,4BACtC0/C,KAAM,CAACN,IAAK,OAAQp/C,KAAM,yBAI9B,MAAM8G,EAAIz+B,SAASi7B,yBACnB,IAAI,MAAMx0B,KAAOgS,EAAS,CACxB,MAAMsK,EAAS,YAAO,qDAAsD,CAACvS,KAAMiI,EAAQhS,GAAKswE,IAAKp/C,KAAMlf,EAAQhS,GAAKkxB,OACxH5U,EAAOxc,QAAQ+D,OAAS7D,EACxBsc,EAAOriB,OAAOrB,KAAKugC,YACnBnB,EAAE/9B,OAAOqiB,GAEX8zD,EAAkB7lE,QAAQtQ,OAAO+9B,GAIjC,MAAM64C,GAA+B,aAAdj4E,KAAKK,KAAsBuL,EAAOssE,eAAiBtsE,EAAOusE,gBAAgBxyE,QAEjG3F,KAAKmrB,SAAW,IAAI,GAAe,CACjCuV,SAAU1gC,KAAKoB,UACfsO,SAAU1P,KAAK02E,eACf/3C,SAAU,CAAC,WACXU,kBAAmBr/B,KAAKs/B,cACxB3uB,YAAa,SACbyvB,uBAAwB,gBAE1BpgC,KAAKmrB,SAASoT,SAAW,IAAI52B,IAAIswE,GAEjC,IAAIG,GAAe,EACnB,MAAMC,EAAOr4E,KAAKmrB,SAAStqB,IAAI6F,KAAK1G,KAAKmrB,UACzCnrB,KAAKmrB,SAAStqB,IAAM,CAACoK,EAAQyG,EAAO4xB,KAClC,GAAGtjC,KAAKmrB,SAASoT,SAASr7B,MAAQ,KAAOk1E,IAAiBh/D,EAAQnO,GAAS,CACzE,MAAMnJ,EAAuB9B,KAAKmrB,SAAS/c,KAAKqF,cAAc,kBAAkBxI,yBAC7EnJ,GACDgO,WAAW,KACThO,EAAGq1B,SAAU,GACZ,GAKL,YADAwC,GADY,IAAK9iB,OAAqB,aAAd7W,KAAKK,KAAsB,uCAAwC,wCAAwC,IAKrI,MAAM2wB,EAAMqnD,EAAKptE,EAAQmO,EAAQnO,GAAU,YAAKmO,EAAQnO,GAAQqtB,WAAQjwB,EAAWi7B,GAInF,OAHGlqB,EAAQnO,IACT+lB,EAAIvd,cAAc,kBAAkBvT,UAAUW,IAAI,SAAWuY,EAAQnO,GAAQysE,KAExE1mD,GAGThxB,KAAKmrB,SAAS5b,WAAWnO,UAAUC,OAAOm2E,EAAkBp2E,UAAWpB,KAAKmrB,SAAS5b,WAAWnO,UAAU63C,kBAE1Gj5C,KAAKmrB,SAAS2hB,WAAWmrC,GACzBG,GAAe,EAEf,IAAI,MAAM1yC,KAAQ95B,EAAO2S,OAEpBnF,EAAQk/D,eAAe5yC,IAAW95B,EAAO2S,OAAOmnB,IAChD8xC,EAAkB7lE,QAAQ8B,cAAc,kBAAkBiyB,OAA0BvF,QAY3F,sBAME,OALGngC,KAAKmrB,WACNnrB,KAAKmrB,SAAS/pB,UAAUkD,SACxBtE,KAAKmrB,SAAW,MAGXxrB,MAAM4S,sBAMR,KAAK3G,EAAuBvL,EAAgC62E,GAMjE,OALAl3E,KAAKu4E,eAAiB3sE,EACtB5L,KAAK4L,OAAS,OAAAkV,GAAA,GAAK9gB,KAAKu4E,gBACxBv4E,KAAKK,KAAOA,EACZL,KAAKk3E,cAAgBA,EAEdv3E,MAAM+U,Q,cC5PF,MAAM,WAAyB,EAA9C,c,oBAUU,KAAAqwB,MAAsJ,GASpJ,OACR/kC,KAAKoB,UAAUlB,UAAUW,IAAI,yBAC7Bb,KAAKq9B,QAAU18B,SAASC,cAAc,OACtCZ,KAAKq9B,QAAQn9B,UAAUW,IAAI,WAC3Bb,KAAKq9B,QAAQh8B,OAAO,YAAK,6BACzBrB,KAAKsgE,iBAAmB3/D,SAASC,cAAc,OAC/CZ,KAAKsgE,iBAAiBpgE,UAAUW,IAAI,qBAEpCb,KAAK22E,WAAa,EAAW,+BAC7B,MAAM6B,EAA4C,CAChDrnE,KAAM,gBACNmnB,KAAM,mBACNopB,QAAS,KACP,IAAI,GAAU,gBAAiB,CAC7B7pB,aAAc,wCACdgE,mBAAoB,sCACpBR,QAAS,CAAC,CACR7B,QAAS,SACT4C,SAAU,KACRo8C,EAAmBz9D,QAAQxa,aAAa,WAAY,QACpD,IAAmB62E,eAAeqB,mBAAmBz4E,KAAK4L,QAAQ,GAAMjI,KAAK+0E,IACxEA,GACD14E,KAAK49B,UAEN+J,QAAQ,KACT6wC,EAAmBz9D,QAAQ4vB,gBAAgB,eAG/C3C,UAAU,MAEX5K,SAGPp9B,KAAK24E,QAAU,GAAiB,GAAI,cAAe,CAACH,IACpDx4E,KAAK24E,QAAQz4E,UAAUW,IAAI,QAE3Bb,KAAKuR,OAAOlQ,OAAOrB,KAAK22E,WAAY32E,KAAK24E,SAEzC,MAAMC,EAAe,IAAI,GAAe,IAElCzjE,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3Bb,KAAKqrC,eAAiB,IAAI,IAAW,CACnCtlC,MAAO,iBACPsP,UAlEyB,KAqE3BF,EAAa9T,OAAOrB,KAAKqrC,eAAejqC,WACxCw3E,EAAajnE,QAAQtQ,OAAO8T,GAE5B,MAAM0jE,EAAe,CAAC7qE,EAAmB8qE,EAAqBz9C,EAAgFwb,KAC5I,MAAM3hC,EAAU,IAAI,GAAe,CACjC1U,KAAMs4E,EACNx7C,aAAa,IAGfpoB,EAAQ9T,UAAUlB,UAAUW,IAAI,cAAemN,GAE/C,MAAM+qE,EAAa7jE,EAAQ8wB,yBAiB3B,OAhBA+yC,EAAW74E,UAAUW,IAAI,qBAEzBw6B,EAAQ9wB,QAAQ2xB,IACd,MAAMxY,EAAS,YAAO,yDAA0D,CAC9EvS,KAAM+qB,EAAE/qB,KACRmnB,KAAM4D,EAAE5D,KACR7mB,UAAUyqB,EAAEC,iBAAa9zB,IAGxB6zB,EAAE17B,OACHq2C,EAAG3a,EAAE17B,MAAQkjB,GAGfq1D,EAAW13E,OAAOqiB,KAGbxO,GAGTlV,KAAKk4E,eAAiBW,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E1nE,KAAM,cACNmnB,KAAM,kCACN6D,YAAY,GACX,CACD7D,KAAM,2BACNnnB,KAAM,aACN3Q,KAAM,YACL,CACD83B,KAAM,8BACNnnB,KAAM,cACN3Q,KAAM,gBACL,CACD83B,KAAM,yBACNnnB,KAAM,QACN3Q,KAAM,UACL,CACD83B,KAAM,2BACNnnB,KAAM,UACN3Q,KAAM,cACL,CACD83B,KAAM,uBACNnnB,KAAM,OACN3Q,KAAM,SACJR,KAAK+kC,OAET/kC,KAAKm4E,eAAiBU,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E1nE,KAAM,gBACNmnB,KAAM,kCACN6D,YAAY,GACX,CACD7D,KAAM,6BACNnnB,KAAM,OACN3Q,KAAM,iBACL,CACD83B,KAAM,0BACNnnB,KAAM,UACN3Q,KAAM,oBACL,CACD83B,KAAM,4BACNnnB,KAAM,YACN3Q,KAAM,iBACJR,KAAK+kC,OAET/kC,KAAKuP,WAAWlO,OAAOrB,KAAKsgE,iBAAkBtgE,KAAKq9B,QAASu7C,EAAax3E,UAAWpB,KAAKk4E,eAAe92E,UAAWpB,KAAKm4E,eAAe/2E,WAEvI,MAAM43E,EAAyBh5E,KAAKk4E,eAAe92E,UAAUqS,cAAc,sBACrEwlE,EAAyBj5E,KAAKm4E,eAAe/2E,UAAUqS,cAAc,sBAE3EulE,EAAuBvlE,cAAc,QAAQnS,iBAAiB,QAAS,KACrE,IAAI,GAAoBtB,KAAKoR,QAAQsD,KAAK1U,KAAK4L,OAAQ,WAAY5L,QAGrEi5E,EAAuBxlE,cAAc,QAAQnS,iBAAiB,QAAS,KACrE,IAAI,GAAoBtB,KAAKoR,QAAQsD,KAAK1U,KAAK4L,OAAQ,WAAY5L,QAGrEA,KAAK22E,WAAWr1E,iBAAiB,QAAS,KACxC,GAAGtB,KAAKqrC,eAAejrC,MAAMF,UAAUuV,SAAS,SAC9C,OAGF,IAAIzV,KAAKqrC,eAAe1mC,MAAMkL,OAE5B,YADA7P,KAAKqrC,eAAejrC,MAAMF,UAAUW,IAAI,SAI1C,IAUIuJ,EAVA8uE,EAAW/sE,MAAMC,KAAK4sE,EAAuBzoD,UAA4B5qB,MAAM,GAAG8rB,OAAO,CAACC,EAAK5vB,IAAO4vB,KAAQ5vB,EAAGqD,MAAMC,QAAS,GACpI8zE,GAAWl5E,KAAK4L,OAAOutE,cAAcx3E,OAEjCu3E,GAKJl5E,KAAK22E,WAAWp2E,aAAa,WAAY,QAMvC6J,EAHEpK,KAAK4L,OAAOmH,GAGJ,IAAmBqkE,eAAeqB,mBAAmBz4E,KAAK4L,QAF1D,IAAmBwrE,eAAegC,mBAAmBp5E,KAAK4L,QAKtExB,EAAQzG,KAAK+0E,IACRA,GACD14E,KAAK49B,UAENltB,MAAMJ,IACS,4BAAbA,EAAIjQ,KACLs5B,GAAM,yCAENppB,QAAQC,MAAM,4BAA6BF,KAE5Cq3B,QAAQ,KACT3nC,KAAK22E,WAAWhsC,gBAAgB,eAxBhChR,GAAM,sDA4BV35B,KAAKqrC,eAAejrC,MAAMkB,iBAAiB,QAAS,KAClDtB,KAAK4L,OAAO8F,MAAQ1R,KAAKqrC,eAAe1mC,MACxC3E,KAAKq5E,uBAGP,MAAMC,EAAsD,SAAdt5E,KAAKK,KAAkB,CACnE,IAAmB+2E,eAAemC,qBAAqBv5E,KAAK4L,OAAOmH,GAAI,gBACvE,IAAmBqkE,eAAemC,qBAAqBv5E,KAAK4L,OAAOmH,GAAI,iBACvE,IAAmBqkE,eAAemC,qBAAqBv5E,KAAK4L,OAAOmH,GAAI,kBACrE,GAEJ,OAAO1N,QAAQC,IAAI,CACjBtF,KAAKw5E,qBAAuBlwB,GAAA,EAAajmD,qBAAqB,CAC5DjC,UAAWpB,KAAKsgE,iBAChBh9D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,aAAaE,KAAK81E,IACnBz5E,KAAK6D,UAAY41E,EAEVnwB,GAAA,EAAajlD,kBAAkBo1E,QAGrCH,IAIP,qBACEt5E,KAAKw5E,qBAAqB71E,KAAK,KAC7B3D,KAAK6D,UAAUN,UAAW,EAC1BvD,KAAK6D,UAAUO,SAIX,eAENpE,KAAK+U,SAAS,aACd/U,KAAK24E,QAAQz4E,UAAUW,IAAI,QAC3Bb,KAAK22E,WAAWz2E,UAAUoE,OAAO,QACjCtE,KAAKqrC,eAAe1mC,MAAQ,GAE5B,IAAI,MAAM+gC,KAAQ1lC,KAAK+kC,MAErB/kC,KAAK+kC,MAAMW,GAAMvgC,MAAMC,QAAU,OAI7B,aAENpF,KAAK+U,SAAuB,WAAd/U,KAAKK,KAAoB,YAAc,oBAEpC,SAAdL,KAAKK,OACNL,KAAK24E,QAAQz4E,UAAUoE,OAAO,QAC9BtE,KAAK22E,WAAWz2E,UAAUW,IAAI,SAGhC,MAAM+K,EAAS5L,KAAK4L,OACpB5L,KAAKqrC,eAAe1mC,MAAQ,OAAA+0E,GAAA,GAAuB,IAAkBC,cAAc/tE,EAAO8F,QAE1F,IAAI,MAAMg0B,KAAQ1lC,KAAK+kC,MACrB/kC,KAAK+kC,MAAMW,GAAyCvgC,MAAMC,QAAYwG,EAAO2S,OAAOmnB,GAA2C,GAAK,OAGtI,CAAE,iBAA2B,kBAA4Bn7B,QAAQnD,IAC/D,MAAM8N,EAAUlV,KAAKoH,GACfwyE,EAAK,GAAkBvrE,iBAE7B,IAAImsD,EAAQ5uD,EAAOxE,GAOnB,OAAAS,EAAA,GAAe2yD,EAAO,CAACvvD,EAAQjD,EAAKC,KAJpB,CAACgD,KACN,IAAmB4uE,cAAc5uE,MAAYA,EAAO82B,UAA4D,SAAjD,IAAgByJ,QAAQvgC,EAAOwL,YAAYrL,EAI/G0uE,CAAQ7uE,IACVhD,EAAIG,OAAOJ,EAAK,KAIpBwyD,EAAQA,EAAM70D,QAEd,MAAMo0E,EAAcC,IAClB,IAAI,IAAIp4E,EAAI,EAAGD,EAASkD,KAAKC,IAAI01D,EAAM74D,OAAQq4E,GAAUp4E,EAAID,IAAUC,EAAG,CACxE,MAAMqJ,EAASuvD,EAAMhxD,QACrB,IAAGyB,EAAO82B,WAAoB,IAAmB83C,cAAc5uE,GAC7D,SAGF,MAAM,IAAC+L,GAAO,GAAkBC,aAAa,CAC3CC,OAAQjM,EACR7J,UAAWw4E,EACXzpE,YAAY,EACZgH,eAAe,EACf9G,WAAW,EACXD,WAAY,KAEd4G,EAAII,gBAAgBrW,cAAcuD,SAGjCk2D,EAAM74D,OACPq3C,EAASC,iBAAiB7rB,YAAY,YAAK,sBAAuB,CAACotC,EAAM74D,UACjEq3C,GACRA,EAAS10C,UAMb,IAAI00C,EACJ,GAHA9jC,EAAQ8wB,yBAAyB3kC,OAAOu4E,GAGrCpf,EAAM74D,OAAQ,CACf,MAAMgQ,EAAUuD,EAAQ8wB,yBACxBgT,EAAW,YAAO,yDAA0D,CAAC7nC,KAAM,SACnF6nC,EAAS94C,UAAUW,IAAI,YAAa,eACpCm4C,EAAS13C,iBAAiB,QAAS,IAAMy4E,EAAW,KACpD/gC,EAAS33C,OAAO,YAAK,sBAAuB,CAACm5D,EAAM74D,UAEnDgQ,EAAQtQ,OAAO23C,GAGjB+gC,EAAW,KAIf,qBACE,GAAiB,SAAd/5E,KAAKK,KAAiB,CACvB,MAAMuN,GAAW,OAAAiT,GAAA,GAAU7gB,KAAKu4E,eAAgBv4E,KAAK4L,QACrD5L,KAAK22E,WAAWz2E,UAAUC,OAAO,QAASyN,GAC1C5N,KAAK24E,QAAQz4E,UAAUC,OAAO,OAAQyN,IAI1C,UAAUhC,EAAsB68C,GAC3BzoD,KAAKoB,WAEN+K,MAAMC,KAAKpM,KAAKoB,UAAUsS,iBAAiB,mBAAmBnJ,QAAQzI,GAAMA,EAAGwC,UAG9EmkD,GACDzoD,KAAKu4E,eAAiB3sE,EACtB5L,KAAK4L,OAAS,OAAAkV,GAAA,GAAKlV,KAEnB5L,KAAK4L,OAASA,EACd5L,KAAKi6E,aACLj6E,KAAKq5E,sBAIF,KAAKztE,GAoBV,YAnBcvD,IAAXuD,GACD5L,KAAKm3E,UAAU,CACb/rE,EAAG,eACH2H,GAAI,EACJrB,MAAO,GACP6M,OAAQ,GACRu4D,aAAc,GACdqC,cAAe,GACfe,cAAe,GACfrD,cAAe,GACfqB,eAAgB,GAChBC,eAAgB,KACf,GACHn4E,KAAKK,KAAO,WAEZL,KAAKm3E,UAAUvrE,GAAQ,GACvB5L,KAAKK,KAAO,QAGPV,MAAM+U,OAAO/Q,KAAK,KACN,SAAd3D,KAAKK,MACNL,KAAKm3E,UAAUn3E,KAAKu4E,gBAAgB,GACpCv4E,KAAKi6E,cAELj6E,KAAKm6E,kB,2SCvXE,MAAM,WAA0B,EAA/C,c,oBAOU,KAAAC,gBAA6C,GAG7C,aAAaC,EAAqEj5E,EAAyBy0B,GACjH,IAAIjqB,EA2CAolB,EA1CA8K,EAAc,GACdyF,EAAmB,GACvB,GAAsB,0BAAnB84C,EAAajvE,EACdQ,EAASyuE,EAAazuE,OACtBkwB,EAAcu+C,EAAav+C,gBACtB,CAQL,GAPAlwB,EAASyuE,EAOa,IALD18D,OAAOg1C,KAAK/mD,EAAO2S,QAAQ5c,OAKvB,CACvB,MAAM4c,EAAS3S,EAAO2S,OACtB,IAAIo7B,EACDp7B,EAAOsjB,SAAU8X,EAAI,oBAChBp7B,EAAOs5D,aAAcl+B,EAAI,uBACzBp7B,EAAOu5D,OAAQn+B,EAAI,kBACnBp7B,EAAOw5D,WAAYp+B,EAAI,oBACvBp7B,EAAOy5D,OAAMr+B,EAAI,iBAEtBA,GACDpY,EAAEh4B,KAAK,YAAKowC,IAIhB,IAAIpY,EAAE5/B,OAAQ,CACZ,MAAM24E,EAAS,IAAmBhD,eAAeC,iBAAiB3rE,EAAOmH,IACzE,IAAI6qD,EAAQ,EAAG2c,EAAW,EAAGzC,EAAS,EACtC,IAAI,MAAM5gE,KAAUojE,EACf,IAAgBE,WAAWtjE,EAAOjM,QAAS6sE,IACtC,IAAgBv7C,YAAYrlB,EAAOjM,QAASsvE,IAC/C3c,IAGJA,GAAOr8B,EAAEh4B,KAAK,YAAK,QAAS,CAACq0D,KAC7B2c,GAAUh5C,EAAEh4B,KAAK,YAAK,WAAY,CAACgxE,KACnCzC,GAAQv2C,EAAEh4B,KAAK,YAAK,SAAU,CAACuuE,MAKtC,GAAIjiD,EAwBFA,EAAI7F,SAASS,YAAc,GAC3B,YAAK8Q,GAAGh3B,QAAQzI,IACd+zB,EAAI7F,SAAS3uB,OAAOS,UAbtB,GAZA+zB,EAAM,IAAI,GAAI,CACZnkB,MAAO,IAAkB6a,cAAc3gB,EAAO8F,OAC9Cse,SAAU8L,EACV7tB,WAAW,IAGVszB,EAAE5/B,QACH,YAAK4/B,GAAGh3B,QAAQzI,IACd+zB,EAAI7F,SAAS3uB,OAAOS,KAIF,iBAAnBu4E,EAAajvE,EAAsB,CACpC,MAAMqvE,EAAW7uE,EAAOmH,GACpB/S,KAAKo6E,gBAAgB9B,eAAe1sE,EAAOmH,KAC7C,YAAiB8iB,EAAIz0B,UAAW,KAC9B,IAAI,GAAiBpB,KAAKoR,QAAQsD,KAAK,IAAmB0iE,eAAesD,UAAUD,KAClF,CAAC5oE,eAAgB7R,KAAK6R,iBAG3B7R,KAAKo6E,gBAAgBxuE,EAAOmH,IAAM8iB,EAgBtC,OAPA7E,EAAM6E,EAAIz0B,UAENwK,EAA0B0sE,eAAe,cAE3CttB,GAAuBh6B,EAAKA,EAAIjwB,eAAiBK,EAAYwK,EAA0B+uE,YAC/Ev5E,GAAWA,EAAUC,OAAO2vB,GAE/BA,EAGO,O,0CACdhxB,KAAKoB,UAAUlB,UAAUW,IAAI,0BAC7Bb,KAAK+U,SAAS,8BAEd/U,KAAKuP,WAAWnO,UAAUlB,UAAUW,IAAI,gBAExCb,KAAKsgE,iBAAmB3/D,SAASC,cAAc,OAC/CZ,KAAKsgE,iBAAiBpgE,UAAUW,IAAI,qBAEpC,MAAMw8B,EAAU18B,SAASC,cAAc,OACvCy8B,EAAQn9B,UAAUW,IAAI,WACtB,YAAM,CAACka,QAASsiB,EAASj2B,IAAK,2BAE9BpH,KAAK46E,gBAAkB,YAAO,kDAAmD,CAC/EtiD,KAAM,2BACNnnB,KAAM,QAGRnR,KAAK66E,eAAiB,IAAI,GAAe,CACvCr6E,KAAM,YAERR,KAAK66E,eAAez5E,UAAU+D,MAAMC,QAAU,OAE9CpF,KAAK86E,iBAAmB,IAAI,GAAe,CACzCt6E,KAAM,sBAERR,KAAK86E,iBAAiB15E,UAAU+D,MAAMC,QAAU,OAEhDpF,KAAKuP,WAAWlO,OAAOrB,KAAKsgE,iBAAkBjjC,EAASr9B,KAAK46E,gBAAiB56E,KAAK66E,eAAez5E,UAAWpB,KAAK86E,iBAAiB15E,WAElI,YAAiBpB,KAAK46E,gBAAiB,KAClCj9D,OAAOg1C,KAAK3yD,KAAKo6E,iBAAiBz4E,QAAU,GAC7Cg4B,GAAM,yCAEN,IAAI,GAAiB35B,KAAKoR,QAAQsD,QAEnC,CAAC7C,eAAgB7R,KAAK6R,iBAEzB,MAAMkpE,EAA2B,KAC/B/6E,KAAK66E,eAAez5E,UAAU+D,MAAMC,QAAUuY,OAAOg1C,KAAK3yD,KAAKo6E,iBAAiBz4E,OAAS,GAAK,QA+DhG,OA5DA,IAAmBy1E,eAAeC,mBAAmB1zE,KAAKy3D,IACxD,IAAI,MAAMxvD,KAAUwvD,EAClBp7D,KAAKg7E,aAAapvE,EAAQ5L,KAAK66E,eAAelpE,SAGhDopE,MAGF/6E,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAkB4L,IAChD5L,KAAKo6E,gBAAgB9B,eAAe1sE,EAAOmH,IAC5C/S,KAAKg7E,aAAapvE,EAAQ,KAAM5L,KAAKo6E,gBAAgBxuE,EAAOmH,KAE5D/S,KAAKg7E,aAAapvE,EAAQ5L,KAAK66E,eAAelpE,SAGhDopE,IAEA/6E,KAAKi7E,wBAGPj7E,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAkB4L,IAChD5L,KAAKo6E,gBAAgB9B,eAAe1sE,EAAOmH,MAM5C/S,KAAKi7E,sBAELj7E,KAAKo6E,gBAAgBxuE,EAAOmH,IAAI3R,UAAUkD,gBACnCtE,KAAKo6E,gBAAgBxuE,EAAOmH,KAGrCgoE,MAGF/6E,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,eAAiBk7E,IAClDA,EAAM3wE,QAAQ,CAACkwE,EAAUzyE,KACvB,MAAM5G,EAAYpB,KAAKo6E,gBAAgBK,GAAUr5E,UACjD4pD,GAAuB5pD,EAAWA,EAAUL,cAAeiH,EAAM,OAIrEhI,KAAKw5E,qBAAuBlwB,GAAA,EAAajmD,qBAAqB,CAC5DjC,UAAWpB,KAAKsgE,iBAChBh9D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,aAAaE,KAAK81E,IACnBz5E,KAAK6D,UAAY41E,EAEVnwB,GAAA,EAAajlD,kBAAkBo1E,KAGxCz5E,KAAKi7E,sBAKEj7E,KAAKw5E,wBAGd,qBACEx5E,KAAKw5E,qBAAqB71E,KAAK,KAC7B3D,KAAK6D,UAAUN,UAAW,EAC1BvD,KAAK6D,UAAUO,SAIX,sBACN,OAAO,KAAWw2B,UAAU,sCAAsCj3B,KAAKw3E,IACrEn7E,KAAK86E,iBAAiB15E,UAAU+D,MAAMC,QAAU+1E,EAAiBx5E,OAAS,GAAK,OAC/EwK,MAAMC,KAAKpM,KAAK86E,iBAAiBnpE,QAAQ4e,UAAU5qB,MAAM,GAAG4E,QAAQzI,GAAMA,EAAGwC,UAE7E62E,EAAiB5wE,QAAQqB,IACvB,MAAMolB,EAAMhxB,KAAKg7E,aAAapvE,GACxB8X,EAAS,YAAO,gCAAiC,CAAC4U,KAAM,QAC9DtH,EAAI3vB,OAAOqiB,GACX1jB,KAAK86E,iBAAiBnpE,QAAQtQ,OAAO2vB,GAErC,YAAiBtN,EAAS3jB,IAGxB,GAFA,OAAAiqB,EAAA,GAAYjqB,GAET4d,OAAOg1C,KAAK3yD,KAAKo6E,iBAAiBz4E,QAAU,GAE7C,YADAg4B,GAAM,yCAIRjW,EAAOnjB,aAAa,WAAY,QAEhC,MAAM6+B,EAAIxzB,EAAOA,OACjBwzB,EAAE84C,eAAiB,GACnB94C,EAAE+4C,eAAiB,GACnB/4C,EAAEy3C,cAAgB,GAElB,IAAmBO,eAAegC,mBAAmBh6C,GAAG,GAAMz7B,KAAK+0E,IAC9DA,GACD1nD,EAAI1sB,WAELqjC,QAAQ,KACTjkB,EAAOinB,gBAAgB,eAExB,CAAC94B,eAAgB7R,KAAK6R,sBCvPlB,MAAM,WAA4B,EACrC,OACR7R,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,0BAA2B,eACxDb,KAAK+U,SAAS,+CAEd,MAAMqmE,EAAiB17E,IAKrB,MAAMwV,EAAU,IAAI,GAAe,CACjC1U,KAAMd,EAAQc,OAGV66E,EAAa,IAAI,GAAI,CACzB/jD,cAAe,IAAI,KAAc,CAACgB,KAAM54B,EAAQ47E,SAAUnkD,SAAS,IACnEI,gBAAiB,YAGbgkD,EAAoB,IAAI,GAAI,CAChCjkD,cAAe,IAAI,KAAc,CAACgB,KAAM,iBAAkBnB,SAAS,IACnEI,gBAAiB,YAGnBriB,EAAQvD,QAAQtQ,OAAOg6E,EAAWj6E,UAAWm6E,EAAkBn6E,WAE/DpB,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,MAAMo6E,EAAkB,CAACpwE,EAAG1L,EAAQ69D,UAC9B/vD,EAAM,KAAwBiuE,kBAAkBD,IACrDhuE,aAAenI,QAAUmI,EAAMnI,QAAQ6E,QAAQsD,IAAM7J,KAAM+3E,IAC1D,MAAMC,EAAgB,KACpB,MAAM59D,EAAQ,KAAwB+tB,QAAQ4vC,GAI9C,OAHAL,EAAW/jD,cAAcH,SAAWpZ,EACpCw9D,EAAkBjkD,cAAcH,QAAUukD,EAAeE,cAElD79D,GAGT49D,IAEA37E,KAAKqS,cAAc/Q,iBAAiB,UAAW,KAC7C,MAAMu6E,GAAQR,EAAW/jD,cAAcH,QACjC2kD,EAAeP,EAAkBjkD,cAAcH,QAErD,GAAG0kD,IAAS,KAAwB/vC,QAAQ4vC,IAAmBI,IAAiBJ,EAAeE,cAC7F,OAGF,MAAMG,EAAqB,OAAAj7D,GAAA,GAAK46D,GAChCK,EAAc3wE,EAAI,0BAClB2wE,EAAcC,WAAaH,EAAO,WAAa,EAC/CE,EAAcH,cAAgBE,EAE9B,KAAwBG,qBAAqBT,EAAiBO,IAC7D,CAACl9D,MAAM,IAEV7e,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,kBAAoBwmC,IACrD,MAAM+2B,EAAWgH,GAAqB/9B,EAAOF,KAAKl7B,GAC/C1L,EAAQ69D,WAAaA,IACtBme,EAAiBl1C,EAAOuF,gBACxB4vC,UAMRP,EAAc,CACZ56E,KAAM,4BACN86E,SAAU,+BACV/d,SAAU,qBAGZ6d,EAAc,CACZ56E,KAAM,sBACN86E,SAAU,yBACV/d,SAAU,qBAGZ6d,EAAc,CACZ56E,KAAM,wBACN86E,SAAU,2BACV/d,SAAU,0BAGZ,CACE,MAAMroD,EAAU,IAAI,GAAe,CACjC1U,KAAM,uBAGF07E,EAAoB,IAAI,GAAI,CAChC5kD,cAAe,IAAI,KAAc,CAACgB,KAAM,gBAAiBnB,SAAS,IAClEI,gBAAiB,YAGb4kD,EAAW,IAAI,GAAI,CACvB7kD,cAAe,IAAI,KAAc,CAACgB,KAAM,sBAAuBnB,SAAS,EAAM8B,SAAU,iCACxF1B,gBAAiB,YAGnB2B,EAAA,EAAgBC,WAAWx1B,KAAKy1B,IAC9B+iD,EAAS7kD,cAAcH,QAAUiC,EAAMuK,SAAS6O,cAAc4pC,QAGhElnE,EAAQvD,QAAQtQ,OAAO66E,EAAkB96E,UAAW+6E,EAAS/6E,WAE7DpB,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAE/B,KAAwBi7E,+BAA+B14E,KAAK4d,IAC1D26D,EAAkB5kD,cAAcH,QAAU5V,EAE1CvhB,KAAKqS,cAAc/Q,iBAAiB,UAAW,KAC7C,MAAMykE,EAAWmW,EAAkB5kD,cAAcH,QAC9C5V,IAAYwkD,GACb,KAAwBuW,8BAA8BvW,IAEvD,CAAClnD,MAAM,Q,2SC3HH,MAAM,WAAuB,EAC1B,O,0CACd7e,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAKoB,UAAUlB,UAAUW,IAAI,sBAC7Bb,KAAK+U,SAAS,mCAEd,MAAMG,EAAU,IAAI,GAAe,IAE7B4pD,EAA8B,IAAIxrD,IAElClJ,EAAU,KAAWmyE,mBAAmB,wBAAyB,CACrEC,UAAW,UACV74E,KAAM84E,IACP,MAAMjgD,EAAS,eACfigD,EAAUlyE,QAASmyE,IACjB,MAAM7mD,EAAM,IAAI,GAAI,CAClBwB,WAAY,IAAI,GAAW,CACzBiB,KAAMokD,EAASl8E,KACfA,KAAMg8B,EACN73B,MAAO+3E,EAASC,YAElB3sD,SAAU0sD,EAASE,cAGrB9d,EAAUtkD,IAAIkiE,EAASC,UAAW9mD,KAGpC,MAAMqB,EAAOiB,GAAkB,IAAI2mC,EAAUj7B,UAAYl/B,IACvD,IAAKk4E,YAAYl4E,KAGnB,IAAKm4E,mBAAmBn5E,KAAKo5E,IAC3B,MAAMlnD,EAAMipC,EAAUnrD,IAAIopE,EAASJ,WAC/B9mD,EAKJA,EAAIwB,WAAWzxB,kBAAiB,GAJ9B2K,QAAQC,MAAM,SAAUqlB,EAAKknD,KAOjC7nE,EAAQvD,QAAQtQ,OAAO61B,KAKzB,OAFAl3B,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAExBgJ,MC7CI,SAAS4yE,GAAkBt9E,GACxC,OAAO,IAAI2F,QAAwB,CAAC6E,EAASmlB,KAC3C,MAAM,OAAC3L,EAAM,SAAE6c,GAAY7gC,EAC3BgkB,EAAO0Y,SAAY5hB,IACjBtQ,EAAQsQ,IAAQA,EAAItX,UAAOmF,IAG7B,MAAMgzB,EAAU,aAAgB,CAAC3X,IACZ2X,EAAQhnB,KAAKqP,GAAUA,EAAOw+C,UACtC9lC,SAAW,KACtB/M,KAGF3vB,EAAQ27B,QAAUA,EAClB37B,EAAQu8B,WAAasE,GAAY,CAACA,GAElC,IAAI,GAAU,qBAAsB7gC,GAAS09B,SCpB1C,SAAS6/C,GAA4B58E,EAAkCqR,GAC5E,MAAMwD,EAAU,IAAI,GAAe,CAAC1U,KAAMkR,IAEpCtK,EAAM,yBAA2B/G,EAAO,IACxC68E,EAAwB,IAAI,KAAc,CAC9C5kD,KAAM,uBACN93B,KAAM,WACNy4B,SAAU7xB,EAAM,WAChB+0B,YAAY,IAERghD,EAAuB,IAAI,KAAc,CAC7C7kD,KAAM,2BACN93B,KAAM,UACNy4B,SAAU7xB,EAAM,UAChB+0B,YAAY,IAERihD,EAAsB,IAAI,KAAc,CAC5C9kD,KAAM,yBACN93B,KAAM,SACNy4B,SAAU7xB,EAAM,SAChB+0B,YAAY,IAERkhD,EAAwB,IAAI,KAAc,CAC9C/kD,KAAM,uBACN93B,KAAM,WACNy4B,SAAU7xB,EAAM,WAChB+0B,YAAY,IAUd,OAPAjnB,EAAQvD,QAAQtQ,OACd67E,EAAsBn3E,MACtBo3E,EAAqBp3E,MACrBq3E,EAAoBr3E,MACpBs3E,EAAsBt3E,OAGjBmP,EAGM,MAAM,WAAgC,EACzC,OACRlV,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAK+U,SAAS,sBAEd,MAAMG,EAAU+nE,GAA4B,QAAS,2BACrDj9E,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,YCzCpB,MAAM,WAA+B,EACxC,OACRpB,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAK+U,SAAS,qBAEd,MAAMuoE,EAAgB,OAAAtjD,GAAA,GAAUujD,IAC9BrkD,EAAA,EAAgBI,SAAS,yCAA0CikD,IAClE,KAAK,GAAO,GAETroE,EAAU+nE,GAA4B,OAAQ,0BAO9CM,EAAU3wE,EAAA,EAAU+2B,SAAS65C,gBAAgBC,cAC7C94E,EAAQE,KAAKslE,KAAKtlE,KAAKslE,MAAMoT,EANvB,QAGMG,WAIZC,EAAO,IAAI,IAAK1jB,YAAY,CAChC7yD,IAAK,4BACL2K,KAAM,CAAC+P,GAAYy7D,MAEfl7E,EAAQ,IAAI,GAAqB,0BAA2B,IAAMsC,EAAO,EAAG,GAAG,GACrFtC,EAAMqN,SAAY/K,IAChB,MAAM44E,EAVUG,SAUC,SAAA/4E,EAAS,GAbhB,OAauC,EAEjDg5E,EAAKC,iBAAiB,CAAC7rE,KAAM,CAAC+P,GAAYy7D,MAE1CD,EAAcC,IAGhBl7E,EAAMkyE,eAAelzE,OAAOs8E,EAAK5iE,SAEjC7F,EAAQvD,QAAQtQ,OAAOgB,EAAMjB,WAE7BpB,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,YCzCpB,MAAM,WAAgC,EACzC,OACRpB,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAK+U,SAAS,sBAEd,MAAMG,EAAU+nE,GAA4B,QAAS,2BACrDj9E,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,Y,2SCUnC,MAAMy8E,GAAmF,CACvFh8C,SAAU,uBACVi8C,QAAS,iBACThG,OAAQ,qBACRyC,SAAU,wBAGG,MAAM,WAA6B,EAChC,O,0CACdv6E,KAAKuR,OAAOrR,UAAUW,IAAI,eAC1Bb,KAAK+U,SAAS,gBAEd,CACE,MAAMG,EAAU,IAAI,GAAe,CAAC1U,KAAM,yBAA0B68B,QAAS,0BAEvEjE,QAAcF,EAAA,EAAgBC,WAE9B4kD,EAAoB,IAAI,KAAc,CAC1CzlD,KAAM,oBACN93B,KAAM,OACN22B,SAAUiC,EAAMuK,SAAS65C,gBAAgBj/D,OAAOhI,SAChD4lB,YAAY,IAGRzsB,EAAW,KACf,aAAiB,CAACqiE,GAChB,OAAAlxD,GAAA,GAAUuY,EAAMuK,SAAS/U,aAAc,IAAW+U,SAAS/U,eAC3D,OAAA/N,GAAA,GAAUuY,EAAMuK,SAAS65C,gBAAiB,IAAW75C,SAAS65C,mBAG5DQ,EAAe,KACnBh+E,KAAKi+E,wBAAwBC,EAAU9kD,EAAMuK,SAAS/U,aAAazmB,OACnEnI,KAAKi+E,wBAAwBE,EAAU/kD,EAAMuK,SAAS/U,aAAa3V,OACnEjZ,KAAKi+E,wBAAwBG,EAAShlD,EAAMuK,SAAS/U,aAAaihD,KAAMz2C,EAAMuK,SAAS65C,gBAAgBC,gBAGnGY,EAAWnqE,IACf,MAAMd,EAAM,IAAIc,EAAelU,KAAKoR,QAAQ,GAC5CgC,EAAIsB,OAEJ1U,KAAK6R,eAAehR,IAAIuS,EAAIf,cAA5BrS,CAA2C,UAAW,KACpDg+E,IACAtuE,KACC,CAACmP,MAAM,KAGNq/D,EAAW,IAAI,GAAI,CACvBrmD,aAAc,qBACd7H,SAAU,GACV/hB,UAAW,KACTowE,EAAQ,OAINF,EAAW,IAAI,GAAI,CACvBtmD,aAAc,qBACd7H,SAAU,GACV/hB,UAAW,KACTowE,EAAQ,OAIND,EAAU,IAAI,GAAI,CACtBvmD,aAAc,oBACd7H,SAAU,GACV/hB,UAAW,KACTowE,EAAQ,OAINtM,EAAc,YAAO,sCAAuC,CAAC5gE,KAAM,SAAUmnB,KAAM,gCACzF,YAAiBy5C,EAAa,KAC5BiL,GAAkB,CAChBnlD,aAAc,wCACdgE,mBAAoB,mCACpBnY,OAAQ,CACN8V,QAAS,WAEV71B,KAAK,KACNiJ,EAAA,EAAU+2B,SAAS65C,gBAAkB,OAAA18D,GAAA,GAAK,IAAW6iB,SAAS65C,iBAC9D5wE,EAAA,EAAU+2B,SAAS/U,aAAe,OAAA9N,GAAA,GAAK,IAAW6iB,SAAS/U,cAC3DsK,EAAA,EAAgB61C,YAAY,WAAYniE,EAAA,EAAU+2B,UAClD/2B,EAAA,EAAU0F,cAAc,mBAAoB,CAAClL,IAAK,WAAYzC,MAAOiI,EAAA,EAAU+2B,WAE/Eq6C,IACAD,EAAkB5mD,SAAWiC,EAAMuK,SAAS65C,gBAAgBj/D,OAAOhI,aAIvE,MAAM+nE,EAAmB,KACvB,MAAM/nE,GAAYwnE,EAAkB5mD,QAE9BwM,EAAW/2B,EAAA,EAAU+2B,SACxBptB,EACDotB,EAAS65C,gBAAgBj/D,OAAOhI,UAAW,SAEpCotB,EAAS65C,gBAAgBj/D,OAAOhI,SAGzC,CAAC2nE,EAAUC,EAAUC,GAAS7zE,QAAQsrB,IACpCA,EAAIz0B,UAAUlB,UAAUC,OAAO,cAAeoW,KAGhD2iB,EAAA,EAAgB61C,YAAY,WAAYprC,GACxC/2B,EAAA,EAAU0F,cAAc,mBAAoB,CAAClL,IAAK,WAAYzC,MAAOg/B,IAErEj0B,KAGFquE,EAAkB39E,MAAMkB,iBAAiB,SAAUg9E,GACnDA,IACAN,IAEA9oE,EAAQvD,QAAQtQ,OACd08E,EAAkBh4E,MAClBm4E,EAAS98E,UACT+8E,EAAS/8E,UACTg9E,EAAQh9E,UACR2wE,GAGF/xE,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAGjC,CACE,MAAM8T,EAAU,IAAI,GAAe,CAAC1U,KAAM,kBAEpC+9E,EAAoB,IAAI,KAAc,CAC1CjmD,KAAM,cACN93B,KAAM,OACNy4B,SAAU,yBACVkD,YAAY,IAERqiD,EAAsB,IAAI,KAAc,CAC5ClmD,KAAM,gBACN93B,KAAM,SACNy4B,SAAU,2BACVkD,YAAY,IAGdjnB,EAAQvD,QAAQtQ,OAAOk9E,EAAkBx4E,MAAOy4E,EAAoBz4E,OAEpE/F,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,eAI3B,wBAAwBy0B,EAAU8N,EAAwC45C,GAChF,IAAIn2E,EAAkB2K,EAA2B,GAEjD,MAAM0sE,EAAW9gE,OAAOg1C,KAAKhvB,GACvB+6C,EAAcD,EAAShyE,IAAIrF,GAAOu8B,EAASv8B,GAAOy2E,GAAuBz2E,QAAOiB,GAAWuD,OAAOc,SACxG,GAAIgyE,EAAY/8E,QAAsB,IAAZ47E,EAEnB,CACL,MAAMoB,EAAQD,EAAY/8E,SAAW88E,EAAS98E,OAQ9C,QAPe0G,IAAZk1E,GACDn2E,EAAMu3E,EAAQ,6BAA+B,wBAC7C5sE,EAAKxI,KAAKuY,GAAYy7D,KAEtBn2E,EAAMu3E,EAAQ,yBAA2B,qBAGvCA,EAAO,CACT,MAAMhjD,EAAWh7B,SAASC,cAAc,QACxC+6B,EAASt6B,UAAU,YAAKq9E,EAAYjyE,IAAIrF,GAAO,YAAKA,KAAO,GAAM,IACjE2K,EAAKxI,KAAKoyB,SAbZv0B,EAAM,kBAiBR,OAAAqJ,EAAA,GAAeolB,EAAI7F,SAAU,YAAK5oB,EAAK2K,K,2SCjK5B,MAAM,WAAuB,EAA5C,c,oBACU,KAAAspB,QAOJ,GASM,OACRr7B,KAAKoB,UAAUlB,UAAUW,IAAI,sBAC7Bb,KAAK+U,SAAS,YAEd,MAAMkoD,EAAU,GAAiB,GAAI,cAAe,CAAC,CACnD9rD,KAAM,SACNmnB,KAAM,qBACNopB,QAAS,KACP,IAAI,GAAU,SAAU,CACtB7pB,aAAc,SACdgE,mBAAoB,qBACpBR,QAAS,CAAC,CACR7B,QAAS,SACT4C,SAAU,KACR,KAAWwiD,UAEb52C,UAAU,MAEX5K,WAIPp9B,KAAKq7B,QAAQwjD,KAAO,EAAW,QAE/B7+E,KAAKuR,OAAOlQ,OAAOrB,KAAKq7B,QAAQwjD,KAAM5hB,GAEtCj9D,KAAKu0C,QAAU,IAAI,GAAYv0C,KAAKuP,WAAYvP,KAAK6R,gBAAgB,GACrE7R,KAAKu0C,QAAQviC,OACbhS,KAAKu0C,QAAQpB,QAAQvmC,EAAA,EAAU+R,MAC/B3e,KAAKu0C,QAAQiC,sBAEb,MAAMsoC,EAAkB,YAAO,wDAAyD,CAAC3tE,KAAM,cAC/F2tE,EAAgBx9E,iBAAiB,QAAS,KACxC,MAAM4D,EAASvE,SAASC,cAAc,WACtC,IAAI,KAAc8T,KAAKxP,EAASirE,IAC9BA,IAASxsE,KAAKwS,GACL,UAAkBigE,mBAAmBjgE,QAIlDnW,KAAKu0C,QAAQx5B,QAAQk+B,iBAAiBhtB,kBAAkB5qB,OAAOy9E,GAE/D,MAAMC,EAAwB,K,MAC5B,MAAMxzC,EAAO,IAAgB00B,UAC7B6e,EAAgB5+E,UAAUC,OAAO,OAA0B,sBAAR,QAAV,EAAAorC,EAAKpjC,aAAK,eAAEiD,KAGvD2zE,IACA/+E,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAkBiL,IAChD2B,EAAA,EAAU+R,OAAS1T,GACpB8zE,MA8CJ,MAAMC,EAAar+E,SAASC,cAAc,OAC1Co+E,EAAW9+E,UAAUW,IAAI,mBAEzB,MAQMu3B,EAR0D,CAC9D,CAAC,SAAU,gCAAiC,IAC5C,CAAC,OAAQ,eAAgB,IACzB,CAAC,OAAQ,qCAAsC,IAC/C,CAAC,WAAY,yCAA0C,IACvD,CAAC,SAAU,0BAA2B,KAGzB3rB,IAAI,EAAE0E,EAAM0oB,EAAa3lB,KAC/B,IAAI,GAAI,CACb2jB,aAAcgC,EACd1oB,OACAlD,UAAW,KACT,IAAIiG,EAAelU,KAAKoR,QAAQ,GAAMsD,WAK5C0jB,EAAK7uB,KACHvJ,KAAKi/E,WAAa,IAAI,GAAI,CACxBpnD,aAAc,UACdE,oBAAqB,IACrB5mB,KAAM,iBACNlD,UAAW,IAAW,mCAChBjO,KAAK4jE,uBACD5jE,KAAK+kE,wBAGb,MAAM3xD,EAAM,IAAI,GAAqBpT,KAAKoR,QAC1CgC,EAAIwwD,eAAiB5jE,KAAK4jE,eAC1BxwD,EAAIf,cAAc/Q,iBAAiB,UAAW,KAC5CtB,KAAK4jE,oBAAiBv7D,EACtBrI,KAAK+kE,sBAAqB,IACzB,CAAClmD,MAAM,IACVzL,EAAIsB,YAIR1U,KAAKk/E,YAAc,IAAI,GAAI,CACzBrnD,aAAc,2BACdE,oBAAqB,YAAK,gBAC1B5mB,KAAM,WACNlD,UAAW,KACT,IAAI,GAAejO,KAAKoR,QAAQsD,WAKtCsqE,EAAW39E,UAAU+2B,EAAK3rB,IAAIopB,GAAOA,EAAIz0B,YAKzC,MAAM+9E,EAAiB,IAAI,GAC3BA,EAAextE,QAAQtQ,OAAO29E,GAE9Bh/E,KAAKuP,WAAWlO,OAAOrB,KAAKu0C,QAAQx5B,QAAuCokE,EAAe/9E,WAM1FpB,KAAKq7B,QAAQwjD,KAAKv9E,iBAAiB,QAAS,KAC9B,IAAI,GAAkBtB,KAAKoR,QACnCsD,SAGN40C,GAAA,EAAaxC,oBAEb9mD,KAAK+kE,uBAGC,kBAAkBqa,GACxB,GAAGp/E,KAAKq/E,2BAA6BD,EAAW,OAAOp/E,KAAKq/E,yBAE5D,MAAMj1E,EAAUpK,KAAKq/E,yBAA2B,KAAWzkD,UAAU,6BACpE+M,QAAQ,KACJ3nC,KAAKq/E,2BAA6Bj1E,IACnCpK,KAAKq/E,8BAA2Bh3E,KAIpC,OAAO+B,EAGF,qBAAqBg1E,GAC1B,OAAOp/E,KAAKs/E,kBAAkBF,GAAWz7E,KAAKuiE,IAC5ClmE,KAAK4jE,eAAiBsC,EAAMtC,eAC5B5jE,KAAKi/E,WAAWtnD,WAAWlH,YAAc,GAAKzwB,KAAK4jE,eAAejiE,UC7NzD,MAAM,WAAyB,EAA9C,c,oBACU,KAAAkT,aAAyC,KAOvC,OACR7U,KAAKoB,UAAUlB,UAAUW,IAAI,yBAC7Bb,KAAK+U,SAAS,cAEd/U,KAAKgV,WAAa,IAAI,EAAYC,IAChCjV,KAAK6U,aAAeI,IAGtB,MAAMC,EAAU,IAAI,GAAe,CACjCmoB,QAAS,wCAGLloB,EAAexU,SAASC,cAAc,OAC5CuU,EAAajV,UAAUW,IAAI,iBAE3Bb,KAAKu/E,sBAAwB,IAAI,IAAW,CAC1Cx5E,MAAO,mBACPsP,UAAW,MAGbrV,KAAKw/E,6BAA+B,IAAI,IAAW,CACjDz5E,MAAO,iCACPsP,UAAW,MAGbF,EAAa9T,OAAOrB,KAAKu/E,sBAAsBn+E,UAAWpB,KAAKw/E,6BAA6Bp+E,WAE5F,MAAMq+E,EAAiB,KACrBz/E,KAAK4V,QAAQ1V,UAAUC,OAAO,eAAgBH,KAAKu/E,sBAAsB56E,MAAMhD,SAC5E3B,KAAKu/E,sBAAsBn/E,MAAMF,UAAUuV,SAAS,WACpDzV,KAAKw/E,6BAA6Bp/E,MAAMF,UAAUuV,SAAS,WAGhEzV,KAAKu/E,sBAAsBn/E,MAAMkB,iBAAiB,QAASm+E,GAC3Dz/E,KAAKw/E,6BAA6Bp/E,MAAMkB,iBAAiB,QAASm+E,GAElEz/E,KAAK4V,QAAU,EAAa,CAACzE,KAAM,eAEnCnR,KAAK4V,QAAQtU,iBAAiB,QAAS,KACrC,MAAMoQ,EAAQ1R,KAAKu/E,sBAAsB56E,MACnCmR,EAAQ9V,KAAKw/E,6BAA6B76E,MAEhD3E,KAAK4V,QAAQW,UAAW,EACxB,IAAgBV,cAAc,CAC5BnE,QACAoE,QACA4pE,WAAW,IACV/7E,KAAM+5B,IACJ19B,KAAK6U,cACN7U,KAAK6U,eAAelR,KAAMwS,IACxB,IAAgBC,UAAUsnB,EAAWvnB,KAIzC,GAAe/B,qBAAqBpU,MACpC,IAAI,GAAiBA,KAAKoR,QAAQsD,KAAK,CACrCrU,KAAM,UACNosC,WAAW,EACX/6B,MAAO,kBACPf,YAAa,gBACb4zB,QAAUluB,GACD,IAAgBC,gBAAgBonB,EAAWrnB,SAM1DrW,KAAK2R,QAAQtQ,OAAOrB,KAAK4V,SACzBV,EAAQvD,QAAQtQ,OAAOrB,KAAKgV,WAAW5T,UAAW+T,GAClDnV,KAAKuP,WAAWlO,OAAO6T,EAAQ9T,WAG1B,sBAML,OALApB,KAAKgV,WAAWrG,QAChB3O,KAAK6U,aAAe,KACpB7U,KAAKu/E,sBAAsB56E,MAAQ,GACnC3E,KAAKw/E,6BAA6B76E,MAAQ,GAC1C3E,KAAK4V,QAAQW,UAAW,EACjB5W,MAAM4S,uB,cCtFF,MAAM,WAA2B,KAC9C,cACE5S,MAAM,wDAAyD,KAAM,CAACqkC,UAAU,EAAM27C,YAAa,QAEnG,YAAM3/E,KAAK0R,MAAO,mBAElB,YAAiB1R,KAAK4/E,WAAY,KAChC,MAAMx1E,EAAU,IAAgBy1E,cAAcx0C,EAAe1mC,MAAO2mC,EAAmB3mC,MAAOm7E,EAAcn7E,OAE5GyF,EAAQzG,KAAK,KACX3D,KAAKmkC,QACH7zB,IACc,YAAbA,EAAIjQ,OACLu5B,GAAS,CAACC,YAAa,sCACvBgQ,EAAStzB,UAAW,KAIxBszB,EAASk2C,gBAAgB31E,IACxB,CAACyH,eAAgB7R,KAAK6R,iBAEzB,MAAMykB,EAA4B,GAC5BtF,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,eAClB,MAAMwqC,EAAiB,IAAI,IAAW,CACpCtlC,MAAO,YACPvF,KAAM,sBACN6U,UAAW,GACXmhB,UAAU,IAEN8U,EAAqB,IAAI,IAAW,CACxCvlC,MAAO,WACPvF,KAAM,0BACN6U,UAAW,KAEPyqE,EAAgB,IAAI,KAAc,CAACtpD,UAAU,IACnDF,EAAY/sB,KAAK8hC,EAAgBC,EAAoBw0C,GAErD,MAAM34E,EAAU,KACd,MAAM3G,EAAO6qC,EAAe1mC,MAAQ,IAAM2mC,EAAmB3mC,MAE7DklC,EAASjT,WAAWopD,UAAYx/E,EAChCqpC,EAASjT,WAAW4P,UAGtBxmC,KAAK6R,eAAehR,IAAIwqC,EAAejrC,MAAvCJ,CAA8C,QAASmH,GACvDnH,KAAK6R,eAAehR,IAAIyqC,EAAmBlrC,MAA3CJ,CAAkD,QAASmH,GAE3D24E,EAAcG,SAAW,MACdH,EAAcn7E,MAAM4T,MAAM,MAGrC,MAAMgzB,EAAO,IAAgB00B,UACvBp5D,EAAY,OAAAgzD,GAAA,GAAkBtuB,EAAKY,OACtCtlC,EAAUI,OACX64E,EAAcn7E,MAAQ,IAAMkC,EAAUI,KAAKi5E,cAG7C,MAAMr2C,EAAW,IAAI,GAAS,CAC5BvT,cACAzkB,eAAgB7R,KAAK6R,eACrBilB,iBAAiB,EACjBlhB,QAAS5V,KAAK4/E,WACdxvE,WAAY,MAGd4gB,EAAI3vB,OAAOgqC,EAAejqC,UAAWkqC,EAAmBlqC,UAAWyoC,EAASjT,YAC5E52B,KAAKoB,UAAUC,OAAO2vB,EAAK8uD,EAAc1+E,WAEzCpB,KAAKo9B,QC9DM,MAAM,WAAuB,EAKhC,OACRp9B,KAAKoB,UAAU2R,GAAK,qBAIpB,MAAMmxD,EAAS,EAAa,CAAC/yD,KAAM,MAAOnD,UAAW,eACrDhO,KAAK2R,QAAQtQ,OAAO6iE,GAEpB,YAAiBA,EAAQ,KACvB,IAAI,IACH,CAACryD,eAAgB7R,KAAK6R,iBAEzB7R,KAAKmgF,YAAc,IAAI,EAAY,SAAWx7E,IAC5C3E,KAAKogF,aAAaz7E,KAGpB3E,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,kBAAoB+W,IACrD,MAAMq0B,EAAY,IAAgBA,UAAUr0B,GACtC9L,EAAS8L,EAAOwU,WACnB6f,EAAWprC,KAAKqgF,eAAex/E,IAAIoK,GACjCjL,KAAKqgF,eAAeluE,OAAOlH,KAGlCjL,KAAK0R,MAAM0b,YAAYptB,KAAKmgF,YAAY/+E,WAExCpB,KAAKwwB,WAAa,eAMV,aACR,MAAM6vD,EAAiB,IAAI,GACrBjyE,EAAOiyE,EAAejyE,KAM5B,OALAA,EAAK2E,GAAK,WACV3E,EAAKlO,UAAUW,IAAI,sBACnB,GAAkB0N,qBAAqBH,EAAM,KAC3CpO,KAAK49B,cACJv1B,GAAW,GACPg4E,EAGC,UACRrgF,KAAKwwB,WAAW3U,QAMR,sBACL,MAAc6kD,IAAS,IAC1B1gE,KAAKmgF,YAAY//E,MAAM6B,QAGlB,aAAamN,GACfpP,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGdhS,KAAKwwB,WAAW3U,QAChB,MAAM2U,EAAaxwB,KAAKwwB,WAAW7c,MACnC3T,KAAKuP,WAAWK,iBAAmB,KACnC5P,KAAKuP,WAAWnO,UAAUqvB,YAAc,GAExC,IAAgB0R,mBAAmB/yB,OAAO/G,EAAW,UAAU1E,KAAKk+B,IAClE,IAAIrR,IACF,OAGF,MAAM6vD,EAAiBrgF,KAAKqgF,eAAiBrgF,KAAKsgF,aAElD,IAAIC,EAAa,KACf,MAAMv/C,EAAYC,GAAA,EAAWx9B,OAAS,GAAK,KAAO,EACtCo+B,EAASz5B,OAAO,EAAG44B,GAE3Bz2B,QAASU,IACXo1E,EAAex/E,IAAIoK,KAGjB42B,EAASlgC,SACX4+E,OAAal4E,EACbrI,KAAKuP,WAAWK,iBAAmB,OAIvC2wE,IACAvgF,KAAKuP,WAAWK,iBAAmB,KAC9B2wE,EACDA,IAEAvgF,KAAKuP,WAAWK,iBAAmB,MAIvC,OAAAa,EAAA,GAAezQ,KAAKuP,WAAWnO,UAAWi/E,EAAejyE,QAItD,OAEL,OADApO,KAAKogF,eACEzgF,MAAM+U,QCxHF,MAAM,WAAuB,EAI1C,OAIE,GAHA1U,KAAKoB,UAAU2R,GAAK,2BACpB/S,KAAK+U,SAAS,kBAEV,GAAkByrE,YAAY,GAAe/F,UAAW,CAC1D,MAAMgG,EAAW,GAAkBpyE,iBACnC,GAAkBqyE,mBAAmBD,EAAU,GAAehG,UAAUr5E,UAAUC,OAAOo/E,GACzF,GAAkBlyE,qBAAqBkyE,EAAU,MAAM,GAIzD,MAAMlxE,EAAa,GAAkBoxE,YAAY,GAAelG,UAChEz6E,KAAKuP,WAAWnO,UAAUgsB,YAAY7d,EAAWnO,WACjDpB,KAAKuP,WAAaA,EAGpB,SACKvP,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGdhS,KAAK4gF,YAAc,GAAkBnG,SACrC,GAAkBoG,YAAY,GAAepG,UAC7C,GAAkBqG,cAIpB,qBACE,GAAkBN,YAAYxgF,KAAK4gF,aAAajyE,QAGlD,UACE,GAAkBkyE,YAAY7gF,KAAK4gF,aACnC,GAAkBE,cAGpB,sBAEE,OADA,GAAkBN,YAAY,GAAe/F,UAAU9rE,QAChDhP,MAAM4S,uBA1CA,GAAAkoE,SAAW,ECgBb,MAAM,WAA2B,EAAhD,c,oBAEU,KAAAsG,mBAA6B,EAY3B,OACR/gF,KAAKoB,UAAUlB,UAAUW,IAAI,2BAC7Bb,KAAK+U,SAAS,gBAEd/U,KAAKghF,cAAgBrgF,SAASC,cAAc,OAC5CZ,KAAKghF,cAAc9gF,UAAUW,IAAI,OAAQ,OAAQ,gBAEjDb,KAAKihF,SAAW,EAAa,CAAC9vE,KAAM,UAEpC,MACM0I,EAAM,KAAmByuC,wBADjB,MAERgY,EAAmB3/D,SAASC,cAAc,OAChD0/D,EAAiBpgE,UAAUW,IAAI,qBAE5BgZ,EACDkX,GAAY,CACVlX,MACAmX,IAAKsvC,EACLh9D,MAAM,EACNc,MAAM,EACNZ,MAAO,GACPC,OAAQ,GACR+iD,MAbU,KAcVC,aAAa,IACZ9iD,KAAK,QAIR28D,EAAiBpgE,UAAUW,IAAI,yBAGjC,MAAMw8B,EAAU18B,SAASC,cAAc,OACvCy8B,EAAQn9B,UAAUW,IAAI,WACtB,YAAMw8B,EAAS,qBAEfr9B,KAAKkhF,aAAe,IAAI5tE,IAExB,MAAMq+B,EAAI,KACR,MAAM0uC,EAAiB,IAAI,GAAe,CACxCjwE,WAAY,GACZk8C,sBAAuB,CACrB60B,WAAY,GACZvqE,KAAK,GAEP1I,YAAY,EACZ89C,SAAWjxC,IACT,MAAMurB,EAAOtmC,KAAKkhF,aAAavtE,IAAIoH,EAAQhI,IACrCsY,EAA0B,CAC9BrrB,KAAKohF,cAAc96C,EAAKiK,WAGtBx1B,EAAQhI,GAAGgvB,UACb1W,EAAS9hB,KAAK,UAAkB85B,qBAAqBtoB,EAAQhI,GAAGgoB,aAGlEhgB,EAAQ/D,IAAII,gBAAgBqZ,YAAc,GAC1C1V,EAAQ/D,IAAII,gBAAgB/V,UAAU,YAAKgqB,GAAU,KAEvD0gC,SAAWhxC,GAEF,WADM/a,KAAKkhF,aAAavtE,IAAIoH,EAAQhI,IAClBw9B,WAM7B,OAFA,GAAkBhiC,qBAAqB8xE,EAAejyE,UAAM/F,OAAWA,GAAW,GAE3Eg4E,GAGHgB,EAAgBrhF,KAAKqhF,cAAgB,IAAI,GAAuB,CACpE7gF,KAAM,qBACN8gF,WAAY3vC,MAGRj7B,EAAe1W,KAAK0W,aAAe,IAAI,GAAuB,CAClElW,KAAM,oBACN8gF,WAAY3vC,MAGR4vC,EAAiBF,EAAcG,WAAW,CAC9ClpD,KAAM,oBACNnnB,KAAM,aAGFswE,EAAmBJ,EAAcG,WAAW,CAChDlpD,KAAM,gBACNnnB,KAAM,aAGFuwE,EAAiBhrE,EAAa8qE,WAAW,CAC7ClpD,KAAM,oBACNnnB,KAAM,aAGR,YAAiBowE,EAAgB,KAC/BvE,GAAkB,CAChBnlD,aAAc,yBACdgE,mBAAoB,wBACpBnY,OAAQ,CACN8V,QAAS,QAEV71B,KAAK,KACN3D,KAAK2hF,mBAEN,CAAC9vE,eAAgB7R,KAAK6R,iBAEzB,YAAiB4vE,EAAkB,KACjCzhF,KAAK4hF,gBACJ,CAAC/vE,eAAgB7R,KAAK6R,iBAEzB,YAAiB6vE,EAAgB,KAC/B,IAAI,EAAe1hF,KAAKoR,QAAQsD,KAAK,IAAI,IACxC,CAAC7C,eAAgB7R,KAAK6R,iBAEzB0vE,EAAerhF,UAAUW,IAAI,WAC7B4gF,EAAiBvhF,UAAUW,IAAI,UAC/B6gF,EAAexhF,UAAUW,IAAI,WAE7Bb,KAAK2R,QAAQtQ,OAAOrB,KAAKihF,UACzBjhF,KAAKuP,WAAWlO,OACdi/D,EACAjjC,EACAgkD,EAAcjgF,UACdsV,EAAatV,UACbpB,KAAKghF,eAID,cAAczwC,GACpB,MAAuC,UAApC3jC,EAAA,EAAU+2B,SAASk+C,aACjBtxC,EAAW,QACL,YAAK,YAAa,CAAC1rC,KAAKE,MAAMwrC,EAAW,QAEzC,YAAK,YAAa,CAAC1rC,KAAKE,MAAiB,MAAXwrC,KAGpCA,GAAY,IACN,YAAK,eAAgB,CAACA,EAAW,MAEjC,YAAK,cAAe,CAACA,IAK3B,OACL,MAAMjmC,EAAS3K,MAAM+U,OA4CrB,OA3CApK,EAAO3G,KAAK,KACV3D,KAAKihF,SAAS/gF,UAAUoE,OAAO,cAC/BgT,UAAUC,YAAYC,mBAAoBC,IACxCzX,KAAK8hF,oBAAsB,CACzBlqE,SAAUH,EAASE,OAAOC,SAC1BE,UAAWL,EAASE,OAAOG,UAC3BiqE,SAAUtqE,EAASE,OAAOoqE,UAG5BxxE,QAAQ2R,IAAIliB,KAAK8hF,qBAEjB,IAAgBE,WACdvqE,EAASE,OAAOC,SAChBH,EAASE,OAAOG,UAChBL,EAASE,OAAOoqE,UAChBp+E,KAAMsU,IACN,MACMuiD,EADUviD,EAA6BgqE,QAAQ,GAChCznB,MACf0nB,EAAe1nB,EAAMnuD,KAAK,CAACC,EAAGC,IAAMD,EAAEikC,SAAWhkC,EAAEgkC,UACnD4xC,EAAgB3nB,EAAM5uD,OAAQ7L,GAAkB,eAAZA,EAAEumC,KAAKl7B,GAAoBzJ,OAC/DygF,EAAe5nB,EAAM5uD,OAAQ7L,GAAkB,eAAZA,EAAEumC,KAAKl7B,GAAoBzJ,OACpEugF,WAAc33E,QAAQ+7B,IACpB,MAAMr7B,EAAS,IAAgBo7B,UAAUC,EAAKA,MACxCpxB,EAAUjK,EAAO82B,SAAW/hC,KAAKqhF,cAAgBrhF,KAAK0W,aAC5D1W,KAAKkhF,aAAa1mE,IAAIvP,EAAQq7B,GAC9BpxB,EAAQosE,WAAWzgF,IAAIoK,KAGzBjL,KAAKghF,cAAc9gF,UAAUC,OAAO,UAAWiiF,IAAgBD,IAC/DniF,KAAKghF,cAAcxyE,UAAY,6CAE/BgC,IACFxQ,KAAKghF,cAAc9gF,UAAUoE,OAAO,QACpCtE,KAAKihF,SAAS/gF,UAAUW,IAAI,cAC5Bb,KAAKihF,SAAS3/E,iBAAiB,QAAStB,KAAK0U,MAC1ClE,aAAiB4H,yBAClBpY,KAAKghF,cAAcxyE,UAAY,oDAE/BxO,KAAKghF,cAAcxyE,UAAY,2EAK9BlE,EAGD,gBACFtK,KAAK8hF,sBAAuB9hF,KAAK+gF,oBACrC/gF,KAAK+gF,mBAAoB,EAEzBpnD,GAAM,qFAEN,IAAgBqoD,WACdhiF,KAAK8hF,oBAAoBlqE,SACzB5X,KAAK8hF,oBAAoBhqE,UACzB9X,KAAK8hF,oBAAoBC,UACzB,EACA,YAGFzqE,UAAUC,YAAY8qE,cAAe/3E,IACnC,MAAMg4E,EAAuBh4E,EAAOqN,OAAOG,YAAc9X,KAAK8hF,oBAAoBhqE,UAC5EyqE,EAAsBj4E,EAAOqN,OAAOC,WAAa5X,KAAK8hF,oBAAoBlqE,SAC1E4qE,EAAgBxiF,KAAKyiF,kBACzBn4E,EAAOqN,OAAOC,SAAUtN,EAAOqN,OAAOG,UACtC9X,KAAK8hF,oBAAoBlqE,SAAU5X,KAAK8hF,oBAAoBhqE,WAC1D,KAEAyqE,GAAuBD,IAAyBE,IAClD,IAAgBR,WACd13E,EAAOqN,OAAOC,SACdtN,EAAOqN,OAAOG,UACdxN,EAAOqN,OAAOoqE,UACd,EACA,YAEF/hF,KAAK8hF,oBAAsB,CACzBlqE,SAAUtN,EAAOqN,OAAOC,SACxBE,UAAWxN,EAAOqN,OAAOG,UACzBiqE,SAAUz3E,EAAOqN,OAAOoqE,cAMxB,eACF/hF,KAAK+gF,oBACT/gF,KAAK+gF,mBAAoB,EACzBpnD,GAAM,gGACN,IAAgBqoD,WACd,EACA,EACA,GACA,EACA,IAII,kBAAkBU,EAAcC,EAAeC,EAAcC,GACnE,MAAM9mD,EAAI,oBACV,OACE,MAAQl3B,KAAKi+E,KACXj+E,KAAKslE,KACF,GAAMtlE,KAAK2lE,KAAKoY,EAAOF,GAAQ3mD,GAE9Bl3B,KAAK2lE,IAAIkY,EAAO3mD,GAAKl3B,KAAK2lE,IAAIoY,EAAO7mD,IAClC,EAAIl3B,KAAK2lE,KAAKqY,EAAQF,GAAS5mD,GAAG,M,oBCpSlC,SAASgnD,GAAavjE,EAAeuC,EAAW,GAC7D,GAAa,IAAVvC,EAAa,MAAO,IAEvB,MACMwC,EAAKD,EAAW,EAAI,EAAIA,EAGxBngB,EAAIiD,KAAKod,MAAMpd,KAAKqd,IAAI1C,GAAS3a,KAAKqd,IAJlC,MAMV,OAAOC,YAAY3C,EAAQ3a,KAAKud,IANtB,IAM6BxgB,IAAIygB,QAAQL,IAJrC,CAAC,GAAI,IAAK,IAAK,IAAK,KAI8BpgB,GC4qB3D,MAAM,GASX,YAAYlC,EAAiC,IAC3C,MAAM0B,EAAYpB,KAAKoB,UAAYT,SAASC,cAAc,OAC1DQ,EAAUlB,UAAUW,IAAI,kCAExB,MAAMi/B,EAAiB9/B,KAAK8/B,eAAiBn/B,SAASC,cAAc,OAOpE,GANAk/B,EAAe5/B,UAAUW,IAfX,wBAiBXnB,EAAQ2gC,UACTP,EAAe5/B,UAAUW,IAAI,aAG5BnB,EAAQsjF,sBACTljD,EAAez+B,OAAOo/B,MACtBX,EAAe5/B,UAAUW,IAAI,4BACxB,GAAInB,EAAQ49B,YAIjBwC,EAAe5/B,UAAUW,IAAI,oBAJC,CAC9B,MAAMu3C,EAAKz3C,SAASC,cAAc,MAClCk/B,EAAez+B,OAAO+2C,GAaxB,MAAMzmC,EAAU3R,KAAK2R,QAAU3R,KAAKgmC,yBAEpC,GAAGtmC,EAAQc,KAAM,CACf,MAAMkR,EAAQ1R,KAAK0R,MAAQ/Q,SAASC,cAAc,OAClD8Q,EAAMxR,UAAUW,IAAI,kBAAmB,6BACvC,YAAM,CAACka,QAASrJ,EAAOtK,IAAK1H,EAAQc,KAAMuR,KAAMrS,EAAQiX,WACxDhF,EAAQtQ,OAAOqQ,GAKjB,GAFAtQ,EAAUC,OAAOy+B,GAEdpgC,EAAQ29B,QAAS,CAClB,MAAMA,EAAUr9B,KAAKq9B,QAAUr9B,KAAKgmC,yBACpC3I,EAAQn9B,UAAUW,IAAI,gCACtBO,EAAUC,OAAOg8B,IAEM,IAApB39B,EAAQ29B,SACT,YAAM,CAACtiB,QAASsiB,EAASj2B,IAAK1H,EAAQ29B,WAKrC,yBACL,MAAM1rB,EAAUhR,SAASC,cAAc,OAQvC,OAPA+Q,EAAQzR,UAAUW,IAAI,gCAMtBb,KAAK8/B,eAAez+B,OAAOsQ,GACpBA,GAIJ,MAAMutD,GAAkB,CAACx+B,EAAsBlgC,EAAoB68B,KACxE,MAAMnoB,EAAU,IAAI,GAAe,CAAC1U,OAAM68B,YAE1C,OADAqD,EAASr/B,OAAO6T,EAAQ9T,WACjB8T,EAAQvD,SAGJ8uB,GAAoB,KAC/B,MAAMwiD,EAAYtiF,SAASC,cAAc,OAEzC,OADAqiF,EAAU/iF,UAAUW,IAAI,sBACjBoiF,GAGF,MAAM,WAA+B,GAG1C,YAAYvjF,GACVC,MAAMD,GAENM,KAAKshF,WAAa5hF,EAAQ4hF,WAE1BthF,KAAK2R,QAAQtQ,OAAOrB,KAAKshF,WAAWlzE,MAG/B,WAAW1O,GAChB,MAAMgkB,EAAS,YAAO,yDAA0DhkB,GAGhF,OAFGM,KAAK0R,MAAO1R,KAAK2R,QAAQ1Q,aAAayiB,EAAQ1jB,KAAK0R,MAAMvQ,aACvDnB,KAAK2R,QAAQ3Q,QAAQ0iB,GACnBA,GAIX,MAAMw/D,GAAiB,IAvuBhB,cAA6B,EAkBlC,cACEvjF,MAAM,CACJ6T,UAAW7S,SAASg2C,eAAe,eACnC9jC,eAAgB,SATZ,KAAAhE,aAAuG,GAc7G7O,KAAKmgF,YAAc,IAAI,EAAY,UACnC,MAAMgD,EAAgBnjF,KAAKwT,UAAUC,cAAc,8BACnD0vE,EAAc9hF,OAAOrB,KAAKmgF,YAAY/+E,WAEtC,MAYMgiF,EAAkB,KACtB,IAAI,GAAepjF,MAAM0U,QAI3B1U,KAAKqjF,QAAUrjF,KAAKwT,UAAUC,cAAc,wBAE5C,MAAM6vE,EAA+D,CACnEnyE,KAAM,UACNmnB,KAAM,gBACNopB,QAAS,KACP,IAAI,GAAe1hD,MAAM0U,QAE3BoG,OAAQ,MACS,IAAmBw8D,eAAeC,iBAAiB,GAAG,GACrD51E,SAAW,IAAmB21E,eAAeiM,gBAAgB,IAI3EC,EAAqB,IAAI,KAAc,CAC3CrjF,QAAQ,EACRg3B,QAAuC,UAA9BvqB,EAAA,EAAUuiE,WAAW3uE,OAEhCgjF,EAAmBpjF,MAAMkB,iBAAiB,SAAU,KAClDsL,EAAA,EAAU+2B,SAASirC,MAAQ4U,EAAmBpjF,MAAM+2B,QAAU,QAAU,MACxE+B,EAAA,EAAgB61C,YAAY,WAAYniE,EAAA,EAAU+2B,UAClD/2B,EAAA,EAAU0F,cAAc,kBAG1B1F,EAAA,EAAUtL,iBAAiB,eAAgB,KACzCkiF,EAAmB59E,iBAA+C,UAA9BgH,EAAA,EAAUuiE,WAAW3uE,QAG3D,MAuFMijF,EAvFoE,CAAC,CACzEtyE,KAAM,QACNmnB,KAAM,gBACNopB,QAAS,KACP5xC,WAAW,KACT,GAAaqjC,QAAQ,CACnBloC,OAAQ,GAAa0T,QAEtB,KAEJ2kE,EAAY,CACbnyE,KAAM,OACNmnB,KAAM,WACNopB,QAAS0hC,GACR,GAA2B,CAC5BjyE,KAAM,QACNmnB,KAAM,eACNopB,QAAS,KACP,IAAI,GAAmB1hD,MAAM0U,cAE7BrM,EAAW,CACb8I,KAAM,WACNmnB,KAAM,WACNopB,QAAS,KACP,IAAI,GAAe1hD,MAAM0U,SAE1B,CACDvD,KAAM,WACNmnB,KAAM,WACNopB,QAAS,OAGTpqB,cAAeksD,GACd,CACDryE,KAAM,aACNmnB,KAAM,aACNopB,QAAS,OAGTpqB,cAAe,IAAI,KAAc,CAC/Bn3B,QAAQ,EACRg3B,SAAS,EACT8B,SAAU,gCAEX,CACD9nB,KAAM,OACNmnB,KAAM,mBACNopB,QAAS,KACP,MAAMpnC,EAAM,IAAKzD,OAAO,uBAAuB,GAC/C,GAAa6sE,QAAQppE,KAEtB,CACDnJ,KAAM,MACNmnB,KAAM,YACNopB,QAAS,KACP,MAAMp1C,EAAI3L,SAASC,cAAc,KACjC0L,EAAEoO,OAAS,SACXpO,EAAEosD,KAAO,kDACT/3D,SAASgC,KAAKtB,OAAOiL,GACrBA,EAAE6zB,QACFrwB,WAAW,KACTxD,EAAEhI,UACD,KAEJ,CACD6M,KAAM,SACNmnB,KAAM,2BACNopB,QAAS,KACPr8C,QAAQC,IAAI,CACVq+E,GAAA,EAAenpE,IAAI,CAACopE,WAAY,MAChCD,GAAA,EAAexxE,OAAO,eACrBxO,KAAK,KACN8T,SAASihD,KAAO,iCAGpB59C,OAAQ,IAAM,KAAI+oE,cACjB,CACD1yE,KAAM,SACNmnB,KAAM,kCACNopB,QAAS,KACPiiC,GAAA,EAAexxE,OAAO,aAAaxO,KAAK,KACtC8T,SAASihD,KAAO,wCAGpB59C,OAAQ,IAAM,KAAI+oE,eAGgBj4E,OAAOc,SAE3C1M,KAAK8jF,SAAW,GAAiB,GAAI,eAAgBL,EAAkB1jF,IACrE0jF,EAAgBl5E,QAAQmZ,IACnBA,EAAO5I,QACR4I,EAAO3I,QAAQ7a,UAAUC,OAAO,QAASujB,EAAO5I,cAItD9a,KAAK8jF,SAAS5jF,UAAUoE,OAAO,cAC/BtE,KAAK8jF,SAAS5jF,UAAUW,IAAI,uBAAwB,cAEpDb,KAAKqjF,QAAQtiF,cAAcE,aAAajB,KAAK8jF,SAAU9jF,KAAKqjF,SAE5D,MAAMpmB,EAAUj9D,KAAK8jF,SAASrwE,cAAc,aAEtCswE,EAAgBpjF,SAASC,cAAc,KAC7CmjF,EAAcrrB,KAAO,iEACrBqrB,EAAcrpE,OAAS,SACvBqpE,EAAcC,IAAM,sBACpBD,EAAc7jF,UAAUW,IAAI,mBAC5BkjF,EAAcziF,iBAAiB,IAAmBvB,IAChDA,EAAEkkF,kBACF,iBAEF,MAAM3vE,EAAI3T,SAASC,cAAc,QACjC0T,EAAEpU,UAAUW,IAAI,wBAChByT,EAAE9F,UAAY,eAAiB,KAAI01E,OAAS,IAAqB,KAAIC,YACrEJ,EAAc1iF,OAAOiT,GACrB2oD,EAAQ/8D,UAAUW,IAAI,cACtBo8D,EAAQ57D,OAAO0iF,GAEf/jF,KAAKokF,WAAa,GAAiB,GAAI,WAAY,CAAC,CAClDjzE,KAAM,aACNmnB,KAAM,aACNopB,QAAS,KACP,IAAI,GAAiB1hD,MAAM0U,SAE5B,CACDvD,KAAM,WACNmnB,KAAM,WACNopB,QA7KsB,KACtB,IAAI,GAAiB1hD,MAAM0U,KAAK,CAC9BrU,KAAM,OACNosC,WAAW,EACXlI,QAAUluB,IACR,IAAI,EAAerW,MAAM0U,KAAK2B,IAEhC3E,MAAO,kBACPf,YAAa,oBAsKd,CACDQ,KAAM,aACNmnB,KAAM,iBACNopB,QAAS0hC,KAEXpjF,KAAKokF,WAAWp2E,UAAY,0EAC5BhO,KAAKokF,WAAWj7D,mBAAmB,aAAc,6GAIjDnpB,KAAKokF,WAAWrxE,GAAK,WACrBowE,EAAc7mD,mBAAmBj7B,OAAOrB,KAAKokF,YAE7CpkF,KAAKqkF,UAAY1jF,SAASC,cAAc,OAExCZ,KAAKqkF,UAAUr2E,UAAY,0DAC3B,OAAAkqB,GAAA,GAAOl4B,KAAKqkF,WACZrkF,KAAKqkF,UAAUhjF,OAAO,YAAK,WAK3B,YAAiBrB,KAAKqkF,UAAW,KAC/B5sE,SAAS6sE,WAGXnB,EAAc7mD,mBAAmBj7B,OAAOrB,KAAKqkF,WAS7CrkF,KAAKmgF,YAAY//E,MAAMkB,iBAAiB,QAAS,IAAMtB,KAAKukF,aAAc,CAAC1lE,MAAM,IAIjF7e,KAAKwkF,cAAgB7jF,SAASC,cAAc,QAC5CZ,KAAKwkF,cAAcx2E,UAAY,2CAE/Bs1E,EAAWvoE,QAAQ1Z,OAAOrB,KAAKwkF,eAE/B53E,EAAA,EAAUtL,iBAAiB,gBAAkBg5E,IAC3C,GAAiB,IAAdA,EAAOvnE,GAAU,CAElB,MAAMzK,EAAQgyE,EAAOmK,mBACrBzkF,KAAKwkF,cAAc52D,UAAY,GAAKm1D,GAAaz6E,EAAO,GACxDtI,KAAKwkF,cAActkF,UAAUC,OAAO,QAASmI,MAIjD,IAAgBiyD,YAAY,kBAG5B,MAAMmqB,EAAiC,CACrCrkF,KAAM,sBACN0T,MAAO,KACLjE,WAAW,KACT9P,KAAKmgF,YAAY//E,MAAM6B,SACtB,IAEI,GAET0iF,WAAW,GAEbhyE,EAAA,EAAwBmB,SAAS4wE,GAEjCxrD,EAAA,EAAgBC,WAAWx1B,KAAKy1B,IAC9B,MAAMkhC,EAAelhC,EAAMkhC,cAAgB,GAC3C,IAAI,IAAI14D,EAAI,EAAGD,EAAS24D,EAAa34D,OAAQC,EAAID,IAAUC,EACzDs3B,EAAA,EAAgB0rD,YAAYtqB,EAAa14D,GAAI,gBAG/C,MACMijF,EAAsB9xC,YAAY,KACtC/6B,MAAM,UAAW,CAAC8sE,MAAO,aACxBnhF,KAAKoM,GAAuB,MAAfA,EAAIq8C,QAAkBr8C,EAAIg1E,IAAMh1E,EAAIuoB,QAAWjzB,QAAQgqB,UACpE1rB,KAAK20B,IACDA,IAAS,KAAI6rD,cACdnkF,KAAKglF,WAAY,EACjB/nC,cAAc4nC,GAEV7kF,KAAKokF,WAAWlkF,UAAUuV,SAAS,cACrCzV,KAAKqkF,UAAUnkF,UAAUoE,OAAO,gBAIrCoM,MAAMuZ,GAAA,IAdqB,QAmB1B,aACN,MAAMg7D,EAAkBjlF,KAAKwT,UAAUC,cAAc,qBAE/ClE,EAAa,IAAI,IAAW01E,GAE5BrnD,EAAQ,KAEV59B,KAAKqjF,QAAQljD,SAIjBngC,KAAK6O,aAAe,CAClBgzB,SAAU,IAAI,EAAY,sBAAuB,gBAAYx5B,OAAWA,OAAWA,OAAWA,EAAWu1B,GACzGm8B,eAAgB,IAAI,EAAY,eAAgB,gBAAY1xD,OAAWA,OAAWA,OAAWA,EAAWu1B,GACxGpuB,SAAU,IAAI,EAAY,iBAAkB,YAC5CirD,OAAQ,IAAI,GAAY,EAAO,YAAY,EAAM,uBAAuB,GAAM,EAAO78B,GACrFy8B,OAAQ,IAAI,EAAY,SAAU,YAAY,EAAM,uBAAuB,GAAM,EAAMz8B,IAGzF,MAAM6W,EAAcz0C,KAAKy0C,YAAc,IAAI,GAAe,CACxDW,UAAW,CAAC,CACVjqC,YAAa,2BACb3K,KAAM,cACNH,KAAM,SACL,CACD8K,YAAa,gCACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,yBACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,8BACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,2BACb3K,KAAM,kBACNH,KAAM,SACL,CACD8K,YAAa,gCACb3K,KAAM,kBACNH,KAAM,UAERkP,aACAV,aAAc7O,KAAK6O,aACnB0mD,YAAY,EACZE,eAAe,EACf9pC,YAAY,IAGds5D,EAAgBjkF,QAAQyzC,EAAYC,IAAI3zC,cAAcA,eACtDwO,EAAWnO,UAAUC,OAAOozC,EAAYrzC,WAGtCqzC,EAAY6B,SAAS,CACnBrrC,OAAQ,GAAGsgB,WACXvf,SAAU,IAEZyoC,EAAYxiC,UAAU,GACtBwiC,EAAYhrC,MAAK,GAKnB,IAAIy7E,EAAgC,GAChCC,EAAyB,GAAG55D,WAC5B65D,EAAkB,EAClBC,EAAkB,EACtB,MAAMC,EAAe,KAEnBtlF,KAAKmgF,YAAY/+E,UAAUlB,UAAUC,OAAO,kBAA6C,IAA1B+kF,EAAevjF,QAC9E3B,KAAKmgF,YAAY/+E,UAAUlB,UAAUC,OAAO,cAAe+kF,EAAevjF,QAEvEujF,EAAevjF,OAChB3B,KAAKmgF,YAAY//E,MAAM+E,MAAMqB,YAAY,gBAAkB0+E,EAAeA,EAAevjF,OAAS,GAAG+iB,wBAAwB4rB,MAAQtwC,KAAKmgF,YAAY//E,MAAMskB,wBAAwBiB,KAAQ,MAE5L3lB,KAAKmgF,YAAY//E,MAAM+E,MAAMogF,eAAe,kBAI1CC,EAAS7kF,SAASC,cAAc,OACtC4kF,EAAOtlF,UAAUW,IAAI,iBACrB2kF,EAAOlkF,iBAAiB,QAAUvB,IAChC,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,iBACzC,IAAIA,EACF,OAGF,MAAMtT,EAAMsT,EAAOxT,QAAQE,IAC3B,GAA4B,IAAzBA,EAAI+d,QAAQ,SAAgB,CAC7B,MAAO/Z,EAAG+uD,EAASyC,GAAWx1D,EAAIi8C,MAAM,KACxC+hC,GAAmBjrB,EACnBkrB,GAAmBzoB,OAEnBuoB,EAAiB/9E,EAAImkB,WAGvB7Q,EAAOpZ,iBAAiB,QAAS,KAC/BmkF,EAAe/qE,KAGjB1a,KAAKmgF,YAAY/+E,UAAUC,OAAOqZ,GAClC1a,KAAKmgF,YAAYzwE,SAAS1P,KAAKmgF,YAAYx7E,MAAQ,IACnDugF,EAAe37E,KAAKmR,GACpB4qE,MAGF7wC,EAAYC,IAAI3zC,cAAcM,OAAOmkF,GAErC,MAAME,EAAe,CAACt+E,EAAsBsK,KAC1C,MAAMsf,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,iBAElB,MAAM06B,EAAW,IAAI,GA0BrB,OAzBAA,EAASr7B,UAAUW,IAAI,uBAAwB,QAAS,aACxD06B,EAASC,UAAW,EAEpBxK,EAAI9pB,QAAQE,IAAM,GAAKA,EACpBA,EAAIs4B,iBACQr3B,IAAVqJ,IACDA,EAAQ,IAAI,KAAU,CAACzG,OAAQ7D,EAAImkB,aAAaxQ,SAGlDwgB,EAAS1E,kBAAkB,CAAC5rB,OAAQ7D,KAEpCm0B,EAASr7B,UAAUW,IAAI,wBAGtB6Q,IACoB,iBAAZ,EACPsf,EAAIxiB,UAAYkD,GAEhB,OAAAjB,EAAA,GAAeugB,EAAKtf,GACpBsf,EAAI3vB,OAAOqQ,KAIfsf,EAAIuS,sBAAsB,aAAchI,GAEjCvK,GAGHy0D,EAAkB/qE,IAEM,IADhBA,EAAOxT,QAAQE,IACpB+d,QAAQ,SACbigE,EAAkBC,EAAkB,EAEpCF,EAAiB,GAAG55D,WAGtB7Q,EAAOpW,SACP,OAAA2P,EAAA,GAAiBixE,EAAgBxqE,GAEjC5K,WAAW,KACTw1E,IACAtlF,KAAKmgF,YAAYzwE,SAAS1P,KAAKmgF,YAAYx7E,QAC1C,IAGL3E,KAAKmgF,YAAYnvE,QAAU,KACzBk0E,EAAe36E,QAAQzI,IACrB2jF,EAAe3jF,MAInB9B,KAAKmgF,YAAYzwE,SAAY/K,IAgB3B,GAfA8vC,EAAYlB,cACZkB,EAAY6B,SAAS,CACnBrrC,OAAQk6E,EACRn5E,SAAUm5E,OAAiB98E,EAAY,EACvC+G,MAAOzK,EACPw1D,QAASirB,EACTxoB,QAASyoB,IAEX5wC,EAAYhrC,MAAK,GAEjB+7E,EAAOh3E,UAAY,GACnBimC,EAAYC,IAAIx0C,UAAUoE,OAAO,SAI7B6gF,GAAkBxgF,EAAMkL,OAAQ,CAClC,MAAM2gB,EAAaikB,EAAYjkB,WAAW7c,MAC1CtO,QAAQC,IAAI,CAEV,IAAmB87B,iBAAiBz8B,GAAOyF,QAAQzG,KAAK,EAAEm9B,aAAaA,EAAQr0B,IAAI80B,GAAKA,EAAEt2B,SAC1F,IAAgBk3B,mBAAmBx9B,GAAO,KACzChB,KAAK6+B,IACN,IAAIhS,IAAc,OACF,IAAI7oB,IAAI66B,EAAQ,GAAG96B,OAAO86B,EAAQ,KAE1Cj4B,QAAQU,IACdu6E,EAAOnkF,OAAOqkF,EAAaz6E,MAG7BwpC,EAAYC,IAAIx0C,UAAUC,OAAO,SAAUqlF,EAAOh3E,aAKtD,IAAI42E,GAAmBzgF,EAAMkL,OAAQ,CACnC,MAAM81E,EAAoB,GAC1B,aAAahhF,EAAOghF,GACpBA,EAAMp7E,QAAQq7E,IACZJ,EAAOnkF,OAAOqkF,EAAa,QAAUE,EAASzrB,QAAU,IAAMyrB,EAAShpB,QAASgpB,EAASl0E,UAG3F+iC,EAAYC,IAAIx0C,UAAUC,OAAO,SAAUqlF,EAAOh3E,aAItDimC,EAAYviC,KAAKmnD,yBAAyB/3D,iBAAiB,YAAcvB,IACvE,MAAM2a,EAAS,OAAAurB,GAAA,GAAUlmC,EAAE2a,OAAQ,MACnC,IAAIA,EACF,OAGF,MAAM1K,EAAc,OAAA8a,GAAA,GAAgBpQ,EAAQ,gBAC5C,IAAI1K,GAAeA,EAAY9P,UAAUuV,SAAS,wBAA0BzF,EAAY9P,UAAUuV,SAAS,uBACzG,OAGF,MAAMxK,EAASyP,EAAO0wD,aAAa,gBAAgB7/C,WACnD2N,EAAA,EAAgBC,WAAWx1B,KAAKy1B,IAC9B,MAAMkhC,EAAelhC,EAAMkhC,cAAgB,GAC3C,GAAGA,EAAa,KAAOrvD,EAAQ,CAC7B,OAAAgJ,EAAA,GAAiBqmD,EAAcrvD,GAC/BqvD,EAAahxD,QAAQ2B,GAClBqvD,EAAa34D,OAAS,KACvB24D,EAAa34D,OAAS,IAGxBu3B,EAAA,EAAgB61C,YAAY,eAAgBzU,GAC5C,IAAI,MAAMrvD,KAAUqvD,EAClBphC,EAAA,EAAgB0rD,YAAY35E,EAAQ,oBAIzC,CAACwkB,SAAS,IAEb,IAAIo2D,EAAkBllF,SAASC,cAAc,OAC7CilF,EAAgB3lF,UAAUW,IAAI,2BAC9BglF,EAAgBxkF,OAAOrB,KAAK6O,aAAa4rD,OAAOrsD,MAChDpO,KAAK6O,aAAa4rD,OAAOr5D,UAAUC,OAAOwkF,GACnB,IAAI,IAAYA,GAAvC,IAGIC,EADAnxD,GAAQ,EAGZ,MAAMkgB,EAAa,YAAiBowC,EAAgBlkF,cAAe,YAAa,IAAMgS,IACjF+yE,GAAuBh1E,aAAag1E,GAE7B,IAAP/yE,GAAa4hB,IACd8f,EAAYxiC,UAAU,GAAG,GACzBjS,KAAKmgF,YAAYpvE,eACjB+0E,EAAwB5jF,OAAO4N,WAAW,KACxCg2E,EAAwB,EACxB9lF,KAAKokF,WAAWlkF,UAAUoE,OAAO,aACjCtE,KAAKglF,WAAahlF,KAAKqkF,UAAUnkF,UAAUoE,OAAO,cACjD,MAGLqwB,GAAQ,IAGVkgB,EAAW,GAEX,MACMkxC,EAAU,KACd/lF,KAAK8jF,SAAS5jF,UAAUoE,OAFF,cAGtBtE,KAAKqjF,QAAQnjF,UAAUW,IAHD,cAItBb,KAAKokF,WAAWlkF,UAAUW,IAAI,aAC9Bb,KAAKqkF,UAAUnkF,UAAUW,IAAI,aAC7Bb,KAAK8jF,SAAS/iF,cAAckrB,kBAAkB/rB,UAAUC,OAAO,cAAc,GAGzE,MAAqBwS,EAAA,EAAwBC,eADF,kBAE7CD,EAAA,EAAwBmB,SAAS,CAC/BC,MAAO,KACL6pB,KAEFv9B,KAN2C,kBAU/Cw0C,EAAW,IAGb70C,KAAKmgF,YAAY//E,MAAMkB,iBAAiB,QAASykF,GACjDA,IAEA/lF,KAAKqjF,QAAQ/hF,iBAAiB,QAAUvB,IACtCC,KAAK8jF,SAAS5jF,UAAUW,IAzBF,cA0BtBb,KAAKqjF,QAAQnjF,UAAUoE,OA1BD,cA2BtBtE,KAAK8jF,SAAS/iF,cAAckrB,kBAAkB/rB,UAAUC,OAAO,cAAc,GAE7EwS,EAAA,EAAwB6B,aAAa,iBAErCqgC,EAAW,KAGb,MAAMmxC,EAAuB,EAAW,SACxChmF,KAAK6O,aAAawrD,OAAO/rD,OAAOjN,OAAO2kF,GACvCA,EAAqB1kF,iBAAiB,QAAS,KAC7C07E,GAAkB,CAChBnhD,mBAAoB,8BACpBnY,OAAQ,CACN8V,QAAS,cACTwO,UAAU,KAEXrkC,KAAK,KACNu1B,EAAA,EAAgBC,WAAWx1B,KAAKy1B,IAC9Bp5B,KAAK6O,aAAawrD,OAAO1rD,QAEzB,MAAM2rD,EAAelhC,EAAMkhC,cAAgB,GAC3C,IAAI,MAAMrvD,KAAUqvD,EAClBphC,EAAA,EAAgB+sD,kBAAkBh7E,EAAQ,gBAG5CqvD,EAAa34D,OAAS,EACtBu3B,EAAA,EAAgB61C,YAAY,eAAgBzU,WA4HtD,KAAe4oB,eAAiBA,GACjB,UChxBA,MAAM,GAOnB,YAAoBtyD,GAAA,KAAAA,OANZ,KAAAC,QAA8B,GAC9B,KAAAq1D,WAA4C,IAAI5yE,IAChD,KAAAwkE,OAAuB,GAEvB,KAAAqO,aAAe,IAMvB,aAAa59B,GACX,MAAMnvC,EAAUpZ,KAAKkmF,WAAWvyE,IAAI40C,GACjCnvC,IACEA,EAAQ6X,MAAMtvB,SACf,OAAA2/B,GAAA,GAAcloB,EAAQ6X,MAAOsQ,GAAKA,EAAEgnB,SAAWA,GAC3CnvC,EAAQ6X,MAAMtvB,OAGhB3B,KAAKomF,YAAYhtE,EAAQ6X,OAFzB,OAAAhd,EAAA,GAAiBjU,KAAK83E,OAAQ1+D,EAAQ6X,QAM1CjxB,KAAKkmF,WAAW/zE,OAAOo2C,IAI3B,gBAAgBA,EAAqB19C,GACnC,MAAMuO,EAAUpZ,KAAKkmF,WAAWvyE,IAAI40C,GACjCnvC,IACDA,EAAQvO,IAAMA,GAIlB,UAAU09C,EAAqBxgD,EAAoBU,GAGjD,MAAMmzD,EAAY7zD,EAAQykB,KACpB3hB,EAAM9C,EAAQ8C,IACpB,IACIomB,EADAhhB,EAASlI,EAAQs+E,UAAYt+E,EAAQkI,OAItCA,IAAWrD,EAAA,EAAU+R,MAAQ5W,EAAQkD,SAAW2B,EAAA,EAAU+R,MAAS5W,EAAgBu+E,YAAcr2E,IAClGA,EAASA,EAAOsb,UAAS,IAI3BvrB,KAAKumF,aAAah+B,GAElB,MAAMi+B,EAAe,CAACj+B,SAAQ19C,MAAK+wD,aACnC,GAAG57D,KAAK6wB,QAAQlvB,OAAQ,CACtB,IAAI8kF,EACAC,GAAgB,EACpB,IAAI,IAAI9kF,EAAI,EAAGA,EAAI5B,KAAK6wB,QAAQlvB,SAAUC,EAAG,CAC3C,MAAM2mD,EAASvoD,KAAK6wB,QAAQjvB,GACtB6zB,EAAO5wB,KAAK+B,IAAI2hD,EAAOqT,UAAYA,GAGzC,GAFarT,EAAOt4C,SAAWA,GAAUwlB,GAAQz1B,KAAKmmF,cAKpD,GAFAO,EAAe9kF,EAEO,cAAnB5B,KAAK4wB,KAAKvwB,KACX,WAGFqmF,GAAgB,EAGlB,GAAsB,cAAnB1mF,KAAK4wB,KAAKvwB,MACRwK,EAAM09C,EAAO19C,IACd,MAaN,IARqB,IAAlB67E,IACDD,EAAczmF,KAAK6wB,QAAQ61D,IAOzBD,EACC,CACHx1D,EAAQw1D,EAAYx1D,MAEpB,IAAIrvB,EAAI,EAAG+kF,EAA0B,EACrC,KAAM/kF,EAAIqvB,EAAMtvB,SAAUC,EAAG,CAC3B,MAAMglF,EAAa31D,EAAMrvB,GAAGg6D,UACtBirB,EAAO51D,EAAMrvB,GAAGiJ,IAEtB,GAAG+wD,EAAYgrB,EACb,MAKF,GAJUhrB,IAAcgrB,IACtBD,EAA0BE,GAGzBF,GAA2B97E,EAAM87E,EAClC,MAIJ11D,EAAM7oB,OAAOxG,EAAG,EAAG4kF,QApBJxmF,KAAK83E,OAAOvuE,KAAK0nB,EAAQ,CAACu1D,SAuB3CxmF,KAAK83E,OAAOvuE,KAAK0nB,EAAQ,CAACu1D,IAK5B,MAAMM,EAAc,CAAClrB,YAAW3rD,SAAQpF,IAAK9C,EAAQ8C,IAAKomB,SAC1D,IAAI81D,EAAc,EAClB,KAAMA,EAAc/mF,KAAK6wB,QAAQlvB,UAC5B3B,KAAK6wB,QAAQk2D,GAAal8E,IAAMA,KADMk8E,GAM3C/mF,KAAK6wB,QAAQzoB,OAAO2+E,EAAa,EAAG,CAACnrB,YAAW3rD,SAAQpF,IAAK9C,EAAQ8C,IAAKomB,UAC1EjxB,KAAKomF,YAAYn1D,GAEjBjxB,KAAKkmF,WAAW1rE,IAAI+tC,EAAQu+B,GAqD9B,YAAY71D,GASR,IAAIA,EAAMtvB,OACR,OAGF,MAAMgzB,EAAQ1D,EAAM,GAAGs3B,OAIvB,GAAoB,IAAjBt3B,EAAMtvB,OAGP,YAFAgzB,EAAMz0B,UAAUW,IAAI,iBAAkB,iBAItC8zB,EAAMz0B,UAAUoE,OAAO,iBACvBqwB,EAAMz0B,UAAUW,IAAI,kBAItB,MAAMc,EAASsvB,EAAMtvB,OAAS,EAC9B,IAAI,IAAIC,EAAI,EAAGA,EAAID,IAAUC,EAAG,CACfqvB,EAAMrvB,GAAG2mD,OACjBroD,UAAUoE,OAAO,gBAAiB,kBAI3C,MAAMwqD,EAAO79B,EAAMA,EAAMtvB,OAAS,GAAG4mD,OACrCuG,EAAK5uD,UAAUoE,OAAO,kBACtBwqD,EAAK5uD,UAAUW,IAAI,iBAKvB,uBAAuBgK,GACrB,MAAMuO,EAAUpZ,KAAK6wB,QAAQxc,KAAKsyD,GAAKA,EAAE97D,MAAQA,GAC9CuO,GACDpZ,KAAKomF,YAAYhtE,EAAQ6X,OAI7B,UACEjxB,KAAK6wB,QAAU,GACf7wB,KAAK83E,OAAS,GACd93E,KAAKkmF,WAAWv3E,SCtOL,MAAM,WAAwB,KAqB3C,YAAYq4E,EAAuBC,EAA+CvnF,EAO9D,IA4ClB,GA3CAC,MAAM,oBAAqBD,EAAQwnF,UAAY,GAAK,CAAC,CACnD1tD,QAAS,aACT4C,SAAU,KACLp8B,KAAKinF,QACNjnF,KAAKinF,OAAOjnF,KAAKmnF,aAAanrB,UAAY,IAAO,KAGpD,CACDxiC,QAAS,SACT0oC,UAAU,IACR,OAAF,QAAGv/D,MAAM,EAAM24B,iBAAiB,GAAS57B,IAlBV,KAAAunF,SAA+C,KAAAvnF,UAsKlF,KAAA0nF,YAAernF,IACbC,KAAKqnF,cAAcC,SAAStnF,KAAKqnF,cAAcE,WAAa,GAC5DvnF,KAAKsnF,WAEFtnF,KAAKqnF,cAAcrrB,YAAch8D,KAAKwnF,SAASxrB,WAChDh8D,KAAKynF,QAAQlnF,aAAa,WAAY,QAGxCP,KAAK4V,QAAQ+0B,gBAAgB,aAG/B,KAAA+8C,YAAe3nF,IACbC,KAAKqnF,cAAcC,SAAStnF,KAAKqnF,cAAcE,WAAa,GAC5DvnF,KAAKsnF,WAEFtnF,KAAKqnF,cAAcrrB,YAAch8D,KAAK2nF,SAAS3rB,WAChDh8D,KAAK4V,QAAQrV,aAAa,WAAY,QAGxCP,KAAKynF,QAAQ98C,gBAAgB,aAG/B,KAAAi9C,YAAe7nF,IAEb,MAAM2a,EAAS3a,EAAE2a,OAEjB,IAAIA,EAAOxT,QAAQ00D,UAAW,OAE9B,GAAG57D,KAAK6nF,WAAY,CAClB,GAAG7nF,KAAK6nF,aAAentE,EAAQ,OAC/B1a,KAAK6nF,WAAW3nF,UAAUoE,OAAO,UAGnCtE,KAAK6nF,WAAantE,EAElBA,EAAOxa,UAAUW,IAAI,UACrB,MAAM+6D,GAAalhD,EAAOxT,QAAQ00D,UAElC57D,KAAKmnF,aAAe,IAAIzqC,KAAKkf,GAE7B57D,KAAK+U,WACL/U,KAAK8nF,gBA3LL9nF,KAAKm6D,QAAUz6D,EAAQy6D,SAAW,IAAIzd,KAAK,uBAExCsqC,EAAWhnF,KAAKm6D,SACjB6sB,EAASe,YAAY/nF,KAAKm6D,QAAQgC,cAAen8D,KAAKm6D,QAAQotB,WAAYvnF,KAAKm6D,QAAQ6tB,WAIzFhoF,KAAKioF,YAActnF,SAASC,cAAc,OAC1CZ,KAAKioF,YAAY/nF,UAAUW,IAAI,wBAE/Bb,KAAKynF,QAAU9mF,SAASC,cAAc,UACtCZ,KAAKynF,QAAQvnF,UAAUW,IAAI,WAAY,aAAc,oBACrD,YAAiBb,KAAKynF,QAASznF,KAAKonF,YAAa,CAACv1E,eAAgB7R,KAAK6R,iBAEvE7R,KAAK4V,QAAUjV,SAASC,cAAc,UACtCZ,KAAK4V,QAAQ1V,UAAUW,IAAI,WAAY,aAAc,oBACrD,YAAiBb,KAAK4V,QAAS5V,KAAK0nF,YAAa,CAAC71E,eAAgB7R,KAAK6R,iBAEvE7R,KAAKkoF,WAAavnF,SAASC,cAAc,OACzCZ,KAAKkoF,WAAWhoF,UAAUW,IAAI,2BAE9Bb,KAAKioF,YAAY5mF,OAAOrB,KAAKynF,QAASznF,KAAKkoF,WAAYloF,KAAK4V,SAG5D5V,KAAKmoF,gBAAkBxnF,SAASC,cAAc,OAC9CZ,KAAKmoF,gBAAgBjoF,UAAUW,IAAI,sBACnC,YAAiBb,KAAKmoF,gBAAiBnoF,KAAK4nF,YAAa,CAAC/1E,eAAgB7R,KAAK6R,iBAE/E7R,KAAK2C,KAAKtB,OAAOrB,KAAKioF,YAAajoF,KAAKmoF,iBAGrCzoF,EAAQ+rB,SAAU,CACnBzrB,KAAKupB,QAAU5oB,SAASC,cAAc,OACtCZ,KAAKupB,QAAQrpB,UAAUW,IAAI,oBAE3B,MAAMoiF,EAAYtiF,SAASC,cAAc,OACzCqiF,EAAU/iF,UAAUW,IAAI,8BACxBoiF,EAAU5hF,OAAO,KAEjB,MAAM+mF,EAAkB,CAAC3jF,EAAaD,EAAwB2C,EAAmCkhF,KAC/F,MAAMC,EAAY,GAAK7jF,EACvBzE,KAAK6R,eAAehR,IAAI2D,EAAWpE,MAAnCJ,CAA0C,QAAUD,IAClD,IAAI4E,EAAQH,EAAWG,MAAMe,QAAQ,MAAO,IACzCf,EAAMhD,OAAS,EAChBgD,EAAQA,EAAMgB,MAAM,EAAG,IAEF,IAAjBhB,EAAMhD,SAAiBgD,EAAM,IAAM2jF,EAAU,IAAyB,IAAjB3jF,EAAMhD,SAAiBgD,EAAQF,KAClE,IAAjBE,EAAMhD,QAAgB0mF,GACvBA,GAAY1jF,EAAM,IAGpBA,EAAQ,IAAMA,EAAM,IAIxBH,EAAWoB,iBAAiBjB,GAC5BwC,EAAQxC,EAAMhD,WAIlB3B,KAAKuoF,gBAAkB,IAAI,IAAW,CAAC3oF,WAAW,IAClDI,KAAKwoF,kBAAoB,IAAI,IAAW,CAAC5oF,WAAW,IAEpDwoF,EAAgB,GAAIpoF,KAAKuoF,gBAAkB5mF,IAC3B,IAAXA,GACD3B,KAAKwoF,kBAAkBpoF,MAAM6B,QAG/BjC,KAAK8nF,gBACHW,IACFzoF,KAAKwoF,kBAAkB7jF,OAAS8jF,EAASzoF,KAAKwoF,kBAAkB7jF,OAAOgB,MAAM,EAAG,KAElFyiF,EAAgB,GAAIpoF,KAAKwoF,kBAAoB7mF,IACvCA,GACF3B,KAAKuoF,gBAAgBnoF,MAAM6B,QAG7BjC,KAAK8nF,iBAGP9nF,KAAKmnF,aAAeH,EAEpBA,EAAS0B,WAAW1B,EAAS2B,aAAe,IAE5C3oF,KAAKuoF,gBAAgB3iF,kBAAkB,IAAMohF,EAAS4B,YAAYjjF,OAAO,IACzE3F,KAAKwoF,kBAAkB5iF,kBAAkB,IAAMohF,EAAS2B,cAAchjF,OAAO,IAE7EqhF,EAASnrB,SAAS,EAAG,EAAG,EAAG,GAE3B77D,KAAKupB,QAAQloB,OAAOrB,KAAKuoF,gBAAgBnnF,UAAW6hF,EAAWjjF,KAAKwoF,kBAAkBpnF,WAEtF,YAAiBpB,KAAK4/E,WAAY,KAC7B5/E,KAAKinF,SACNjnF,KAAKmnF,aAAatrB,UAAU77D,KAAKuoF,gBAAgB5jF,OAAS,GAAI3E,KAAKwoF,kBAAkB7jF,OAAS,EAAG,EAAG,GACpG3E,KAAKinF,OAAOjnF,KAAKmnF,aAAanrB,UAAY,IAAO,IAGnDh8D,KAAKmkC,QACJ,CAACtyB,eAAgB7R,KAAK6R,iBAEzB7R,KAAK2C,KAAKtB,OAAOrB,KAAKupB,SAEtBvpB,KAAKynF,QAAQvnF,UAAUW,IAAI,WAC3Bb,KAAK4V,QAAQ1V,UAAUW,IAAI,WAG7B,MAAMgoF,EAAgBloF,SAASC,cAAc,OAC7CioF,EAAc3oF,UAAUW,IAAI,kBAC5BgoF,EAAcxnF,OAAOrB,KAAKoB,WAC1BpB,KAAK+a,QAAQ1Z,OAAOwnF,GAIpB7B,EAASnrB,SAAS,EAAG,EAAG,EAAG,GAC3B77D,KAAKmnF,aAAeH,EAEpBhnF,KAAK48D,QAAUl9D,EAAQk9D,SAAW,IAAIlgB,KACtC18C,KAAK48D,QAAQf,SAAS,EAAG,EAAG,EAAG,GAE/B77D,KAAKqnF,cAAgB,IAAI3qC,KAAK18C,KAAKmnF,cACnCnnF,KAAKqnF,cAAcvrB,QAAQ,GAE3B97D,KAAK2nF,SAAW,IAAIjrC,KAAK18C,KAAK48D,SAC9B58D,KAAK2nF,SAAS7rB,QAAQ,GAEtB97D,KAAKwnF,SAAW,IAAI9qC,KAAK18C,KAAKm6D,SAC9Bn6D,KAAKwnF,SAAS3rB,SAAS,EAAG,EAAG,EAAG,GAChC77D,KAAKwnF,SAAS1rB,QAAQ,GAEnB97D,KAAKqnF,cAAcrrB,YAAch8D,KAAKwnF,SAASxrB,WAChDh8D,KAAKynF,QAAQlnF,aAAa,WAAY,QAGrCP,KAAKqnF,cAAcrrB,YAAch8D,KAAK2nF,SAAS3rB,WAChDh8D,KAAK4V,QAAQrV,aAAa,WAAY,QAGrCb,EAAQ+7B,UACTz7B,KAAK+U,SAAW,QAGlB/U,KAAK8nF,eACL9nF,KAAK+U,WACL/U,KAAKsnF,WA+CA,eACL,GAAGtnF,KAAK4/E,YAAc5/E,KAAKmnF,aAAc,CACvC,IAAI//E,EAAkB2K,EAAc,GACpC,MAAMya,EAAO,IAAIkwB,KACjBlwB,EAAKqvC,SAAS,EAAG,EAAG,EAAG,GAEvB,MAAMitB,EAA0C,CAC9C5T,OAAQ,UACRD,KAAM,WAGF8T,EAAW,IAAIrsC,KAAK18C,KAAKmnF,aAAanrB,WAG5C,GAFA+sB,EAASltB,UAAU77D,KAAKuoF,gBAAgB5jF,OAAQ3E,KAAKwoF,kBAAkB7jF,OAEpE3E,KAAKmnF,aAAanrB,YAAcxvC,EAAKwvC,UACtC50D,EAAM,yBAGE,CACRA,EAAM,oBAEN,MAAM4hF,EAA0C,CAC9C9sB,MAAO,QACP+sB,IAAK,WAGJF,EAAS5sB,gBAAkB3vC,EAAK2vC,gBACjC6sB,EAAY5sB,KAAO,WAGrBrqD,EAAKxI,KAAK,IAAI,IAAK+yD,gBAAgB,CACjC9vC,KAAMu8D,EACNrpF,QAASspF,IACRjuE,SAGLhJ,EAAKxI,KAAK,IAAI,IAAK+yD,gBAAgB,CACjC9vC,KAAMu8D,EACNrpF,QAASopF,IACR/tE,SAEH/a,KAAK4/E,WAAWjnB,WAAWvrC,YAAY,YAAKhmB,EAAK2K,KAI9C,WAGL/R,KAAK0R,MAAM+e,YAAc,GACzBzwB,KAAK0R,MAAMrQ,OAAO,IAAI,IAAKi7D,gBAAgB,CACzC9vC,KAAMxsB,KAAKmnF,aACXznF,QAAS,CACPupF,IAAK,UACL/sB,MAAO,OACPgtB,QAAS,WAEVnuE,SAGG,cAAcxE,EAAmBqX,EAAkC,IACzE,MAAM9rB,EAAKnB,SAASC,cAAc,UAWlC,OAVAkB,EAAG5B,UAAUW,IAAI,WAAY,0BAE1B0V,GACDzU,EAAGvB,aAAa,WAAY,QAG3BqtB,GACD9rB,EAAGT,OAAOusB,GAGL9rB,EAGF,WACL,MAAMqnF,EAAY,IAAIzsC,KAAK18C,KAAKqnF,eAE1B3nF,EAAsC,CAC1C08D,KAAM,UACNF,MAAOl8D,KAAKupB,SAAWpB,EAAA,EAAWC,SAAW,QAAU,QAGzDpoB,KAAKkoF,WAAWz3D,YAAc,GAC9BzwB,KAAKkoF,WAAW7mF,OAAO,IAAI,IAAKi7D,gBAAgB,CAAC9vC,KAAM28D,EAAWzpF,YAAUqb,SAGzE/a,KAAKk8D,OACNl8D,KAAKk8D,MAAM53D,SAGbtE,KAAKk8D,MAAQv7D,SAASC,cAAc,OACpCZ,KAAKk8D,MAAMh8D,UAAUW,IAAI,qBAEzB,MAAMuoF,EAAgB,IAAI1sC,KACpBusC,EAAMG,EAAcC,SACf,IAARJ,GACDG,EAAcvtB,UAAU,IAAMotB,EAAM,IAGtC,IAAI,IAAIrnF,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAME,EAAK9B,KAAKspF,eAAc,EAAM,IAAI,IAAKhtB,gBAAgB,CAAC9vC,KAAM48D,EAAe1pF,QAAS,CAACwpF,QAAS,YAAYnuE,SAClHjZ,EAAG5B,UAAUoE,OAAO,0BACpBxC,EAAG5B,UAAUW,IAAI,yBACjBb,KAAKk8D,MAAM76D,OAAOS,GAClBsnF,EAActtB,QAAQstB,EAAcpB,UAAY,GAIlD,IAAIuB,EAAWJ,EAAUE,SAAW,GACnB,IAAdE,IAAiBA,EAAW,GAE/B,MAAMC,EAAa,IAAI9sC,KAAKysC,EAAUntB,WACtCwtB,EAAW1tB,QAAQ0tB,EAAWxB,UAAYuB,EAAW,GAGrD,IAAI,IAAI3nF,EAAI,EAAGA,EAAI2nF,IAAY3nF,EAC1B5B,KAAKN,QAAQ+pF,oBACdD,EAAW1tB,QAAQ0tB,EAAWxB,UAAY,GAC1ChoF,KAAKk8D,MAAM76D,OAAOrB,KAAKspF,eAAc,EAAM,GAAKE,EAAWxB,aAE3DhoF,KAAKk8D,MAAM76D,OAAOrB,KAAKspF,eAAc,IAIzC,EAAG,CACD,MAAM98D,EAAO28D,EAAUnB,UACjBlmF,EAAK9B,KAAKspF,cAAcH,EAAYnpF,KAAK48D,SAAWusB,EAAYnpF,KAAKm6D,QAAS,GAAK3tC,GACzF1qB,EAAGoF,QAAQ00D,UAAY,GAAKutB,EAAUntB,UAEnCmtB,EAAUntB,YAAch8D,KAAKmnF,aAAanrB,YAC3Ch8D,KAAK6nF,WAAa/lF,EAClBA,EAAG5B,UAAUW,IAAI,WAGnBb,KAAKk8D,MAAM76D,OAAOS,GAElBqnF,EAAUrtB,QAAQtvC,EAAO,SACK,IAAxB28D,EAAUnB,WAElB,MAAMpuC,EAAY55C,KAAKk8D,MAAMztD,kBAAoB,EACjD,GAAGzO,KAAKN,QAAQ+pF,oBAAsB7vC,EACpC,IAAI,IAAIh4C,EAAIg4C,EAAWh4C,EAAI,IAAKA,EAC9B5B,KAAKk8D,MAAM76D,OAAOrB,KAAKspF,eAAc,EAAM,GAAKH,EAAUnB,YAC1DmB,EAAUrtB,QAAQqtB,EAAUnB,UAAY,GAI5C,MAAM0B,EAAQ7kF,KAAKosC,KAAKjxC,KAAKk8D,MAAMztD,kBAAoB,GACvDzO,KAAKoB,UAAU8F,QAAQwiF,MAAQ,GAAKA,EAEpC1pF,KAAKmoF,gBAAgB9mF,OAAOrB,KAAKk8D,QCnYtB,MAAMytB,GAInB,YAAoBvoF,EAAgCwoF,GAAhC,KAAAxoF,YAAgC,KAAAwoF,UAClD5pF,KAAK6pF,iBACL7pF,KAAK8pF,kBAQC,iBACN9pF,KAAK+pF,gBAAkB,IAAI74C,qBAAsBC,IAC/C,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAM64C,EAAa54C,EAAM64C,mBACnBC,EAAe94C,EAAM12B,OAAO3Z,cAC5BopF,EAAiB/4C,EAAMg5C,WAG1BJ,EAAWtkE,OAASykE,EAAezxD,KACpC14B,KAAK4pF,SAAQ,EAAMM,GAIlBF,EAAWtkE,QAAUykE,EAAezxD,KACnCsxD,EAAWtkE,OAASykE,EAAezkE,QACrC1lB,KAAK4pF,SAAQ,EAAOM,KAGvB,CAACG,UAAW,EAAGC,KAAMtqF,KAAKoB,YAGvB,kBACNpB,KAAKuqF,iBAAmB,IAAIr5C,qBAAsBC,IAChD,MAAMC,EAAQD,EACbvlC,OAAOwlC,GAASA,EAAM64C,mBAAmBvxD,IAAM0Y,EAAMg5C,WAAW1xD,KAChErsB,KAAK,CAACC,EAAGC,IAAMD,EAAE29E,mBAAmBvxD,IAAMnsB,EAAE09E,mBAAmBvxD,KAAK,GACrE,IAAI0Y,EAAO,OAEX,MAAMhwC,EAAYgwC,EAAMC,eAAiBD,EAAM12B,OAAS02B,EAAM12B,OAAO4hB,mBACrEt8B,KAAK4pF,SAAQ,EAAMxoF,IAClB,CAACkpF,KAAMtqF,KAAKoB,YAOT,YAAYA,EAAwB4M,GAC1C,MAAMw8E,EAAW7pF,SAASC,cAAc,OAExC,OADA4pF,EAAStqF,UAAUW,IAAI,kBAAmBmN,GACnC5M,EAAUw3B,YAAY4xD,GAQxB,2BAA2BzvE,GAChC,MAAM0vE,EAAiBzqF,KAAK0qF,YAAY3vE,EAAS,wBACjD/a,KAAK+pF,gBAAgBt6C,QAAQg7C,GAE7BzqF,KAAKuqF,iBAAiB96C,QAAQ10B,GAGzB,aACL/a,KAAK+pF,gBAAgBY,aACrB3qF,KAAKuqF,iBAAiBI,aAGjB,UAAU5vE,EAAsB0vE,GACrCzqF,KAAKuqF,iBAAiBv4C,UAAUj3B,GAChC/a,KAAK+pF,gBAAgB/3C,UAAUy4C,ICvDpB,MAAM,WAAwBj/D,YAS3C,cACE7rB,QACAK,KAAKE,UAAUW,IArBA,YAwBjB,oBACE,OAAOb,KAAK4qF,eAGd,kBAAyBC,GACvB7qF,KAAK4qF,eAAiBC,EAGxB,YACE,OAAO7qF,KAAK6qF,cAAcviF,MAGrB,KAAKjI,GACVL,KAAKK,KAAOA,EACZL,KAAKE,UAAUW,IAAI,YAAmBR,GAGjC,oBAAoByqF,GACzB9qF,KAAK8qF,iBAAmBA,EAGnB,OAAOC,GACZ,MAAMC,IAAwBhrF,KAAKsgE,iBAC/B0qB,IACFhrF,KAAKsgE,iBAAmB3/D,SAASC,cAAc,OAC/CZ,KAAKsgE,iBAAiBpgE,UAAUW,IAAI,oBACpCb,KAAKqB,OAAOrB,KAAKsgE,mBAGnB,MAAMuqB,EAAgB7qF,KAAK6qF,cAC3B,IAAIE,IAAuBC,EAAqB,CAC9C,MAAMniD,EAAoB,KAAoBoiD,YAAYJ,EAAc/hD,UACxE,OAAA6K,GAAA,GAAY9K,EAAoBA,I,MAC1BA,EAAkBqiD,aACpBlrF,KAAKsgE,iBAAiBpgE,UAAUW,IAAI,aAGnCgoC,EAAkBtqB,OAAO6rB,UAC1BpqC,KAAKE,UAAUW,IAAI,eAGrB,MAAMqC,EAAqB,WAAdlD,KAAKK,KA/DG,GACD,GA+Dd8qF,EAAcnrF,KAAKorF,mBAAqBr6D,GAAY,CACxDC,IAAKhxB,KAAKsgE,iBACVzmD,IAAkC,QAA7B,EAAAgvB,EAAkBqiD,mBAAW,QAAIriD,EAAkBI,YACxDzlC,MAAON,EACPO,OAAQP,EACRwjD,QAAQ,IACP/e,QAAQ,KACN3nC,KAAKorF,qBAAuBD,IAC7BnrF,KAAKorF,wBAAqB/iF,QAO7B,gB,MACL,MAAMwiF,EAAgB7qF,KAAK6qF,cACrBQ,EAA0B,WAAdrrF,KAAKK,KA9EuB,EACD,EA8E7C,GAAGwqF,EAAcviF,OAAS+iF,GAA4B,UAAdrrF,KAAKK,OAAqBL,KAAK8qF,iBAAmB,CACpF9qF,KAAKw7D,UACPx7D,KAAKw7D,QAAU76D,SAASC,cAA4B,WAAdZ,KAAKK,KAAoB,IAAM,QACrEL,KAAKw7D,QAAQt7D,UAAUW,IAAI,qBAG7B,MAAMgG,EAAYk8E,GAAa8H,EAAcviF,OAC1CtI,KAAKw7D,QAAQ/qC,cAAgB5pB,IAC9B7G,KAAKw7D,QAAQ/qC,YAAc5pB,GAGzB7G,KAAKw7D,QAAQz6D,eACff,KAAKqB,OAAOrB,KAAKw7D,cAEC,QAAZ,EAAAx7D,KAAKw7D,eAAO,eAAEz6D,iBACtBf,KAAKw7D,QAAQl3D,SACbtE,KAAKw7D,aAAUnzD,GAIZ,cAAcijF,GACF,WAAdtrF,KAAKK,OAILL,KAAK6qF,cAAcviF,OAvGuB,IAuGwBtI,KAAK8qF,iBACrE9qF,KAAKi/C,iBACNj/C,KAAKi/C,eAAe79C,UAAUkD,SAC9BtE,KAAKi/C,oBAAiB52C,IAMtBrI,KAAKi/C,iBACPj/C,KAAKi/C,eAAiB,IAAI,GAAe,CACvC7uC,WAAY,KAGdpQ,KAAKqB,OAAOrB,KAAKi/C,eAAe79C,YAGlCpB,KAAKi/C,eAAeC,OAAOosC,EAAgB7+E,IAAIq8B,GAAY,IAAgBzC,UAAUyC,EAASyiD,aAGzF,YAAYC,IAAaxrF,KAAK6qF,cAActsE,OAAOggC,QACxD,GAAiB,WAAdv+C,KAAKK,KAAmB,QACTL,KAAKE,UAAUuV,SAAS,eAAiBzV,KAAKE,UAAUuV,SAAS,gBAClE+1E,GACf,aAAcxrF,KAAM,YAAawrF,EAAUxrF,KAAK0vB,YAAc,IAAM,GAIjE,sBACL,OAAAikB,GAAA,GAAY,KAAoBs3C,YAAYjrF,KAAK6qF,cAAc/hD,UAAYD,IACzE,MAAM3lC,EAAqB,WAAdlD,KAAKK,KAAoBorF,GAA4BC,GAC5D16D,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,6BAElBwE,QAAQC,IAAI,CACVyrB,GAAY,CACVC,IAAKA,EACLnX,IAAKgvB,EAAkBqiD,YACvB1nF,MAAON,EACPO,OAAQP,EACR0iD,WAAW,EACXa,aAAa,EACbriD,MAAM,EACNqhD,UAAW,EACXx0B,MAAO,OACP+zB,YAAY,IAGdO,GAAqB,CACnB1rC,IAAKgvB,EAAkB8iD,iBACvBzoF,KAAM,GACNwX,OAAQ1a,KAAKsgE,iBACb9a,KAAM,SACNC,UAAW,EACXrhD,MAAM,IACLuhD,iBACFhiD,KAAK,EAAEioF,EAAYC,MACpB,MAAMvnF,EAAS,KAEb,aAAQ,KAENsnF,EAAWtnF,SACX0sB,EAAI1sB,SACJtE,KAAKsgE,iBAAiBpgE,UAAUoE,OAAO,oBAI3CsnF,EAAWtqF,iBAAiB,aAAewkD,IACtCA,IAAY8lC,EAAW7lC,WACrB/lD,KAAKorF,mBACNprF,KAAKorF,mBAAmBznF,KAAK,KAC3BmM,WAAWxL,EAAQ,OAGrBA,OAKNsnF,EAAWtqF,iBAAiB,aAAc,KACxCtB,KAAKsgE,iBAAiBj/D,OAAO2vB,GAC7BhxB,KAAKsgE,iBAAiBpgE,UAAUW,IAAI,iBACpC+qF,EAAWxnF,OACXynF,EAAaznF,QACZ,CAACya,MAAM,SAMlB8Q,eAAeC,OAtME,mBAsMe,IC3MhC,MAGMk8D,GAAyD,IAAIx4E,IAGpD,MAAM,WAAyBkY,YAQ5C,cACE7rB,QACAK,KAAKE,UAAUW,IAhBA,aAiBfb,KAAKkM,OAAS,GAGhB,oBACE,IAAIsO,EAAMsxE,GAAmBn4E,IAAI3T,KAAKoH,KAClCoT,GACFsxE,GAAmBtxE,IAAIxa,KAAKoH,IAAKoT,EAAM,IAAI7S,KAG7C6S,EAAI3Z,IAAIb,MAELA,KAAK+rF,mBAAqB/rF,KAAK0vB,cAChC1vB,KAAK+rF,oBACL/rF,KAAK+rF,uBAAoB1jF,GAI7B,uBACE,MAAMmS,EAAMsxE,GAAmBn4E,IAAI3T,KAAKoH,KACxCoT,EAAIrI,OAAOnS,MACPwa,EAAItX,MACN4oF,GAAmB35E,OAAOnS,KAAKoH,KAI5B,iBAAiB4kF,GACtB,OAAOhsF,KAAKkM,OAAOlM,KAAKkM,OAAOiZ,QAAQ6mE,IAAkBnB,cAGpD,aACL,OAAO7qF,KAAK+H,QAGP,KAAKA,EAA0B1H,EAA0B4rF,QAC9C5jF,IAAbrI,KAAKoH,KACNpH,KAAKksF,uBAGPlsF,KAAK+H,QAAUA,EACf/H,KAAKoH,IAAMpH,KAAK+H,QAAQkD,OAAS,IAAMjL,KAAK+H,QAAQ8C,IACpD7K,KAAKisF,cAAgBA,EAElBjsF,KAAKK,OAASA,IACfL,KAAKK,KAAOA,EACZL,KAAKE,UAAUW,IAAI,aAAmBR,IAGxCL,KAAKmsF,oBAGA,cAAcpkF,GACnB,OAAO/H,KAAKgS,KAAKjK,EAAS/H,KAAKK,KAAML,KAAKisF,eAGrC,OAAOlkF,EAA0BqkF,GACtCpsF,KAAK+H,QAAUA,EACf/H,KAAKk/C,OAAOktC,GAGP,OAAOA,GACZ,MAAM/hD,EAAYrqC,KAAK+H,QAAQsiC,UACzBgiD,KAAkBhiD,IAAaA,EAAU7H,QAAQ7gC,QAEvD,GADA3B,KAAKE,UAAUC,OAAO,oBAAqBksF,IACvCA,IAAiBrsF,KAAKkM,OAAOvK,OAAQ,OAEzC,MAAM2qF,EAA2B,KAAoBniD,wBAE7CjV,EAASm3D,EACbC,aAAoCjnF,QAClCglC,EAAU7H,QACV6H,EAAU7H,QAAQ52B,OAAOi/E,GAChB,KAAoB0B,iBAAiB1B,EAAc/hD,WAE5D,GAEJ,OAAAjhC,EAAA,GAAe7H,KAAKkM,OAAQ,CAAC8/E,EAAiBhkF,EAAKC,KACjD,MAAM6gC,EAAWkjD,EAAgBnB,cAAc/hD,SACjC5T,EAAOs3D,KAAK3B,GAAiBA,EAAc/hD,WAAaA,KAEpE7gC,EAAIG,OAAOJ,EAAK,GAChBgkF,EAAgB1nF,YAIpB,MAAMmoF,EAAiBv3D,EAAOzD,OAAO,CAACC,EAAKoG,IAAMpG,EAAMoG,EAAExvB,MAAO,GAC1DwiF,EAAmBzgD,KAAeA,EAAU9rB,OAAOmuE,cAAgBD,ED5F9B,ECsI7C,GAzCEzsF,KAAKkM,OAASgpB,EAAOzoB,IAAI,CAACo+E,EAAe7iF,KACvC,MAAM2kF,EAAqB3sF,KAAKkM,OAAOkP,UAAU4wE,GAAmBA,EAAgBnB,cAAc/hD,WAAa+hD,EAAc/hD,UAC7H,IAAIkjD,GAA0C,IAAxBW,GAA6B3sF,KAAKkM,OAAOygF,GAC3DX,IACFA,EAAkB,IAAI,GACtBA,EAAgBh6E,KAAKhS,KAAKK,OAG5B2qD,GAAuBghC,EAAiBhsF,KAAMgI,GAE9C,MAAMsjF,EAAkBjhD,EAAUuiD,iBAAmBviD,EAAUuiD,iBAAiBhhF,OAAOk9B,GAAYA,EAASA,WAAa+hD,EAAc/hD,UAAY,GAQnJ,OAPAkjD,EAAgBnB,cAAgB,OAAH,UAAOA,GACpCmB,EAAgBa,oBAAoB/B,GACpCkB,EAAgB9sC,OAAOl/C,KAAKisF,eAC5BD,EAAgBc,gBAChBd,EAAgBe,cAAczB,GAC9BU,EAAgBgB,cAEThB,KAWLhsF,KAAKisF,gBAAiBG,aAAc,EAAdA,EAAgBzqF,UACrC3B,KAAK0vB,YACN1vB,KAAKitF,qBAAqBb,GAE1BpsF,KAAK+rF,kBAAoB,KACvB/rF,KAAKitF,qBAAqBb,MAO9BpsF,KAAKkM,OAAOvK,QAAwB,UAAd3B,KAAKK,KAAkB,CAC/C,MAAMU,EAAgBf,KAAKe,cAG3B,GAFAf,KAAKsE,SAEFvD,EAAcb,UAAUuV,SAAS,sBAAwB1U,EAAcmsF,WAAWvrF,OAEnF,YADAZ,EAAcuD,SAIhB,MAAM6oF,EAAWntF,KAAKyT,cAAc,SACjC05E,GACDpsF,EAAcM,OAAO8rF,IAKnB,qBAAqBf,GAExBpsF,KAAK+H,QAAQkD,SAAW2B,EAAA,EAAU3B,QAErCmhF,EAAe7hF,QAAQsgF,IACrB,MAAMmB,EAAkBhsF,KAAKkM,OAAOmI,KAAK23E,GAAmBA,EAAgBnB,cAAc/hD,WAAa+hD,EAAc/hD,UAClHkjD,GACDA,EAAgBoB,yBAMxBz9D,eAAeC,OA5KE,oBA4Ke,ICvKhChjB,EAAA,EAAUtL,iBAAiB,kBAAoByG,IAC5CoE,MAAMC,KAAKzL,SAAS+S,iBAA4B,kCAAmB3L,EAAQkD,UAAUlD,EAAQ8C,UAA+BN,QAAQwQ,IACnIA,EAAQhT,QAAUA,EAClBgT,EAAQmkC,aAIG,MAAM,WAAuB1zB,YAU1C,cACE7rB,QAHM,KAAA0tF,SAAU,EAMX,OACLrtF,KAAKk/C,SACLl/C,KAAKkH,QAAQomF,QAAUttF,KAAK+H,QAAQkD,OAAS,IAAMjL,KAAK+H,QAAQ8C,IAChE7K,KAAKE,UAAUW,IAAI,UAAW,WAAab,KAAKK,MAG3C,SACL,MAAMktF,EAAUvtF,KAAK+H,QAAQwlF,QAM7B,GAAiB,WAAdvtF,KAAKK,KAAmB,CACzB,IAAImtF,EACDxtF,KAAKisB,oBACNuhE,EAAWxtF,KAAKisB,oBAGfshE,aAAO,EAAPA,EAASE,kBACPD,IAAaA,EAASttF,UAAUuV,SAAS,4BAC1CzV,KAAKwO,UAAY,GACjBg/E,EAAW,MAGTxtF,KAAKi/C,iBACPj/C,KAAKi/C,eAAiB,IAAI,GAAe,CACvC3wB,cAAetuB,KAAKsuB,cACpBle,WAAY,KAGdpQ,KAAKi/C,eAAe79C,UAAUlB,UAAUW,IAAI,2BAG9C2sF,EAAWxtF,KAAKi/C,eAAe79C,UAE/BpB,KAAKi/C,eAAeC,OAAOquC,EAAQE,gBAAgBhhF,IAAI65B,GAAQ,IAAgBD,UAAUC,IAAQtmC,KAAKouB,gBAEnGo/D,IAAaA,EAASttF,UAAUuV,SAAS,oBAC1C+3E,EAASlpF,SACTkpF,EAAW,MAGTA,IACFA,EAAW7sF,SAASC,cAAc,QAClC4sF,EAASttF,UAAUW,IAAI,oBAIvB2sF,EAASzsF,eACXf,KAAKgB,QAAQwsF,GAGXxtF,KAAKs4B,OACPt4B,KAAKs4B,KAAO,IAAI,IAAK2hC,aAGvB,MAAM3hC,EAAOt4B,KAAKs4B,KAWlB,GAVGi1D,EACEA,EAAQA,QACTj1D,EAAKslD,iBAAiB,CAACx2E,IAAK,WAAY2K,KAAM,CAACw7E,EAAQA,WAEvDj1D,EAAKslD,iBAAiB,CAACx2E,IAAK,kBAG9BkxB,EAAKslD,iBAAiB,CAACx2E,IAAK,eAG3BmmF,EAAS,CAEV,IAAIG,GAAW,EACZH,EAAQA,cACkBllF,IAAxBklF,EAAQI,kBAAgDtlF,IAAnBklF,EAAQK,SAC9CF,EAAWH,EAAQI,YAAcJ,EAAQK,QAK7C5tF,KAAKE,UAAUC,OAAO,YAAautF,GAGrC,IAAIG,EAAW7tF,KAAKuwB,SAAS,GAC7B,IAAIs9D,EAAU,CACZA,EAAWltF,SAASC,cAAc,QAClCitF,EAAS3tF,UAAUW,IAAI,uBAEvB,MAAMitF,EAAWntF,SAASC,cAAc,QACxCktF,EAAS5tF,UAAUW,IAAI,cAEvB,MAAMktF,EAAkBptF,SAASC,cAAc,OAC/C,OAAAs3B,GAAA,GAAO61D,GAEP/tF,KAAKqB,OAAOwsF,EAAUC,EAAUC,GAGlC,OAAAt9E,EAAA,GAAeo9E,EAAUv1D,EAAKvd,cAE9B/a,KAAKE,UAAUW,IAAI,wBACnBb,KAAKwO,UAAY,iFAAgF++E,aAAO,EAAPA,EAASA,SAAUxK,GAAawK,EAAQA,QAAS,GAAK,aAGtJA,GAAYvtF,KAAKqtF,SAAYrtF,KAAK+H,QAAQwW,OAAOuN,cAClD,IAAmBkiE,uBAAuBhuF,KAAK+H,QAAQkD,OAAQjL,KAAK+H,QAAQ8C,KAC5E,IAAmBojF,cAAcjuF,KAAK+H,QAAQkD,OAAQjL,KAAK+H,QAAQ8C,IAAK,mBACxE7K,KAAKqtF,SAAU,GAGdrtF,KAAKouB,eACNpuB,KAAKouB,kBAAe/lB,IAK1BsnB,eAAeC,OAxIE,kBAwIe,ICrIhC,MAEMs+D,GAAa,KACjB,MAAMC,EAASxtF,SAASC,cAAc,KAGtC,OAFAutF,EAAOjuF,UAAUW,IAAI,UACrB,YAAMstF,EAAQ,iBACPA,GAGHC,GAAgB,IAAM,YAAK,oBAE1B,IAAU,GAAAC,OAAA,QAAa,KAKfC,QAAW5uF,I,MAItB,MAAM,SAAC6uF,EAAQ,QAAExmF,GAAWrI,EACtB8sB,EAAO,IAAIkwB,KAAoB,IAAf30C,EAAQykB,MACxBza,EAAiC,GAEvC,IAAIy8E,EAAyBC,EAA4BC,EAAoCC,EAE7F,MAAMC,IAAiB7mF,EAA4BwW,OAAOswE,UACpDC,IAAc,WAAY/mF,KAAa6mF,EAC7C,IAAIvC,EAEA5vC,EAAoBmyC,OAAcvmF,EAAY,aAAWmkB,GAC7D,GAAGsiE,EAAW,CACZ,GAAG/mF,EAAQgnF,MAAO,CAChB,MAAMC,EAAajnF,EAAQknF,cAA+B,QAAhB,EAAAlnF,EAAQmnF,gBAAQ,eAAED,aAEtDE,EAAgBxuF,SAASC,cAAc,QAC7CuuF,EAAcjvF,UAAUW,IAAI,cAC5BsuF,EAAc3gF,UAAYu0E,GAAah7E,EAAQgnF,MAAO,GAEtD,MAAMK,EAAezuF,SAASC,cAAc,KAI5C,GAHAwuF,EAAalvF,UAAUW,IAAI,qBAAsB,aAEjDkR,EAAKxI,KAAK4lF,EAAeC,GACtBJ,EAAY,CACb,MAAM/hD,EAAOtsC,SAASC,cAAc,QACpC,OAAAksB,EAAA,GAAamgB,EAAM,IAAkB1gB,cAAcyiE,IACnD/hD,EAAK9jB,mBAAmB,YAAa,WACrCpX,EAAKxI,KAAK0jC,IAQd,GAJGllC,EAAQsnF,WAA0B,cAAbd,IAA6BxmF,EAAQwW,OAAO+wE,WAClEv9E,EAAKzI,QAAQklF,EAAaN,MAGZ,WAAbK,GAAyBxmF,EAAQwW,OAAOgxE,OAAQ,CACjD,MAAM3tF,EAAIjB,SAASC,cAAc,KACjCgB,EAAE1B,UAAUW,IAAI,mBAAoB,aACpCkR,EAAKzI,QAAQ1H,GAGU,aAAtBmG,EAAQwjF,QAAQngF,IACjBihF,GAAe,EAEfsC,EAAmB,IAAmBa,sBAAsBznF,GAE5D2mF,EAAmB,IAAI,GACvBA,EAAiB18E,KAAK28E,EAAkB,UAAU,GAClDD,EAAiBxvC,SACjBntC,EAAKzI,QAAQolF,SAEPE,GACR78E,EAAKxI,KAAKklF,EAAgBL,MAGzB3xC,GACD1qC,EAAKxI,KAAKkzC,GAGZ,IAAI/qC,EAAQk9E,OAAcvmF,EAAY,aAAYmkB,GAC/CsiE,IACDp9E,IAAU3J,EAAQsnF,YAActnF,EAAQwW,OAAO+wE,UAAY,aAAa,aAAY,IAAI5yC,KAAyB,IAApB30C,EAAQsnF,YAAuB,KACvHtnF,EAAQmnF,SAAW,eAAe,aAAY,IAAIxyC,KAA6B,IAAxB30C,EAAQmnF,SAAS1iE,OAAkB,KAGjG,MAAM2gE,EAAWxsF,SAASC,cAAc,QACxCusF,EAASjtF,UAAUW,IAAI,OAAQ,SAE/BssF,EAAS9rF,UAAU0Q,GAEnB,MAAM09E,EAAQ9uF,SAASC,cAAc,OACrC6uF,EAAMvvF,UAAUW,IAAI,QAAS,SAC1B6Q,IAAO+9E,EAAM/9E,MAAQA,GAExB,IAAIg+E,EAAa39E,EAOjB,GANGy8E,IACDkB,EAAWA,EAAWvqE,QAAQqpE,IAAeN,MAE5CO,IACDiB,EAAWA,EAAWvqE,QAAQspE,IAAkBL,MAE/CM,EAAkB,CACnB,MAAMiB,EAAoBD,EAAWA,EAAWvqE,QAAQupE,IAAqB,IAAI,GACjFiB,EAAkB39E,KAAK28E,EAAkB,UACzCgB,EAAkBzwC,SAUpB,OARAwwC,EAAaA,EAAWjjF,IAAIH,GAAKA,aAAakf,cAAgBlf,EAAEpM,UAAUuV,SAAS,UAAYnJ,EAAEpM,UAAUuV,SAAS,aAAenJ,EAAEpL,WAAU,GAAuBoL,GACnKmwC,IACDizC,EAAWA,EAAW/tF,OAAS,GAAK,aAAW6qB,IAEjDijE,EAAMpuF,UAAUquF,GAEhBvC,EAAS9rF,OAAOouF,GAETtC,GAGI,GAAAyC,cAAgB,EAAErnC,SAAQsnC,kBAAiB9nF,UAAS+nF,aAAY1hE,eAAcE,oBAQzF,MAAMyhE,GAAYxnC,EAAOroD,UAAUuV,SAAS,aAAe8yC,EAAOroD,UAAUuV,SAAS,eAAiB8yC,EAAOroD,UAAUuV,SAAS,SAC1Hu6E,EAAgB,IAAI,GAO1B,OANAA,EAAcjoF,QAAUA,EACxBioF,EAAc3vF,KAAO0vF,EAAW,SAAW,SAC3CC,EAAc5hE,aAAeA,EAC7B4hE,EAAc1hE,cAAgBA,EAC9B0hE,EAAch+E,OACd69E,EAAgB7uF,QAAQgvF,GACjBD,GAGI,GAAAE,SAAW,EAAEr/D,OAAM23B,SAAQsnC,kBAAiB9nF,cAMvD,MAAMmoF,GAAeL,EAClBK,IACDL,EAAkBtnC,EAAO90C,cAAc,oBAGzC,MAAM08E,EAAkBD,EAAcL,EAAgBp8E,cAAc,UAAY,KAChF,IAAI1L,EAAQqoF,aAMV,OALGD,GACDA,EAAgB7rF,cAGlBikD,EAAOroD,UAAUoE,OAAO,YAK1B,MAAM+rF,EAAgBtoF,EAAQuoF,SAASC,iBAAmB3/D,EAAK4/D,gBAAgBnqD,UAAUt+B,EAAQuoF,SAASC,kBAAoB3/D,EAAK3lB,OAEnI,IACIwlF,EADAC,EAAkB9/D,EAAKqgC,mBAAmBxwC,iBAAiB4vE,EAAetoF,EAAQqoF,cAM7D,iBAAtBM,EAAgBtlF,GAEjBwlB,EAAKqgC,mBAAmB0/B,kBAAkBN,EAAetoF,EAAQqoF,cACjEx/D,EAAKC,QAAQ+/D,WAAWrnF,KAAK,CAAC8mF,gBAAeQ,SAAU9oF,EAAQqoF,aAAcvlF,IAAK9C,EAAQ8C,MAE1F4lF,EAAoB,YAAK,YAEzBA,EAAoB,IAAI,KAAU,CAChCxlF,OAAQylF,EAAgBzgF,QAAUygF,EAAgBpK,UAClDpvE,QAAQ,EACRwjD,eAAe,EACf96D,WAAW,IACVmb,QAGL,MAAMiT,EAAU+7B,GAAU0mC,OAAmBpoF,EAAWqoF,GACrDP,EACDA,EAAgB/iE,YAAYY,GAE5B6hE,EAAgBxuF,OAAO2sB,GAGzBu6B,EAAOroD,UAAUW,IAAI,a,cCxMlB,SAASiwF,GAAkB1vF,EAAwB2vF,EAAgCC,GAExF,MAAMvsE,EAAOrjB,EAAUsjB,wBACjBtB,EAAuB,WAAnB4tE,EAA8BnsF,KAAKosC,KAAKxsB,EAAKkB,MAASlB,EAAK6rB,MAAQ7rB,EAAKkB,MAAQ,EAAK,GAAK9gB,KAAKosC,KAAKxsB,EAAKkB,KAAO,GACpHrC,EAAqB,WAAjBytE,EAA4BlsF,KAAKod,MAAMwC,EAAKiU,IAAMjU,EAAKhhB,OAAS,GAAKoB,KAAKosC,KAAKxsB,EAAKiU,IAAM,GACpG,OAAO/3B,SAASswF,iBAAiB7tE,EAAGE,GCPvB,SAAS4tE,GAAwBn2E,GAC9CA,EAAQ5V,MAAMC,QAAU,OACnB2V,EAAQy1B,WACbz1B,EAAQ5V,MAAMC,QAAU,GDO1B,KAAe0rF,kBAAoBA,G,kDEWnC,MAAMK,GAAiC,CACrCC,SAAU,GACVC,QAAS,EACTC,SAAU,KAAIC,cAKT,MAAM,GAAb,cAEU,KAAAC,iBAEJ,GAGI,KAAAC,iBAAkD,GAElD,KAAAC,oBAAoE,GAiErE,iBAAiBJ,EAAmB,KAAIC,cAC7C,MAAMnnF,EAAUpK,KAAK0xF,oBAAoBJ,GACzC,GAAGlnF,EACD,OAAOA,EAGT,MAAMunF,EAAkB,iBAAmBL,EAC3C,OAAOtxF,KAAK0xF,oBAAoBJ,GAAYM,GAAA,EAAaj+E,IAAIg+E,GAAYhuF,KAAMkuF,IACzE,OAAAC,GAAA,GAASD,KACXA,EAAO,IAGT,OAAAE,GAAA,GAAmBZ,GAAiBU,GAGpCA,EAAKP,SAAWA,EAChBtxF,KAAKwxF,iBAAiBF,GAAYO,EAE3B,KAAWj3D,UAAU,sCAAuC,CACjE+hD,UAAWkV,EAAKP,SAChBU,aAAcH,EAAKR,UAClB1tF,KAAMsuF,IACPJ,EAAKR,QAAUY,EAAmBZ,QAElC,MAAMa,EAAeL,EAAKT,SACpBA,EAAWa,EAAmBb,SACpC,IAAI,IAAIxvF,EAAI,EAAGD,EAASyvF,EAASzvF,OAAQC,EAAID,IAAUC,EAAG,CACxD,MAAM,QAACuwF,EAAO,UAAEC,GAAahB,EAASxvF,GACtCswF,EAAaC,GAAWC,EAO1B,OAJAR,GAAA,EAAap3E,IAAI,CACf,CAACm3E,GAAaE,IAGTA,GACN,IACMA,KAKN,uBACL,MAAM7uD,EAA2B,CAC/BhjC,KAAKqyF,oBAWP,OARG,IAAKC,wBAA0B,KAAIf,cACpCvuD,EAASz5B,KAAKvJ,KAAKqyF,iBAAiB,IAAKC,wBAGvCtyF,KAAKq6D,QACPr3B,EAASz5B,KAAKvJ,KAAKuyF,mBAGdltF,QAAQC,IAAI09B,GAGd,cACDhjC,KAAKklB,QACPllB,KAAKklB,MAAQ,IAAI,UAAY7c,EAAW,IAG1C,IAAI,MAAMipF,KAAYtxF,KAAKwxF,iBAAkB,CAC3C,GAAGxxF,KAAKyxF,iBAAiBH,GACvB,SAGF,MACMF,EADOpxF,KAAKwxF,iBAAiBF,GACbF,SAEtB,IAAI,MAAMe,KAAWf,EAAU,CAC7B,MAAMgB,EAAYhB,EAASe,GAC3BnyF,KAAKklB,MAAMstE,YAAYJ,EAAWD,GAGpCnyF,KAAKyxF,iBAAiBH,IAAY,GAI/B,aAAa1uD,GAMlB,IAAI6vD,EACJ,GANAzyF,KAAK0yF,eAEL9vD,EAAIA,EAAE4gB,cAAc99C,QAAQ,KAAM,MAI7BmK,OAAQ,CACX,MAAM2K,EAAMxa,KAAKklB,MAAMytE,OAAO/vD,GAC9B6vD,EAAStmF,MAAMC,KAAKoO,GAAKiX,OAAO,CAACC,EAAKoT,IAAMpT,EAAIhqB,OAAOo9B,GAAI,SAE3D2tD,EAASzyF,KAAKq6D,OAAO3yD,OAAO,GAAgBkrF,eAAejtF,MAAM,EAvK7C,IAmLtB,OATA8sF,EAAStmF,MAAMC,KAAK,IAAIzE,IAAI8qF,IASrBA,EAGF,kBACL,OAAGzyF,KAAK6yF,uBAA+B7yF,KAAK6yF,uBACrC7yF,KAAK6yF,uBAAyB35D,EAAA,EAAgBC,WAAWx1B,KAAKy1B,GAC5Dp5B,KAAKq6D,OAASluD,MAAMo3C,QAAQnqB,EAAM05D,aAAe15D,EAAM05D,YAAc,IAIzE,gBAAgBtsC,GACrBA,EAAQ,IAAkBusC,SAASvsC,GACnCxmD,KAAKuyF,kBAAkB5uF,KAAK02D,IAC1B,OAAApmD,EAAA,GAAiBomD,EAAQ7T,GACzB6T,EAAO/wD,QAAQk9C,GACZ6T,EAAO14D,OAlMU,KAmMlB04D,EAAO14D,OAnMW,IAsMpBu3B,EAAA,EAAgB61C,YAAY,cAAe1U,GAC3CztD,EAAA,EAAU0F,cAAc,eAAgBk0C,MApM7B,GAAAosC,cAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAyMxO,MAAM,GAAkB,IAAI,GAC5B,OAAmB,KAAeI,gBAAkB,IACrC,U,kBCtNf,MAAMC,GAA0B,IAAItrF,IAC7B,SAASurF,GAAY1sC,EAAeplD,EAAwBJ,GAAU,EAAOmyF,GAAQ,G,MAK1F,MAAMC,EAAYzyF,SAASC,cAAc,QAGzC,IAAIyyF,EAiBJ,GAnBAD,EAAUlzF,UAAUW,IAAI,eAGrBsyF,IAAU,KACXE,EAAM,IAAkBC,gBAAgB9sC,IAExCA,EAAQ,IAAkBusC,SAASvsC,GACnC6sC,EAAM,IAAkB9mE,cAAci6B,IAUxC4sC,EAAU/xF,OAAOgyF,GAEdD,EAAU7iE,SAAS5uB,OAAS,EAAG,CAChC,MAAMgzB,EAAQy+D,EAAUnnE,kBACxBmnE,EAAU5kF,UAAY,GACtB4kF,EAAU/xF,OAAOszB,GAGnB,GAA4C,SAAd,QAA3B,EAAAy+D,EAAUnnE,yBAAiB,eAAEqmB,SAAmB,CACjD,MAAMoS,EAAQ0uC,EAAUnnE,kBAElB3R,EAAMoqC,EAAMrqC,IAClB,IAAI44E,GAAWtnF,IAAI2O,GAAM,CACvBoqC,EAAMnkD,aAAa,UAAW,QAC9B,MAAMoQ,EAAchQ,SAASC,cAAc,QAC3C+P,EAAYzQ,UAAUW,IAAI,qBAEvB+L,EAAA,EAAU+2B,SAASC,oBACpB8gB,EAAMv/C,MAAM4tD,QAAU,IACtBpiD,EAAYxL,MAAM4tD,QAAU,KAG9BrO,EAAMpjD,iBAAiB,OAAQ,KAC7B,aAAQ,KACHsL,EAAA,EAAU+2B,SAASC,oBACpB8gB,EAAMv/C,MAAM4tD,QAAU,GACtBpiD,EAAYxL,MAAM4tD,QAAU,IAG9BqgC,EAAUlzF,UAAUoE,OAAO,SAE3B2uF,GAAWpyF,IAAIyZ,MAEhB,CAACuE,MAAM,IAEVu0E,EAAU/xF,OAAOsP,IAMlB3P,EAASI,EAAUJ,QAAQoyF,GACzBhyF,EAAUw3B,YAAYw6D,GAGtB,SAASG,GAAoBx4E,GAClC,OAAI,OAAA+P,GAAA,GAAgB/P,EAAS,eAEL,IAArBA,EAAQy4E,SAAuBz4E,EAAQ04E,WACnB,SAApB14E,EAAQu3B,UAAuBv3B,EAAQ7a,UAAUuV,SAAS,UAAYsF,EAAQkR,oBAC/ElR,EAAUA,EAAQkR,mBAGblR,EAAQqwD,aAAa,QAAUrwD,EAAQ6S,WAPM,GAUvC,MAAM,GAArB,cASU,KAAA8lE,eAAiB,EA2KzB,KAAAC,eAAkB5zF,IAChB,OAAAiqB,EAAA,GAAYjqB,GAEZ,MAAMymD,EAAQ+sC,GAAoBxzF,EAAE2a,QAChC8rC,IAIJ,GAAa51B,KAAKxwB,MAAMwzF,gBAAgBptC,GAAO,GAC5C,MACD,OAAAgL,GAAA,OAlLJ,OACExxD,KAAK2R,QAAUhR,SAASg2C,eAAe,iBAEvC,MAAMoiC,EAA4B,CAChC,wBACA,yBACA,qBACA,wBACA,yBACA,gBAEA,cACA,cAEI8a,EAEF,GAEE3nF,EAAqC,IAAIoH,IAAI,CACjD,CACE,eACA,MAIJ,IAAI,MAAMkzC,KAAS,KAAO,CACxB,MACM5kD,EAAI,GADM,KAAM4kD,GAEhBstC,EAAW/a,GAAYn3E,EAAE,GAAK,GACpC,IAAIkyF,EAAU,SAEd,IAAIh4E,EAAI5P,EAAOyH,IAAImgF,GACfh4E,IACFA,EAAI,GACJ5P,EAAOsO,IAAIs5E,EAAUh4E,IAGvBA,GAAGla,EAAE+D,MAAM,IAAM,GAAK6gD,EAOxBt6C,EAAOiG,OAAO4mE,EAAW1vE,OAGzB6C,EAAO3B,QAAQ,CAACkoF,EAAQqB,KACtB,MAAM9iE,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,kBAElB,MAAMkzF,EAAWpzF,SAASC,cAAc,OACxCmzF,EAAS7zF,UAAUW,IAAI,kBACvBkzF,EAAS1yF,OAAO,YAAKyyF,IAErB,MAAME,EAAWrzF,SAASC,cAAc,OACxCozF,EAAS9zF,UAAUW,IAAI,gBAEvBmwB,EAAI3vB,OAAO0yF,EAAUC,GAErBvB,EAAOloF,QAAQ0pF,IAsBbf,GAjBY,aAAoBe,GAiBoCD,GAAU,KAOhFH,EAAKC,GAAY9iE,IAKnB,MAAMo8B,EAAOptD,KAAKotD,KAAOptD,KAAK2R,QAAQ0lC,uBAChC68C,EAAcl0F,KAAKsjC,OAAS,IAAI,IAAWtjC,KAAK2R,QAAS,SAIzDyY,EAAY,aAAapqB,KAAK2R,SAAS,GAE7CtM,QAAQC,IAAI,CACV,OAAArB,GAAA,GAAM,KACN,GAAgBsuF,kBAAkB5uF,KAAK02D,IACrC,MAAM85B,IAAc95B,EAAO14D,OACrByyF,EAAWD,EAAY,EAAI,EACjCn0F,KAAKotD,KAAK78B,SAAS,GAAGrwB,UAAUC,OAAO,QAASg0F,GAChDn0F,KAAKotD,KAAK78B,SAAS6jE,GAAUl0F,UAAUW,IAAI,UAC3C,MAAM8wC,EAAI,GAAkB0iD,YAAYjnC,EAAM8mC,OAAa7rF,EAAW+rF,GAGtE,OAFAp0F,KAAKs0F,kBAAoB3iD,EAAE2iD,kBAC3Bt0F,KAAKu0F,cAAgB5iD,EAAEjjC,UAChB2rD,MAER12D,KAAK,EAAEyH,EAAGivD,MACXjwC,EAAU9lB,SAEVtE,KAAKw0F,eAAiBX,EAAK,gBAAgBpgF,cAAc,iBACzD,IAAI,MAAM+yC,KAAS6T,EACjB64B,GAAY1sC,EAAOxmD,KAAKw0F,gBAG1Bx0F,KAAKw0F,eAAezzF,cAAcb,UAAUC,OAAO,QAASH,KAAKw0F,eAAe/lF,mBAEhFsqE,EAAWzvE,QAAQ,gBACnByvE,EAAWtsE,IAAIqnF,IACb,MAAM9iE,EAAM6iE,EAAKC,GAQjB,OANI9iE,GACFzgB,QAAQC,MAAM,sBAAuBsjF,GAGvCI,EAAY9yF,UAAUC,OAAO2vB,GAC7BhxB,KAAKs0F,kBAAkBG,2BAA2BzjE,GAC3CA,MAIXhxB,KAAK2R,QAAQrQ,iBAAiB,QAAStB,KAAK2zF,gBAC5C3zF,KAAKgS,KAAO,KAEZpF,EAAA,EAAUtL,iBAAiB,eAAiBklD,IAC1C,MAAMj2B,EAAWpkB,MAAMC,KAAKpM,KAAKw0F,eAAejkE,UAChD,IAAI,IAAI3uB,EAAI,EAAGD,EAAS4uB,EAAS5uB,OAAQC,EAAID,IAAUC,EAAG,CACxD,MAAME,EAAKyuB,EAAS3uB,GAEpB,GAAG4kD,IADY,IAAkBusC,SAASQ,GAAoBzxF,IACzC,CACnB,GAAS,IAANF,EACD,OAGFE,EAAGwC,UAIP4uF,GAAY1sC,EAAOxmD,KAAKw0F,gBAAgB,GACxCx0F,KAAKw0F,eAAezzF,cAAcb,UAAUoE,OAAO,QACnDtE,KAAKotD,KAAK78B,SAAS,GAAGrwB,UAAUoE,OAAO,QAEnCtE,KAAK0zF,gBACP1zF,KAAKu0F,cAAc,KAIvB,GAAkBjzF,iBAAiB,QAAS,KAC1CtB,KAAK0zF,eAAiB1zF,KAAKsjC,OAAOyM,YAkBtC,Y,qTCvRa,MAAM,GAKnB,YAAoBh1B,EAA8BkW,EAAuB1hB,EAAwBof,GAAS,GAAtF,KAAA5T,UAA8B,KAAAkW,QAAuB,KAAA1hB,aAHjE,KAAAmlF,cAA0CrvF,QAAQ6E,UAClD,KAAA2G,QAAkB,EAyBlB,KAAAw2B,SAAW,KACdrnC,KAAK6Q,QACNC,aAAa9Q,KAAK6Q,SAElB7Q,KAAK00F,cAAgB,eAIvB10F,KAAK6Q,QAAU3O,OAAO4N,WAAW,KAC/B9P,KAAK6Q,QAAU,EACf7Q,KAAK00F,cAAcxqF,WAElB,MA8EE,KAAAyqF,oBAAuB3jE,GACrBhxB,KAAK00F,cAAc/wF,KAAK,IAAW,mCAGxC,GAAG3D,KAAKsuB,cAAcsmE,YAAYC,UAAU7jE,GAC1C,OAGF,MAAM/X,EAAQ+X,EAAIvd,cAAc,SAC1Bib,EAAMsC,EAAIvd,cAAc,OAQ9B,GANGib,IACDA,GAAOA,EAAIxuB,UAAUoE,OAAO,cAEtB,iBAGLtE,KAAKsuB,cAAcsmE,YAAYC,UAAU7jE,IAIzC/X,EAAO,CACRA,EAAM3U,SACN2U,EAAMoB,IAAM,GACZpB,EAAMxP,OACa+4C,EAAA,EAAqBsyC,cAAc77E,GAC3C1O,QAAQnB,IACjBo5C,EAAA,EAAqBuyC,eAAe3rF,GAAM,GAAM,UA3ItDpJ,KAAKsuB,cAAgB,IAAI,SAAqBjmB,EAAW,CAACqS,EAAQkzB,KAC7DA,EACD5tC,KAAKg1F,kBAAkBt6E,GAEvB1a,KAAK20F,oBAAoBj6E,KAa1BiU,GACD3uB,KAAK2uB,SAmBF,SACL3uB,KAAKuP,WAAWnO,UAAUE,iBAAiB,SAAUtB,KAAKqnC,UAGrD,SACLrnC,KAAK2O,QACL3O,KAAKuP,WAAWnO,UAAUyM,oBAAoB,SAAU7N,KAAKqnC,UAGxD,QACLrnC,KAAKsuB,cAAc3f,QAGb,kBAAkBqiB,GAExB,GADcA,EAAIvd,cAAc,SAE9B,OAwDFzT,KAAKsuB,cAAc/kB,KAAK,CAACynB,MAAKvnB,KAnDjB,KACX,MAAMsQ,EAAQiX,EAAI9pB,QAAQ6S,MACpBF,EAAM,IAAeC,OAAOC,GA4ClC,OA1CgB/Z,KAAK00F,cAAc/wF,KAAK,KACtC,MASMyG,EATM21C,GAAU,CACpBlmC,MACAzY,UAAW4vB,EACX1C,cAAe,KAEf2C,MAAOjxB,KAAKixB,MACZivB,QAAQ,IAGU98C,YAyBpB,OAxBAgH,EAAQu9B,QAAQ,KACd,MAAM1uB,EAAQ+X,EAAIvd,cAAc,SAEhCud,EAAI7rB,MAAM4tD,QAAU,GACpB,MAAMrkC,EAAMsC,EAAIvd,cAAc,OAC9Bib,GAAOA,EAAIxuB,UAAUW,IAAI,QAEtBoY,IAAUA,EAAMlY,eACjB+O,WAAW,KACTmJ,EAAMoB,IAAM,GACZpB,EAAMxP,OACa+4C,EAAA,EAAqBsyC,cAAc77E,GAC3C1O,QAAQnB,IACjBo5C,EAAA,EAAqBuyC,eAAe3rF,GAAM,GAAM,MAEjD,GAIDpJ,KAAKsuB,cAAcsmE,YAAYC,UAAU7jE,IAC3ChxB,KAAK20F,oBAAoB3jE,KAItB5mB,OAgDN,IAAIyP,EAAiB6mB,EAAW1gC,KAAK+a,S,MAC1C,IAAIk6E,EAAWp7E,EAAIkF,EACfm2E,EAAYr7E,EAAI6F,EACjBw1E,EA5JQ,MA6JTD,GA7JS,IA6JWC,EACpBA,EA9JS,KAiKX,MAAMC,EAAetwF,KAAKC,IAlKP,IADT,IAmK2CmwF,GAC/C/xF,EAAO,OAAAkyF,GAAA,GAAeH,EAAUC,EAAWC,EAlKtC,KAiLLnkE,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,MAAO,sBACzBmwB,EAAI7rB,MAAM3B,MAAQN,EAAKM,MAAQ,KAC/BwtB,EAAI7rB,MAAM4tD,QAAU,IAEpB/hC,EAAI9pB,QAAQ6S,MAAQ,GAAKF,EAAI9G,GAE7B2tB,EAASr/B,OAAO2vB,GAGhBhxB,KAAKsuB,cAAcmhB,QAAQze,GAI3B,MAAM8wB,EAAW,IAAeC,SAASloC,GAAK,GAG9C,IAAI6U,IADoBozB,IAGtBpzB,EAAM,IAAIygB,MACVzgB,EAAIxuB,UAAUW,IAAI,gBAEdihD,EAAS5nC,aAAaI,KACxBwnC,EAAS13C,QAAQzG,KAAK,KACpB+qB,EAAIrU,IAAMynC,EAAS5nC,aAAaI,OAKtC,MAAM8sC,EAAc,KACf14B,IACDsC,EAAI3vB,OAAOqtB,GACXsC,EAAI7rB,MAAM4tD,QAAU,MAID,QAAtB,EAAAjR,aAAQ,EAARA,EAAU5nC,oBAAY,eAAEI,KAAM,OAAA2oC,GAAA,GAAmBv0B,EAAKozB,EAAS5nC,aAAaI,IAAK8sC,GAAeA,KC1NtF,MAAM,GAGnB,OACEpnD,KAAK2R,QAAUhR,SAASg2C,eAAe,gBACvC,MAAM0+C,EAAgBr1F,KAAK2R,QAAQsa,kBACnCopE,EAAc/zF,iBAAiB,QAAS,GAAkBw1D,cAE1D,MAAMxzB,EAAS,IAAI,IAAWtjC,KAAK2R,QAAS,QACtC2jF,EAAU,IAAI,GAAYD,EAAeE,GAAuBjyD,GAChElZ,EAAY,aAAapqB,KAAK2R,SAAS,GAE7C,KAAWipB,UAAU,wBAAyB,CAACq9B,KAAM,MAAMt0D,KAAMoM,IAGlD,uBAAVA,EAAI3E,GACL2E,EAAI2wC,KAAKn2C,QAAQ,CAACsP,EAAK7R,KACrB+H,EAAI2wC,KAAK14C,GAAO6R,EAAM,IAAeo2D,QAAQp2D,GAE7Cy7E,EAAQz0F,IAAIgZ,KAIhBuQ,EAAU9lB,WAGZ,GAAkBkxF,uBAAuBF,EAAQhnE,cAAegnE,EAAQX,qBAExE30F,KAAKgS,KAAO,KAGd,Y,2SCpBK,MAAM,GAIX,YAAoByjF,EAA6CxkE,GAA7C,KAAAwkE,uBAA6C,KAAAxkE,QAFzD,KAAAykE,aAAoC,IAAI/tF,IA8CxC,KAAAguF,wBAA0B,CAAC3kE,EAAkB4c,KAEnC4U,EAAA,EAAqBsyC,cAAc9jE,GAC3CzmB,QAAQkvE,IACV7rC,EAGF4U,EAAA,EAAqBuyC,eAAetb,GAAQ,GAF5Cj3B,EAAA,EAAqBuyC,eAAetb,GAAQ,GAAM,MAOhD,KAAAub,kBAAqBhkE,IAC3B,MAAMjX,EAAQiX,EAAI9pB,QAAQ6S,MACpBF,EAAM,IAAeC,OAAOC,GAE5B7W,EAAOilB,EAAA,EAAWqvB,OAAOi8B,WAAWjwE,MAIpC4G,EAAU2mB,GAAY,CAC1BlX,MACAmX,IAAKA,EACLxtB,MAAON,EACPO,OAAQP,EACRorB,cAAe,KACf2C,MAAOjxB,KAAKixB,MACZs1B,WAAW,EACXniD,MAAM,EACNd,MAAM,IAYR,OATA8G,EAAQzG,KAAK,KAEX3D,KAAK21F,wBAAwB3kE,EAAKhxB,KAAKsuB,cAAcsmE,YAAYC,UAAU7jE,MAOtE5mB,GAGF,KAAAuqF,oBAAuB3jE,IAC5B,MAAMjX,EAAQiX,EAAI9pB,QAAQ6S,MACpBF,EAAM,IAAeC,OAAOC,GAIlC/Z,KAAK21F,wBAAwB3kE,GAAK,GAElCA,EAAIxiB,UAAY,GAChBxO,KAAK41F,cAAc/7E,EAAKmX,IAhGxBhxB,KAAKsuB,cAAgB,IAAI,SAAoBjmB,EAAW,CAACqS,EAAQkzB,KAC3DA,GACF5tC,KAAK20F,oBAAoBj6E,KAKxB,QACL1a,KAAKsuB,cAAc3f,QAGd,cAAckL,EAAiBmX,EAAsB5C,GAoB1D,OAnBI4C,KACFA,EAAMrwB,SAASC,cAAc,QACzBV,UAAUW,IAAI,YAAa,iBAE5BgZ,EAAIwvC,UACLrpD,KAAK61F,mBAAmB7kE,IAK5BD,GAAY,CACVlX,MACAmX,MACA1C,cAAetuB,KAAKy1F,qBACpBxkE,MAAOjxB,KAAKixB,MACZs1B,UAAW1sC,EAAIwvC,SACfj7B,iBAGK4C,EAGF,mBAAmBA,GACxBhxB,KAAK01F,aAAa70F,IAAImwB,GAEtBhxB,KAAKsuB,cAAcmhB,QAAQ,CACzBze,MACAvnB,KAAMzJ,KAAKg1F,qBA6DF,MAAM,GAArB,cAIU,KAAAzf,YAGH,GAGG,KAAAugB,eAA+B,GAM/B,KAAAtiC,SAAU,EAEV,KAAAuiC,kBAAgE,GAMxE,aAAaC,EAA0BC,EAA2C,GAAI7rF,EAAgCpJ,GAGpH,MAAMgzF,EAAWrzF,SAASC,cAAc,OACxCozF,EAAS9zF,UAAUW,IAAI,iBAAkB,kBAEzC,MAAMkzF,EAAWpzF,SAASC,cAAc,OAoCxC,OAnCAmzF,EAAS7zF,UAAUW,IAAI,kBAEpBo1F,IAC4B,iBAApB,EAA8BlC,EAASvlF,UAAYynF,EACvDlC,EAAS1yF,OAAO40F,IAGvBD,EAAY30F,OAAO0yF,EAAUC,GAE7Bh0F,KAAKs0F,kBAAkBG,2BAA2BuB,GAElDh2F,KAAK+1F,kBAAkBxsF,KAAK,CAACwR,QAASi7E,EAAah1F,YAEnDoJ,EAAQzG,KAAKgmD,IACXA,EAAUp/C,QAAQsP,IAEhBm6E,EAAS3yF,OAAOrB,KAAKk2F,qBAAqBN,cAAc/7E,MAGvD7Z,KAAK+1F,kBAAkBp0F,SACxB3B,KAAK+1F,kBAAkBxrF,QAAQ,EAAEwQ,UAAS/Z,cACrCA,EACEhB,KAAKm2F,UAAUp1F,eAChBf,KAAKmzE,YAAYnyE,QAAQ+Z,GACzB/a,KAAKmzE,YAAYnyE,QAAQhB,KAAKm2F,YAE9Bn2F,KAAKmzE,YAAYnyE,QAAQ+Z,GAEtB/a,KAAKmzE,YAAY9xE,OAAO0Z,KAGjC/a,KAAK+1F,kBAAkBp0F,OAAS,KAI7B,CAACoyF,YAGJ,iBAAiBv5E,EAA4BxZ,GAAU,G,0CAC3D,MAAMg1F,EAAcr1F,SAASC,cAAc,OAC3Co1F,EAAY91F,UAAUW,IAAI,oBAC1Bm1F,EAAY9uF,QAAQ6L,GAAK,GAAKyH,EAAIzH,GAClCijF,EAAY9uF,QAAQ4oE,YAAc,GAAKt1D,EAAIs1D,YAE3C,MAAMpsD,EAAS/iB,SAASC,cAAc,UACtC8iB,EAAOxjB,UAAUW,IAAI,WAAY,4BAEjCb,KAAKu1E,YAAY/6D,EAAIzH,IAAM,CACzBqjF,SAAUJ,EACV5iF,IAAKsQ,GAGJ1iB,EACDhB,KAAKotD,KAAKnsD,aAAayiB,EAAQ1jB,KAAKotD,KAAKnhC,kBAAkB9qB,aAE3DnB,KAAKotD,KAAK/rD,OAAOqiB,GAKnB,MAAMtZ,EAAU,KAAmBq/C,cAAcjvC,GACjDxa,KAAKq2F,aAAaL,EAAa,IAAkBzpE,cAAc/R,EAAI9I,OAAQtH,EAAQzG,KAAK+lD,GAAcA,EAAWC,WAA4B3oD,SACpHoJ,EAIzB8+C,GAAoB,CAClB1uC,MACApZ,UAAWsiB,EACXuN,MAAOskE,GACPjnE,cAAe,GAAkBA,cACjC9qB,MAAO,GACPC,OAAQ,GACRF,UAAU,OAId,OACEvD,KAAK2R,QAAUhR,SAASg2C,eAAe,oBAGvC32C,KAAKm2F,UAAYx1F,SAASC,cAAc,OACxCZ,KAAKm2F,UAAUj2F,UAAUW,IAAI,mBAAoB,mBAEjD,IAAIy1F,EAAct2F,KAAK2R,QAAQ0lC,uBAC/Br3C,KAAKotD,KAAOkpC,EAAYrqE,kBAExB,IAAIsqE,EAAa,IAAI,IAAYD,GAEjCt2F,KAAKmzE,YAAcxyE,SAASC,cAAc,OAC1CZ,KAAKmzE,YAAYjzE,UAAUW,IAAI,uBAC/Bb,KAAK2R,QAAQtQ,OAAOrB,KAAKmzE,aAmBzBvmE,EAAA,EAAUtL,iBAAiB,qBAAuBvB,IAChD,MAAMya,EAA6Bza,GAE/BC,KAAKu1E,YAAY/6D,EAAIzH,KAAO/S,KAAKwzD,SACnCxzD,KAAKy1E,iBAAiBj7D,GAAK,KAI/B5N,EAAA,EAAUtL,iBAAiB,mBAAqBvB,IAC9C,MAAMya,EAA6Bza,EAEnC,GAAGC,KAAKu1E,YAAY/6D,EAAIzH,KAAO/S,KAAKwzD,QAAS,CAC3C,MAAMnoC,EAAWrrB,KAAKu1E,YAAY/6D,EAAIzH,IACtCsY,EAAS+qE,SAAS9xF,SAClB+mB,EAASjY,IAAI9O,gBACNtE,KAAKu1E,YAAY/6D,EAAIzH,OAIhC/S,KAAKmzE,YAAY7xE,iBAAiB,QAAUvB,IAC1C,MAAM2a,EAAS3a,EAAE2a,OACjB,GAAG,OAAAoQ,GAAA,GAAgBpQ,EAAQ,kBAA3B,CACE,MAAM5Y,EAAK,OAAAw+B,GAAA,GAAgB5lB,EAAQ,WACnC,IAAI,GAAc,CAAC3H,GAAIjR,EAAGoF,QAAQ6L,GAAI+8D,YAAahuE,EAAGoF,QAAQ4oE,cAAc1yC,YAI9E,GAAkB05B,aAAa/2D,KAGjC,MAAM2oD,EAAY,CAACv5B,GAAS,KAC1BviB,EAAA,EAAU0F,cAAc,oBAAqB6c,IAG/CnvB,KAAKsjC,OAAS,IAAI,IAAWtjC,KAAK2R,QAAS,YAC3C3R,KAAKsjC,OAAO7zB,oBAAoBzP,KAAKmzE,aACrCnzE,KAAKsjC,OAAOkR,mBAAqB,KAC/BkU,KAGF,GAAkBpnD,iBAAiB,SAAU,KAC3ConD,GAAU,KAGZ,GAAkBpnD,iBAAiB,SAAU,KAC3ConD,MAGF1oD,KAAKs0F,kBAAoB,GAAkBD,YAAYr0F,KAAKotD,KAAMptD,KAAKsjC,OAAQizD,GAAYjC,kBAE3F,MAAMlqE,EAAY,aAAapqB,KAAK2R,SAAS,GAE7CtM,QAAQC,IAAI,CACV,KAAmBkxF,oBAAoB7yF,KAAKyyF,IAC1Cp2F,KAAK81F,eAAiBM,EAASA,SAASzwF,MAAM,EAAG,IAIjD3F,KAAKu1E,YAAoB,OAAI,CAC3B6gB,SAAUp2F,KAAKm2F,UACf/iF,IAAKpT,KAAKotD,KAAKnhC,mBAGjB7B,EAAU9lB,SACV,MAAM,SAACyvF,GAAY/zF,KAAKq2F,aAAar2F,KAAKm2F,UAAW,GAAI9wF,QAAQ6E,QAAQlK,KAAK81F,iBAAiB,GAC/F/B,EAAS1yF,OAAO,YAAK,sBAGvB,KAAmBq0E,iBAAiB/xE,KAAMoM,IACxCqa,EAAU9lB,SAEV,IAAI,IAAIkW,KAAQzK,EAAgD6lE,KAC9D51E,KAAKy1E,iBAAiBj7D,OAGzBmtB,QAAQ,KACT3nC,KAAKwzD,SAAU,EACf9K,MAGF1oD,KAAKk2F,qBAAuB,IAAI,GAAqB,GAAkB5nE,cAAeinE,IAEtF,GAAkBC,uBAAuBx1F,KAAKk2F,qBAAqB5nE,cAAetuB,KAAKk2F,qBAAqBvB,qBAU5G30F,KAAKgS,KAAO,KAGd,kBAAkB6H,G,MAGhB,GAFA,KAAmB48E,kBAAkB58E,KAEnB,QAAd,EAAA7Z,KAAKm2F,iBAAS,eAAEp1F,eAClB,OAGF,IAAIiwB,EAAMhxB,KAAKm2F,UAAU1iF,cAAc,iBAAiBoG,EAAI9G,QACxDie,IACFA,EAAMhxB,KAAKk2F,qBAAqBN,cAAc/7E,IAGhD,MAAM1Q,EAAQnJ,KAAKm2F,UAAU1iF,cAAc,mBAC3CtK,EAAMnI,QAAQgwB,GAEX7nB,EAAMsF,kBAAoB,IAC1BtC,MAAMC,KAAKjD,EAAMonB,UAA4B5qB,MAAM,IAAI4E,QAAQzI,GAAMA,EAAGwC,UAI7E,Y,2SCiBF,MAAM,GAAuB,IAvXtB,MAAP,cACU,KAAAoyF,cAAgE,GAChE,KAAAC,QAKJ,GAEG,YAAYC,GACjB,MAAiB,aAAVA,EAAIxrF,EAAmB,CAC5BA,EAAG,gBACHsM,IAAKk/E,EAAIl/E,IACTG,KAAM++E,EAAI/+E,KACVg/E,gBAAiBD,EAAIC,iBACnB,CACFzrF,EAAG,sBAIA,iBAAiBH,EAAgB6rF,EAAc1nF,EAAQ,GAAIklB,EAAS,GAAIsiE,GAC7E,OAAO,KAAgBh8D,UAAU,+BAAgC,CAC/DwpC,IAAK,IAAgBrE,aAAa+2B,GAClCxwD,KAAM,IAAgB2wC,iBAAiBhsE,GACvCmE,QACA2G,UAAW6gF,EAAM52F,KAAK+2F,YAAYH,QAAOvuF,EACzCisB,UACC,CAAmB0iE,UAAW,EAAGC,YAAY,IAAOtzF,KAAKuzF,IAC1D,MAAMC,EAAUD,EAAWE,SAoB3B,OAdAF,EAAW10D,QAAQj4B,QAAQD,IACT,yBAAbA,EAAOc,IACLd,EAAO3J,WACR2J,EAAO3J,SAAW,IAAesvE,QAAQ3lE,EAAO3J,WAG/C2J,EAAOnC,QACRmC,EAAOnC,MAAQ,IAAiBkvF,UAAU/sF,EAAOnC,SAIrDnI,KAAK02F,cAAc12F,KAAKs3F,YAAYH,EAAS7sF,EAAOyI,KAAOzI,IAGtD4sF,IAIJ,YAAYC,EAA4DI,GAC7E,OAAOJ,EAAU,IAAMI,EAGjB,eAAeT,GACrB,IAAgBv8B,YAAY,eAAe52D,KAAM6zF,IAC/C,MAAMC,EAAYX,EAAMvrE,WAClBrG,EAAQsyE,EAASp8E,UAAUs8E,GAAWA,EAAQ3kF,KAAO0kF,GAC3D,IAAIC,EAEFA,GADY,IAAXxyE,EACSsyE,EAAStyE,GAET,CACRnS,GAAI0kF,EACJE,OAAQ,KAIVD,EAAQC,OACV,OAAA1rC,GAAA,GAA2BurC,EAAUE,EAAS,UAE9Cx+D,EAAA,EAAgB0+D,qBAAqB,mBAMlC,WAAWhlC,EAAoBkkC,EAAce,GAGlD,OAFA73F,KAAK22F,QAAQG,GAAS,CAAC7rF,OAAQ2nD,EAAYnW,KAAMC,KAAKC,OACtD/vC,EAAA,EAAU0F,cAAc,gBAAiB,CAACrH,OAAQ6rF,EAAMvrE,aACjD,IAAmBusE,SAAShB,OAAOzuF,EAAWwvF,GA8G1C,kBAAkBf,G,0CAC7B,MAAM1yB,EAAM,IAAgB54B,QAAQsrD,GACpC,IAAI1yB,IAAQA,EAAI7lD,OAAO6lD,MAAQA,EAAI2zB,uBACjC,OAGF,MAAMC,EAAWh4F,KAAK22F,QAAQG,GAC9B,OAAGkB,WACMh4F,KAAK22F,QAAQG,GAChBp6C,KAAKC,MAAQq7C,EAASv7C,KAAQ,MACzBu7C,EAAS/sF,YAHpB,KAQK,kBAAkBA,EAAgBqE,EAAkBwnF,EAAc1nF,GACvExC,EAAA,EAAU0F,cAAc,gBAAiB,CAACrH,SAAQqE,aAClD,KAAiB2oF,SAAShtF,EAAQqE,EAAU,IAAM,IAAgBk8B,QAAQsrD,GAAOp8D,SAAW,IAAMtrB,GAG7F,oBAAoBnE,EAAgBJ,EAAa6Y,GACtD,OAAO,KAAgBkX,UAAU,gCAAiC,CAChE0L,KAAM,IAAgB2wC,iBAAiBhsE,GACvC09C,OAAQ,IAAsBC,mBAAmB/9C,GACjDm9C,KAAMtkC,EAAOskC,MACZ,CAAmBgvC,UAAW,EAAGC,YAAY,IAAOtzF,KAAMu0F,IACtB,iBAA3BA,EAAenwF,SAAwBmwF,EAAenwF,QAAQpG,QACtEg4B,GAAM,IAAkBka,aAAaqkD,EAAenwF,QAAS,CAACowF,SAAS,EAAMC,cAAc,OAyB1F,iBAAiBntF,EAAgB6rF,EAAcuB,EAA2B34F,EAY5E,I,MACH,MAAM44F,EAAet4F,KAAK02F,cAAc2B,GACxC,IAAIC,EACF,OAGFt4F,KAAKu4F,eAAezB,GACpB,MAAMh3B,EAAWu4B,EAAkBh1C,MAAM,KACnCm1C,EAAU14B,EAASt2D,QACnBivF,EAAW34B,EAAS10C,KAAK,KAQ/B,GAPA1rB,EAAQ2mF,SAAWyQ,EACnBp3F,EAAQy3F,QAAUqB,EAClB94F,EAAQ63F,SAAWkB,EAChBH,EAAaI,aAAaC,eAC3Bj5F,EAAQk5F,YAAcN,EAAaI,aAAaC,cAGf,yBAAhCL,EAAaI,aAAattF,EAC3B1L,EAAQw+C,SAAWo6C,EAAaI,aAAax6C,SAC7C,IAAmB26C,SAAS5tF,EAAQqtF,EAAaI,aAAa3wF,QAASrI,OAClE,CACL,IACIo5F,EADAz7D,EAAU,GAEd,MAAM07D,EAAcT,EAAaI,aACjC,OAAOK,EAAY3tF,GACjB,IAAK,4BAGH,GAFAiyB,EAAU07D,EAAYhxF,QAEA,yBAAnBuwF,EAAaltF,EAA8B,CAC5C,MAAM,SAACzK,EAAQ,MAAEwH,GAASmwF,EAExBQ,EADCn4F,EACY,IAAeq4F,cAAcr4F,GAE7B,IAAiBq4F,cAAc7wF,GAIhD,MAGF,IAAK,2BACH2wF,EAAa,CACX1tF,EAAG,qBACH2K,UAAW/V,KAAK+2F,YAAYgC,EAAYnC,MAG1Cl3F,EAAQu5F,SAAWF,EAAYnC,IAE/B,MAGF,IAAK,6BACHkC,EAAa,CACX1tF,EAAG,kBACH2K,UAAW/V,KAAK+2F,YAAYgC,EAAYnC,KACxCllF,MAAOqnF,EAAYrnF,MACnBsE,QAAS+iF,EAAY/iF,QACrBkjF,SAAUH,EAAYG,SACtBC,SAAUJ,EAAYI,SACtBC,WAAYL,EAAYK,YAG1B15F,EAAQu5F,SAAWF,EAAYnC,IAE/B,MAGF,IAAK,+BACHkC,EAAa,CACX1tF,EAAG,oBACHiuF,aAAcN,EAAYM,aAC1B3tD,WAAYqtD,EAAYrtD,WACxBC,UAAWotD,EAAYptD,UACvB2tD,MAAOP,EAAYO,OAOrBR,IACFA,EAAa,CACX1tF,EAAG,sBACH/K,KAAMi4F,EAAaj4F,KACnB+f,UAAWk4E,EAAa5mF,QACmC,QAAxD,EAAA4mF,EAAiD3mF,eAAO,eAAE2I,MAC1Dg+E,EAAiDh+E,IACpDpX,KAAM,EACNsmB,SAAU,CAAC+vE,QAAS,GAAIrqE,MAAO,KAInC,IAAmBsqE,UAAUvuF,EAAQ6tF,EAAYp5F,MA4BvD,OAAmB,KAAe+5F,qBAAuB,IAC1C,U,uSC9XA,MAAM,WAAmB,EAAxC,c,oBAIU,KAAAC,WAAa,GACb,KAAA3wF,WAAY,EA2BZ,KAAA4wF,YAAe55F,IACrB,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,OACzC,IAAIA,EAAQ,OAEZ,MAAMq4D,EAASr4D,EAAOxT,QAAQ6S,MAC3B,GAAa6W,KAAKxwB,MAAM4yE,wBAAwBD,GAC9C5qD,EAAA,EAAWC,UACZ,GAAgB1V,kBAGlBnC,QAAQgN,KAAK,oBAAqBw1D,IA9B5B,OACR/yE,KAAKoB,UAAU2R,GAAK,wBAEpB/S,KAAKmgF,YAAc,IAAI,EAAY,kBAAoBx7E,IACrD3E,KAAKuN,QACLvN,KAAK2yF,OAAOhuF,KAGd3E,KAAK0R,MAAM0b,YAAYptB,KAAKmgF,YAAY/+E,WAExCpB,KAAK45F,QAAUj5F,SAASC,cAAc,OACtCZ,KAAK45F,QAAQ15F,UAAUW,IAAI,gBAC3B,YAAiBb,KAAK45F,QAAS55F,KAAK25F,YAAa,CAAC9nF,eAAgB7R,KAAK6R,iBAEvE7R,KAAKuP,WAAWlO,OAAOrB,KAAK45F,SAE5B55F,KAAKs1F,QAAU,IAAI,GAAYt1F,KAAK45F,QA9BjB,cA8B0C55F,KAAKuP,YAkB7D,UACLvP,KAAKuP,WAAWK,iBAAmB,OAG9B,sBAKL,OAJA5P,KAAKuN,QACLvN,KAAK45F,QAAQprF,UAAY,GACzBg0C,EAAA,EAAqBq3C,qBAAgBxxF,EAvDlB,eAwDnBrI,KAAKmgF,YAAY77E,SACV3E,MAAM4S,sBAGP,QACNvS,KAAKkP,cAAgB,KACrBlP,KAAK05F,WAAa,GAClB15F,KAAK+I,WAAY,EACjB/I,KAAKs1F,QAAQ3mF,QAGR,OACL,MAAMnB,EAAM7N,MAAM+U,OAQlB,OAPA,GAAgBsiC,eAAc,GAAMrzC,KAAK,KACvC3D,KAAK2yF,OAAO,IAAI,GAEhB3yF,KAAKuP,WAAWK,iBAAmB,KACjC5P,KAAK2yF,OAAO3yF,KAAKmgF,YAAYx7E,OAAO,MAGjC6I,EAGI,OAAO4B,EAAe0qF,GAAY,G,0CAC7C,IAAG95F,KAAKkP,gBAAiBlP,KAAK+I,UAA9B,CAEI/I,KAAK+5F,eACP/5F,KAAK+5F,oBAAsB,IAAgBC,gBAAgB,QAAQjnF,GAAGwY,UAAS,IAGjF,IACEvrB,KAAKkP,cAAgB,GAAqB+qF,iBAAiB,KAAcj6F,KAAK+5F,aAAc3qF,EAAOpP,KAAK05F,YACxG,MAAM,QAAEl3D,EAAO,YAAE0W,SAAsBl5C,KAAKkP,cAE5C,GAAGlP,KAAKmgF,YAAYx7E,QAAUyK,EAC5B,OAGFpP,KAAKkP,cAAgB,KACrBlP,KAAK05F,WAAaxgD,EACf4gD,IACD95F,KAAK45F,QAAQprF,UAAY,IAGxBg0B,EAAQ7gC,OACT6gC,EAAQj4B,QAASD,IACC,yBAAbA,EAAOc,GAAgCd,EAAO3J,UAC/CX,KAAKs1F,QAAQz0F,IAAIyJ,EAAO3J,YAI5BX,KAAK+I,WAAY,EAGnB/I,KAAKuP,WAAW83B,WAChB,MAAM/2B,GAGN,MAFAtQ,KAAKkP,cAAgB,KACrBqB,QAAQC,MAAM,sBAAuBF,GAC/BA,QC/GG,MAAM,WAAuB,EAKhC,OACRtQ,KAAKoB,UAAU2R,GAAK,qBACpB/S,KAAKoB,UAAUlB,UAAUW,IAAI,sBAE7Bb,KAAKsuB,cAAgB,IAAI,IAEzBtuB,KAAKmgF,YAAc,IAAI,EAAY,gCAAkCx7E,IACnE3E,KAAK2yF,OAAOhuF,KAGd3E,KAAK0R,MAAM0b,YAAYptB,KAAKmgF,YAAY/+E,WAExCpB,KAAKk6F,QAAUv5F,SAASC,cAAc,OACtCZ,KAAKk6F,QAAQh6F,UAAUW,IAAI,gBAC3Bb,KAAKuP,WAAWlO,OAAOrB,KAAKk6F,SAE5B,YAAiBl6F,KAAKk6F,QAAUn6F,IAC9B,MAAM8mD,EAAU,OAAA/7B,GAAA,GAAgB/qB,EAAE2a,OAAQ,uBAC1C,GAAGmsC,EAAS,CACV,MAAM9sC,EAAQ8sC,EAAQ3/C,QAAQ6S,MAE9B,YADA,GAAa6W,KAAKxwB,MAAM4yE,wBAAwBj5D,GAIlD,MAAMW,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,eACzC,IAAIA,EAAQ,OAEZ,MAAM3H,EAAK2H,EAAOxT,QAAQwiD,WACpBomB,EAAcp1D,EAAOxT,QAAQ4oE,YAE7BpsD,EAAS,OAAAoH,GAAA,GAAgB/qB,EAAE2a,OAAQ,sBACtCgJ,GACD3jB,EAAE0H,iBACF1H,EAAE80D,cAAe,EAEjBnxC,EAAOnjB,aAAa,WAAY,QAEhC,KAAmBkpD,cAAc,CAAC12C,KAAI+8D,gBAAcnsE,KAAK8qB,IACvD,KAAmB+kD,iBAAiB/kD,EAAKjU,KAAK7W,KAAKiK,IAC9CA,IACD8V,EAAO+M,YAAc,GACrB/M,EAAOriB,OAAO,YAAKotB,EAAKjU,IAAI+4D,eAAiB,uBAAyB,uBACtE7vD,EAAOxjB,UAAUC,OAAO,SAAUsuB,EAAKjU,IAAI+4D,mBAE5C5rC,QAAQ,KAETjkB,EAAOinB,gBAAgB,iBAI3B,KAAmB8e,cAAc,CAAC12C,KAAI+8D,gBAAcnsE,KAAK8qB,IACvD,IAAI,GAAcA,EAAKjU,KAAK4iB,UAG/B,CAACvrB,eAAgB7R,KAAK6R,iBAGpB,sBAGL,OAFA7R,KAAKk6F,QAAQ1rF,UAAY,GACzBg0C,EAAA,EAAqBq3C,qBAAgBxxF,EAAW,mBACzC1I,MAAM4S,sBAGR,UAAUiI,GAEf,MAAMwW,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,eAElB,MAAM0Q,EAAS5Q,SAASC,cAAc,OACtC2Q,EAAOrR,UAAUW,IAAI,sBAErB,MAAMuY,EAAUzY,SAASC,cAAc,OACvCwY,EAAQlZ,UAAUW,IAAI,uBACtBuY,EAAQ5K,UAAY,uCAEpB,OAAAse,EAAA,GAAa1T,EAAQ6S,kBAAmB,IAAkBM,cAAc/R,EAAI9I,QAE5E,MAAMyoF,EAAWx5F,SAASC,cAAc,OACxCu5F,EAASj6F,UAAUW,IAAI,qBACvBs5F,EAAS94F,OAAO,YAAK,WAAY,CAACmZ,EAAIlS,SACtC8Q,EAAQ/X,OAAO84F,GAEf,MAAMz2E,EAAS/iB,SAASC,cAAc,UACtC8iB,EAAOxjB,UAAUW,IAAI,cAAe,oBAAqB,sBACzD6iB,EAAOriB,OAAO,YAAKmZ,EAAI+4D,eAAiB,uBAAyB,uBAG9D/4D,EAAI+4D,gBACL7vD,EAAOxjB,UAAUW,IAAI,QAKvB0Q,EAAOlQ,OAAO+X,EAASsK,GAEvB,MAAMyvD,EAAcxyE,SAASC,cAAc,OAC3CuyE,EAAYjzE,UAAUW,IAAI,wBAE1B,MAAMyH,EAAQzD,KAAKC,IAAI,EAAG0V,EAAIlS,OAC9B,IAAI,IAAI1G,EAAI,EAAGA,EAAI0G,IAAS1G,EAAG,CAC7B,MAAMw4F,EAAaz5F,SAASC,cAAc,OAC1Cw5F,EAAWl6F,UAAUW,IAAI,uBAEzBsyE,EAAY9xE,OAAO+4F,GAGrB,KAAmB3wC,cAAcjvC,GAAK7W,KAAK6W,IAGzC,IAAI,IAAI5Y,EAAI,EAAGA,EAAI0G,IAAS1G,EAAG,CAC7B,MAAMovB,EAAMmiD,EAAY5iD,SAAS3uB,GAC3BiY,EAAMW,EAAImvC,UAAU/nD,GACb,kBAAViY,EAAIzO,GAIP2lB,GAAY,CACVlX,MACAmX,MACA1C,cAAetuB,KAAKsuB,cACpB2C,MAAO,kBAGP7sB,MAAM,EACNd,MAAM,EACNE,MAAO,GACPC,OAAQ,QA8BdutB,EAAI9pB,QAAQwiD,WAAa,GAAKlvC,EAAIzH,GAClCie,EAAI9pB,QAAQ4oE,YAAc,GAAKt1D,EAAIs1D,YACnC9+C,EAAI9pB,QAAQwK,MAAQ8I,EAAI9I,MAExBsf,EAAI3vB,OAAOkQ,EAAQ4hE,GAEnBnzE,KAAKk6F,QAAQ74F,OAAO2vB,GAGf,OACL,MAAMxjB,EAAM7N,MAAM+U,OAKlB,OAJA,GAAgBsiC,eAAc,GAAMrzC,KAAK,KACvC3D,KAAKq6F,mBAGA7sF,EAGF,iBACL,OAAO,KAAmB8sF,sBAAsB32F,KAAK42F,IAChDv6F,KAAKmgF,YAAYx7E,QAIpB41F,EAAcv6F,KAAKw6F,eAAe,GAAID,IAC1BhwF,QAAQiQ,IAClBxa,KAAKy6F,UAAUjgF,EAAIA,SAKjB,eAAepL,EAAemrF,GACpCA,EAAcA,EAAY50F,QAE1B,MAAM4qB,EAAWpkB,MAAMC,KAAKpM,KAAKk6F,QAAQ3pE,UAczC,OAbA,OAAA1oB,EAAA,GAAe0oB,EAAUzuB,IACvB,MAAMiR,EAAKjR,EAAGoF,QAAQwiD,WAChBxkC,EAAQq1E,EAAYn/E,UAAUs/E,GAAWA,EAAQlgF,IAAIzH,KAAOA,IAEpD,IAAXmS,EACDq1E,EAAYnyF,OAAO8c,EAAO,GACjB9V,GAAUtN,EAAGoF,QAAQwK,MAAM8xC,cAAcvkB,SAAS7vB,EAAMo0C,gBACjE1hD,EAAGwC,WAIPk+C,EAAA,EAAqBq3C,qBAAgBxxF,EAAW,mBAEzCkyF,EAGF,OAAOnrF,GACZ,OAAIA,EAIG,KAAmBurF,kBAAkBvrF,GAAO,GAAOzL,KAAK42F,IAC1Dv6F,KAAKmgF,YAAYx7E,QAAUyK,IAM9BmrF,EAAcv6F,KAAKw6F,eAAeprF,EAAOmrF,IAC7BhwF,QAAQiQ,IAClBxa,KAAKy6F,UAAUjgF,EAAIA,SAZdxa,KAAKq6F,kB,2SC5NH,MAAM,WAAsB,IAWzC,YAAY36F,GAGVC,OAAM,GANE,KAAAi7F,YAAa,EACb,KAAAC,QAAS,EAoCX,KAAAC,WAAc/6F,IAGpB,GADA+Q,aAAa9Q,KAAK+6F,iBACd/6F,KAAKg7F,WAAY,OAErB,MAAMC,EAAal7F,EAAUk7F,UAC1BA,GAAa,OAAA/qC,GAAA,GAAc+qC,EAAWj7F,KAAK+a,WAI9C/a,KAAK+6F,eAAiB74F,OAAO4N,WAAW,KACtC9P,KAAKG,QAAO,IA3DK,OA6Ed,KAAAA,OAAeo3C,GAAqB,mCAEzC,MAAM2jD,IAAkBl7F,KAAK+a,QAAQ5V,MAAMC,cAAsBiD,IAAXkvC,GAAyBA,EAC/E,GAAGv3C,KAAKgS,KAAM,CACZ,IAAGkpF,EAID,OAHAl7F,KAAKgS,OACLhS,KAAKgS,KAAO,KAMhB,GAAGkpF,IAAiBl7F,KAAKg7F,WAIzB,GAAIh7F,KAAK+a,QAAQ5V,MAAMC,cAAsBiD,IAAXkvC,GAAyBA,EAAQ,CACjE,MAAMxnC,EAAM/P,KAAKm7F,wBAAwB,cACnC91F,QAAQC,IAAIyK,GAElB/P,KAAK+a,QAAQ5V,MAAMC,QAAU,GACxBpF,KAAK+a,QAAQy1B,WAClBxwC,KAAK+a,QAAQ7a,UAAUW,IAAI,UAE3BiQ,aAAa9Q,KAAK+6F,gBAClB/6F,KAAK+6F,eAAiB74F,OAAO4N,WAAW,KACtC9P,KAAK46F,YAAa,EAClB56F,KAAKsS,cAAc,WAClB,KAAqB,EAxGH,UAqHrBtS,KAAKsS,cAAc,SAEnBtS,KAAK+a,QAAQ7a,UAAUoE,OAAO,UAE9BwM,aAAa9Q,KAAK+6F,gBAClB/6F,KAAK+6F,eAAiB74F,OAAO4N,WAAW,KACtC9P,KAAK+a,QAAQ5V,MAAMC,QAAU,OAC7BpF,KAAK46F,YAAa,EAClB56F,KAAKsS,cAAc,WAClB,KAAqB,EA9HH,QAiBvB,OAAAxJ,EAAA,GAAW9I,KAAMN,GAGZ,qBAAqBgkB,EAAqB7R,GAC/C,IAAI42C,GAAY,EACb,KACD,YAAiB/kC,EAAQ,KACpB+kC,GACDA,GAAY,EACZzoD,KAAKG,QAAO,IAEZH,KAAKG,UAEN,CAAC0R,mBAEJA,EAAehR,IAAI6iB,EAAnB7R,CAA2B,YAAc9R,IAEpC0oD,IACD52C,EAAehR,IAAI6iB,EAAnB7R,CAA2B,WAAY7R,KAAK86F,YAC5CryC,GAAY,GAGd33C,aAAa9Q,KAAK+6F,gBAClB/6F,KAAK+6F,eAAiB74F,OAAO4N,WAAW,KACtC9P,KAAKG,QAAO,IA1CC,OA+DX,OACJ,OACFH,KAAK+a,QAAQqgF,WAAap7F,KAAK86F,WAC/B96F,KAAK+a,QAAQsgF,YAAet7F,IACvBC,KAAK46F,YAKR9pF,aAAa9Q,KAAK+6F,kBAyEjB,WACL,OAAO/6F,KAAK+a,QAAQ7a,UAAUuV,SAAS,W,2SCjIpC,MAAM8/E,GAAwB,qBAO9B,MAAM,WAA0B,GAoBrC,cACE51F,MAAM,CACJob,QAASpa,SAASg2C,eAAe,oBAb7B,KAAA2kD,OAAS,EA2IT,KAAAC,iBAAoBxoF,IACvB/S,KAAKs7F,QAAUvoF,IAIlByvC,EAAA,EAAqBq3C,iBAAgB,EAAMtE,IAE3Cv1F,KAAKs7F,MAAQvoF,EACb/S,KAAKw7F,aAAat7F,UAAUC,OAAO,OAAuB,IAAfH,KAAKs7F,OAChDt7F,KAAKy7F,UAAUv7F,UAAUC,OAAO,OAAuB,IAAfH,KAAKs7F,SAGvC,KAAAI,YAAc,KACpB,MAAM,OAACzwF,EAAM,SAAEqE,GAAY,GAAashB,KAClCL,EAAWvwB,KAAK27F,OAAOprE,SACvBqrE,EAAezvF,MAAMC,KAAKmkB,GAE1BsrE,EAAkB,IAAmBC,cAAc7wF,EAAQqE,EAAU,iBAC3EssF,EAAa,GAAGllE,gBAAgB,YAAamlE,GAE7C,MAAME,EAAc,IAAmBD,cAAc7wF,EAAQqE,EAAU,aACvEssF,EAAa,GAAGllE,gBAAgB,YAAaqlE,GAE7C,MAAMvkD,EAASx3C,KAAK27F,OAAOloF,cAAc,YACtC+jC,GAAiC,IAAvB,OAAA2T,GAAA,GAAW3T,IAAmBqkD,GAAoBE,GAC7D/7F,KAAKiS,UAAU,GAAG,IApJpBjS,KAAKsB,iBAAiB,OAAQ,IAAW,mCACpC,MAEE,OAAAkwD,GAAA,aACK,OAAAvtD,GAAA,GAAM,MAIbjE,KAAK+a,QAAQha,gBAAkB,GAAa6vB,KAAKxwB,MAAM47F,WACxD,GAAaprE,KAAKxwB,MAAM47F,UAAU36F,OAAOrB,KAAK+a,SAGhD/a,KAAKi8F,WAAaj8F,KAAKk8F,eAEvB,GAAkB5tE,cAAc+oC,OAEhC7U,EAAA,EAAqB25C,sBAAsB5G,QAG7Cv1F,KAAKsB,iBAAiB,SAAU,KAC9BkhD,EAAA,EAAqB45C,wBAAwB7G,IAC7C,GAAkBjnE,cAAc+tE,SAChC,GAAkB/tE,cAAcguE,UAEhCt8F,KAAKoB,UAAUlB,UAAUoE,OAAO,mBAGlCtE,KAAKsB,iBAAiB,QAAS,KAC7B,GAAkBgtB,cAAc+oC,OAIhC7U,EAAA,EAAqB25C,sBAAsB5G,IAC3C/yC,EAAA,EAAqBq3C,iBAAgB,EAAMtE,MAG7Cv1F,KAAKsB,iBAAiB,SAAU,KAE9BkhD,EAAA,EAAqB45C,wBAAwB7G,IAC7C,GAAkBjnE,cAAc+tE,SAChC,GAAkB/tE,cAAcguE,UAEhCt8F,KAAKoB,UAAUlB,UAAUoE,OAAO,iBAEhCtE,KAAKi8F,gBAAa5zF,IAIZ,OACRrI,KAAKu8F,SAAW,IAAI,GACpBv8F,KAAKw8F,YAAc,IAAI,GACvBx8F,KAAKy8F,QAAU,IAAI,GAEnBz8F,KAAKkS,KAAO,CACVwqF,EAAG18F,KAAKu8F,SACRI,EAAG38F,KAAKw8F,YACRI,EAAG58F,KAAKy8F,SAGVz8F,KAAKoB,UAAYpB,KAAK+a,QAAQtH,cAAc,oCAC5CzT,KAAK27F,OAAS37F,KAAK+a,QAAQtH,cAAc,eACzCzT,KAAKiS,UAAY,OAAAokD,EAAA,GAAer2D,KAAK27F,OAAQ37F,KAAKoB,UAAWpB,KAAKu7F,iBAAkB,KAClF,MAAMnoF,EAAMpT,KAAKkS,KAAKlS,KAAKs7F,OACxBloF,EAAIpB,MACLoB,EAAIpB,OAGNoB,EAAIb,qBAAuBa,EAAIb,sBAC/BiwC,EAAA,EAAqBq3C,iBAAgB,EAAOtE,MAG9Cv1F,KAAKw7F,aAAex7F,KAAK+a,QAAQtH,cAAc,sBAC/CzT,KAAKw7F,aAAal6F,iBAAiB,QAAS,KACxB,IAAftB,KAAKs7F,MACF,GAAgB99C,YAAY,KAC9B,IAAI,GAAe,IAAiB9oC,OAGlC,GAAgB8oC,YAAY,KAC9B,IAAI,GAAW,IAAiB9oC,SAKtC1U,KAAKy7F,UAAYz7F,KAAK+a,QAAQtH,cAAc,sBAC5CzT,KAAKy7F,UAAUn6F,iBAAiB,QAAUvB,I,MACxC,MAAMK,EAAQ,GAAawwB,KAAKxwB,MAAMy8F,cACX,QAAvB,EAAAz8F,EAAM+sB,iBAAiB,eAAEmlB,SAC3BlyC,EAAM64C,iBAAiB30C,SACflE,EAAM+sB,YACV/sB,EAAM+sB,UAAUsD,YAAY9uB,OAG9BvB,EAAM+sB,UAAUsD,YAAcrwB,EAAM+sB,UAAUsD,YAAY9qB,MAAM,GAAI,GAFpEvF,EAAM+sB,UAAU7oB,UAMpB,MAAM6e,EAAQ,IAAIsW,MAAM,QAAS,CAAC5I,SAAS,EAAMxG,YAAY,IAC7D,GAAauG,KAAKxwB,MAAMy8F,aAAavqF,cAAc6Q,GAGnD,OAAA6G,EAAA,GAAYjqB,KAGd,MAAM+8F,EAAiB,KAEjBC,EAAcD,EAAiB,EAAI,EAczC,OAZGA,GACA98F,KAAK27F,OAAOprE,SAAS,GAAmBrwB,UAAUW,IAAI,QAGxDb,KAAK27F,OAAOprE,SAASwsE,EAAc,GAAqB58D,QACtDngC,KAAKkS,KAAK6qF,GAAa/qF,MACxBhS,KAAKkS,KAAK6qF,GAAa/qF,OAGzBpF,EAAA,EAAUtL,iBAAiB,eAAgBtB,KAAK07F,aAChD17F,KAAK07F,cAEE/7F,MAAMqS,OA8HR,uBAAuBsc,EAAyCqmE,GACrE30F,KAAKsB,iBAAiB,QAAS,KAC7BgtB,EAAc+oC,SAGhBr3D,KAAKsB,iBAAiB,SAAU,KAC9B,MAAMuyF,EAAOvlE,EAAcsmE,YAAYoI,aAEvC,IAAI,MAAMhsE,KAAO6iE,EACfc,EAAoB3jE,GAGtB1C,EAAcsmE,YAAYqI,iBAG5Bj9F,KAAKsB,iBAAiB,SAAU,KAC9BgtB,EAAcgpC,qBAIX,gBACL,OAAOt3D,KAAKk8F,gBAAkBl8F,KAAKi8F,WAG7B,eACN,MAAMz5F,EAAM7B,SAASwB,eACrB,GAAGK,EAAI06F,YAAcv8F,SAASqB,gBAAkB,GAAa4uB,KAAKxwB,MAAMy8F,aACtE,OAAOr6F,EAAI26F,WAAW,IAzSZ,GAAA7uE,cAAgB,IAAI,IAgLpB,GAAA+lE,YAAc,CAACjnC,EAAmB9pB,EAAoBizD,EAA0BtgC,EAAS,KACrG,IAAImnC,GAAY,EAEhB,MAAM1uF,EAAaqE,GACdA,IAAOkjD,IAIV7I,EAAK78B,SAAS0lC,GAAQ/1D,UAAUoE,OAAO,UACvC8oD,EAAK78B,SAASxd,GAAI7S,UAAUW,IAAI,UAChCo1D,EAASljD,GAEF,GAGHuhF,EAAoB,IAAI3K,GAAkBrmD,EAAOliC,UAAW,CAACi8F,EAAO3iF,KAGxE,GAAG7V,KAAK+B,IAAIw2F,EAAW95D,EAAOliC,UAAU2uC,YAAc,EACpD,OAEAqtD,GAAY,EAGd,MAAME,EAAQ,OAAAnyC,GAAA,GAAWzwC,IACrB2iF,GAASC,IAIb5uF,EAAU4uF,GAEP/G,IACE+G,EAAQlwC,EAAK3+C,kBAAoB,EAClC8nF,EAAWn1F,UAAUm8F,WAA2B,IAAbD,EAAQ,GAE3C/G,EAAWn1F,UAAUm8F,WAAqB,GAARD,MA+BxC,OA1BAlwC,EAAK9rD,iBAAiB,QAAUvB,IAC9B,IAAI2a,EAAS3a,EAAE2a,OAGf,GAFAA,EAAS,OAAAoQ,GAAA,GAAgBpQ,EAAQ,6BAE7BA,EACF,OAGF,MAAM4iF,EAAQ,OAAAnyC,GAAA,GAAWzwC,GAMzB,IAAIhM,EAAU4uF,GACZ,OAGF,MACM3mC,GADWrzB,EAAO/D,SAAW+D,EAAOliC,WAAWmvB,SAAS+sE,GACpC3mC,UAAY,EAEtCrzB,EAAOliC,UAAU2uC,UAAYqtD,EAAWzmC,IAKnC,CAAC29B,oBAAmB5lF,cAGf,GAAAooD,aAAe,CAAC/2D,EAAoCy9F,GAAa,KAC7E,IAAI9iF,EAAS3a,EAAE2a,OAGf,GAFAA,EAAS,OAAAurB,GAAA,GAAUvrB,EAAQ,QAEvBA,EAAQ,OAAO,EAEnB,MAAMq4D,EAASr4D,EAAOxT,QAAQ6S,MAC9B,QAAIg5D,IAED,GAAaniD,KAAKxwB,MAAM4yE,wBAAwBD,OAAQ1qE,EAAWm1F,IAGjEC,GAAkBr8F,YACnBq8F,GAAkB7C,YAAa,EAC/B6C,GAAkBr8F,UAAUlB,UAAUW,IAAI,iBAC1C48F,GAAkBt9F,QAAO,KAGpB,IAEPoQ,QAAQgN,KAAK,oBAAqBw1D,IAC3B,KAoCb,MAAM0qB,GAAoB,IAAI,GAC9B,KAAeA,kBAAoBA,GACpB,U,cCnVA,SAF8C,oBAAxB,mBAAwC,MCE9D,OAFW,GCIX,SAASC,GACtB3iF,EACA4iF,EACAC,EACAn5E,EAAO1J,EAAQ2J,wBACfm5E,EAAeF,EAAgBj5E,yBAE/B,IAAKgU,IAAKolE,EAAaxtD,MAAOytD,EAAer4E,OAAQs4E,EAAgBr4E,KAAMs4E,GAAgBJ,EAG3F,GAAGD,EAAe,CAChB,MAAMM,EAASP,EAAgBlqF,cAAc,WAC7C,GAAGyqF,EAAQ,CAETJ,EADmBI,EAAOx5E,wBACDgB,QAI7B,GAAGjB,EAAKiU,KAAOslE,GACVv5E,EAAKiB,QAAUo4E,GACfr5E,EAAK6rB,OAAS2tD,GACdx5E,EAAKkB,MAAQo4E,EAChB,OAAO,KAGT,MAAMI,EAAW,CACfzlE,KAAK,EACL4X,OAAO,EACP5qB,QAAQ,EACRC,MAAM,EACNpB,SAAU,EACV65E,WAAY,GAIRr/E,EAAS,mBAAoB7c,OAASA,OAAOm8F,eAAiBn8F,OAC9Do8F,EAAcv/E,EAAEvb,OAASub,EAAEw/E,WAC3BC,EAAez/E,EAAEtb,QAAUsb,EAAE0/E,YAEnC,MAAO,CACLh6E,KAAM,CACJiU,IAAKjU,EAAKiU,IAAMolE,GAA+B,IAAhBA,GAAqBK,EAASzlE,KAAM,IAAQylE,EAAS55E,SAAUu5E,GAAer5E,EAAKiU,IAClH4X,MAAO7rB,EAAK6rB,MAAQytD,GAAiBA,IAAkBO,GAAeH,EAAS7tD,OAAQ,IAAQ6tD,EAASC,WAAYL,GAAiBt5E,EAAK6rB,MAC1I5qB,OAAQjB,EAAKiB,OAASs4E,GAAkBA,IAAmBQ,GAAgBL,EAASz4E,QAAS,IAAQy4E,EAAS55E,SAAUy5E,GAAkBv5E,EAAKiB,OAC/IC,KAAMlB,EAAKkB,KAAOs4E,GAAiC,IAAjBA,GAAsBE,EAASx4E,MAAO,IAAQw4E,EAASC,WAAYH,GAAgBx5E,EAAKkB,MAE5Hw4E,YAIHj8F,OAAew7F,eAAiBA,G,IClDrBgB,G,UCkBG,MAAM,WAA4B,KAC/C,YAAYzmC,EAAc0mC,GACxBh/F,MAAM,yBAA0B,aAAgB,CAAC,CAC/C65B,QAASmlE,EAAWpgF,OAAOqgF,eAAiB,qBAAwBD,EAAWpgF,OAAOmhE,UAAY,yBAA2B,uBAC7HtjD,SAAU,KACR,KAAWxB,UAAU,4BAA6B,CAACq9B,SAClDt0D,KAAMs+E,IACLpkB,GAAA,EAAkBghC,qBAAqB5c,GACvC,MACMh3E,EADQg3E,EAA4BrkB,MAAM,GAC5B7qD,GAAGwY,UAAS,GAChC3e,EAAA,EAAU0F,cAAc,gBAAiB,CAACrH,YACxCuF,IACgB,wBAAfA,EAAMnQ,MACPu5B,GAAS,CAACC,YAAa,4BAI1B,CAACmK,UAAU,EAAM1I,iBAAiB,EAAM34B,MAAM,IAEnD3C,KAAKuR,OAAOjN,SAeZ,MAAMsyB,EAAa,IAAI,GACvBA,EAAW12B,UAAUW,IAAI,cACzB+1B,EAAW4E,UAAW,EACI,UAAvBmjE,EAAWx2F,MAAMiD,GAClBuzF,EAAWx2F,MAAQ,IAAiBkvF,UAAUsH,EAAWx2F,OACzD8lB,GAAU,CACR7sB,UAAWw1B,EACX7uB,QAAS,KACTI,MAAOw2F,EAAWx2F,MAClBgmB,UAAW,IACXD,SAAU,IACVG,kBAAkB,IAEpBuI,EAAWzxB,MAAM3B,MAAQozB,EAAWzxB,MAAM1B,OAAS,IAEnD,IAAkBq7F,SAASloE,EAAY,MAAc,EAAO+nE,EAAWjtF,OAGzE,MAAMA,EAAQ/Q,SAASC,cAAc,OACrC8Q,EAAMxR,UAAUW,IAAI,cACpB,OAAAisB,EAAA,GAAapb,EAAO,IAAkB6a,cAAcoyE,EAAWjtF,QAG/D,MAAM6qB,EAAcoiE,EAAWpgF,OAAOmhE,UAChCqf,EAAc,YAAKxiE,EAAc,cAAgB,UAAW,CAAC,OAAAyiE,GAAA,GAAuBL,EAAWplC,sBAKrG,GAJAwlC,EAAY7+F,UAAUW,IAAI,2BAE1Bb,KAAK2C,KAAKtB,OAAOu1B,EAAYllB,EAAOqtF,GAEjCJ,EAAWpgF,OAAOqgF,eAAgB,CACnC,MAAMvhE,EAAU18B,SAASC,cAAc,OACvC,YAAMy8B,EAASd,EAAc,kCAAoC,iCACjEc,EAAQn9B,UAAUW,IAAI,0BAA2B,mBAEjDb,KAAK2C,KAAKtB,OAAOg8B,MDtFvB,SAAYqhE,GACV,yBACA,mCACA,iCACA,6BACA,+BACA,6CANF,CAAYA,QAAkB,KEIf,MAAM,GAWnB,YACUnvF,EACA9G,GADA,KAAA8G,aACA,KAAA9G,UAKV,gBACE,OAAOzI,KAAKuP,WAAWnO,UAGlB,WACL,MAAO,CACLw1D,aAAc52D,KAAK42D,aACnB7mB,UAAW/vC,KAAK+vC,UAChBkvD,aAAcj/F,KAAKi/F,cAIhB,OACL,MAAM,UAAClvD,EAAS,aAAE6mB,EAAY,aAAEqoC,GAAgBj/F,KAAKoB,UAIrDpB,KAAK42D,aAAeA,EACpB52D,KAAK+vC,UAAYA,EACjB/vC,KAAKi/F,aAAeA,EACpBj/F,KAAKk/F,qBAAuBl/F,KAAKyI,QAAUmuD,EAAe7mB,EAAYA,EAcjE,QAAQovD,GACb,MAAM,UAAC/9F,EAAW89F,qBAAsBE,EAA4B,WAAE7vF,GAAcvP,KACpF,QAAoCqI,IAAjC+2F,EACD,MAAM,IAAIhwE,MAAM,wBAGlB,MAAMwnC,EAAex1D,EAAUw1D,aAC/B,GAAGA,IAAiB52D,KAAK42D,aACvB,OAGF52D,KAAK42D,aAAeA,EAiBpB,MAAMyoC,EAAer/F,KAAKyI,QAAUmuD,EAAewoC,EAA+BA,EAQlFp/F,KAAKuP,WAAW+vF,qBAAqBt/F,KAAK+vC,UAAYsvD,GAInD,MAAaF,GACdjO,GAAwB9vF,IC9Ff,MAAMm+F,GAMnB,YAAYvtF,GACVhS,KAAKw/F,UAAY,IAAIlsF,IACrBtT,KAAKy/F,eAAiB,IAAInsF,IAC1BtT,KAAK0/F,qBAAsB,EAE3B1/F,KAAK2/F,SAAW,IAAIzuD,qBAAsBC,IACxC,MAAMquD,EAAYx/F,KAAKw/F,UACvB,IAAI,IAAI59F,EAAI,EAAGD,EAASwvC,EAAQxvC,OAAQC,EAAID,IAAUC,EAAG,CACvD,MAAMwvC,EAAQD,EAAQvvC,GAChBg+F,EAAYJ,EAAU7rF,IAAIy9B,EAAM12B,QAKtC,IAAI,MAAM0hB,KAAYwjE,EACpB,IACExjE,EAASgV,GACT,MAAM9gC,GACNC,QAAQC,MAAM,uCAAwCF,MAI3D0B,GAGE,aACLhS,KAAKw/F,UAAU7wF,QACf3O,KAAKy/F,eAAe9wF,QACpB3O,KAAK2/F,SAAShV,aAGT,mBAAmBhmF,GACxB,GAAG3E,KAAK0/F,sBAAwB/6F,EAC9B,OAGF3E,KAAK0/F,oBAAsB/6F,EAE3B,MAAMk7F,EAAQ7/F,KAAKy/F,eACnB,IAAI96F,GAASk7F,EAAM38F,KAAM,CACvB,IAAI,MAAOwX,EAAQklF,KAAcC,EAC/B,IAAI,MAAMzjE,KAAYwjE,EACpB5/F,KAAKyvC,QAAQ/0B,EAAQ0hB,GAIzByjE,EAAMlxF,SAIH,IAAI+L,EAA4B0hB,EAAgCojE,EAAYx/F,KAAKw/F,WACtF,MAAMI,EAAYJ,EAAU7rF,IAAI+G,GAChC,SAAUklF,IAAaA,EAAUj0F,IAAIywB,IAGhC,QAAQ1hB,EAA4B0hB,GACzC,GAAGp8B,KAAK0/F,qBAAuB1/F,KAAK2L,IAAI+O,EAAQ0hB,GAC9C,OAGF,MAAMojE,EAAYx/F,KAAK0/F,oBAAsB1/F,KAAKy/F,eAAiBz/F,KAAKw/F,UACxE,IAAII,EAAYJ,EAAU7rF,IAAI+G,GAC3BklF,GAAaA,EAAUj0F,IAAIywB,KAI1BwjE,IACFA,EAAY,IAAIj4F,IAChB63F,EAAUhlF,IAAIE,EAAQklF,GAEnBJ,IAAcx/F,KAAKw/F,WACpBx/F,KAAK2/F,SAASlwD,QAAQ/0B,IAI1BklF,EAAU/+F,IAAIu7B,IAGT,UAAU1hB,EAA4B0hB,GAC3C,MAAMojE,EAAYx/F,KAAK0/F,sBAAwB1/F,KAAK2L,IAAI+O,EAAQ0hB,GAAYp8B,KAAKy/F,eAAiBz/F,KAAKw/F,UACjGI,EAAYJ,EAAU7rF,IAAI+G,GAC5BklF,IAIJA,EAAUztF,OAAOiqB,GACbwjE,EAAU18F,OACZs8F,EAAUrtF,OAAOuI,GACjB1a,KAAK2/F,SAAS3tD,UAAUt3B,M,2SCA9B,MACMolF,GAA6D,IAAIn4F,IAAI,CACzE,4BACA,4BAIIo4F,GAAiE,IAAIp4F,IAExE,IACDo4F,GAAmBl/F,IAAI,0BAIzB,IAAIm/F,QAD8B33F,EAG9B,GAAU,EAQC,MAAM,GA2FnB,YACUuoB,EACAqgC,EACAgvC,EACAC,EACAzG,EACA0G,EACA3P,EACA4P,EACAC,EACAC,EACAC,EACAC,EACAC,GA+UR,GA3VQ,KAAA7vE,OACA,KAAAqgC,qBACA,KAAAgvC,qBACA,KAAAC,kBACA,KAAAzG,uBACA,KAAA0G,mBACA,KAAA3P,kBACA,KAAA4P,oBACA,KAAAC,mBACA,KAAAC,wBACA,KAAAC,kBACA,KAAAC,sBACA,KAAAC,qBA7FF,KAAAC,UAAY,IAAI/4F,IACjB,KAAAipF,WAAuE,GAEvE,KAAA//D,QAAwC,GACxC,KAAA8vE,YAA2B,IAAIh5F,IAC9B,KAAAi5F,aAKH,GAEG,KAAAC,cAAe,EACf,KAAAC,mBAAqB,EAIrB,KAAAC,SAAqC,IAAIztF,IACzC,KAAA0tF,aAA4B,IAAIr5F,IAKhC,KAAAyiB,UAAkC,KAEnC,KAAA62E,qBAAsC,KACrC,KAAAC,cAAoG,GACpG,KAAAC,sBAAoC,KACpC,KAAAC,gCAA8C,KAE9C,KAAAC,kBAAiC,KAKjC,KAAA7wE,WAAa,eAMb,KAAA8wE,mBAA+B,GAE/B,KAAAvsD,4BAA6B,EAG7B,KAAAwsD,aAAc,EAMd,KAAAC,aAEH,GAOG,KAAAC,UAAyB,IAAI95F,IAG7B,KAAA+5F,iBAAkB,EAgrBlB,KAAAC,yBAA4BvwD,IAClC,GAAGA,EAAMC,eAAgB,CACvB,MAAM32B,EAAS02B,EAAM12B,OACf7P,EAAM7K,KAAK+gG,SAASptF,IAAI+G,GAC9B1a,KAAK4hG,qBAAqBlnF,EAAQ7P,KAI9B,KAAAg3F,sBAAyBzwD,IAC/B,GAAGA,EAAMC,eAAgB,CACvB,MAAMxmC,GAAQumC,EAAM12B,OAAuBxT,QAAQ2D,IAGnD,GAFA7K,KAAK2/F,SAAS3tD,UAAUZ,EAAM12B,OAAQ1a,KAAK6hG,uBAExCh3F,EACD7K,KAAKyhG,UAAU5gG,IAAIgK,GACnB7K,KAAK8hG,gCACA,CACL,MAAM,iBAACC,GAAoB/hG,KACxB+hG,GAAoBA,EAAiBC,mBAC/BD,EAAiBC,UACxBhiG,KAAK4wB,KAAKqxE,WAAWC,gBAAgB,gCAAiC,CACpErnE,QAAS76B,KAAKugG,gBAAgBzlE,gBAAgB96B,KAAKiL,OAAO8vB,YAC1DinE,UAAWD,EAAiBC,gBA6H9B,KAAAG,mBAAsBpiG,IAC5B,MAAM4R,EAAU,OAAAmZ,GAAA,GAAgB/qB,EAAE2a,OAAQ,kBAC1C,GAAG/I,IAAY3R,KAAK4wB,KAAKolB,UAAUC,YAAa,CAC9C,MAAMsS,EAAS,OAAAz9B,GAAA,GAAgBnZ,EAAS,UACxC,IAAI3R,KAAK4wB,KAAKolB,UAAUid,gBAAgB1K,GAEtC,YADAvoD,KAAKoiG,kBAIP,IAAI,YAACC,EAAW,cAAEC,GAAiBtiG,KACnC,GAAGuoD,IAAW85C,EACZ,OAQF,GALAriG,KAAKoiG,kBAELC,EAAcriG,KAAKqiG,YAAc95C,EACjC+5C,EAAgBtiG,KAAKsiG,cAEjBA,EA0DMA,EAAcp7F,QAAQi3B,QAC9Bn+B,KAAKuiG,gBAAgBD,GAAe,OA3DnB,CACjBA,EAAgBtiG,KAAKsiG,cAAgB3hG,SAASC,cAAc,OAC5D0hG,EAAcpiG,UAAUW,IAAI,yBAE5B,MAAM2hG,EAAiB7hG,SAASC,cAAc,OAC9C4hG,EAAetiG,UAAUW,IAAI,iCAC7ByhG,EAAcjhG,OAAOmhG,GAErB7wF,EAAQtQ,OAAOihG,GAEf,IAAIv6F,EAA2B/H,KAAK4wB,KAAKk6B,YAAYvC,EAAOrhD,QAAQ2D,KACpE9C,EAAU/H,KAAKixD,mBAAmBu+B,sBAAsBznF,GAExD,MAAMyoB,EAAaxwB,KAAK8wB,cAAc,IAAM9wB,KAAKsiG,gBAAkBA,GACnEj9F,QAAQC,IAAI,CACVtF,KAAKwgG,oBAAoBiC,+BAA+B16F,GACxD,OAAA9D,GAAA,GAAM,OACLN,KAAK,EAAEukC,MACR,MAAMW,EAAoBX,EAAmB,GACzCW,EAKJ9X,GAAY,CACVC,IAAKwxE,EACL3oF,IAAKgvB,EAAkB65D,iBACvBl/F,MAAO,GACPC,OAAQ,GACRgjD,aAAa,EACbj2B,aACAS,MAAOC,GACP00B,WAAW,EACXZ,YAAY,IACXrhD,KAAK81E,IACN,OAAA5zB,GAAA,GAA0B4zB,GACtBjpD,MAIJipD,EAAOn4E,iBAAiB,aAAc,KAChCkvB,MAKJ8xE,EAAcp7F,QAAQi3B,OAAS,IAC/Bn+B,KAAKuiG,gBAAgBD,GAAe,KACnC,CAACzjF,MAAM,IAEV,YAAiByjF,EAAgBviG,IAC/B,OAAAiqB,EAAA,GAAYjqB,GAEZC,KAAKwgG,oBAAoBmC,aAAa56F,EAAS8gC,EAAkBC,UACjE9oC,KAAKoiG,mBACJ,CAACvwF,eAAgB7R,KAAK6R,oBAnCzBywF,EAAch+F,iBA0CpBtE,KAAKoiG,mBAiBD,KAAAA,gBAAkB,KACxB,MAAM,YAACC,EAAW,cAAEC,GAAiBtiG,KAClCqiG,IACDriG,KAAKuiG,gBAAgBD,GAAe,GACpCtiG,KAAKqiG,iBAAch6F,EACnBrI,KAAKsiG,mBAAgBj6F,IAqJlB,KAAAu6F,eAAkB7iG,I,MACvB,IAAI2a,EAAS3a,EAAE2a,OACX6tC,EAAsB,KAC1B,IACEA,EAAS,OAAAz9B,GAAA,GAAgBpQ,EAAQ,UACjC,MAAMpK,IAER,IAAIi4C,EAAQ,OAEZ,GAAGA,EAAOroD,UAAUuV,SAAS,YAAc,OAAAqV,GAAA,GAAgBpQ,EAAQ,kBAAmB,CACpF,GAAG6tC,EAAOroD,UAAUuV,SAAS,eAAiBzV,KAAK6iG,UAAU3iG,UAAUuV,SAAS,gBAC9E,OAGF,IAAI,MAAMmmD,KAAa57D,KAAK4gG,aAAc,CAExC,GADU5gG,KAAK4gG,aAAahlC,GACvB5qC,MAAQu3B,EAAQ,CACnB,IAAI,GAAgB,IAAI7L,MAAMkf,GAAY57D,KAAK8iG,YAAY1lE,OAC3D,OAIJ,OAGF,IAAI,MAAsB,OAAAtS,GAAA,GAAgBpQ,EAAQ,QAEhD,YADA1a,KAAK4wB,KAAKolB,UAAUE,gBAAgBqS,GAKtC,GAAGvoD,KAAK4wB,KAAKolB,UAAUC,aAAel2C,EAAE2b,UAAW,CACjD,GAAG6sC,EAAOroD,UAAUuV,SAAS,iBAAqCpN,IAAvBkgD,EAAOrhD,QAAQ2D,IACxD,OAMF,OAHA,OAAAmf,EAAA,GAAYjqB,GAGT,MAAsBC,KAAK4wB,KAAKolB,UAAUyY,kBAC3CzuD,KAAK4wB,KAAKolB,UAAUyY,kBAAepmD,QAKrCrI,KAAK4wB,KAAKolB,UAAUE,gBAAgB,OAAAprB,GAAA,GAAgBpQ,EAAQ,iBAAmB6tC,GAIjF,MAAMw6C,EAA0B,OAAAj4E,GAAA,GAAgBpQ,EAAQ,WACxD,GAAGqoF,EAID,YAHA/iG,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQ83F,EAAW77F,QAAQ+D,OAAOsgB,aAKtC,MAAM03E,EAAuB,OAAAn4E,GAAA,GAAgBpQ,EAAQ,eACrD,GAAGuoF,EAED,YADAjjG,KAAK4wB,KAAKoyE,aAAaE,SAASljG,KAAKiL,OAAOwL,WAAYwsF,EAAQ/7F,QAAQ7G,MAI1E,MAAM8iG,EAAuB,OAAAr4E,GAAA,GAAgBpQ,EAAQ,WACrD,GAAGyoF,EAAS,CACV,MAAMrT,EAAa,OAAAhlE,GAAA,GAAgBq4E,EAAS,WAEtCn1F,EAAY,qBACZ6mF,EAAY/E,EAAW5vF,UAAUuV,SAASzH,GAC5C6mF,GACF,OAAA7qE,EAAA,GAAYjqB,GAGd,MAAM0Z,EAAW,IACX2pF,EAAe,IACfC,EAAWxO,EAAgB,EAAJ,EAC1BwO,GACDvT,EAAW5vF,UAAUW,IAAI,eAG3B,MAAMyiG,EAAiBxT,EAAW5oF,QAAQo8F,eAe1C,OAdsB,OAAnBA,IACDxyF,cAAcwyF,UACPxT,EAAW5oF,QAAQo8F,qBAG5B,aAAcxT,EAAY9hF,GAAW,EAAMyL,EAAU,KACnDq2E,EAAW5oF,QAAQo8F,eAAiB,GAAKphG,OAAO4N,WAAW,KACzD,aAAcggF,EAAY9hF,GAAW,EAAOyL,EAAU,KACpDq2E,EAAW5vF,UAAUoE,OAAO,sBACrBwrF,EAAW5oF,QAAQo8F,kBAE3BF,IACFC,GAKL,MAAMrX,EAAkB,OAAA/lD,GAAA,GAAUvrB,EAAQ,oBAC1C,GAAGsxE,EAAiB,CAElB,GADA,OAAAhiE,EAAA,GAAYjqB,GACTisF,EAAgB9rF,UAAUuV,SAAS,eACpC,OAGF,MAAMi5E,EAAmB1C,EAAgBjrF,cACnC8pF,EAAgB6D,EAAiB6U,iBAAiBvX,GAElDjkF,EAAU2mF,EAAiB5jC,aAGjC,YAFA9qD,KAAKwgG,oBAAoBmC,aAAa56F,EAAS8iF,EAAc/hD,UAM/D,GADiC,OAAAhe,GAAA,GAAgBpQ,EAAQ,WACzC,CACd,MAAM8oF,GAAaj7C,EAAOrhD,QAAQ2D,IAClC,GAAG7K,KAAKiL,SAAW,KAAiB,CAClC,MAAMlD,EAAU/H,KAAK4wB,KAAKk6B,WAAW04C,GAC/Bv4F,EAASjL,KAAKwwF,gBAAgBnqD,UAAUt+B,EAAQuoF,SAASC,kBACzDjhF,EAAWvH,EAAQuoF,SAASmT,gBAC5BC,EAAY37F,EAAQmnF,SAASyU,kBACnC3jG,KAAK4wB,KAAKoyE,aAAaY,WAAW34F,EAAQy4F,EAAWp0F,OAChD,CACL,MAAMvH,EAAU/H,KAAKixD,mBAAmB4yC,eAAe7jG,KAAK4wB,KAAKk6B,WAAW04C,GAAYz7F,KAAcA,EAA4BwlF,SAAS,GACrIA,EAAUxlF,EAAQwlF,QACrBA,GACDvtF,KAAKixD,mBAAmB6yC,qBAAqB9jG,KAAKiL,OAAQlD,EAAQ8C,KAAKlH,KAAKoE,IAC1E/H,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQsiF,EAAQwW,WAAWx4E,UAAS,GACpClrB,KAAM,aACNiP,SAAWvH,EAAsB8C,QAMzC,OAGF,MAAMm5F,EAAM,OAAAl5E,GAAA,GAAgBpQ,EAAQ,UACpC,GAAGspF,EAAK,CACN,MAAMliG,EAAKkiG,EAAIvwF,cAAc,eAC7B,GAAGiH,IAAW5Y,GAAM,OAAAouD,GAAA,GAAcx1C,EAAQ5Y,GAAK,CAC7C,MAAMiG,EAAUjG,EAAG8rB,UAAY,IAI/B,OAHA5tB,KAAKqgG,iBAAiBpI,SAASj4F,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,SAAUvH,QAChE,OAAAiiB,EAAA,GAAYjqB,IAMhB,MAAM+jD,EAAU,OAAAh5B,GAAA,GAAgBpQ,EAAQ,eAAiB,OAAAurB,GAAA,GAAUvrB,EAAQ,mBAAqB,OAAA4lB,GAAA,GAAgB5lB,EAAQ,mBACxH,GAAGopC,GAAWA,IAAYyE,EAAQ,CAChC7tC,EAASopC,GAAWppC,EACpB,MAAMupF,EAAYvpF,EAAOxT,QAAQ+D,QAAUyP,EAAO0wD,aAAa,SAAY1wD,EAAyBzP,OAC9Fi5F,EAAYxpF,EAAOxT,QAAQg9F,UACjC,GAAyB,iBAAhB,GAA4BA,EACnC,GAAGA,EAAW,CACZ,MAAOj5F,EAAQJ,GAAOq5F,EAAU7gD,MAAM,KAEtCrjD,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQA,EAAOsgB,WACfm4E,WAAY74F,QAET,CACL,MAAMI,EAASg5F,EAAU14E,WACtBtgB,IAAW,KACZjL,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAACtiD,WAErC0uB,GAAM,IAAK9iB,OAAO,cAAc,IAKtC,OAaF,GAAG0xC,EAAOroD,UAAUuV,SAAS,YAAciF,EAAO3Z,cAAcb,UAAUuV,SAAS,cAAe,CAChG,MAAM0uF,GAAa57C,EAAOrhD,QAAQ2D,IAG5BgP,EAAmB,QAAb,EAFI7Z,KAAK4wB,KAAKk6B,WAAWq5C,GAEjB1rF,aAAK,eAAE9X,SAM3B,aAJGkZ,aAAG,EAAHA,EAAKg5D,kBACN,IAAI,GAAch5D,EAAIg5D,iBAAiBz1C,QAM3C,MAAMgnE,EAAc,OAAAt5E,GAAA,GAAgBpQ,EAAQ,uBAC5C,GAAuB,QAAnBA,EAAO43B,UAAsB53B,EAAOxa,UAAUuV,SAAS,WAAaiF,EAAOxa,UAAUuV,SAAS,mBAC7FiF,EAAOxa,UAAUuV,SAAS,eAEN,UAAnBiF,EAAO43B,UAAwBiW,EAAOroD,UAAUuV,SAAS,UACzD2uF,IAAgBA,EAAY3wF,cAAc,yBAC3CiH,EAAOxa,UAAUuV,SAAS,oBAAqB,CAClD,MAAM4uF,EAAc,OAAAv5E,GAAA,GAAgBpQ,EAAQ,eAAiB,OAAAoQ,GAAA,GAAgBpQ,EAAQ,sBAC/EypF,IAAcE,GAAe97C,GAAQrhD,QAAQ2D,IAC7C9C,EAAU/H,KAAK4wB,KAAKk6B,WAAWq5C,GACrC,IAAIp8F,EAEF,YADA/H,KAAKkiB,IAAI3E,KAAK,2BAA4B4mF,GAI5C,MAAM/5E,GAAai6E,GAAe97C,GAAQ90C,cAA2B,wBACrE,GAAG2W,EAGD,OAFA,YAAmBA,QACnB,OAAAJ,EAAA,GAAYjqB,GAId,MAAMukG,EAAyB,UACzBC,EAAgBh8C,EAAOroD,UAAUuV,SAAS6uF,GAE1CllE,EAAIglE,EAAe3rF,GAChB,GAAe+rF,mCAAmC/rF,GACtDA,GACgB,UAAZA,EAAMrN,GAAiB,CAAC,QAAS,OAAO6zB,SAASxmB,EAAMpY,MAG1DmM,EAAiE,GACjE2uD,EAAMopC,EAAgB,CAACJ,GAAaxmF,OAAOg1C,KAAK3yD,KAAK6wB,SAASpkB,IAAIktC,IAAMA,GAAG/tC,OAAOmH,IAMtF,MAAMhL,EAAU/H,KAAK4wB,KAAKk6B,WAAW/3C,GAC/B0F,EAAQzY,KAAKixD,mBAAmBxyC,oBAAoB1W,GAE1D,OAAO0Q,GAAS2mB,EAAE3mB,KACjBpM,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAEtB4uD,EAAI5wD,QAAQwI,IACV,IAAIoY,EACJ,GAAGi5E,EACDj5E,EAAW,0BACN,CAELA,EAAW,qEAETA,GAHenrB,KAAK6wB,QAAQ9d,GAAI7S,UAAUuV,SAAS,mBAGvC,2BAEA,qCAIhB,MAAM4V,EAAWlf,MAAMC,KAAKpM,KAAK6wB,QAAQ9d,GAAIW,iBAAiByX,IACxDs5E,EAA4B,IAAI98F,IACtC,GAAGy8F,EACD/4E,EAAS9gB,QAASwQ,IAChBvO,EAAQjD,KAAK,CACXwR,QAASA,EAAQtH,cAAc,iBAC/B5I,KAAMkQ,EAAQ7T,QAAQ2D,IACtBI,OAAQjL,KAAKiL,eAGZ,CACL,MAAMy5F,IAAgB1kG,KAAK6wB,QAAQ9d,GAAIU,cAAc,6BACrD4X,EAAS9gB,QAASwQ,IAChB,GAAG2pF,IAAgB,OAAA55E,GAAA,GAAgB/P,EAAS,4BAA6B,OACzE,IAAI4pF,EAAY,OAAA75E,GAAA,GAAgB/P,EAAS,cACzC,MAAMm0C,EAASy1C,GAAa5pF,EAAQha,cACjC0jG,EAAQ94F,IAAIujD,KACfu1C,EAAQ5jG,IAAIquD,GACZ1iD,EAAQjD,KAAK,CACXwR,UACAlQ,IAAK85F,GAAaA,EAAUz9F,QAAQ2D,IAAMkI,EAC1C9H,OAAQjL,KAAKiL,eAMrBuB,EAAQH,KAAK,CAACC,EAAGC,IAAMD,EAAEzB,IAAM0B,EAAE1B,KAEjC,IAAI7C,EAAMwE,EAAQ4O,UAAU9G,GAAKA,EAAEzJ,MAAQs5F,GAM3C,OAJG,MACDnkG,KAAKkiB,IAAI,oCAAqCi5C,EAAKnzD,EAAKwE,GAGtDA,EAAQxE,KAKZ,IAAI,IACHsF,iBAAiB,CAChBgC,SAAUtP,KAAK4wB,KAAKthB,SACpBrE,OAAQjL,KAAKiL,OACbE,YAAa,CAACC,EAAGg5F,EAAc,8BAAgC,iCAC/D/2F,UAA8B,cAAnBrN,KAAK4wB,KAAKvwB,OAAyBkkG,EAC9Cv3F,YAAgC,cAAnBhN,KAAK4wB,KAAKvwB,OAExB42D,UAAUlvD,EAASyE,EAAQxE,GAAK+S,QAAS,GAAG,EAAMvO,EAAQ7G,MAAM,EAAGqC,GAAMwE,EAAQ7G,MAAMqC,EAAM,SAE9F,OAAAgiB,EAAA,GAAYjqB,SAdVC,KAAKkiB,IAAI,8BAA+BxH,GAqB5C,IAFkE,IAA/D,CAAC,MAAO,MAAO,QAAmByK,QAAQzK,EAAO43B,WAAiB53B,EAAS,OAAAurB,GAAA,GAAUvrB,EAAQ,SAEhD,IAA7C,CAAC,MAAO,QAAQyK,QAAQzK,EAAO43B,SAAiD,CACjF,GAAG53B,EAAOxa,UAAUuV,SAAS,iBAAkB,CAC7C,MAAMyuF,EAAY37C,EAAOrhD,QAAQg9F,WAC1Bj5F,EAAQJ,GAAOq5F,EAAU7gD,MAAM,KAMtC,YAJArjD,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQA,EAAOsgB,WACfm4E,WAAY74F,IAGT,GAAG6P,EAAOxa,UAAUuV,SAAS,WAAY,CAC9C,MAAM5K,GAAO09C,EAAOrhD,QAAQ2D,IACtB9C,EAAU/H,KAAKixD,mBAAmBxwC,iBAAiBzgB,KAAKiL,OAAQJ,GAKtE,YAJA,IAAI,GAAa,CACf,CAAC7K,KAAKiL,QAASjL,KAAKixD,mBAAmB2zC,iBAAiB78F,KAM5D,IAAI88F,GAAe,EAEnB,IACEA,IAAiB,OAAA/5E,GAAA,GAAgB/qB,EAAE2a,OAAQ,SAC3C,MAAMpK,IAER,GAAGu0F,GAAgBt8C,EAAOroD,UAAUuV,SAAS,YAA6D,CACxG,MAAM+tF,GAAaj7C,EAAOrhD,QAAQ2D,IAClC7K,KAAKshG,mBAAmB/3F,KAAKi6F,GAE7B,MAAMz7F,EAAU/H,KAAK4wB,KAAKk6B,WAAW04C,GAE/BnT,EAAgBtoF,EAAQuoF,SAASC,iBAAmBvwF,KAAKwwF,gBAAgBnqD,UAAUt+B,EAAQuoF,SAASC,kBAAoBvwF,KAAKiL,OAC7H65F,EAAa/8F,EAAQuoF,SAASyU,gBAEpC/kG,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQolF,EACRqT,UAAWoB,EACXzkG,KAAML,KAAK4wB,KAAKvwB,KAChBiP,SAAUtP,KAAK4wB,KAAKthB,cAwKrB,KAAA+3B,SAAW,CAAC29D,EAAgCC,K,QAGjD,GAAGjlG,KAAK+0C,4BAMN,GALG/0C,KAAKklG,wBACNllG,KAAKklG,uBAAuBp0F,eAI3B9Q,KAAK6gG,eAAiBmE,EACvB,YAGChlG,KAAK4wB,KAAKu0E,OAAOC,eAClBplG,KAAK4wB,KAAKu0E,OAAOC,cAAcC,yBAAyBrlG,KAAKuP,WAAW+1F,qBAGvEtlG,KAAKklG,wBACNllG,KAAKklG,yBAGPllG,KAAKulG,wBAKP,GAAGN,GAAoBA,EAAiBO,cAjrDZ,KAirDuDxlG,KAAK6gG,aACtF,OAGF,MAAM2E,EAA+C,QAA/B,EAAAP,aAAgB,EAAhBA,EAAkBO,qBAAa,QAAIxlG,KAAKuP,WAAWk2F,oBACA,IAAxCzlG,KAAKuP,WAAW+1F,qBAA6BE,EAAgB,GAAMP,KAE/FjlG,KAAK8gG,mBACNhwF,aAAa9Q,KAAK8gG,oBACT9gG,KAAK6iG,UAAU3iG,UAAUuV,SAAS,iBAC3CzV,KAAK6iG,UAAU3iG,UAAUW,IAAI,gBAG/Bb,KAAK8gG,mBAAqB5+F,OAAO4N,WAAW,KAC1C9P,KAAK6iG,UAAU3iG,UAAUoE,OAAO,gBAChCtE,KAAK8gG,mBAAqB,GACzB,MAAkC,QAA1B,EAAAmE,aAAgB,EAAhBA,EAAkBxrF,gBAAQ,QAAI,KAGxC+rF,EApsDyB,MAosDmBxlG,KAAKuP,WAAWxG,UAAU2c,QAAU1lB,KAAK4wB,KAAKywB,iBAAmBrhD,KAAKiL,SACnHjL,KAAKm+C,iBAAiBj+C,UAAUW,IAAI,iBACpCb,KAAK6gG,cAAe,GACZ7gG,KAAKm+C,iBAAiBj+C,UAAUuV,SAAS,mBACjDzV,KAAKm+C,iBAAiBj+C,UAAUoE,OAAO,iBACvCtE,KAAK6gG,cAAe,IA2yExB,KAAAiC,WAAclnC,IACZ,MAAM3wD,EAASjL,KAAKiL,OACpBjL,KAAKixD,mBAAmBy0C,eAAez6F,EAAQ,EAAG,GAAI,EAAG2wD,EAAW57D,KAAK4wB,KAAKthB,UAAU3L,KAAKmE,I,OACtE,QAAjB,EAAAA,aAAO,EAAPA,EAAS0H,gBAAQ,eAAE7N,QAGb3B,KAAKiL,SAAWA,GAI1BjL,KAAK4wB,KAAK+0E,aAAc79F,EAAQ0H,SAAS,GAAiB3E,KANxD7K,KAAKkiB,IAAI1R,MAAM,kBA14HnBxQ,KAAK6R,eAAiB,IAAI,IAE1B7R,KAAKm+C,iBAAmBx9C,SAASC,cAAc,OAC/CZ,KAAKm+C,iBAAiBj+C,UAAUW,IAAI,UAAW,iBAE/Cb,KAAK6iG,UAAYliG,SAASC,cAAc,OACxCZ,KAAK6iG,UAAU3iG,UAAUW,IAAI,iBAE7Bb,KAAK4lG,YAEL5lG,KAAKm+C,iBAAiB98C,OAAOrB,KAAKuP,WAAWnO,WAI7CpB,KAAKkiB,IAAMliB,KAAK4wB,KAAK1O,IACrBliB,KAAK6lG,aAAe,IAAI,GAAa7lG,KAAK4wB,MAC1C5wB,KAAKoqB,UAAY,IAAI,KAAqB,CACxCC,YAAY,IAEdrqB,KAAKsuB,cAAgB,IAAI,IACzBtuB,KAAKsuB,cAAc00B,UAAY,GAO/BhjD,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkB,EAAE+M,UAAS9B,SAAQJ,UACtE,GAAG7K,KAAK4wB,KAAK1jB,uBAAyBH,EAAS,CAC7C,MAAMw7C,EAASvoD,KAAK6wB,QAAQhmB,GAC5B,IAAI09C,EAAQ,OAEZ,MAAMxgD,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,GAErC,IAAI09C,EAAOrhD,QAAQ00D,WAAc7zD,EAAQykB,KAAO,KAAkB+vB,iBAAmB,EAEnF,YADAv8C,KAAK6lG,aAAaC,gBAAgBv9C,EAAQ19C,GAI5C7K,KAAK+lG,kBAAkBx9C,EAAQxgD,GAAS,GAGrC/H,KAAKgmG,mBACNhmG,KAAKimG,iBASXjmG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,eAAgB,EAAEiL,aAChDjL,KAAKiL,SAAWA,GACjBjL,KAAKkmG,oBAAoBvoF,OAAOg1C,KAAK3yD,KAAK6wB,SAASpkB,IAAIklC,IAAMA,MAKjE3xC,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,eAAiBD,I,oBAClD,MAAM,QAACgN,EAAO,OAAEm0B,EAAM,YAAEilE,EAAW,IAAEt7F,GAAO9K,EAG5C,GAAGC,KAAK4wB,KAAK1jB,uBAAyBH,EACpC,OAQF,MAAMymD,EAAUxzD,KAAKyzD,iBAAiBvyB,EAAQilE,IAAgBnmG,KAAKyzD,iBAAiB5oD,GACpF,GAAG2oD,EAAS,CACV,MAAMzrD,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,GAC/B09C,EAASiL,EAAQjL,OAKjB69C,EAAoBj6F,MAAMC,KAAKm8C,EAAO70C,iBAAiB,sBAO7D,GANG0yF,EAAkBzkG,QACnBykG,EAAkB77F,QAAQmkF,IACxBA,EAAiB2X,cAAct+F,KAIhCA,EAAQwlF,QAAS,CAClB,MAAM+Y,EAAiB/9C,EAAO90C,cAAc,mBACzC6yF,IACDA,EAAev+F,QAAUA,EACzBu+F,EAAet0F,QAInB,GAAgB,QAAb,EAAAjK,EAAQ0Q,aAAK,eAAE9X,SAAU,CAC1B,MAAMqwB,EAAMu3B,EAAO90C,cAAc,iCAAiCytB,iBAClE,GAAGlQ,EAAK,CACN,MAAM5vB,EAAY,OAAA0pB,GAAA,GAAgBkG,EAAK,wBAEA,QAAnC,EAA2B,QAA3B,EAAiB,QAAjB,EAAAm1E,EAAY1tF,aAAK,eAAE9X,gBAAQ,eAAE4e,cAAM,eAAE5d,UAAuC,QAA7B,EAAAoG,EAAQ0Q,MAAM9X,SAAS4e,cAAM,eAAE5d,SAChF,eAA2BgC,KAAK,KAC9B,MAAMwpF,EAAWn8D,EAAIvd,cAAc,SAC7B8yF,EAASrjD,GAAa,CAACn7C,YAC7BipB,EAAI5D,YAAYm5E,GAEbpZ,GACDoZ,EAAO9yF,cAAc,kBAAkBpS,OAAO8rF,KAKjD/rF,IACDA,EAAU8F,QAAQ2D,IAAM,GAAKA,IAMnC,GAAG9C,EAAQy+F,WAAY,CACrB,MAAMp9F,EAAQm/C,EAAO90C,cAAc,2BAA2BytB,QAA+BqnB,EAC1Fn/C,IACDA,EAAKlC,QAAQ2D,IAAM,GAAKA,GAI5B,GAAgB,QAAb,EAAA9C,EAAQ0Q,aAAK,eAAEo/B,KAAM,CACtB,MAAMiC,EAAcyO,EAAO90C,cAAc,gBACzC,GAAGqmC,EAAa,CACd,MAAM2sD,EAAU1+F,EAAQ0Q,MAAMo/B,KAC9BiC,EAAY/xC,QAAUA,EACtB+xC,EAAYv5C,aAAa,UAAWkmG,EAAQ1zF,IAC5C+mC,EAAYv5C,aAAa,aAAc,GAAKsK,IAIhD,GAAgB,QAAb,EAAA9C,EAAQ0Q,aAAK,eAAE9X,SAAU,CAC1B,MAAMoa,EAAUwtC,EAAO90C,cAAc,2BAA2BytB,+BAAoCA,+BAAoCA,OACrInmB,IACEA,aAAmB,IAAgBA,EAAQ7a,UAAUuV,SAAS,gBAC/DsF,EAAQ7T,QAAQ2D,IAAM,GAAK9C,EAAQ8C,WAC5BkQ,EAAQ7T,QAAQ2kB,WACtB9Q,EAAgBhT,QAAUA,EAC1BgT,EAAgBwS,QAAO,IAExBxS,EAAQ7T,QAAQ6S,MAAQhS,EAAQ0Q,MAAM9X,SAASoS,KAWrC,QAAb,EAAAhL,EAAQ0Q,aAAK,eAAEkY,WAAY43B,EAAO90C,cAAc,SACjD,eAA2B9P,KAAK,KAC9B3D,KAAK0mG,kBAAkB3+F,GAAS,GAAM,EAAOwgD,GAAQ,GACrDvoD,KAAK2mG,qBAAqBp+C,UAS9BvoD,KAAKkiB,IAAI3E,KAAK,kCAAmCxd,GAGnD,MAAM8wB,EAAU7wB,KAAK6wB,QACrB,GAAGA,EAAQqQ,GAAS,CAClB,MAAMqnB,EAAS13B,EAAQqQ,GACvBrQ,EAAQhmB,GAAO09C,SACR13B,EAAQqQ,GAGb,aAAQ,KACN,MAAMr2B,GAAO09C,EAAOrhD,QAAQ2D,IACzBgmB,EAAQhmB,KAAS09C,GAAUA,EAAOroD,UAAUuV,SAAS,iBACtD8yC,EAAOroD,UAAUoE,OAAO,aAAc,eACtCikD,EAAOroD,UAAUW,IAAKb,KAAKiL,SAAW2B,EAAA,EAAU+R,MAA2B,cAAnB3e,KAAK4wB,KAAKvwB,OAA0BL,KAAK0gG,UAAU/0F,IAAId,GAAO,UAAY,cAKxI09C,EAAOrhD,QAAQ2D,IAAM,GAAKA,EAS5B,GANG7K,KAAK0gG,UAAU/0F,IAAIu1B,KACpBlhC,KAAK0gG,UAAUvuF,OAAO+uB,GACtBlhC,KAAK0gG,UAAU7/F,IAAIgK,IAIC,cAAnB7K,KAAK4wB,KAAKvwB,KAAsB,EACfq8C,KAAKC,MAAQ,IAAO,IACjBwpD,EAAY35E,KAAO,IAGtCxsB,KAAKkmG,oBAAoB,CAACr7F,OAKhC7K,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,eAAgB,EAAE+M,UAAS9B,SAAQJ,UAElE,GAAGkC,IAAY/M,KAAK4wB,KAAK1jB,qBAAsB,OAC/C,MAAMnF,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,GAC/B2oD,EAAUzrD,EAAQy+F,WAAaxmG,KAAK4mG,iBAAiB7+F,EAAQy+F,YAAcxmG,KAAKyzD,iBAAiB5oD,GACvG,IAAI2oD,EAAS,OAEb,MAAMqzC,EAAoC,cAAnB7mG,KAAK4wB,KAAKvwB,KAE3BymG,EAAc,IAAI,GAAY9mG,KAAKuP,YAAY,GACrDu3F,EAAY9iD,OACZhkD,KAAK0mG,kBAAkBlzC,EAAQzrD,SAAS,GAAM,EAAOyrD,EAAQjL,OAAQs+C,GACrEC,EAAYC,UAETF,IACA7mG,KAAKihG,sBAAwB57F,QAAQ6E,WAAWvG,KAAK,KACpD3D,KAAKgnG,4BAMS,cAAnBhnG,KAAK4wB,KAAKvwB,OACXL,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,2BAA4B,EAAE+H,UAASqkF,qBACxE,GAAGpsF,KAAKiL,SAAWlD,EAAQkD,SAAWlD,EAAQsiC,YAActiC,EAAQsiC,UAAU7H,QAAQ7gC,OACpF,OAGF,MAAM4mD,EAASvoD,KAAKinG,mBAAmBl/F,GACvC,GAAIwgD,EAAJ,CAIA,GAAGxgD,EAAQy+F,WAAY,CAErBz+F,EADgB/H,KAAK4mG,iBAAiB7+F,EAAQy+F,YAC5Bz+F,QAGpB/H,KAAKknG,+BAA+B3+C,EAAQxgD,EAASqkF,MAGvDpsF,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,qBAAuBiI,IACxD,IAAI6+F,EAEJ,IAAI,MAAM,QAAC/+F,EAAO,eAAEqkF,KAAmBnkF,EAAK,CAC1C,GAAGjI,KAAKiL,SAAWlD,EAAQkD,OACzB,OAIF,IADejL,KAAKinG,mBAAmBl/F,GAErC,OAGE++F,IACFA,EAAc,IAAI,GAAY9mG,KAAKuP,YAAY,GAC/Cu3F,EAAY9iD,QAGd,MAAM58C,EAAMW,EAAQkD,OAAS,IAAMlD,EAAQ8C,IACrC2P,EAAMsxE,GAAmBn4E,IAAIvM,GACnC,GAAGoT,EACD,IAAI,MAAMO,KAAWP,EACnBO,EAAQyrB,OAAOz+B,EAASqkF,QAG1Bx/E,EAAA,EAAU0F,cAAc,2BAA4B,CAACvK,UAASqkF,mBAI/D0a,GACDA,EAAYC,aAKlB/mG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,aAAc,EAAEiL,SAAQ0/C,UAASw8C,kBAEhE,GAAGl8F,IAAWjL,KAAKiL,OAAQ,OAC3B,MACMm8F,EADOpnG,KAAKixD,mBAAmBpG,eAAeF,GAC5BjjD,OAAOy/F,GAAa9yF,KAAKxJ,GAAO7K,KAAK6wB,QAAQhmB,IACrE,IAAIu8F,EAAY,OAEhB,MAAMC,EAAc,OAAA7qC,GAAA,GAAqBx8D,KAAKixD,mBAAmBq2C,uBAAuB38C,GAAU,OAAOthD,MAEzGrJ,KAAK0mG,kBAAkB1mG,KAAK4wB,KAAKk6B,WAAWu8C,IAAc,GAAM,EAAOrnG,KAAK6wB,QAAQu2E,IAAa,KAIrGpnG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,sBAAuB,EAAEiL,SAAQgB,WAClE,MAAMukB,EAAaxwB,KAAK8wB,gBACxB,eAA2BntB,KAAK,KAC1B6sB,KAEHvkB,EAAkB1B,QAAQM,IAKzB,OAAAhD,EAAA,GAAe7H,KAAK4wF,WAAY,CAAC7kF,EAAK/D,KACpC,GAAG+D,EAAI8kF,WAAahmF,GAAOkB,EAAIskF,gBAAkBplF,EAAQ,CACvD,MAAM,IAACJ,EAAG,SAAEgmF,GAAY7wF,KAAK4wF,WAAWxoF,OAAOJ,EAAK,GAAG,GAGjDugD,EAASvoD,KAAK6wB,QAAQhmB,GAC5B,IAAI09C,EAAQ,OAEZ,MAAMxgD,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,GAEd7K,KAAKixD,mBAAmBxwC,iBAAiB1U,EAAIskF,cAAeQ,GACjEjxD,gBACT73B,EAAQqoF,aAGjB,GAAcH,SAAS,CACrBr/D,KAAM5wB,KAAK4wB,KACX23B,SACAxgD,qBAQT,KAAoB,CACrB,MAAMiG,EAAY,qBACZ0vE,EAAM,GACN6pB,EAAmB,IAAN7pB,EACnB,IACIhjE,EACAvJ,EAFAq2F,GAAc,EAGlB76C,GAAsB,CACpB5xC,QAAS/a,KAAKm+C,iBACd5P,kBAAoBxuC,KACfC,KAAK4wB,KAAKolB,UAAUC,cAAgBj2C,KAAK4wB,KAAK62E,aAKjD/sF,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,UAChCA,IACD,aAAcA,EAAQ1M,GAAW,EAAM,KAClC0M,EAAO81B,WAERr/B,GAIFA,EAAKjR,UAAUoE,OAAO,cACtB6M,EAAKhM,MAAM4tD,QAAU,KAJrB5hD,EAAOxQ,SAASC,cAAc,QAC9BuQ,EAAKjR,UAAUW,IAAI,qBAAsB,8BAM3C6Z,EAA8CrZ,OAAO8P,MAG9CuJ,GAEXo0B,QAAS,CAACJ,EAAOC,KACf64D,EAAc94D,GAAS64D,EAEpBC,IAAgBr2F,EAAKjR,UAAUuV,SAAS,eACzCtE,EAAKjR,UAAUW,IAAI,cAErBsQ,EAAKhM,MAAM4tD,QAAU,GAAKluD,KAAKC,IAAI,EAAG4pC,EAAQ64D,GAE9C,MAAMnkF,GAAKve,KAAKJ,IAAI,EAAGI,KAAKC,IAAI44E,EAAKhvC,IACrCh0B,EAAOvV,MAAMogB,UAAY,cAAcnC,OACvC,gBAEFgrB,QAAS,KACP,MAAMs5D,EAAUhtF,EAChB,aAAcgtF,EAAS15F,GAAW,EAAO,IAAK,KACzCmD,EAAKpQ,gBAAkB2mG,IACxBv2F,EAAKjR,UAAUoE,OAAO,cACtB6M,EAAK7M,YAIT,aAAQ,KAGN,GAFAojG,EAAQviG,MAAMogB,UAAY,GAEvBiiF,EAAa,CACd,MAAM,IAAC38F,GAAO68F,EAAQxgG,QACtBlH,KAAK4wB,KAAKxwB,MAAMunG,kBAAkB98F,GAClC28F,GAAc,MAIpB15D,gBAAiB,CAACre,SAAS,KAsF/B,IAAIe,EAlFJ,YAAiBxwB,KAAKuP,WAAWnO,UAAWpB,KAAK4iG,eAAgB,CAAC/wF,eAAgB7R,KAAK6R,iBAGvF7R,KAAK6R,eAAehR,IAAIb,KAAKuP,WAAWnO,UAAxCpB,CAAmD,YAAcD,IAC/D,GAAgB,IAAbA,EAAE2jB,OAAc,OAEnB,MAAMzc,EAAoB,OAAAg/B,GAAA,GAAUlmC,EAAE2a,OAAQ,QAC9C,OAAGzT,GACD,OAAA+iB,EAAA,GAAYjqB,GCvnBlBs4B,GDwnBsBpxB,ECxnBMwpB,kBDynBtBmJ,GAAS,CAACC,YAAa,qBAHzB,IAQC,MACD75B,KAAK6R,eAAehR,IAAIb,KAAKm+C,iBAA7Bn+C,CAA+C,WAAaD,IAC1D,MAAMwoD,EAAS,OAAAz9B,GAAA,GAAgB/qB,EAAE2a,OAAQ,iBAAmB,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,UACtF,GAAG6tC,EAAQ,CACT,MAAM19C,GAAO09C,EAAOrhD,QAAQ2D,IAC5B7K,KAAKkiB,IAAI,iBAAkBliB,KAAK4wB,KAAKk6B,WAAWjgD,IAChD7K,KAAK4nG,gBAAgBr/C,MAKvB,MAAgC,WAAnBvoD,KAAK4wB,KAAKvwB,MACzBL,KAAK6R,eAAehR,IAAIb,KAAKm+C,iBAA7Bn+C,CAA+C,WAAaD,IAC1D,GAAGC,KAAK4wB,KAAKolB,UAAUC,cACpBj2C,KAAK4wB,KAAK62E,UACX,OAGF,MAAM/sF,EAAS3a,EAAE2a,OACX6tC,EAAS7tC,EAAOxa,UAAUuV,SAAS,UACvCiF,EACCA,EAAOxa,UAAUuV,SAAS,sBAAwBiF,EAAO3Z,cAAgB,KAC5E,GAAGwnD,IAAWA,EAAOroD,UAAUuV,SAAS,gBAAiB,CACvD,MAAM5K,GAAO09C,EAAOrhD,QAAQ2D,IAE5B,GADgB7K,KAAK4wB,KAAKk6B,WAAWjgD,GAC1B0T,OAAOuN,YAChB,OAGF9rB,KAAK4wB,KAAKxwB,MAAMunG,iBAAiB98F,MAKvB7K,KAAKs0F,kBAAoB,IAAI3K,GAAkB3pF,KAAKuP,WAAWnO,UAAW,CAACi8F,EAAO3iF,KAChG,IAAI,MAAMkhD,KAAa57D,KAAK4gG,aAAc,CACxC,MAAMiH,EAAc7nG,KAAK4gG,aAAahlC,GACtC,GAAGisC,EAAYzmG,YAAcsZ,EAAQ,CACnC,MAAMotF,EAAaD,EAAY72E,IAS/B82E,EAAW5nG,UAAUC,OAAO,YAAak9F,GACtCA,IACDr9F,KAAK+nG,mBAAqBD,GAG5B,OAID9nG,KAAK+nG,qBAON,OACF/nG,KAAKklG,uBAAyB,OAAAlrE,GAAA,GAASh6B,KAAKgoG,cAActhG,KAAK1G,MAAO,KAAM,GAAO,IAIrF,OAAAo3D,GAAA,GAAuB,KACrBp3D,KAAK+0C,4BAA6B,EAClC/0C,KAAKsuB,cAAc+oC,OACnB7mC,EAAaxwB,KAAK8wB,iBAKjB,KACD9wB,KAAK+0C,4BAA6B,EAE/BvkB,GAAcA,MACfxwB,KAAKsuB,cAAc+tE,SACnBr8F,KAAKsuB,cAAcguE,WAOrB9rE,EAAa,MACZxwB,KAAK6R,gBAGH,uBAEL7R,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkB,EAAE+M,UAASlC,UAC9D,GAAGkC,IAAY/M,KAAK4wB,KAAK1jB,uBAErBlN,KAAKuP,WAAWxG,UAAU2c,OAG5B1lB,KAAKioG,uBAAuB,CAACp9F,IAAM,GAFnC7K,KAAK4wB,KAAK+0E,eAKT/4F,EAAA,EAAU+2B,SAASC,mBAAmB,CACvC,MAAMmoC,EAAmB/rE,KAAK4wB,KAAKm7C,iBAChCA,GACDA,EAAiBm8B,oBAKvBloG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,sBAAwBi1C,IACzD,KAAKj1C,KAAKiL,UAAUgqC,GAAe,OACnC,MAAMkzD,EAASh8F,MAAMC,KAAK6oC,EAAaj1C,KAAKiL,SAAStF,QAAQ0G,KAAK,CAACC,EAAGC,IAAMA,EAAID,GAChFtM,KAAKioG,uBAAuBE,KAG9BnoG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkB,EAAEiL,SAAQQ,WAC1DR,IAAWjL,KAAKiL,QACjBjL,KAAKkmG,oBAAoB/5F,MAAMC,KAAKX,MAIxCzL,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAiB,EAAEiL,aACjDA,IAAWjL,KAAKiL,SACjBjL,KAAK4wB,KAAKxwB,MAAMgoG,iBAEhB,eAA2BzkG,KAAK,KAC9B3D,KAAKqoG,4BAKXroG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,sBAAwB8gC,IACtDA,EAAQ9gC,KAAKiL,SACdjL,KAAK4wB,KAAKxwB,MAAMgoG,mBAIpBpoG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,yBAA2BkX,IACzDlX,KAAKiL,SAAWiM,EAAOjM,QACxBjL,KAAK4wB,KAAKxwB,MAAMgoG,mBAIpBpoG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,cAAgBkW,IACjD,GAAGlW,KAAKiL,SAAWiL,EAAOqV,UAAS,GAAO,CACtBvrB,KAAK6iG,UAAU3iG,UAAUuV,SAAS,gBAClCzV,KAAK4wB,KAAK62E,YAG1BznG,KAAKsoG,mBACLtoG,KAAK4wB,KAAKxwB,MAAMkoG,uBAKtBtoG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAqBD,IACtD,GAAa,uBAAVA,EAAEqH,IAA8B,CACjC,MAAMmhG,EAAiBvoG,KAAKuP,WAAWg5F,eACnCA,GACFvoG,KAAKwoG,0BAGM,OAAAhsC,GAAA,GAAqBx8D,KAAK6wB,QAAS,QAC3CtmB,QAAQM,IACX,MAAM09C,EAASvoD,KAAK6wB,QAAQhmB,GAC5B,GAAG09C,EAAOroD,UAAUuV,SAAS,sBAAuB,CAClD,MAAM1N,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,GACrC7K,KAAK0mG,kBAAkB3+F,OAASM,GAAW,EAAOkgD,MAKnDggD,EACDvoG,KAAKuP,WAAW+vF,qBAAqB,OAErCt/F,KAAKyoG,qBAAqB,IAAI,GAAM,OAAOpgG,MAKjDrI,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAmBiI,IACpD,aAAQ,KACN,IAAI6+F,EACJ,IAAI,MAAM,OAAC77F,EAAM,MAAE8jF,EAAK,IAAElkF,KAAQ5C,EAAK,CACrC,GAAGjI,KAAKiL,SAAWA,EAAQ,OAE3B,MAAMs9C,EAASvoD,KAAK6wB,QAAQhmB,GAC5B,IAAI09C,EAAQ,OAEZ,MAAMmgD,EAAoBv8F,MAAMC,KAAKm8C,EAAO70C,iBAAiB,gBAC7D,GAAGg1F,EAAkB/mG,OAAQ,CAC3B,MAAM4gB,EAAMwgE,GAAagM,EAAO,GAChC,IAAI4Z,GAAY,EAChBD,EAAkBn+F,QAAQq+F,KACrBD,GAAaC,EAAUp6F,YAAc+T,KAClCukF,IACFA,EAAc,IAAI,GAAY9mG,KAAKuP,YAAY,GAC/Cu3F,EAAY9iD,QAGd2kD,GAAY,EACZC,EAAUp6F,UAAY+T,MAM3BukF,GACDA,EAAYC,cAKlB/mG,KAAK2/F,SAAW,IAAIJ,GAA0B,CAACjV,KAAMtqF,KAAKuP,WAAWnO,YAErEpB,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAiB,EAAE62C,SACpD,MAAM7G,EAAS6G,IAAO72C,KAAK4wB,KAErBjQ,EAAK,KACT3gB,KAAK2/F,SAASkJ,mBAAmB74D,IAG/BA,EAKFrvB,IAJA7Q,WAAW,KACT6Q,KACC,OAMP3gB,KAAK8hG,0BAA4B,OAAA9nE,GAAA,GAAS,KACxC,MAAM/tB,EAAO,IAAIjM,KAAKyhG,WACtBzhG,KAAKyhG,UAAU9yF,QAEf3O,KAAKixD,mBAAmB63C,sBAAsB9oG,KAAKiL,OAAQgB,IAC1D,KAAM,GAAO,GAgCV,uBACN,KAAK,mBAAoB/J,SAAWlC,KAAK+oG,eACvC,OAGF,MAAM3nG,EAAYpB,KAAKuP,WAAWnO,UAClC,IAAI4nG,EAAY,EACZC,GAAW,EACXC,GAAO,EACPC,EAAW,EACXC,EAAO,EACPC,EAAM,EAGV,MAAMC,EAAc,KAClB,MAAM7lG,EAASrC,EAAUmoG,aACnBhB,EAAiBvoG,KAAKuP,WAAWg5F,eACpC9kG,IAAWulG,GAAeE,GAASX,IACpCa,GAAQJ,EAAYvlG,GAOnB2lG,GACDppG,KAAKuP,WAAW+vF,qBAAqBt/F,KAAKuP,WAAWwgC,UAAYlrC,KAAKE,MAAMqkG,IAG9EJ,EAAYvlG,EACZ0lG,EAAW,EACXE,EAAM,EACND,EAAO,EACPH,GAAW,EACXC,GAAO,GAGHM,EAAa/yD,IACd4yD,GAAKnnG,OAAO+jB,qBAAqBojF,GACpCA,EAAMnnG,OAAO8jB,sBAAsBywB,EAAS6yD,EAAc,KACxDD,EAAMnnG,OAAO8jB,sBAAsBsjF,OAgEhBtpG,KAAK+oG,eAAiB,IAAIU,eA3DDt4D,IAM9C,GAAG+3D,EAED,YADAM,GAAU,GAIZ,MACM/lG,EADQ0tC,EAAQ,GACDu4D,YAAYjmG,OAEjC,IAAIulG,EAEF,YADAA,EAAYvlG,GAId,MAAMkmG,EAAWX,EAAYvlG,EAC7B,IAAIgyB,EAAOk0E,EAAWP,EACtB,MAAMQ,EAAQn0E,EAAO,EAGrB,GAFAA,GAAQm0E,GAEJX,IACFA,GAAW,EAMRU,EAAW,GAAK3pG,KAAKuP,WAAWg5F,gBAOjC,OALEa,GAAQO,EAGVT,GAAO,OACPM,GAAU,GAWd,GANAL,GAAY1zE,EAMTA,EAAM,CACP,MAAMo0E,EAAgB7pG,KAAKuP,WAAWwgC,UAAYta,EAClDz1B,KAAKuP,WAAW+vF,qBAAqBuK,GAGvCL,GAAU,GAEVJ,EAAOQ,EACPZ,EAAYvlG,KAICgsC,QAAQruC,GAGjB,wBACN,MAAM2nG,EAAiB/oG,KAAK+oG,eACxBA,IAIJA,EAAepe,aACf3qF,KAAK+oG,oBAAiB1gG,GAwFjB,6BACLrI,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,sBAAuBA,KAAKoiG,iBAC/DpiG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkBA,KAAKoiG,iBAC1DpiG,KAAK6R,eAAehR,IAAIb,KAAK4wB,KAAKolB,UAAlCh2C,CAA6C,SAAUA,KAAKoiG,iBAC5DpiG,KAAK6R,eAAehR,IAAIb,KAAKm+C,iBAA7Bn+C,CAA+C,YAAaA,KAAKmiG,oBAG3D,gBAAgBG,EAA4B10D,GAClD,aAAc00D,EAAe,aAAc10D,EAAS,IAAKA,OAAUvlC,EAAY,KAC7Ei6F,EAAch+F,UACb,GAYE,yBA+CA,oBACL,OAAOqZ,OAAOg1C,KAAK3yD,KAAK6wB,SAASlvB,OAAS3B,KAAK2gG,YAAYz9F,KAGrD,qBAAqBwX,EAAqB7P,GAChD7K,KAAKghG,aAAangG,IAAIgK,GACtB7K,KAAK2/F,SAAS3tD,UAAUt3B,EAAQ1a,KAAK2hG,0BACrC3hG,KAAK+gG,SAAS5uF,OAAOuI,GACrB1a,KAAK8pG,eAGC,eACN,GAAG9pG,KAAK+pG,YAAa,OAErB,MAAMv5E,EAAaxwB,KAAK8wB,gBACxB9wB,KAAK+pG,YAAcn9F,EAAA,EAAUo9F,KAAKC,aAAatmG,KAAK,KAClD,IAAI6sB,IAAc,OAClB,IAAI5lB,EAAQ/F,KAAKJ,OAAO0H,MAAMC,KAAKpM,KAAKghG,eAGxC,GAAGhhG,KAAKuP,WAAWxG,UAAU2c,OAAQ,CACnC,MAAMwkF,EAAerlG,KAAKJ,OAAOkZ,OAAOg1C,KAAK3yD,KAAK6wB,SAASpkB,IAAI7K,IAAMA,IAClEgJ,GAASs/F,IACVt/F,EAAQ/F,KAAKJ,IAAIzE,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UAAU1E,OAAS,EAAGA,IAI5G5K,KAAK+gG,SAASx2F,QAAQ,CAACM,EAAK6P,KACvB7P,GAAOD,GACR5K,KAAK4hG,qBAAqBlnF,EAAQ7P,KAItC,MAAMu/F,EAAyB,GAC/B,IAAI,MAAMv/F,KAAO7K,KAAKghG,aAAc,CAClC,MAAMj5F,EAAqB/H,KAAK4wB,KAAKk6B,WAAWjgD,GAC7C7K,KAAKixD,mBAAmBo5C,gBAAgBtiG,IACzCqiG,EAAa7gG,KAAKsB,GActB,OAVA7K,KAAKixD,mBAAmBryC,aAAa5e,KAAKiL,OAAQm/F,GAElDpqG,KAAKghG,aAAaryF,QAEf,MACD3O,KAAKkiB,IAAI,6BAA8BtX,GAKlC5K,KAAKixD,mBAAmBq5C,YAAYtqG,KAAKiL,OAAQL,EAAO5K,KAAK4wB,KAAKthB,UAAUoB,MAAOJ,IACxFtQ,KAAKkiB,IAAI1R,MAAM,mBAAoBF,GACnCtQ,KAAKixD,mBAAmBq5C,YAAYtqG,KAAKiL,OAAQL,EAAO5K,KAAK4wB,KAAKthB,YACjEq4B,QAAQ,KACLnX,MACJxwB,KAAK+pG,iBAAc1hG,EAEhBrI,KAAKghG,aAAa99F,MACnBlD,KAAK8pG,oBAMN,yBACL9pG,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,uBAAyBD,IAC1D,MAAM,OAACkL,EAAM,KAAEgB,EAAI,OAAEsjF,GAAUxvF,EAC5BkL,IAAWjL,KAAKiL,QAEhBgB,IACGsjF,GACFvvF,KAAKkmG,oBAAoBj6F,MAM1B,4BACL,MAAM+/C,EAAW,KACfhsD,KAAK4wB,KAAKu0E,OAAOpwF,SAAS/U,KAAKixD,mBAAmBhkD,4BAA4BjN,KAAKiL,QAAQ/H,OAG7FlD,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAiB,EAAEiL,SAAQJ,UACzDI,IAAWjL,KAAKiL,SAEnBjL,KAAKioG,uBAAuB,CAACp9F,IAC7BmhD,OAGFhsD,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAoB,EAAEiL,SAAQgB,WAC5DhB,IAAWjL,KAAKiL,SAEnBjL,KAAKkmG,oBAAoBj6F,GACzB+/C,OAsXG,gBACL,GAAGhsD,KAAKshG,mBAAmB3/F,OAAQ,CACjC,OAAAkG,EAAA,GAAe7H,KAAKshG,mBAAoB,CAACz2F,EAAK7C,KAC5C,MAAMugD,EAASvoD,KAAK6wB,QAAQhmB,GAC5B,IAAI0/F,GAAM,EACV,GAAGhiD,EAAQ,CACT,MAAM9jC,EAAO8jC,EAAO7jC,wBACpB6lF,EAAOtpE,GAAA,EAAWx9B,OAAS,EAAKghB,EAAKiU,QAChC,CACW14B,KAAK4wB,KAAKk6B,WAAWjgD,GACzB+0B,UACV2qE,GAAM,GAIPA,GACDvqG,KAAKshG,mBAAmBl5F,OAAOJ,EAAK,KAIxChI,KAAKshG,mBAAmBj1F,KAAK,CAACC,EAAGC,IAAMA,EAAID,GAE3C,MAAMzB,EAAM7K,KAAKshG,mBAAmBj4F,MACpCrJ,KAAK4wB,KAAK+0E,aAAa96F,QAEvB7K,KAAK4wB,KAAK+0E,eAYP,iBAAiB5U,GACtB,IAAIh2E,EAAU+1E,GAAkB9wF,KAAKuP,WAAWnO,UAAW2vF,EAAc,UAkBzE,OAFGh2E,IAASA,EAAU,OAAA+P,GAAA,GAAgB/P,EAAS,WAExCA,EAGF,iBAAiB4vC,GACtB,MAAM15B,EAAQjxB,KAAKixD,mBAAmBq2C,uBAAuB38C,GAC7D,IAAI,MAAO9/C,KAAQomB,EACjB,GAAGjxB,KAAK6wB,QAAQhmB,GAAM,CACpB,MAAMD,EAAQ/F,KAAKJ,OAAOwsB,EAAM0hC,QAChC,MAAO,CACLpK,OAAQvoD,KAAK6wB,QAAQhmB,GACrBA,KAAMA,EACN9C,QAAS/H,KAAK4wB,KAAKk6B,WAAWlgD,KAM/B,mBAAmB7C,GACxB,IAAKA,EAA4By+F,WAAY,OAAOxmG,KAAK6wB,QAAQ9oB,EAAQ8C,KACzE,MAAM2/F,EAAUxqG,KAAK4mG,iBAAkB7+F,EAA4By+F,YACnE,OAAOgE,aAAO,EAAPA,EAASjiD,OAGX,sBAAsBA,GAC3B,OAAOp8C,MAAMC,KAAKm8C,EAAO70C,iBAAiB,kBAGrC,iBAAiB7I,EAAa9C,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,IAClE,GAAG9C,EAAQy+F,YAAcxmG,KAAKixD,mBAAmBpG,eAAe9iD,EAAQy+F,YAAY7kG,OAAS,EAAG,CAC9F,MAAM2K,EAAItM,KAAK4mG,iBAAiB7+F,EAAQy+F,YACxC,GAAGl6F,EAED,OADAA,EAAEi8C,OAASj8C,EAAEi8C,OAAO90C,cAAc,iCAAiC5I,QAAYyB,EAAEi8C,OAC1Ej8C,EAIX,MAAMi8C,EAASvoD,KAAK6wB,QAAQhmB,GAC5B,GAAI09C,EAEJ,MAAO,CAACA,SAAQ19C,MAAK9C,WAGf,6BAA6B8C,GACnC,OAAO7K,KAAK6wB,QAAQ,OAAA2rC,GAAA,GAAqBx8D,KAAK6wB,SAASxc,KAAKtB,I,MAC1D,QAAGA,EAAKlI,OACiB,QAAhB,EAAA7K,KAAK6wB,QAAQ9d,UAAG,eAAEhS,kBAIxB,gBAAgB23B,EAAcge,GAAW,GAE9C,IAAI12C,KAAKiL,QAEPjL,KAAK4wB,KAAKywB,gBACVrhD,KAAK+0C,4BACJrc,IAAQ14B,KAAKyqG,sBAAwBzqG,KAAKuP,WAAWxG,UAAU2vB,OAC9DA,IAAQ14B,KAAK0qG,yBAA2B1qG,KAAKuP,WAAWxG,UAAU2c,QAEpE,OAKF,MAAM5d,EAAU6V,OAAOg1C,KAAK3yD,KAAK6wB,SAChCpkB,IAAIsG,IAAOA,GACX1G,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GACnBX,OAAOmH,GAAMA,EAAK,IAAM/S,KAAK2gG,YAAYh1F,IAAIoH,IAC9C,GAAIjL,EAAQnG,OAEZ,GAAG+2B,EACE,MACD14B,KAAKkiB,IAAI,qCAAsCpa,EAAQ,GAAI,SAAUA,EAAQA,EAAQnG,OAAS,GAAI+0C,GAOrF12C,KAAK2qG,WAAW7iG,EAAQ,IAAI,OAAMO,OAAWA,EAAWquC,OAClE,CAEL,MAAMH,EAAiBv2C,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UAGxF,IAA8C,IAA3CxH,EAAQqd,QAAQoxB,EAAe3rC,OAEhC,YADA5K,KAAKiJ,UAAU,UAAU,GAIxB,MACDjJ,KAAKkiB,IAAI,uCAAwCpa,EAAQA,EAAQnG,OAAS,GAAI+0C,GAGjE12C,KAAK2qG,WAAW7iG,EAAQA,EAAQnG,OAAS,IAAI,GAAO,OAAM0G,EAAWquC,IA0DjF,YACL12C,KAAKuP,WAAa,IAAI,IAAW,KAAM,KAAiB,KACxDvP,KAAKiJ,UAAU,OAAO,GACtBjJ,KAAKiJ,UAAU,UAAU,GAEzBjJ,KAAKuP,WAAWnO,UAAUC,OAAOrB,KAAK6iG,WAatC7iG,KAAKuP,WAAWilC,mBAAqBx0C,KAAKqnC,SAC1CrnC,KAAKuP,WAAWq7F,cAAgB,IAAM5qG,KAAK6qG,iBAAgB,GAC3D7qG,KAAKuP,WAAWK,iBAAmB,IAAM5P,KAAK6qG,iBAAgB,GAG3D,KA0BE,uBACL,MAAMt0D,EAAiBv2C,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UAClF1E,EAAQ5K,KAAKiL,SAAW2B,EAAA,EAAU+R,KAAO43B,EAAeu0D,UAAYv0D,EAAew0D,gBAIzF,IAAI,MAAMC,KAAShrG,KAAK0gG,UACtB,GAAGsK,EAAQ,GAAKA,GAASpgG,EAAO,CAC9B,MAAM29C,EAASvoD,KAAK6wB,QAAQm6E,GAC5B,GAAGziD,EAAQ,CAGT,GAFAvoD,KAAK0gG,UAAUvuF,OAAO64F,GAEnBziD,EAAOroD,UAAUuV,SAAS,eAC3B,SAGF8yC,EAAOroD,UAAUoE,OAAO,UAAW,aAAc,eACjDikD,EAAOroD,UAAUW,IAAI,aAMtB,oBAAoBoL,EAAgBg/F,GAAY,EAAMC,GAC3D,IAAItrE,GAAU,EACd3zB,EAAK1B,QAAQM,IACX,KAAKA,KAAO7K,KAAK6wB,SAAU,OAE3B+O,GAAU,EAIV,MAAM2oB,EAASvoD,KAAK6wB,QAAQhmB,UACrB7K,KAAK6wB,QAAQhmB,GACpB7K,KAAK2gG,YAAYxuF,OAAOtH,GAErB7K,KAAKqhG,oBAAsB94C,IAC5BvoD,KAAKqhG,kBAAoB,MAG3BrhG,KAAK6lG,aAAatf,aAAah+B,GAC5BvoD,KAAK2/F,WACN3/F,KAAK2/F,SAAS3tD,UAAUuW,EAAQvoD,KAAK2hG,0BACrC3hG,KAAK+gG,SAAS5uF,OAAOo2C,GAErBvoD,KAAK2/F,SAAS3tD,UAAUuW,EAAQvoD,KAAK6hG,uBACrC7hG,KAAKyhG,UAAUtvF,OAAOtH,IAGxB09C,EAAOjkD,SAGJtE,KAAKmrG,sBAAwBtgG,IAC9B7K,KAAKmrG,yBAAsB9iG,KAM3Bu3B,IAIJ5/B,KAAKuP,WAAW67F,wBACbH,GAAajrG,KAAK4wB,KAAKolB,UAAUC,aAClCj2C,KAAK4wB,KAAKolB,UAAUq1D,mBAAmBrrG,KAAKiL,OAAQgB,GAGtDu2C,EAAA,EAAqBq3C,iBAAgB,EAAO3oE,IAC5ClxB,KAAKgnG,wBAEDkE,GACFlrG,KAAKqnC,YAID,cAAc7W,EAAaxwB,KAAK8wB,iBACtC,IACIw6E,EADAC,GAAkB,EAEtB,IAAIvrG,KAAK0hG,gBAAiB,CACxB,MAAM,aAACzC,EAAY,aAAEroC,GAAgB52D,KAAKuP,WAAWnO,UACrDmqG,EAAkBtM,IAAiBroC,EAShC20C,IAIDD,EAAetrG,KAAK6iG,UACpByI,EAAanmG,MAAMqmG,WAAavM,EAAe,KAC/Cj/F,KAAKuP,WAAW+vF,qBAAqB1oC,GACrC52D,KAAK0hG,iBAAkB,GAI3B,MAAO,CACL6J,kBACAE,aAAcF,EAAkB,KAC3B/6E,KAAgB+6E,IACjBD,EAAanmG,MAAMqmG,WAAa,GAChCxrG,KAAK0hG,iBAAkB,SAEvBr5F,GAID,uBAAuB4D,EAAgB40F,GAC5C,IAAI7gG,KAAKuP,WAAWxG,UAAU2c,OAAQ,CAEpC,MAAM27B,EAAiBrhD,KAAK4wB,KAAKywB,eACjC,GAAGA,EAAgB,CACjB,MAAM7wB,EAAaxwB,KAAK8wB,gBACxBuwB,EAAe19C,KAAK,KACd6sB,KACJxwB,KAAKioG,uBAAuBh8F,KAIhC,OAGCjM,KAAK4wB,KAAKthB,WACXrD,EAAOA,EAAKL,OAAOf,IACjB,MACM6gG,EADU1rG,KAAK4wB,KAAKk6B,WAAWjgD,GACbylF,SACxB,OAAOob,IAAYA,EAAQjI,iBAAmBiI,EAAQ3G,mBAAqB/kG,KAAK4wB,KAAKthB,YAIzFrD,EAAOA,EAAKL,OAAOf,IAAQ7K,KAAK6wB,QAAQhmB,IAMpCg2F,IACFA,EAAe7gG,KAAK6gG,gBACjB7gG,KAAKgmG,mBACNhmG,KAAKgmG,oBAAsBhmG,KAAK2rG,iBAChC3rG,KAAKgmG,oBAAsBhmG,KAAK6iG,YAIpC,MAAMryE,EAAaxwB,KAAK8wB,iBAClB,gBAACy6E,EAAe,aAAEE,GAAgBzrG,KAAK4rG,cAAcp7E,GAErDpmB,EAAUpK,KAAKyoG,qBAAqBx8F,GAAM,GAAO,GACpD40F,GACDz2F,EAAQzG,KAAK,KACX,IAAI6sB,IAAc,OAKlB,IAAI+3B,EACkB,cAAnBvoD,KAAK4wB,KAAKvwB,OACXkoD,EAASvoD,KAAK6wB,QAAQhsB,KAAKJ,OAAOwH,KAGpC,MAAM7B,EAAUm+C,EAASvoD,KAAK6rG,kBAAkBtjD,GAAUvoD,KAAKimG,cAC5DsF,GAEDnhG,EAAQzG,KAAK8nG,KAYd,gBACL,MAAMK,EAAgB9rG,KAAK+rG,mBAC3B,GAAGD,EACD,OAAOA,EAAc7yD,iBAIlB,eACLl+B,EACA4d,EACAmL,EACAkoE,GAEA,MAAMzjD,EAAS,OAAAz9B,GAAA,GAAgB/P,EAAS,UAExC,IAAIkxF,EAEJ,GAAG1jD,GAAuB,QAAb5vB,GAAsB,OAAAwyB,GAAA,GAAW5C,MAAavoD,KAAKs0F,kBAp8D9C,EAo8DkF,GAAsC,CAGtI2X,EAFgB1jD,EAAOxnD,cAkB3B,MAAMmrG,EAAoBlsG,KAAK4wB,KAAKxwB,MAAMy8F,cAAgB78F,KAAK4wB,KAAKxwB,MAAMy8F,aAAa38F,UAAUuV,SAAS,uBAA0BzV,KAAK4wB,KAAKxvB,UAAUlB,UAAUuV,SAAS,sBACrKrL,EAAUpK,KAAKuP,WAAWi0B,kBAAkB,CAChDzoB,UACA4d,WACAwzE,OATW,EAUXroE,iBACAkoE,gBACAI,KAAM,IACNC,cAAeH,EAAmB,EAAEznF,WAGlC,IAAIhhB,EAASw9B,GAAA,EAAWx9B,OAIxB,OAFAA,GAAUzD,KAAKm+C,iBAAiBwY,UAChClzD,GAAU0kB,EAAA,EAAWC,UAAY6Y,GAAA,EAAWx9B,OAAS,IAAM,GAAK,GACzDA,QAKL4E,EACJ4jG,sCACAz1C,cAAgB81C,IAEdtsG,KAAKqnC,UAAS,EAAMilE,MASxB,OAJGxoE,IAAmB,KAAeC,SACnC/jC,KAAKuP,WAAWg9F,mBAAqBvsG,KAAKuP,WAAWwgC,WAGhD3lC,EAGF,cACL,OAAOpK,KAAK6rG,kBAAkB7rG,KAAK6iG,WAGxB,kBAAkBt6C,G,0CAK7B,GAAGA,EAAQ,CACTvoD,KAAKgmG,kBAAoBz9C,EACzB,MAAM/3B,EAAaxwB,KAAK8wB,gBAExB,SADM9wB,KAAKwsG,eAAejkD,EAAQ,WAAOlgD,OAAWA,IAChDmoB,IAAc,OAClBxwB,KAAKgmG,uBAAoB39F,MAKrB,mBACN,IAAkBokG,EAAdC,EAAW,EACf,IAAI,MAAM9qG,KAAK5B,KAAK4gG,aAAc,CAChC,MAAMiH,EAAc7nG,KAAK4gG,aAAah/F,GACnCimG,EAAY8E,eAAiBD,IAC9BD,EAAW5E,EAAYzmG,UACvBsrG,EAAW7E,EAAY8E,gBAI3B,OAAOF,EAGI,qBAAqBlkD,G,0CAChC,GAAGvoD,KAAK2rG,kBAAoBpjD,EAE1B,OAAOvoD,KAAKimG,iBAIT,gBAAgBlrF,GACrB,MAAM6xF,EAAa,mBAChB7xF,EAAQ7T,QAAQ0lG,KACjB97F,cAAciK,EAAQ7T,QAAQ0lG,IAC9B7xF,EAAQ7a,UAAUoE,OAAO,kBACpByW,EAAQ0oB,aAGf1oB,EAAQ7a,UAAUW,IAAI,kBACtBka,EAAQ7T,QAAQ0lG,GAAc,GAAK98F,WAAW,KAC5CiL,EAAQ7a,UAAUoE,OAAO,yBAClByW,EAAQ7T,QAAQ0lG,IACtB,KAGG,iBAAiBhxC,EAAmBpvC,EAAa,IAAIkwB,KAAiB,IAAZkf,IAChE,IAAIS,EAEJ,MAAMwwC,EAAQ,IAAInwD,KAClBmwD,EAAMhxC,SAAS,EAAG,EAAG,EAAG,GAExB,MAAM7uD,EAAiC,cAAnBhN,KAAK4wB,KAAKvwB,KAE9B,GAAGwsG,EAAM7wC,YAAcxvC,EAAKwvC,UAC1BK,EAAc,YAAKrvD,EAAc,8BAAgC,mBAC5D,GAAGA,GEvrE4B,aFurEb4uD,EACvBS,EAAc,YAAK,mCACd,CACL,MAAM38D,EAAsC,CAC1CupF,IAAK,UACL/sB,MAAO,QAGN1vC,EAAK2vC,gBAAkB0wC,EAAM1wC,gBAC9Bz8D,EAAQ08D,KAAO,WAGjBC,EAAc,IAAI,IAAKC,gBAAgB,CACrC9vC,OACA9sB,YACCqb,QAEA/N,IACDqvD,EAAc,YAAK,yBAA0B,CAACA,KAIlD,MAAM9T,EAAS5nD,SAASC,cAAc,OACtC2nD,EAAOv6C,UAAY,yBACnB,MAAM8+F,EAAgBnsG,SAASC,cAAc,OAC7CksG,EAAc5sG,UAAUW,IAAI,kBAC5B,MAAMksG,EAAapsG,SAASC,cAAc,OAQ1C,OAPAmsG,EAAW7sG,UAAUW,IAAI,eAEzBksG,EAAW1rG,OAAOg7D,GAElBywC,EAAczrG,OAAO0rG,GACrBxkD,EAAOlnD,OAAOyrG,GAEPvkD,EAGF,0BAA0BxgD,EAAcU,GAC7C,MAAM+jB,EAAO,IAAIkwB,KAAoB,IAAf30C,EAAQykB,MAC9BA,EAAKqvC,SAAS,EAAG,EAAG,GACpB,MAAME,EAAgBvvC,EAAKwvC,UAC3B,IAAIh8D,KAAK4gG,aAAa7kC,GAAgB,CACpC,MAAMxT,EAASvoD,KAAKgtG,iBAAiBjlG,EAAQykB,KAAMA,GAE7CygF,EAAajtG,KAAKgtG,iBAAiBjlG,EAAQykB,KAAMA,GACvDygF,EAAW/sG,UAAUW,IAAI,WAEzB,MAAMO,EAAYT,SAASC,cAAc,WACzCQ,EAAU4M,UAAY,qBACtB5M,EAAUC,OAAOknD,EAAQ0kD,GAEzBjtG,KAAK4gG,aAAa7kC,GAAiB,CACjC/qC,IAAKu3B,EACLnnD,YACAurG,eAAgBngF,EAAKwvC,WAGvB,MAAMO,EAAiB,OAAAC,GAAA,GAAqBx8D,KAAK4gG,aAAc,OAC/D,IAA2C3/F,EAAvCW,EAAI,EAAGD,EAAS46D,EAAe56D,OACnC,KAAMC,EAAI26D,EAAe56D,SAAUC,EAAG,CACpC,MAAM0S,EAAIioD,EAAe36D,GAEzB,GADAX,EAAejB,KAAK4gG,aAAatsF,GAAGlT,UACjC26D,EAAgBznD,EACjB,MAID1S,IAAMD,GAAUV,IACjBA,EAAeA,EAAaq7B,oBAG1Br7B,EAGFjB,KAAK6iG,UAAU5hG,aAAaG,EAAWH,GAFvCjB,KAAK6iG,UAAUxhG,OAAOD,GAKrBpB,KAAKs0F,mBACNt0F,KAAKs0F,kBAAkBG,2BAA2BrzF,GAItD,OAAOpB,KAAK4gG,aAAa7kC,GAGpB,UAGL/7D,KAAKuP,WAAWq7F,cAAgB5qG,KAAKuP,WAAWK,iBAAmB5P,KAAKuP,WAAWilC,mBAAqB,KAExGx0C,KAAK6R,eAAeO,YAEpBpS,KAAKsuB,cAAc3f,QACnB3O,KAAK2/F,UAAY3/F,KAAK2/F,SAAShV,aAC/B3qF,KAAKs0F,mBAAqBt0F,KAAKs0F,kBAAkB3J,oBAE1C3qF,KAAKsuB,cACZtuB,KAAK2/F,iBAAmB3/F,KAAK2/F,SAC7B3/F,KAAKs0F,0BAA4Bt0F,KAAKs0F,kBAGjC,QAAQ4Y,GAAa,GAC1BltG,KAAK6wB,QAAU,GAEf7wB,KAAKiJ,UAAU,OAAO,GACtBjJ,KAAKiJ,UAAU,UAAU,GAGzB,aAAqBjJ,KAAKuP,WAAWnO,WAGrC,oBAEmBiH,IAAhB23F,KACDA,QArrE4B33F,GAwrE9BrI,KAAK2gG,YAAYhyF,QACjB3O,KAAK4gG,aAAe,GACpB5gG,KAAK6lG,aAAa/3F,UAClB9N,KAAK0gG,UAAU/xF,QACf3O,KAAK4wF,WAAWjvF,OAAS,EACzB3B,KAAKsuB,cAAc3f,QAGhBu+F,IACDltG,KAAKuP,WAAWnO,UAAUqvB,YAAc,IAG1CzwB,KAAKqhG,kBAAoB,KACzBrhG,KAAKmtG,sBAAuB,EAE5BntG,KAAKkhG,cAAcv/F,OAAS,EAC5B3B,KAAKihG,qBAAuB,KAE5BjhG,KAAKyqG,qBAAuBzqG,KAAK0qG,6BAA0BriG,EAC3DrI,KAAKotG,qBAAkB/kG,EACvBrI,KAAKqtG,gCAA6BhlG,EAE/BrI,KAAKs0F,mBACNt0F,KAAKs0F,kBAAkB3J,aAGtB3qF,KAAK2/F,WACN3/F,KAAK2/F,SAAShV,aAEd3qF,KAAK+gG,SAASpyF,QACd3O,KAAKghG,aAAaryF,QAClB3O,KAAK+pG,iBAAc1hG,EAEnBrI,KAAKyhG,UAAU9yF,SAGjB3O,KAAKwwB,WAAW3U,QAEhB7b,KAAKstG,qBAAkBjlG,EACvBrI,KAAKutG,4BAAyBllG,EAC9BrI,KAAKmrG,yBAAsB9iG,EAC3BrI,KAAK+hG,sBAAmB15F,EACxBrI,KAAK+nG,wBAAqB1/F,EAE1BrI,KAAKgmG,uBAAoB39F,EAGzBrI,KAAK0hG,iBAAkB,EAIpB1hG,KAAK8gG,qBACNhwF,aAAa9Q,KAAK8gG,oBAClB9gG,KAAK8gG,mBAAqB,GAG5B9gG,KAAKm+C,iBAAiBj+C,UAAUoE,OAAO,oBACvCtE,KAAKuP,WAAWi+F,gBAGX,QAAQviG,EAAgBy4F,EAAoB7L,G,MAIjD,IAAI5sF,EAIF,OAHAjL,KAAK8N,SAAQ,GACb9N,KAAKiL,OAASA,EACdjL,KAAKoqB,UAAUk4B,SACR,KAGT,MAAMmrD,EAAWztG,KAAKiL,SAAWA,EAM3BsjF,EAAWvuF,KAAK4wB,KAAKvwB,MAEX,cAAbkuF,GAA4BvuF,KAAK4wB,KAAK8iB,gBACvCgwD,EAAY,GAGd,MAAMntD,EAAiBv2C,KAAKu2C,eAAiBv2C,KAAKixD,mBAAmBk5C,kBAAkBl/F,EAAQjL,KAAK4wB,KAAKthB,UACzG,IAAIo+F,EAA0B,WAAbnf,EAAwBvuF,KAAKixD,mBAAmB08C,eAAe1iG,GAAQL,MAAiC,QAAzB,EAAA5K,KAAKu2C,eAAe3rC,aAAK,QAAI,EAC7H,MAAMgjG,OAAyBvlG,IAAdq7F,EAOjB,IAAImK,EACeC,EAAiEC,EAAhFjD,EAAY,EAChB,IAAI8C,EAKF,GAJIH,IACFK,EAAgB9tG,KAAK4wB,KAAKoyE,aAAagL,qBAAqBhuG,KAAK4wB,OAGhEk9E,QAEI,GAAGJ,EAAY,CACpB5C,EAAY9qG,KAAKixD,mBAAmBg9C,qBAAqBhjG,EAAQjL,KAAK4wB,KAAKthB,UAC3E,MAAM4H,EAASlX,KAAKixD,mBAAmB4oB,cAAc5uE,GACrD,IAA4B6/F,GAAc2C,GAAcv2F,GAAkC,IAAxBA,EAAOg3F,aASvExK,EAAYgK,MATgF,CAC5F,MAAMS,EAAa53D,EAAezuC,QAAQsmG,gBAAgBtD,GACvDqD,GAAcA,EAAWxoG,MAAMg8B,MAAM,KAAS0sE,UAC/CN,EAAwBI,EAAWxoG,MAAMwoG,EAAW75E,OAAS,KAAO65E,EAAWxoG,MAAM,IAAMmlG,GAG7F+C,GAAmBD,EACnBlK,EAAYoH,GAQlB,MAAMwD,EAAS5K,IAAcgK,GAEvB,WAACn+F,GAAcvP,KAErB,GAAGytG,EAAU,CACX,MAAMj6C,EAAUxzD,KAAKyzD,iBAAiBiwC,GACtC,GAAGlwC,EAgBD,OAfGo6C,GACD5tG,KAAKwsG,eAAeh5C,EAAQjL,OAAQ,UACpCvoD,KAAK4nG,gBAAgBp0C,EAAQjL,QAC7BvoD,KAAK4wB,KAAKte,cAAc,UAAWoxF,GAAW,IACtCgK,IAAeY,IAGvBtuG,KAAKimG,cACLjmG,KAAK4wB,KAAKte,cAAc,UAAWoxF,GAAW,SAG9Br7F,IAAfwvF,GACD73F,KAAK4wB,KAAKxwB,MAAMmuG,cAAc1W,GAGzB,UAGN73F,KAAKiL,SACNjL,KAAKsuB,cAAc00B,UAAY,GAC/BhjD,KAAK4wB,KAAKqxE,WAAWuM,WAAWxuG,KAAK4wB,KAAKC,QAAQvC,cAAc00B,UAGlEhjD,KAAKiL,OAASA,EACdjL,KAAKshG,mBAAmB3/F,OAAS,EAEjC3B,KAAKwhG,aAAe,CAClBiN,wBAAyBzuG,KAAKwwF,gBAAgBhW,WAAWvvE,IAAWjL,KAAKkgG,gBAAgBwO,MAAMzjG,IAIhG,MACDjL,KAAKkiB,IAAI,kBAAmBjX,EAAQjL,KAAKu2C,eAAgBmtD,EAAWgK,GAItE,MAAMiB,EAAgBZ,UAA0BO,GAAuB,cAAb/f,GAA4BvuF,KAAK4wB,KAAK8iB,aAAe,EAAIg6D,EAQnH,IAAIkB,EAAc,EAClB,GAAGnB,EAAU,CACX,IAAI3rG,EAAK9B,KAAK6uG,iBAAiB,UAE5B/sG,IACD8sG,GAAe9sG,EAAGoF,QAAQ2D,KAGzB+jG,GAAe,IAChBA,EAAc/pG,KAAKJ,OAAOkZ,OAAOg1C,KAAK3yD,KAAK6wB,SAASpkB,IAAI5B,IAAQA,UAGlE7K,KAAKuhG,aAAc,EACnBvhG,KAAK8uG,wBAGP,MAAMC,EAAe/uG,KAAK6iG,UAC1B7iG,KAAK8N,UACL,MAAM+0F,EAAY7iG,KAAK6iG,UAAYliG,SAASC,cAAc,OACvD6sG,GACD5K,EAAU70F,UAAY+gG,EAAa/gG,UACnC60F,EAAU3iG,UAAUoE,OAAO,gBAAiB,iBAE5Cu+F,EAAU3iG,UAAUW,IAAI,iBAG1Bb,KAAKsuB,cAAc+oC,OAGnB,MAAM23C,EAAuBvB,GAAaC,GAAcY,GAAWV,EAC7DqB,EAASL,EAAc,KAAOlL,GAAakL,EAAclL,GAAaA,EAAY,GAClFwL,GAAkBD,GAAUxB,EAC5B0B,GAAgBD,GAAkBD,EAGxC,IAAI3kG,EAFJtK,KAAKovG,iBAAmBF,GAAkBC,EAMxC7kG,EAHEwjG,EAGO,CACP1jG,QAAS,eAA2BzG,KAAK,IAChC3D,KAAKyoG,qBAAqBqF,EAAc7hG,MAAM,GAAM,OAAO5D,IAEpE2X,QAAQ,GANDhgB,KAAK2qG,WAAWjH,GAAW,EAAM4K,EAAQK,GAUpD,MAAM,QAACvkG,EAAO,OAAE4V,GAAU1V,EAGtB0V,GACEytF,IACFl+F,EAAWnO,UAAUqvB,YAAc,GAEnCzwB,KAAK4wB,KAAK03E,iBAAiBsF,EAAUU,EAAQ5K,EAAW7L,GACxD73F,KAAKoqB,UAAUuE,OAAO3uB,KAAKm+C,mBAQ/B,MAAM3tB,EAAaxwB,KAAK8wB,gBAExB0xB,EAAA,EAAqB6sD,UAAUn+E,IAC/B,MAAMmwB,EAAiBj3C,EAAQzG,KAAK,KA8BlC,GA3BGqc,IACGytF,GACFztG,KAAK4wB,KAAK03E,iBAAiBsF,EAAUU,EAAQ5K,EAAW7L,IAI5D73F,KAAKoqB,UAAUk4B,SAEZtiD,KAAKutG,yBACNvtG,KAAKutG,yBACLvtG,KAAKutG,4BAAyBllG,GAKhCkH,EAAW+1F,oBAAsB,EACjC/1F,EAAWg9F,mBAAqB,EAChC,OAAA97F,EAAA,GAAelB,EAAWnO,UAAWyhG,GAErCrgD,EAAA,EAAqB8sD,YAAYp+E,IACjCsxB,EAAA,EAAqBq3C,iBAAgB,EAAO3oE,IAG1ClxB,KAAKsuB,cAAc+tE,SAIlByR,EACDv+F,EAAW+vF,qBAAqBwO,EAAcp1E,UAYzC,GAAGs2E,EAAsB,CAC9B,IAAIvD,EACJ,GAAGyD,EACD3/F,EAAW+vF,qBAAqB,YAC3B,GAAG6P,EAAc,CACtB,MAAM30F,EAAMxa,KAAK4rG,gBACdpxF,EAAI+wF,kBACLE,EAAejxF,EAAIixF,cAGrBl8F,EAAW+vF,qBAAqB,GAGlC,MAAMiQ,EAAqB7L,EAAY1jG,KAAKyzD,iBAAiBiwC,GAAa,CAACn7C,OAAQvoD,KAAK2rG,iBACxF,IAKIvhG,EALAm+C,EAAuBslD,GAAmB7tG,KAAKqhG,oBAAsBkO,aAAkB,EAAlBA,EAAoBhnD,QAO7F,IANIA,aAAM,EAANA,EAAQxnD,iBACVwnD,EAASvoD,KAAKwvG,6BAA6B9L,IAK1Cn7C,EAAQ,CACT,MAAMknD,EAAazvG,KAAK2rG,gBAClBhzE,EAAkCk1E,EAAkB,QAAYS,GAAWV,GAAY6B,IAAelnD,EAAiB,SAAR,MAGnHn+C,EADc,QAAbuuB,GAAsB82E,IAAelnD,GAAUklD,EACtCztG,KAAKimG,cAELjmG,KAAKwsG,eAAejkD,EAAQ5vB,EAAW80E,OAAmCplG,EAAxB,KAAe07B,SAGzE8pE,GAAmBD,GACrB5tG,KAAK4nG,gBAAgBr/C,GAItBkjD,IACArhG,GAAW/E,QAAQ6E,WAAWvG,KAAK,KAClC8nG,WAIJl8F,EAAW+vF,qBAAqB,OAIhCt/F,KAAK0vG,oBAGP1vG,KAAKqnC,WAEL,MAAM7W,EAAaxwB,KAAK8wB,gBAClB6+E,EAAkBtqG,QAAQC,IAAI,CAAC+7C,EAAgB,iBACrDsuD,EAAgBhsG,KAAK,KACnB4L,EAAW8uB,qBAObr+B,KAAK4wB,KAAKte,cAAc,UAAWoxF,GAAY4K,GAG/C,GAD8BtuG,KAAKwwF,gBAAgBtpD,UAAUj8B,GACnC,CACxB,MAAMulB,EAAaxwB,KAAK8wB,gBAClB8+E,EAAiB,KACrB,IAAIp/E,IAAc,OAElB,MAAMvkB,EAAiB,GACvB,IAAI,MAAMpB,KAAO7K,KAAK6wB,QAAS,CAC7B,IAAI9oB,EAAqB/H,KAAK4wB,KAAKk6B,YAAYjgD,GAC9B,YAAd9C,EAAQqD,IAIXrD,EAAU/H,KAAKixD,mBAAmBu+B,sBAAsBznF,GACxDkE,EAAK1C,KAAKxB,EAAQ8C,OAGJoB,EAAKtK,OAAS3B,KAAKwgG,oBAAoBqP,qBAAqB7vG,KAAKiL,OAAQgB,GAAQ5G,QAAQ6E,WACjGvG,KAAK,KACXmM,WAAW8/F,EAAgB,QAI/BvqG,QAAQC,IAAI,CAACqqG,EAAiB,eAA4B,OAAA1rG,GAAA,GAAM,OAAON,KAAK,KAC1EisG,MAIJ,MAAME,EAAoB9vG,KAAKixD,mBAAmB8+C,sBAAsB9kG,GA4DxE,GA3DqB6iG,GAAiBgC,EAOpCH,EAAgBhsG,KAAK,KACnB,GAAI6sB,MAIJjhB,EAAW8uB,mBAERyxE,GAAmB,CACpB,MAAM1wE,EAAI,KACRp/B,KAAKotG,gBAAkB,IAAI/nG,QAAe6E,IACpCsmB,KAAiBxwB,KAAKixD,mBAAmB8+C,sBAAsB9kG,GAKnEjL,KAAKixD,mBAAmB++C,cAAc/kG,EAAQjL,KAAK4wB,KAAKthB,UAAU3L,KAAM4yC,IACtE,IAAI/lB,MAAiB+lB,EAEnB,YADArsC,IAIF,MACM+lG,EADQ15D,EAAezuC,QAAQnC,MACXg8B,MAAM,KAAS0sE,QACtC9+F,EAAWxG,UAAU2c,QAAUnW,EAAWxG,UAAU2c,SAAWuqF,IAChEjwG,KAAKiJ,UAAU,SAAUgnG,GACzBjwG,KAAKqnC,YAGPv3B,WAAWsvB,EAAG,KACdl1B,MAlBAA,MAoBDy9B,QAAQ,KACT3nC,KAAKotG,qBAAkB/kG,KAIxBolG,EACD39F,WAAWsvB,EAAG,KAEdA,OA3CFskE,IAAa1jG,KAAK6wB,QAAQ68E,IAAehK,IAAcgK,GACzD1tG,KAAKiJ,UAAU,UAAU,GAgD7BjJ,KAAKkiB,IAAI,mBAAoB3S,EAAWxG,UAAU2c,QAG/CnW,EAAWxG,UAAU2c,QAAUgoF,IAAe1tG,KAAK+gG,SAAS79F,MAC7DlD,KAAKkwG,oBAGS,SAAb3hB,EAAqB,CACtB,MAAMr3E,EAASlX,KAAKixD,mBAAmB4oB,cAAc5uE,IAClDiM,aAAM,EAANA,EAAQqH,OAAO4xF,cAChBnwG,KAAKixD,mBAAmBm/C,iBAAiBnlG,GAAQ,MAUpDyF,MAAMJ,IAMP,MALAtQ,KAAKkiB,IAAI1R,MAAM,4BAA6BF,GACxCkgB,KACFxwB,KAAKoqB,UAAUk4B,SAGXhyC,IAGR,MAAO,CAAC0P,SAAQ5V,QAASi3C,GAGpB,oBACL,GAAsB,SAAnBrhD,KAAK4wB,KAAKvwB,MAAsC,eAAnBL,KAAK4wB,KAAKvwB,KAAuB,CAC/D,MAAM0M,EAAU/M,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UACjFtP,KAAKixD,mBAAmBq5C,YAAYtqG,KAAKiL,OAAQ8B,EAAQnC,MAAO5K,KAAK4wB,KAAKthB,UAAU,IAIjF,mBACL,MAAM43B,EAAYlnC,KAAKwwF,gBAAgBtpD,UAAUlnC,KAAKiL,QAChDolG,EAAWrwG,KAAK4wB,KAAK62E,UAE3BznG,KAAK6iG,UAAU3iG,UAAUC,OAAO,aAAckwG,GAC9CrwG,KAAKm+C,iBAAiBj+C,UAAUC,OAAO,wBAAyBkwG,GAEhErwG,KAAK6iG,UAAU3iG,UAAUC,OAAO,UAAWH,KAAK4wB,KAAK4pD,cACrDx6E,KAAK6iG,UAAU3iG,UAAUC,OAAO,aAAc+mC,GAE9ClnC,KAAKswG,uBAGA,oBAAoBvoG,EAAcwgD,EAAqB9/C,EAAkBu6B,GAY9E,OAFAhjC,KAAKkhG,cAAc33F,KAAK,CAACxB,UAASwgD,SAAQ9/C,UAASu6B,aAE5ChjC,KAAKwoG,0BAGP,0BACL,OAAGxoG,KAAKihG,uBAAyBjhG,KAAKkhG,cAAcv/F,OAAe0D,QAAQ6E,UAEpElK,KAAKihG,qBAAuB,IAAI57F,QAAQ,CAAC6E,EAASmlB,KACvDvf,WAAW,KACT,MAAM+vF,EAAQ7/F,KAAKkhG,cAAcv7F,QACjC3F,KAAKkhG,cAAcv/F,OAAS,EAE5B,MAAMqhC,EAAW68D,EAAMpuE,OAAO,CAACC,GAAMsR,eAAetR,EAAInoB,QAAQy5B,GAAWtR,GAAM,IAQjF1xB,KAAKkiB,IAAI,mBAAoB8gB,EAAU68D,EAAO7/F,KAAK+0C,4BACnD,MAAMvkB,EAAaxwB,KAAK8wB,gBACxBzrB,QAAQC,IAAI09B,GAAUr/B,KAAK,KACzB,IAAI6sB,IACF,KAAM,yCAGLxwB,KAAKmhG,uBACNnhG,KAAKmhG,wBAGJnhG,KAAKohG,iCACNphG,KAAKohG,kCAGPvB,EAAMt1F,QAAQ,EAAExC,UAASwgD,SAAQ9/C,cAC/BzI,KAAK+lG,kBAAkBx9C,EAAQxgD,EAASU,KAIxCyB,IAEFlK,KAAKihG,qBAAuB,KAEzBjhG,KAAKkhG,cAAcv/F,QACpB3B,KAAKwoG,0BAGPxoG,KAAKuwG,uBAEJ7/F,MAAM2e,IACR,KAMA,kBAAkBk5B,EAAqBxgD,EAAmDU,GAC/F,GAAGV,EAAQwW,OAAOiyF,MAEhB,YADAxwG,KAAK6iG,UAAW96F,EAA4BwW,OAAOswE,UAAY,SAAW,WAAWtmC,GAIvF,MAAMs/C,EAAc7nG,KAAKywG,0BAA0B1oG,EAASU,GAC5D,GAAsB,cAAnBzI,KAAK4wB,KAAKvwB,MAA2C,WAAnBL,KAAK4wB,KAAKvwB,KAAiC,CAC9E,MAAMi0B,EAASt0B,KAAKs0F,kBAvtFJ,EAutFwC,EACxD,IAAI/jE,EAAWpkB,MAAMC,KAAKy7F,EAAYzmG,UAAUmvB,UAAU5qB,MAAM2uB,GAC5D1yB,EAAI,EAAG+kF,EAA0B,EACrC,KAAM/kF,EAAI2uB,EAAS5uB,SAAUC,EAAG,CAC9B,MAAM0S,EAAIic,EAAS3uB,GACbg6D,GAAatnD,EAAEpN,QAAQ00D,UAC7B,GAAG7zD,EAAQykB,KAAOovC,EAChB,MAKF,GAJU7zD,EAAQykB,OAASovC,IACzB+qB,GAA2BryE,EAAEpN,QAAQ2D,KAGpC87E,GAA2B5+E,EAAQ8C,IAAM87E,EAC1C,MAKJ,IAAIzhE,EAAQoP,EAAS1yB,EAQrBopD,GAAuBzC,EAAQs/C,EAAYzmG,UAAW8jB,QAEnDzc,EACDo/F,EAAYzmG,UAAUH,aAAasnD,EAAQs/C,EAAYzmG,UAAUmvB,SAASvwB,KAAKs0F,kBAAoBoc,EAAoB,GAAGvvG,aAE1H0mG,EAAYzmG,UAAUC,OAAOknD,GAIhB,YAAdxgD,EAAQqD,GAAoBrD,EAAQG,QAAU63F,GAAmBp0F,IAAI5D,EAAQG,OAAOkD,GACrFpL,KAAK6lG,aAAa8K,UAAUpoD,EAAQxgD,EAASU,GAE7C8/C,EAAOroD,UAAUW,IAAI,iBAAkB,iBAIpC,cAAc+vG,GACnB,OAAO5wG,KAAKwwB,WAAW7c,IAAIi9F,GAIrB,cAAc7oG,EAAmDU,GAAU,EAAOooG,GAAiB,EAAOtoD,EAAsB,KAAMs+C,GAAiB,G,cAI7J,IAAIt+C,GAAUvoD,KAAK6wB,QAAQ9oB,EAAQ8C,KACjC,OAGF,MAAMikF,EAA0B,YAAd/mF,EAAQqD,EACpBu/C,EAAUmkC,GAAa/mF,EAAQy+F,WAG/BsK,EAA6C,WAAnB9wG,KAAK4wB,KAAKvwB,KAC1C,GAAG0H,EAAQ63B,QAAS,OACf,GAAG+qB,GAAWmmD,EAAyB,CAC1C,MAAM/jG,EAAU/M,KAAKixD,mBAAmBq2C,uBAAuB38C,GACzD//C,EAAQ/F,KAAKJ,OAAOsI,EAAQ4lD,QAClC,GAAG5qD,EAAQ8C,IAAMD,EACf,OAIJ,MAAMK,EAASjL,KAAKiL,OAEd8lG,EAAMhpG,EAAQkI,SAAWrD,EAAA,EAAU+R,MAAS5W,EAAQwW,OAAO6I,KAAOpnB,KAAKwwF,gBAAgB1iC,YAAY7iD,GAEnG6kF,EAAanvF,SAASC,cAAc,OAK1C,IAAIivF,EACAmhB,EAGJ,GARAlhB,EAAW5vF,UAAUW,IAAI,WAQrB0nD,EAsBG,CACL,MAAMvE,EAAO,CAAC,iBAAkB,iBAAkB,iBAC5CitD,EAAgB1oD,EAAOv6C,UAAUq1C,MAAM,KACvC6tD,EAAa,CAAC,UAAUxpG,OAAOs8C,EAAKp4C,OAAOksB,GAAKm5E,EAAchyE,SAASnH,KAC7EywB,EAAOv6C,UAAYkjG,EAAW9lF,KAAK,KAEnC4lF,EAAiBzoD,EAAOtP,iBACpB+3D,EAAe9wG,UAAUuV,SAAS,4BACpCu7F,EAAiBzoD,EAAO90C,cAAc,4BAGxCo8E,EAAkBmhB,EAAe/kF,kBACjC4jE,EAAgBrhF,UAAY,GAC5BqhF,EAAgB1qF,MAAM2X,QAAU,GAChCk0F,EAAexiG,UAAY,GAC3BwiG,EAAep4E,YAAYi3D,GAE3B,MAAMshB,EAAkBH,EAAe7rG,MAAMgsG,gBAC7CH,EAAe7rG,MAAM2X,QAAU,GAC/Bk0F,EAAe7rG,MAAMgsG,gBAAkBA,EAEpC5oD,IAAWvoD,KAAKqhG,mBACjB94C,EAAOroD,UAAUW,IAAI,mBAIvB,MAAMuwG,GAAe7oD,EAAOrhD,QAAQ2D,KACnB9C,EAAQ8C,MAAQumG,WAMxBpxG,KAAK6wB,QAAQugF,GACpBpxG,KAAK2gG,YAAYxuF,OAAOi/F,SA5C1B,GAXAJ,EAAiBrwG,SAASC,cAAc,OACxCowG,EAAe9wG,UAAUW,IAAI,0BAE7BgvF,EAAkBlvF,SAASC,cAAc,OACzCivF,EAAgB3vF,UAAUW,IAAI,mBAE9B0nD,EAAS5nD,SAASC,cAAc,QACzBV,UAAUW,IAAI,UACrBmwG,EAAep4E,YAAYi3D,GAC3BtnC,EAAO3vB,YAAYo4E,IAEfD,IAAQhpG,EAAQwW,OAAO6I,KAAOpnB,KAAK2/F,SAAU,EAE9B53F,EAAQwW,OAAO8yF,QAC9BrxG,KAAKixD,mBAAmBo5C,gBAAgBtiG,SACLM,IAAlCrI,KAAKu2C,eAAeu0D,WAA2B9qG,KAAKu2C,eAAeu0D,UAAY/iG,EAAQ8C,OAExF7K,KAAK2/F,SAASlwD,QAAQ8Y,EAAQvoD,KAAK2hG,0BACnC3hG,KAAK+gG,SAASvmF,IAAI+tC,EAAQxgD,EAAQ8C,MA4CxC7K,KAAK6wB,SAAS9oB,EAAQ8C,KAAO09C,EAC7BA,EAAOrhD,QAAQ2D,IAAM,GAAK9C,EAAQ8C,IAClC09C,EAAOrhD,QAAQ+D,OAAS,GAAKlD,EAAQkD,OACrCs9C,EAAOrhD,QAAQ00D,UAAY,GAAK7zD,EAAQykB,KAExC,MAAM4B,EAA+B,GAErC,KAAiB,mBAAdrmB,EAAQqD,GAA4BrD,EAAQG,QAAW63F,GAAmBp0F,IAAI5D,EAAQG,OAAOkD,IAAK,CACnG,MAAMlD,EAASH,EAAQG,OACvB,GAAGA,EAAQ,CACT,MAAMkD,EAAIlD,EAAOkD,EACjB,GAAG00F,GAAen0F,IAAIP,IAAO2xE,EAAA,EAASzE,eAAeltE,KAAO2xE,EAAA,EAAS3xE,GAEnE,OADApL,KAAK2gG,YAAY9/F,KAAKkH,EAAQ8C,KACvB09C,EAIXA,EAAOv6C,UAAY,iBAEnB6hF,EAAgBrhF,UAAY,GAC5B,MAAMsN,EAAInb,SAASC,cAAc,OAqBjC,OApBAkb,EAAE5b,UAAUW,IAAI,eACbqH,IACe,oCAAbA,EAAOkD,EACR0Q,EAAEza,OAAO,YAAK,qBAAsB,CAAC,IAAI,KAAU,CAAC4J,OAAQ/C,EAAOopG,QAAQ/lF,UAAS,KAAQxQ,WACvE,+BAAb7S,EAAOkD,EACf0Q,EAAEza,OAAO,YAAK,mBAAoB,CAAC,IAAI,KAAU,CAAC4J,OAAQ/C,EAAO67F,WAAWx4E,UAAS,KAAQxQ,WAE7Fe,EAAEza,OAAOrB,KAAKixD,mBAAmBsgD,yBAAyBxpG,KAG9D8nF,EAAgBxuF,OAAOya,GAEpB+qF,IACD7mG,KAAKwxG,oBAAoBzpG,EAASwgD,EAAQ9/C,EAAS2lB,GAEhDrmB,EAAQwW,OAAOkzF,WAChBlpD,EAAOroD,UAAUW,IAAI,kBAIlB0nD,EAGT,IAEImpD,EAAwB/5C,EAFxBg6C,EAA6B7iB,GAAa/mF,EAAQ0Q,MAGtD,GAAGq2E,EACD,IAAsD,QAAnD,EAAC6iB,SAAkD,eAAEhxG,YACrD,CAAC,QAAS,OAAOs+B,SAAW0yE,EAAmDhxG,SAAwBN,YAEnG,GAAGsqD,GAAWmmD,EAAyB,CAC5C,MAAMx8F,EAAItU,KAAKixD,mBAAmB2gD,aAAajnD,GAC/C+mD,EAAiBp9F,EAAEvM,QAEnB4vD,EAAgBrjD,EAAEqjD,kBAC8E,aAAX,QAA3E,EAAkD,QAAlD,EAAAg6C,SAAkD,eAAEhxG,gBAAuB,eAAEN,QACvFqxG,EAAiB3pG,EAAQA,QAEzB4vD,EAAgB5vD,EAAQ4vD,mBAGF,2BAArB5vD,EAAQG,OAAOkD,IAChBumG,EAAe,CACbvmG,EAAG,mBACHlD,OAAQH,EAAQG,SAQtB,IAAI2pG,EAAW,IAAkBh+D,aAAa69D,EAAgB,CAC5DxzD,SAAUyZ,EACV6pC,aAAcxhG,KAAKwhG,eAGjBsQ,GAAc,EACdC,GAAoB,EACpBC,GAAgB,EACpB,GAAGr6C,IAAkBg6C,EAAc,CACjC,IAAIM,EAAgBt6C,EAAc/rD,OAAQ7L,GAAc,uBAARA,EAAEqL,GAC9C8mG,EAAYR,EAAe/vG,OAG/B,GAFqBswG,EAAcxgF,OAAO,CAACC,EAAKygF,IAASzgF,EAAMygF,EAAKxwG,OAAQ,KAEtDuwG,GAAaD,EAActwG,QAAU,GAAKg2D,EAAch2D,SAAWswG,EAActwG,OAAQ,CAC7G,GAAGiL,EAAA,EAAU+2B,SAAS6iB,MAAM4rD,IAAK,CAC/B,IAAIvrD,EAAU7mD,KAAKigG,mBAAmB33C,wBAAwBopD,GAC9D,GAA4B,IAAzBO,EAActwG,SAAiBgwG,GAAgB9qD,EAChD8qD,EAAe,CACbvmG,EAAG,uBACHzK,SAAUkmD,OAEP,CACL,IAAI+D,EAAgBjqD,SAASC,cAAc,OAC3CgqD,EAAc1qD,UAAUW,IAAI,cAE5B,OAAAisB,EAAA,GAAa89B,EAAeinD,GAE5BtpD,EAAOroD,UAAUW,IAAI,SAAWoxG,EAActwG,OAAS,KAEvDkuF,EAAgBxuF,OAAOupD,GAGzBrC,EAAOroD,UAAUW,IAAI,mBAAoB,aACzCkxG,GAAoB,EACpBD,GAAc,EACdE,GAAgB,EAGlBzpD,EAAOroD,UAAUW,IAAI,uBAStBmxG,GACD,OAAAllF,EAAA,GAAagjE,EAAY+hB,GAG3B,MAAM1kB,EAAW,GAAcmB,QAAQ,CACrCC,SAAUvuF,KAAK4wB,KAAKvwB,KACpB0H,YAMF,GAJA+nF,EAAWzuF,OAAO8rF,GAClB0C,EAAgB7uF,QAAQ8uF,GAGrBhB,GAAa/mF,EAAQgnF,MAAO,CAG7B,GAFAxmC,EAAOroD,UAAUW,IAAI,kBAED,QAAhB,EAAAkH,EAAQmnF,gBAAQ,eAAEyU,oBAAwC,WAAnB3jG,KAAK4wB,KAAKvwB,KAAmB,CACtE,MAAMgyG,EAAU1xG,SAASC,cAAc,OACvCyxG,EAAQnyG,UAAUW,IAAI,uBAAwB,UAAW,wBACzDgvF,EAAgB7uF,QAAQqxG,GACxB9pD,EAAOroD,UAAUW,IAAI,uBAGnBkH,EAAQwW,OAAOuN,aAAe9rB,KAAK2/F,UACrC3/F,KAAK2/F,SAASlwD,QAAQ8Y,EAAQvoD,KAAK6hG,uBAIvC,MAAMjJ,EAAc9J,GAAa/mF,EAAQ4wF,aACzC,GAAGC,GAAiC,sBAAlBA,EAAYxtF,GAA6BwtF,EAAYxgE,MAAQwgE,EAAYxgE,KAAKz2B,OAAQ,CACtG,MAAMy2B,EAAOwgE,EAAYxgE,KAEnBk6E,EAAe3xG,SAASC,cAAc,OAC5C0xG,EAAapyG,UAAUW,IAAI,gBAC3Bu3B,EAAK7tB,QAASsrB,IACZ,MAAMwF,EAAUxF,EAAIwF,QACpB,IAAIA,IAAYA,EAAQ15B,OAAQ,OAEhC,MAAM4wG,EAAS5xG,SAASC,cAAc,OACtC2xG,EAAOryG,UAAUW,IAAI,oBAErBw6B,EAAQ9wB,QAASmZ,IACf,MAAM4U,EAAO,IAAkBub,aAAanwB,EAAO4U,KAAM,CAAC6/D,SAAS,EAAMC,cAAc,IAEvF,IAAIoa,EAEJ,OAAO9uF,EAAOtY,GACZ,IAAK,oBAAqB,CACxB,MAAM2a,EAAI,IAAkB8tB,aAAa,IAAK,CAC5CqK,SAAU,CAAC,CACT9yC,EAAG,uBACHzJ,OAAQ,EACR2yB,OAAQ,EACRha,IAAKoJ,EAAOpJ,QAIhBk4F,EAAW,OAAAj6C,GAAA,GAAuBxyC,GAAGkG,kBACrCumF,EAAStyG,UAAUW,IAAI,UAAW,SAElC,MAGF,IAAK,6BACH2xG,EAAW7xG,SAASC,cAAc,UAClC4xG,EAAStyG,UAAUW,IAAI,mBAAoB,SAC3C,YAAiB2xG,EAAWzyG,IAC1B,OAAAiqB,EAAA,GAAYjqB,GAEZ,MAAM+2F,EAAQ/uF,EAAQs+E,UAAYt+E,EAAQkI,OAC1C,IAAI7F,EACwBA,EAAzBsZ,EAAOnF,OAAOk0F,UAAqBptG,QAAQ6E,QAAQlK,KAAKiL,QAC5CjL,KAAKy5F,qBAAqBiZ,kBAAkB5b,GAAOnzF,KAAKsH,GAClEA,GAII,IAAI5F,QAAgB,CAAC6E,EAASmlB,KACrB,IAAI,GAAa,CAC7B,CAACrvB,KAAKiL,QAAS,IACbA,IACFf,EAAQe,KACP,GAEG3J,iBAAiB,QAAS,KAC9B+tB,SAKNjlB,EAAQzG,KAAKsH,IACX,MAAMqE,EAAWtP,KAAKiL,SAAWA,EAASjL,KAAK4wB,KAAKthB,cAAWjH,EAC/DrI,KAAKy5F,qBAAqBkZ,kBAAkB1nG,EAAQqE,EAAUwnF,EAAOpzE,EAAOtU,WAGhF,MAGF,QACEojG,EAAW7xG,SAASC,cAAc,UAKtC4xG,EAAStyG,UAAUW,IAAI,sBAAuB,MAC1B,iBAAX,EACP2xG,EAASrpF,mBAAmB,YAAamP,GAEzCk6E,EAASnxG,OAAOi3B,GAGlB,OAAAJ,GAAA,GAAOs6E,GAEPD,EAAOlxG,OAAOmxG,KAGhBF,EAAajxG,OAAOkxG,KAGtB,YAAiBD,EAAevyG,IAC9B,IAAI2a,EAAS3a,EAAE2a,OAGf,GADIA,EAAOxa,UAAUuV,SAAS,yBAAwBiF,EAAS,OAAAoQ,GAAA,GAAgBpQ,EAAQ,yBACnFA,GAAUA,EAAOxa,UAAUuV,SAAS,YAAciF,EAAOxa,UAAUuV,SAAS,oBAAqB,OAErG,OAAAuU,EAAA,GAAYjqB,GAEZ,MAAM6yG,EAAS,OAAAznD,GAAA,GAAWzwC,GACpBmb,EAAMuC,EAAK,OAAA+yB,GAAA,GAAWzwC,EAAO3Z,gBAEnC,IAAI80B,EAAIwF,UAAYxF,EAAIwF,QAAQu3E,GAE9B,YADA5yG,KAAKkiB,IAAI3E,KAAK,iBAAkBsY,EAAK+8E,EAAQ7qG,GAI/C,MAAM2b,EAASmS,EAAIwF,QAAQu3E,GAC3B5yG,KAAKy5F,qBAAqBoZ,oBAAoB7yG,KAAKiL,OAAQlD,EAAQ8C,IAAK6Y,KAG1EouF,GAAc,EACdvpD,EAAOroD,UAAUW,IAAI,qBACrBmwG,EAAe3vG,OAAOixG,GAGxB,MAAMzmF,EAAa9jB,EAAQwW,OAAOuN,YAClC,GAAGilF,EAAK,EACHhpG,EAAQwW,OAAO8yF,QAAUxlF,IAAY7rB,KAAK0gG,UAAU7/F,IAAIkH,EAAQ8C,KACnE,IAAIuhD,EAAS,GACEA,EAAZvgC,EAAqB,aACV9jB,EAAQwW,OAAO8yF,QAAWtpG,EAA4BwW,OAAOC,aAAe,UAAY,UACtG+pC,EAAOroD,UAAUW,IAAIurD,GAGpBvgC,GACD08B,EAAOroD,UAAUW,IAAI,eAGvB,MAAMiyG,EAAqBhkB,GAAa9uF,KAAKixD,mBAAmB8hD,sBAAsBhrG,GAChFirG,IAAgBF,GAAsB/qG,EAAQ8C,IAAM,EAEvDmoG,GACDzqD,EAAOroD,UAAUW,IAAI,gBAGvB,MAAMoyG,EAAUnkB,GAAa/mF,EAAQmnF,SAC/B5I,EAAYwI,GAAa/mF,EAAQu+E,UAEjCrmC,EAAQ8wD,KAASkC,GAAWjzG,KAAKiL,SAAW2B,EAAA,EAAU+R,MAC5D,IAAIu0F,EAA6BrjB,EAEjC,MAAMsjB,IAAsBprG,EAAQs+E,UAAat+E,EAAQkI,SAAWrD,EAAA,EAAU+R,MAAS5W,EAAQwW,OAAO6I,KAGtG,GAAGuqF,EAA8D,CAC/D,IAAI/mD,EAAgBjqD,SAASC,cAAc,OAC3CgqD,EAAc1qD,UAAUW,IAAI,cAExB6wG,GACFnpD,EAAOroD,UAAUW,IAAI,oBAGvB,IAAIuyG,GAAoB,EAEJ,OAAOzB,EAAavmG,GACtC,IAAK,oBAAqB,CACxB,MAAMjD,EAAQwpG,EAAaxpG,MAGvBupG,IACFI,GAAc,GAGbqB,GACD5qD,EAAOroD,UAAUW,IAAI,aAGvB0nD,EAAOroD,UAAUW,IAAI,SAErB,MAAMkM,EAAU/M,KAAKixD,mBAAmBq2C,uBAAuB38C,GAC/D,GAAGA,GAA4B,IAAjB59C,EAAQ7J,MAAc4tG,EAAyB,CAC3DvoD,EAAOroD,UAAUW,IAAI,WAAY,cACjC6pD,GAAU,CACRC,QAASA,EACTC,gBACAp6B,WAAYxwB,KAAK8wB,gBACjBmvB,MAAO8wD,EACPziF,cAAetuB,KAAKsuB,cACpBsC,KAAM5wB,KAAK4wB,KACXxC,eACAQ,aAAc5uB,KAAK4wB,KAAKhC,eAG1B,MAGF,MAAMoxB,GAAY,MAAc8xD,IAAgBkB,IA3sGlC,EA4sGXhzD,GAAUuI,EAAOroD,UAAUW,IAAI,mBAClCotB,GAAU,CACR9lB,MAAOA,EACPJ,UACA3G,UAAWwpD,EACX5K,WACAC,QACA3xB,cAAetuB,KAAKsuB,cACpBkC,WAAYxwB,KAAK8wB,gBACjB1C,eACAiyB,iBAAkBrgD,KAAK4wB,KAAKhC,aAAazmB,QAG3C,MAGF,IAAK,sBAAuB,CAC1BirG,GAAoB,EAEpB,IAAIziF,EAAmBghF,EAAahhF,QAEpC,GAAiB,YAAdA,EAAQvlB,EACT,MAGFm9C,EAAOroD,UAAUW,IAAI,WAErB,IAAIyrE,EAAM3rE,SAASC,cAAc,OACjC0rE,EAAIpsE,UAAUW,IAAI,OAElB,IAGIwyG,EAAgCC,EAHhCC,EAAQ5yG,SAASC,cAAc,OACnC2yG,EAAMrzG,UAAUW,IAAI,SAGpB,MAAMsH,EAAqBwoB,EAAQxoB,OAChCA,GAASwoB,EAAQhwB,YAClB0yG,EAAiB1yG,SAASC,cAAc,OACxCyyG,EAAenzG,UAAUW,IAAI,mBAC7ByyG,EAAU3yG,SAASC,cAAc,OACjC0yG,EAAQpzG,UAAUW,IAAI,WACtBwyG,EAAehyG,OAAOiyG,IAGxB,IAAIE,EAAe7yG,SAASC,cAAc,OAC1C4yG,EAAatzG,UAAUW,IAAI,cAE3B,MAAMgZ,EAAM8W,EAAQhwB,SACpB,GAAGkZ,EACD,GAAgB,QAAbA,EAAIxZ,MAA+B,UAAbwZ,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KAAkB,CAErE,MAAMozG,EAAyB,UAAb55F,EAAIxZ,KAAmB8nB,EAAA,EAAWqvB,OAAOzyC,MAAQojB,EAAA,EAAWqvB,OAAO7mB,QACrE,UAAb9W,EAAIxZ,MACLkoD,EAAOroD,UAAUW,IAAI,SACrByyG,EAAQpzG,UAAUW,IAAI,aAEtB0nD,EAAOroD,UAAUW,IAAI,SAEvBk/C,GAAU,CACRlmC,MACAzY,UAAWkyG,EACXvrG,QAASA,EACTmmB,SAAUulF,EAAUjwG,MACpB2qB,UAAWslF,EAAUhwG,OACrB6qB,cAAetuB,KAAKsuB,cACpBkC,WAAYxwB,KAAK8wB,gBACjBmvB,QACAhvB,MAAOC,GACP9C,eACAQ,aAAc5uB,KAAK4wB,KAAKhC,mBAGrB,CACL,MAAM60B,EAASP,GAAa,CAC1Bn7C,QAASA,EACTs4C,iBAAkBrgD,KAAK4wB,KAAKhC,aAAaihD,KACzCvhD,cAAetuB,KAAKsuB,cACpBF,eACAvB,SAAU,eACV/hB,cAAe,CACbuC,WAAW,EACXpC,OAAQjL,KAAKiL,OACbE,YAAa,CACXC,EAAG,+BAITkoG,EAAQjyG,OAAOoiD,GACf6vD,EAAQpzG,UAAUW,IAAI,yBACtB2yG,EAAatzG,UAAUW,IAAI,gBAU/B,IAAIyT,EACJ,GALG++F,GACDG,EAAanyG,OAAOgyG,GAInB1iF,EAAQ+iF,UAAW,CACpB,MAAM5qF,EAAO,IAAkB+qB,aAAaljB,EAAQrW,KAC9ChO,EAAuB,OAAAisD,GAAA,GAAuBzvC,GAAMmD,kBAC1D3f,EAAEpM,UAAUW,IAAI,gBAChB,MAAM8yG,EAAShzG,SAASC,cAAc,UACtC,OAAAksB,EAAA,GAAa6mF,EAAQ,IAAkBpnF,cAAcoE,EAAQ+iF,YAC7DpnG,EAAEmkB,YAAc,GAChBnkB,EAAEjL,OAAOsyG,GACTH,EAAanyG,OAAOiL,GACpBgI,EAAIhI,EAGN,MAAMoF,EAAQ1R,KAAKygG,mBAAmBroC,UAAUznC,GAChD,GAAGjf,EAAM+e,YAAa,CACpB,IAAIsjE,EAAWpzF,SAASC,cAAc,OACtCmzF,EAAS7zF,UAAUW,IAAI,SACvB,MAAM8yG,EAAShzG,SAASC,cAAc,UACtC,OAAAksB,EAAA,GAAa6mF,EAAQjiG,GACrBqiF,EAAS1yF,OAAOsyG,GAChBH,EAAanyG,OAAO0yF,GACpBz/E,EAAIy/E,EAGN,MAAMj4D,EAAc97B,KAAKygG,mBAAmBnoC,gBAAgB3nC,GAC5D,GAAGmL,EAAYrL,YAAa,CAC1B,IAAImjF,EAAUjzG,SAASC,cAAc,OACrCgzG,EAAQ1zG,UAAUW,IAAI,QACtB,OAAAisB,EAAA,GAAa8mF,EAAS93E,GACtB03E,EAAanyG,OAAOuyG,GACpBt/F,EAAIs/F,EAWN,GAFAL,EAAMlyG,OAAOmyG,GAEVrrG,IAAU0R,EAAK,CAChB0uC,EAAOroD,UAAUW,IAAI,SAErB,MAAMqC,EAA4BiF,EAAMsX,MAAMtX,EAAMsX,MAAM9d,OAAS,GACnE,IAAIkyG,GAAW,EACZ3wG,EAAK6b,IAAM7b,EAAKwc,GAAKpL,GACtBi0C,EAAOroD,UAAUW,IAAI,mBACrBgzG,GAAW,EACX7zG,KAAKmgG,iBAAiB57C,kBAAkBp8C,EAAOmrG,EAAS,GAAI,IAAI,IAKxDpwG,EAAKwc,EAAIxc,EAAK6b,GACtBwpC,EAAOroD,UAAUW,IAAI,qBAGvBotB,GAAU,CACR9lB,QACAJ,UACA3G,UAAWkyG,EACXplF,SAAU2lF,EAAW,EAAI1rF,EAAA,EAAWqvB,OAAO7mB,QAAQntB,MACnD2qB,UAAW0lF,EAAW,EAAI1rF,EAAA,EAAWqvB,OAAO7mB,QAAQltB,OACpDw8C,QACA3xB,cAAetuB,KAAKsuB,cACpBkC,WAAYxwB,KAAK8wB,gBACjB1C,eACAC,iBAAkBwlF,EAClBxzD,iBAAkBrgD,KAAK4wB,KAAKhC,aAAazmB,QAI7CmkE,EAAIjrE,OAAOkyG,GAITzjB,EAAW7uF,aAAaqrE,EAAK6gB,GAO/B,MAGF,IAAK,uBAAwB,CAC3B,MAAMtzE,EAAM83F,EAAahxG,SAIzB,GAAGkZ,EAAIgtC,QAAkC,CACvC0B,EAAOroD,UAAUW,IAAI,WACrBixG,GAAc,EACdC,GAAoB,EAEjBl4F,EAAIwvC,UACLd,EAAOroD,UAAUW,IAAI,oBAGvB,MAAM4e,EAAQ0I,EAAA,EAAWqvB,OACnBt0C,EAAOqlD,EAAOroD,UAAUuV,SAAS,aAAegK,EAAMq0F,aAAgBj6F,EAAIwvC,SAAW5pC,EAAMs0F,gBAAkBt0F,EAAMu0F,cACzHh0G,KAAKmgG,iBAAiB57C,kBAAkB1qC,EAAK+wC,EAAe1nD,EAAKM,MAAON,EAAKO,QAE7EosF,EAAgB1qF,MAAM0sB,SAAW+4B,EAAczlD,MAAM3B,MACrDqsF,EAAgB1qF,MAAMuzC,UAAYkS,EAAczlD,MAAM1B,OAEtDstB,GAAY,CACVlX,MACAmX,IAAK45B,EACLp6B,WAAYxwB,KAAK8wB,gBACjBxC,cAAetuB,KAAKsuB,cACpB2C,MAAOC,GAEP9sB,MAAM,EACNd,MAAM,EACNkjD,MAAO+B,EAAOroD,UAAUuV,SAAS,aAAei8F,OAAiBrpG,EACjEu9C,WAAW,EACXx3B,sBAEG,GAAgB,UAAbvU,EAAIxZ,MAAiC,QAAbwZ,EAAIxZ,MAA+B,UAAbwZ,EAAIxZ,KAA4C,CAGtG,MAAMgwB,EAAuB,UAAbxW,EAAIxZ,KACjBgwB,IACD0hF,GAAoB,IAGnB1hF,GAAYqhF,IACbI,GAAc,GAGbqB,GACD5qD,EAAOroD,UAAUW,IAAI,aAGvB0nD,EAAOroD,UAAUW,IAAIwvB,EAAU,QAAU,SACzC,MAAMtjB,EAAU/M,KAAKixD,mBAAmBq2C,uBAAuB38C,GAC/D,GAAGA,GAA4B,IAAjB59C,EAAQ7J,MAAc4tG,EAClCvoD,EAAOroD,UAAUW,IAAI,WAAY,cAEjC6pD,GAAU,CACRC,QAASA,EACTC,gBACAp6B,WAAYxwB,KAAK8wB,gBACjBmvB,MAAO8wD,EACPziF,cAAetuB,KAAKsuB,cACpBsC,KAAM5wB,KAAK4wB,KACXxC,eACAQ,aAAc5uB,KAAK4wB,KAAKhC,mBAErB,CACL,MAAMoxB,GAAY,OAAe,OAAa3vB,GAAWyhF,IAAgBkB,IAv8G/D,EAw8GPhzD,GAAUuI,EAAOroD,UAAUW,IAAI,mBAClCk/C,GAAU,CACRlmC,MACAzY,UAAWwpD,EACX7iD,QAASA,EACTmmB,SAAU/F,EAAA,EAAWqvB,OAAOgN,QAAQhhD,MACpC2qB,UAAWhG,EAAA,EAAWqvB,OAAOgN,QAAQ/gD,OACrCu8C,WACAC,QACA3xB,cAAetuB,KAAKsuB,cACpBkC,WAAYxwB,KAAK8wB,gBACjBG,MAAOC,GACP9C,eACAQ,aAAc5uB,KAAK4wB,KAAKhC,aACxB9jB,cAAeulB,EAAU,CACvBplB,OAAQjL,KAAKiL,OACbE,YAAa,CAACC,EAAG,iCACjBkE,SAAUtP,KAAK4wB,KAAKthB,SACpBjC,WAAatF,EAA4BwW,OAAOC,aAChDxR,YAAcjF,EAA4BwW,OAAOC,mBAC/CnW,SAGH,CAEL,MAAM4rG,E/F1kDX,UAA8B,wBAACnD,EAAuB,QAAE/oG,EAAO,OAAEwgD,EAAM,WAAEunC,EAAU,KAAEl/D,EAAI,aAAExC,EAAY,iBAAEiyB,EAAgB,cAAE/xB,EAAa,cAAExjB,EAAa,UAAEuC,EAAS,SAAEwf,IAczK,IAAIqmF,EACJ,MAAMjnG,EAAO6kG,EAA0BlgF,EAAKuiC,aAAaprD,EAAQ8C,KAAO,CAAC9C,EAAQ8C,KAyDjF,OApDAoB,EAAK1B,QAAQ,CAACM,EAAK7C,KACjB,MAAMD,EAAU6oB,EAAKk6B,WAAWjgD,GAC1BmmB,EAAMkyB,GAAa,CACvBn7C,UACAqmB,eACAiyB,mBACA/xB,gBACAxjB,gBACA+hB,aAGIzrB,EAAYT,SAASC,cAAc,OACzCQ,EAAUlB,UAAUW,IAAI,sBACxBO,EAAU8F,QAAQ2D,IAAM,GAAKA,EAC7BzJ,EAAU8F,QAAQ+D,OAAS,GAAKlD,EAAQkD,OAExC,MAAMipG,EAAUvzG,SAASC,cAAc,OAGvC,GAFAszG,EAAQh0G,UAAUW,IAAI,oBAEnBkH,EAAQA,QAAS,CAClB,MAAM+nF,EAAanvF,SAASC,cAAc,OAC1CkvF,EAAW5vF,UAAUW,IAAI,oBAEzB,MAAMgxG,EAAW,IAAkBh+D,aAAa9rC,EAAQA,QAAS,CAC/Dm2C,SAAUn2C,EAAQ4vD,gBAGpB,OAAA7qC,EAAA,GAAagjE,EAAY+hB,GACzBqC,EAAQ7yG,OAAOyuF,GAGjB,GAAG7jF,EAAKtK,OAAS,EAAG,CAClB,MAAMq0C,EAAYr1C,SAASC,cAAc,OACzCo1C,EAAU91C,UAAUW,IAAI,sBACxBO,EAAUC,OAAO20C,GAEjB50C,EAAUlB,UAAUW,IAAI,gBAEb,IAARmH,IACDkrG,EAAgBgB,GAIpBA,EAAQ7yG,OAAO2vB,GACf5vB,EAAUC,OAAO6yG,GACjBpkB,EAAWzuF,OAAOD,KAGjB6K,EAAKtK,OAAS,GACf4mD,EAAOroD,UAAUW,IAAI,wBAAyB,cAGzCqyG,E+FkgD4BiB,CAAqB,CAC5CrD,0BACA/oG,UACAwgD,SACAunC,aACAl/D,KAAM5wB,KAAK4wB,KACXxC,eACAiyB,iBAAkBrgD,KAAK4wB,KAAKhC,aAAaihD,KACzCvhD,cAAetuB,KAAKsuB,cACpBxjB,cAA4B,UAAb+O,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KAAmB,CAC5D4K,OAAQjL,KAAKiL,OACbE,YAAa,CAACC,EAAgB,UAAbyO,EAAIxZ,KAAmB,gCAAkC,4BAC1EiP,SAAUtP,KAAK4wB,KAAKthB,SACpBjC,WAAatF,EAA4BwW,OAAOC,aAChDxR,YAAcjF,EAA4BwW,OAAOC,mBAC/CnW,EACJwkB,SAAU,iBAGTonF,IACDf,EAAgBe,GAGlB,MAAMG,EAAgBtkB,EAAW72C,iBAAiBxlC,cAAc,6CAEhE2gG,GAAiBA,EAAc/yG,OAAO8rF,GAEtC5kC,EAAOroD,UAAUoE,OAAO,oBACxBwrF,EAAW5vF,UAAUW,KAAO,CAAC,QAAS,OAAgCo+B,SAASplB,EAAIxZ,MAAiC,WAAzBwZ,EAAIxZ,MAAQ,YAA2B,YAClI+yG,GAAoB,EAGtB,MAGF,IAAK,mBAAoB,CACvB,MAAMlrG,EAASypG,EAAazpG,OACtB8oB,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,cAAeqH,EAAOqW,OAAOtF,MAAQ,oBAAsB,eAE7E,MAAM5Y,EAAiB6H,EAAOqW,OAAOtF,MAAQ,QAAU,QACvD+X,EAAI9pB,QAAQ7G,KAAOA,EAEnB,MAAMqR,EAAQ/Q,SAASC,cAAc,OACrC8Q,EAAMxR,UAAUW,IAAI,qBAEpB,YAAM6Q,EAAOuuC,EACV/3C,EAAOqW,OAAOtF,MAAQ,2BAA6B,sBACnD/Q,EAAOqW,OAAOtF,MAAQ,2BAA6B,uBAEtD,MAAM+W,EAAWrvB,SAASC,cAAc,OAGxC,GAFAovB,EAAS9vB,UAAUW,IAAI,6BAEAwH,IAApBH,EAAOuR,SACRuW,EAAS3uB,OAAO,OAAAgzG,GAAA,GAAmBnsG,EAAOuR,eACrC,CACL,IAAIogB,EACJ,OAAO3xB,EAAOosG,OAAOlpG,GACnB,IAAK,6BACHyuB,EAAc,kBACd,MACF,IAAK,+BACHA,EAAc,2BACd,MAEF,QACEA,EAAc,8BAIlB7J,EAAS9vB,UAAUW,IAAI,aACvB,YAAMmvB,EAAU6J,GAGlB7J,EAAS9vB,UAAUW,IAAI,QAAS,eAAgCwH,IAApBH,EAAOuR,SAAyB,QAAU,QAEtFuX,EAAI3vB,OAAOqQ,EAAOse,GAElBojF,GAAoB,EAEpB7qD,EAAOroD,UAAUoE,OAAO,oBACxBwrF,EAAW5vF,UAAUW,IAAI,gBACzBivF,EAAWzuF,OAAO2vB,GAElB,MAGF,IAAK,sBAAuB,CAG1B,MAAMujF,EAAU5C,EACV5O,EAAapiG,SAASC,cAAc,OAC1CmiG,EAAW7iG,UAAUW,IAAI,WACzBkiG,EAAW77F,QAAQ+D,OAAS,GAAKspG,EAAQ3tE,QAEzCwsE,GAAoB,EAEpB,MAAMoB,EAAiB7zG,SAASC,cAAc,OAC9C4zG,EAAexmG,UAAY,kBAC3B,MAAMymG,EAAiB9zG,SAASC,cAAc,OAC9C6zG,EAAezmG,UAAY,eAC3BymG,EAAepzG,OACb,IAAkBkrB,cAAc,CAC9BgoF,EAAQ7oE,WACR6oE,EAAQ5oE,WACR//B,OAAOc,SAAS0e,KAAK,OAGzB,MAAMspF,EAAmB/zG,SAASC,cAAc,OAChD8zG,EAAiB1mG,UAAY,iBAC7B0mG,EAAiBjkF,YAAc8jF,EAAQlb,aAAe,IAAM,OAAAx/B,GAAA,GAAkB06C,EAAQlb,cAAcxyF,UAAY,uBAEhHk8F,EAAW1hG,OAAOmzG,GAClBA,EAAenzG,OAAOozG,EAAgBC,GAEtC,MAAM99E,EAAa,IAAI,GACvBA,EAAWC,kBAAkB,CAC3BvI,cAAetuB,KAAKsuB,cACpBrjB,OAAQspG,EAAQ3tE,QAAQrb,aAE1BqL,EAAW12B,UAAUW,IAAI,iBAAkB,aAE3CkiG,EAAW/hG,QAAQ41B,GAEnB2xB,EAAOroD,UAAUoE,OAAO,oBACxBwrF,EAAW5vF,UAAUW,IAAI,mBACzBivF,EAAWzuF,OAAO0hG,GAElB,MAGF,IAAK,mBAAoB,CACvBx6C,EAAOroD,UAAUoE,OAAO,oBAExB,MAAMw1C,E/FroDT,SAAkB/xC,GACvB,MAAM2iB,EAAO,IAAI,GAMjB,OALAA,EAAK3iB,QAAUA,EACf2iB,EAAKnqB,aAAa,UAAW,GAAKwH,EAAQkD,QAC1Cyf,EAAKnqB,aAAa,UAAWwH,EAAQ0Q,MAAMo/B,KAAK9kC,IAChD2X,EAAKnqB,aAAa,aAAc,GAAKwH,EAAQ8C,KAC7C6f,EAAKw0B,SACEx0B,E+F8nDqBiqF,CAAS5sG,GAC7B+nF,EAAW9uF,QAAQ84C,GACnBg2C,EAAW5vF,UAAUW,IAAI,gBAEzB,MAGF,QACE0nD,EAAOroD,UAAUoE,OAAO,oBACxBwrF,EAAWzuF,OAAO,YAAK,KAA4B8rF,GACnDntF,KAAKkiB,IAAI3E,KAAK,2BAA4Bo0F,EAAavmG,EAAGrD,GAI1DqrG,GACFvjB,EAAgBxuF,OAAOupD,GAYxBmnD,GACDxpD,EAAOroD,UAAUW,IAAI,cAGpBb,KAAK4wB,KAAKolB,UAAUC,aACrBj2C,KAAK4wB,KAAKolB,UAAU4b,sBAAsBrJ,GAAQ,GAGpD,IAAI27C,EAAY,GAGhB,MAAM0Q,EAAY7sG,EAAQkI,SAAWrD,EAAA,EAAU+R,MAAQ3e,KAAKwwF,gBAAgBhW,WAAWvvE,IAAYlD,EAAQs+E,UAAat+E,EAA4BwW,OAAOswE,UAC3J,GAAG+lB,GAAY3B,GAAWlrG,EAAQqoF,aAAc,CAC9C,IAAI1+E,EACAmjG,EAEJ,MAAMC,EAAuB/sG,EAAQgtG,SAAiC,gBAAtBhtG,EAAQgtG,QAAQ3pG,GAAuBrD,EAAQkI,SAAWq2E,EAE1G,IA8BIxiC,EA9BAkxD,EAAW/B,IAAYA,EAAQ8B,QA+BnC,GA9BGhtG,EAAQs+E,WACTwuB,EAAWl0G,SAASC,cAAc,QAClCi0G,EAASjnF,UAAY,IAAM5tB,KAAKkgG,gBAAgB10D,QAAQzjC,EAAQs+E,UAAU3rD,SAC1Em6E,EAAS30G,UAAUW,IAAI,cACvB0nD,EAAOroD,UAAUW,IAAI,mBAGpBm0G,GAEDtjG,EAAQ/Q,SAASC,cAAc,QAC/B,OAAAksB,EAAA,GAAapb,EAAO,IAAkB6a,cAAc0mF,EAAQgC,YAC5DvjG,EAAMxR,UAAUW,IAAI,cAEpB0nD,EAAOroD,UAAUW,IAAI,mBAErB6Q,EAAQ,IAAI,KAAU,CAACzG,OAAQq7E,GAAav+E,EAAQkI,SAAS8K,QAG5DhT,EAAQqoF,cAAgBroF,EAAQqoF,eAAiBpwF,KAAK4wB,KAAKthB,UAAYw/E,GACxE,GAAcmB,SAAS,CACrBr/D,KAAM5wB,KAAK4wB,KACX23B,SACAsnC,kBACA9nF,YAOAu+E,GAAa2sB,EAaf,GAZGjzG,KAAKiL,SAAW2B,EAAA,EAAU+R,MAASm2F,GACpCvsD,EAAOroD,UAAUW,IAAI,aAGpBkH,EAAQm8F,YACTA,EAAYn8F,EAAQm8F,UACpBxyF,EAAMxK,QAAQg9F,UAAYA,GAG5BpgD,EAAUnjD,SAASC,cAAc,OACjC8Q,EAAMxK,QAAQ+D,OAAS,GAAKq7E,EAExBtmF,KAAKiL,SAAW2B,EAAA,EAAU+R,MAAQ3e,KAAKiL,SAAW,OAAmB6pG,GAA0B/C,EAG5F,CAGL,MAAMhgG,EAA2B,CAACL,GAC/BqgG,GACDhgG,EAAKzI,QAAQ3I,SAASC,cAAc,OAEtCkjD,EAAQziD,OAAO,YAAK,gBAAiB,CAAC0Q,UATtC+xC,EAAQ3+C,MAAM03C,MAAQ78C,KAAKwwF,gBAAgB0kB,iBAAiB5uB,GAAW,GACvExiC,EAAQziD,OAAOqQ,QAUZ,IAAI3J,EAAQs+E,SACjB,IAAI0rB,GAAqB6C,EAAU,CACjC9wD,EAAUnjD,SAASC,cAAc,OACjCkjD,EAAQziD,OAAOqQ,GAEf,MACM6M,EAA4B,QAAlB,EADHve,KAAKwwF,gBAAgB7wD,QAAQ53B,EAAQkI,eAChB,eAAEsO,OACjCA,IAAWA,EAAOivB,MAAQjvB,EAAOgvB,OAClCuW,EAAQziD,OAAO0rC,GAAiBxuB,EAAOivB,OAGrCujE,IACFjtD,EAAQ3+C,MAAM03C,MAAQ78C,KAAKwwF,gBAAgB0kB,iBAAiBntG,EAAQkI,QAAQ,IAG9E6zC,EAAQ58C,QAAQ+D,OAAS,GAAKlD,EAAQkI,YAEtCs4C,EAAOroD,UAAUW,IAAI,aAIzB,GAAGkH,EAAQs+E,SAAU,CACfviC,EAGFA,EAAQziD,OAAO,KAFfyiD,EAAUnjD,SAASC,cAAc,OAKnC,MAAMqsC,EAAOtsC,SAASC,cAAc,QACpCqsC,EAAK5rC,OAAO,YAAK,UAAW,IAAKwzG,GACjC5nE,EAAK/sC,UAAUW,IAAI,UAEnBijD,EAAQziD,OAAO4rC,GAGd6W,IACDA,EAAQ5jD,UAAUW,IAAI,QACtBqyG,EAAc7xG,OAAOyiD,IAIvB,GADmB9jD,KAAK4wB,KAAK4pD,eAAiBv6B,EAC/B,CACb,IAAIrpB,EAAa,IAAI,GACrBA,EAAW12B,UAAUW,IAAI,cAAe,aACxC+1B,EAAWC,kBAAkB,CAC3BvI,cAAetuB,KAAKsuB,cACpBrjB,QAAUgoG,IAAYjzG,KAAKiL,SAAW2B,EAAA,EAAU+R,MAAQ3e,KAAKiL,SAAW,OAAqB6pG,EAAuBxuB,EAAYv+E,EAAQkI,SAAW,KACnJ+vE,WAAYsG,GAAa2sB,GAAWA,EAAQgC,UAA4BhC,EAAQgC,eAAY5sG,EAC5F+lB,iBAKF4iF,EAAe3vG,OAAOu1B,SAGxB2xB,EAAOroD,UAAUW,IAAI,aAGD,WAAnBb,KAAK4wB,KAAKvwB,OACX6jG,EAAY,GAAGlkG,KAAK4wB,KAAK3lB,UAAUlD,EAAQ8C,OAQ7C,GALwBioG,GAAsBA,EAAmBjoG,MAAQ7K,KAAK4wB,KAAKthB,UAEjFi5C,EAAOroD,UAAUW,IAAI,oBAAqB,iBAGzCqjG,IAAiC,WAAnBlkG,KAAK4wB,KAAKvwB,MAAqB4yG,EAAQtP,oBAAsB3jG,KAAKiL,SAAW,KAAiB,CAC7G,MAAMkqG,EAAOx0G,SAASC,cAAc,OACpCu0G,EAAKj1G,UAAUW,IAAI,uBAAwB,gBAAiB,oBAC5DgvF,EAAgBxuF,OAAO8zG,GACvB5sD,EAAOrhD,QAAQg9F,UAAYA,EAC3B37C,EAAOroD,UAAUW,IAAI,sBAQvB,GALA0nD,EAAOroD,UAAUW,IAAIo/C,EAAQ,SAAW,SACrC4mD,GACD7mG,KAAKwxG,oBAAoBzpG,EAASwgD,EAAQ9/C,EAAS2lB,GAGlD4kF,EAAa,CACG,GAAcpjB,cAAc,CAC3CrnC,SACAsnC,kBACA9nF,QAAS+qG,EACThjB,aACA1hE,eACAE,cAAetuB,KAAKsuB,kBAIpBwjF,GAAc,GAoBlB,OAhBGhjB,GACD9uF,KAAKknG,+BAA+B3+C,EAAQxgD,GAS3C+pG,IACDvpD,EAAOroD,UAAUW,IAAI,iBAErBgvF,EAAgBxuF,OAAO+zG,OAGlB7sD,EAGD,+BAA+BA,EAAqBxgD,EAA0BqkF,GACpF,GAAGpsF,KAAKiL,OAAO82B,SACb,OAGF,MAAM4sD,EAAmB3uF,KAAKixD,mBAAmBu+B,sBAAsBznF,GACvE,IAAI4mF,EAAiBtkD,YAAcskD,EAAiBtkD,UAAU7H,QAAQ7gC,OACpE,OAKF,MAAM+sF,EAAmB,IAAI,GAI7B,GAHAA,EAAiB18E,KAAK28E,EAAkB,SACxCD,EAAiBxvC,OAAOktC,GAErB7jC,EAAOroD,UAAUuV,SAAS,oBAC3B8yC,EAAO90C,cAAc,2BAA2BpS,OAAOqtF,OAClD,CACL,MAAMoB,EAAavnC,EAAO90C,cAAc,YACxC,GAAG80C,EAAOroD,UAAUuV,SAAS,yBAA0B,CACrD,MAAM4/F,EAAoBvlB,EAAW72C,iBACrC,IAAIq8D,EAAqBD,EAAkB5hG,cAAc,qBAErD05E,EAAwBmoB,GAAsBA,EAAmB7hG,cAAc,SAC/E05E,IACFA,EAAW,GAAcmB,QAAQ,CAC/BC,SAAUvuF,KAAK4wB,KAAKvwB,KACpB0H,aAIJ2mF,EAAiBrtF,OAAO8rF,GAEpBmoB,IACFA,EAAqB30G,SAASC,cAAc,OAC5C00G,EAAmBp1G,UAAUW,IAAI,oBACjCw0G,EAAkB5hG,cAAc,qBAAqBzS,QAAQs0G,IAG/DA,EAAmBj0G,OAAOqtF,OACrB,CACL,MAAMvB,EAAWhhF,MAAMC,KAAKm8C,EAAO70C,iBAAiB,UAAUrK,MAC9DqlF,EAAiBrtF,OAAO8rF,GAExB2C,EAAWzuF,OAAOqtF,KAKhB,kBAAkB3mF,EAAcU,EAAmBooG,EAA0BtoD,EAAsBs+C,GACzG,IACE,OAAO7mG,KAAKu1G,cAAcxtG,EAASU,EAASooG,EAAgBtoD,EAAQs+C,GACpE,MAAMv2F,GACNtQ,KAAKkiB,IAAI1R,MAAM,uBAAwBF,IAI9B,qBAAqBxI,EAAgEW,EAAkB+sG,EAAsB7G,G,0CAuCxI,IAAI7H,EAA0B2O,EAvB9B3tG,EAAUA,EAAQnC,QAEfgpG,GACD7mG,EAAQwB,QAAQqlG,GAqBf3uG,KAAK6iG,UAAU9hG,gBAChBf,KAAKmhG,sBAAwB,KAG3B,GAFA2F,EAAc,IAAI,GAAY9mG,KAAKuP,WAAY9G,GAE5CzI,KAAK01G,sBAAwB11G,KAAK4wB,KAAKywB,eAAgB,CACxD,MAAMs0D,EAAgB31G,KAAK41G,mBAC3B51G,KAAK61G,oBAAoBF,GAAe,GAG1C7O,EAAY9iD,OACZ,MAAM8xD,EAAQhP,EAAYiP,WAC1BN,EAAYK,EAAMl/C,eAAiBk/C,EAAM7W,eAI1Cj/F,KAAKg2G,mBACN9kB,GAAwBlxF,KAAKuP,WAAWnO,WACxCpB,KAAKg2G,kBAAmB,GAG1B,MAAMr1F,EAAM9V,IACV,MAAM9C,EAAoE,iBAAV,EAAqB/H,KAAK4wB,KAAKk6B,WAAWjgD,GAAOA,EAC9G9C,EAAQwW,OAAOiyF,MAChBxwG,KAAKi2G,0BAA0BluG,GAE/B/H,KAAK0mG,kBAAkB3+F,EAASU,GAAS,IAIvC9G,EAASmG,EAAQnG,OACvB,GAAG8G,EAAS,IAAI,IAAI7G,EAAI,EAAGA,EAAID,IAAUC,EAAG+e,EAAG7Y,EAAQlG,SAClD,IAAI,IAAIA,EAAID,EAAS,EAAGC,GAAK,IAAKA,EAAG+e,EAAG7Y,EAAQlG,IAErD,GAAsB,cAAnB5B,KAAK4wB,KAAKvwB,KAAsB,CACjC,MAAMk2C,EAAiBv2C,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UAClF4mG,EAAa3/D,EAAezuC,QAAQ6sB,MACpCwhF,EAAY5/D,EAAezuC,QAAQgnD,MACtConD,EAAWv0E,MAAM,KAAS0sE,SAAa6H,EAAWv0G,SAAUmG,EAAQm3B,SAASi3E,EAAW,KACzFl2G,KAAKiJ,UAAU,UAAU,GAAM,IAG9BktG,EAAUx0E,MAAM,KAASy0E,MAAUD,EAAUx0G,SAAUmG,EAAQm3B,SAASk3E,EAAUA,EAAUx0G,OAAS,KACtG3B,KAAKiJ,UAAU,OAAO,GAAM,QAG9BjJ,KAAKiJ,UAAU,OAAO,GACtBjJ,KAAKiJ,UAAU,UAAU,GAkB3B,aAfMjJ,KAAKihG,qBAERjhG,KAAKuP,WAAWxG,UAAU2vB,KAAO14B,KAAKohG,kCACvCphG,KAAKohG,kCAEFphG,KAAKohG,iCACNphG,KAAKohG,mCAIN0F,IACDA,EAAYC,UAA2B,IAAnBj/F,EAAQnG,SAAiB8G,IAC7CzI,KAAK0vG,kBAAkB5I,EAAYiP,cAG9B,KAGD,kBAAkB38E,GAExB,IAAIp5B,KAAKm+C,iBAAiBj+C,UAAUuV,SADlB,oBACuC,CAGvD,IAFmBzV,KAAKoqB,UAAUu3B,WAI9BvoB,YAAU,CACRw9B,aAAc52D,KAAKuP,WAAWqnD,aAC9BqoC,aAAcj/F,KAAKuP,WAAWnO,UAAU69F,eAE1C7lE,EAAMw9B,eAAiBx9B,EAAM6lE,cAE/B,CAMA,MAAMzuE,EAAaxwB,KAAK8wB,gBAClBsL,EAAW,KACX5L,KACJxwB,KAAKm+C,iBAAiBj+C,UAAUW,IArBpB,qBA8Bd,YANGb,KAAKovG,iBACNhzE,IAEAtsB,WAAWssB,EAAU,OAO3Bp8B,KAAKovG,sBAAmB/mG,EAkBnB,eAAeuC,EAAelC,EAAmBiC,GAEtD,GAAsB,SAAnB3K,KAAK4wB,KAAKvwB,MAAsC,eAAnBL,KAAK4wB,KAAKvwB,KACxC,OAAOL,KAAKixD,mBAAmB05C,WAAW3qG,KAAKiL,OAAQL,EAAOlC,EAAWiC,EAAW3K,KAAK4wB,KAAKthB,UACzF,GAAsB,WAAnBtP,KAAK4wB,KAAKvwB,KAAmB,CAUrC,OATgBL,KAAKixD,mBAAmBjmD,UAAU,CAChDC,OAAQjL,KAAKiL,OACbE,YAAa,CAACC,EAAG,6BACjBR,QACAM,MAAOxC,EACPiC,cAEDhH,KAAKgB,IAAS,CAAEmD,QAASnD,EAAMmD,QAAQ2E,IAAIklC,GAAKA,EAAE9mC,QAG9C,MAAsB,cAAnB7K,KAAK4wB,KAAKvwB,KACXL,KAAKixD,mBAAmBolD,qBAAqBr2G,KAAKiL,QAAQtH,KAAKsI,IAG7D,CAACnE,QAASmE,EAAKtG,QAAQ8C,kBAJ3B,EASK,gBAAgBkmG,EAAuB2H,EAA0BC,EAA2B5rG,EAAmBC,G,0CAI3H,GAAG5K,KAAK4wB,KAAKywB,iBAAmBrhD,KAAKutG,uBAGnC,YADAvtG,KAAKutG,uBAAyBvtG,KAAKw2G,gBAAgB9vG,KAAK1G,KAAM2uG,EAAe2H,EAAgBC,EAAkB5rG,EAAWC,IAQ5H,IAAI+S,OAAOg1C,KAAK3yD,KAAK6wB,SAASlvB,OAC5B,OAGF,IAMI80G,EANAC,EAAa,OAAAl6C,GAAA,GAAqBx8D,KAAK6wB,QAAS,QAEjD0lF,GAAoBD,EAAe30G,SACpC+0G,EAAaA,EAAW9qG,OAAOf,IAAQyrG,EAAer3E,SAASp0B,KAK/D4rG,EADC9rG,EACWC,GAAS/F,KAAKJ,OAAOiyG,GAE9B/H,GAGW9pG,KAAKJ,OAAOiyG,GAI5B,MAAMC,EAASD,EAAW/wG,MAAM+wG,EAAWt7F,UAAUvQ,GAAO4rG,EAAY5rG,IAClE+rG,EAAYL,EAAmB,GAAK,CAACE,GACrCI,EAAYN,EAAmB,GAAKG,EAAW/wG,MAAM,EAAG+wG,EAAWt7F,UAAUvQ,GAAO4rG,GAAa5rG,IAAMpC,UAE1G,MACDzI,KAAKkiB,IAAI,6BAA8Bu0F,EAAW7rG,EAAO+jG,EACvDgI,EAAOlqG,IAAIklC,GAAK3xC,KAAKsgG,sBAAsB13C,mBAAmBjX,IAC9DklE,EAAUpqG,IAAIklC,GAAK3xC,KAAKsgG,sBAAsB13C,mBAAmBjX,KAGrE,MAAMmlE,EAA4B,GAElC92G,KAAK6iG,UAAU3iG,UAAUW,IAAI,eAC7B,MAAMk2G,EAAQR,EAAmB,GAAK,GAChC/3E,EAAc+3E,EAAmB,EAAI,EACrCC,EAAkB,CAACvqG,EAAgBuyB,EAAc,KACrD,MAAMkZ,EAAmB,eACzB,IAAIs/D,EAAc,EAsClB,OArCA/qG,EAAK1B,QAAQ,CAACM,EAAK7C,KACjB,IAAIhI,KAAK6wB,QAAQhmB,IAAQ7K,KAAK2gG,YAAYh1F,IAAId,GAE5C,YADA7K,KAAKkiB,IAAI3E,KAAK,qCAAsC1S,GAItD,MAAMmmG,EAAiBhxG,KAAK6wB,QAAQhmB,GAAKouC,iBASzC,GAPA+9D,GAAgBhvG,EAAMw2B,GAAgB,IAAOu4E,EAI7C/F,EAAe9wG,UAAUW,IAAI,aAC7BmwG,EAAe7rG,MAAMgsG,gBAAkB6F,EAAc,KAElDhvG,IAASiE,EAAKtK,OAAS,EAAI,CAC5B,MAAMg0D,EAAmB51D,IACpBA,EAAE2a,SAAWs2F,IAIhBt5D,EAAiBxtC,UACjB8mG,EAAenjG,oBAAoB,gBAAiB8nD,KAGtDq7C,EAAe1vG,iBAAiB,gBAAiBq0D,GAKnDmhD,EAAWvtG,KAAKynG,KAGd/kG,EAAKtK,QACP+1C,EAAiBxtC,UAGZ,CAAC8sG,cAAat/D,qBAGjBu/D,EAAST,EAAgBG,EAAQn4E,GACjC04E,EAAYV,EAAgBI,GAC5BO,EAAYX,EAAgBK,EAAWr4E,GACvCwE,EAAW,CAACi0E,EAAOv/D,iBAAkBw/D,EAAUx/D,iBAAkBy/D,EAAUz/D,kBAC3E0/D,EAAmB,CAACH,EAAOD,YAAaE,EAAUF,YAAaG,EAAUH,aAgB/E,IAAI5sG,EAsBJ,OApCGpK,KAAKstG,wBACAttG,KAAKstG,mBAIb,aAAQ,KACNttG,KAAKulG,wBAELuR,EAAWvsG,QAAQymG,IACjBA,EAAe9wG,UAAUoE,OAAO,kBAMjCqyG,EAAOh1G,QAAUi1G,EAAUj1G,QAAUk1G,EAAUl1G,UAChDyI,EAAU/E,QAAQC,IAAI09B,GAEtB,aAA4B54B,EAASvF,KAAKJ,OAAO2yG,GAAU,KAC1DzzG,KAAK,KACJ,aAAQ,KACNmzG,EAAWvsG,QAAQymG,IACjBA,EAAe7rG,MAAMgsG,gBAAkB,KAGzCnxG,KAAK6iG,UAAU3iG,UAAUoE,OAAO,oBAW/B8F,KAGD,uBAAuB/J,EAA4FkoD,EAAqBxgD,EAAcsjB,GAC5J,MAAM4jB,EAAa,2BAGnB,IAAIv9B,EAaA2lG,EACJ,GAhBA9uD,EAAOroD,UAAUW,IAAIouC,EAAYA,EAAa,IAAM5uC,GAGxC,UAATA,EAAkBqR,EAAQ,YAAK,oBACjB,UAATrR,EAAkBqR,EAAQ,YAAK,qBACtB,eAATrR,GAAkC,aAATA,EAAqBqR,EAAQ,YAAK,cAClD,wBAATrR,EAAgCqR,EAAQ,YAAK,uBACpC,eAATrR,IACNqR,EAAQ/Q,SAASC,cAAc,QAC/B8Q,EAAMkc,UAAY5tB,KAAKwwF,gBAAgB8mB,yBAAyBt3G,KAAKiL,SAEvEyG,EAAMxR,UAAUW,IAAI,SAAUouC,EAAa,UAE3C5jB,EAAS9hB,KAAKmI,GAGF,UAATrR,EACDgrB,EAAS9hB,KAAK,YAAK,qBACnB8tG,EAAe,CACb,YAAK,qBACL,YAAK,qBACL,YAAK,qBACL,YAAK,2BAEF,GAAY,UAATh3G,EACRg3G,EAAe,CACb,YAAK,4BACL,YAAK,4BACL,YAAK,4BACL,YAAK,kCAEF,GAAY,aAATh3G,EAAqB,CAC7B,MAAM2vB,EAAW,YAAK,kCACtBA,EAAS9vB,UAAUW,IAAI,SAAUouC,EAAa,aAE9C,OAAA3N,GAAA,GAActhC,KAAKkhG,cAAet+D,GAAKA,EAAE2lB,SAAWA,GAEpD,MAAM6xC,EAAaz5F,SAASC,cAAc,OAC1Cw5F,EAAWl6F,UAAUW,IAAIouC,EAAa,YAEtC,MAAMze,EAAaxwB,KAAK8wB,gBAElB1tB,EAAcpD,KAAKigG,mBAAmBsX,qBAAqB5zG,KAAKkW,IACpE,IAAI2W,IAAc,OAElB,MAAMpC,EAA+B,GAoBrC,OAnBA2C,GAAY,CACVlX,MAEAmX,IAAKopE,EACL5pE,aACAlC,cAAetuB,KAAKsuB,cACpB2C,MAAOC,GAEP9sB,MAAM,EACNd,MAAM,EACNsiD,WAAW,EACXx3B,iBAGF,YAAiBgsE,EAAar6F,IAC5B,OAAAiqB,EAAA,GAAYjqB,GACZ,GAAkB+2D,aAAa,CAACp8C,OAAQ3a,EAAE2a,WAGrCrV,QAAQC,IAAI8oB,KAGrBpuB,KAAKwxG,oBAAoBzpG,EAASwgD,GAAQ,EAAO,CAACnlD,IAElDioB,EAAS9hB,KAAKymB,EAAUoqE,GAGvBid,IACDhsF,EAAS9hB,QACJ8tG,EAAa5qG,IAAIie,IAClB,MAAMuiB,EAAOtsC,SAASC,cAAc,QAGpC,OAFAqsC,EAAK/sC,UAAUW,IAAIouC,EAAa,cAChChC,EAAK5rC,OAAOqpB,GACLuiB,KAIC,UAAT5sC,EACDg3G,EAAa9sG,QAAQmgB,IACnB,MAAM9oB,EAAIjB,SAASC,cAAc,QACjCgB,EAAE1B,UAAUW,IAAI,eAChB6pB,EAAK1pB,QAAQY,KAEE,UAATvB,GACRg3G,EAAa9sG,QAAQmgB,IACnB,MAAM9oB,EAAIjB,SAASC,cAAc,QACjCgB,EAAE1B,UAAUW,IAAIouC,EAAa,gBAC7BrtC,EAAEgsB,UAAY,IACdlD,EAAK1pB,QAAQY,MAKhBypB,EAAS1pB,OAAS,GACnB4mD,EAAOroD,UAAUW,IAAI,mBAGvBwqB,EAAS9gB,QAASwQ,GAAiBA,EAAQ7a,UAAUW,IAAIouC,EAAa,UAGhE,0BAA0BlnC,GAChC,MAAM6mF,IAAiB7mF,EAA4BwW,OAAOswE,UACpDtmC,EAASvoD,KAAK0mG,kBAAkB3+F,OAASM,OAAWA,OAAWA,EAAWumF,GAChFrmC,EAAOroD,UAAUW,IAAI,gBAAiB,kBAElC+tF,IACFrmC,EAAOroD,UAAUW,IAAI,gBACrB0nD,EAAOroD,UAAUoE,OAAO,gBAAiB,UAG3C,MAAM+mB,EAA8B,GAC9BqjF,EAAQ1uG,KAAKwwF,gBAAgBke,MAAM1uG,KAAKiL,QAC9C,GAAGjL,KAAK4wB,KAAK8iB,aACX1zC,KAAKw3G,uBAAuB,aAAcjvD,EAAQxgD,EAASsjB,OACtD,IAAGujE,EAAa,CACrB,IAAIt2D,EAAmBztB,EAAagtF,EAAoBz7D,EAExDmsB,EAAOroD,UAAUW,IAAI,mBAErB,MAAMkhG,EAAmB/hG,KAAK+hG,iBAAoBh6F,EAA4Bg6F,iBACxE92F,EAASjL,KAAKwwF,gBAAgBnqD,UAAU07D,EAAiBgT,SAE5DhT,EAAiB0V,cAClBn/E,EAAO,kBACPztB,EAAM7K,KAAKsgG,sBAAsBoX,kBAAkB3V,EAAiB0V,eAC5D1V,EAAiB4V,aAAe33G,KAAKkgG,gBAAgBwO,MAAMzjG,EAAOwL,aAC1E6hB,EAAO,uBACPu/D,EAAakK,EAAiB4V,aAE9Br/E,EAAOt4B,KAAKwwF,gBAAgBhW,WAAWvvE,GAAU,yBAA2B,2BAI5EmxB,EADC2lE,EAAiB6V,YACP,KACT,IAAI,GAAoB7V,EAAiB8V,iBAAkB9V,EAAiB6V,aAAsCx6E,QAE5G2kE,EAAiB8V,iBACd,KACT,MAAM56E,EAAqB,CACzB7xB,EAAGszF,GAAmBoZ,UACtBC,OAAQhW,EAAiB8V,kBAG3B73G,KAAK4wB,KAAKoyE,aAAagV,oBAAoB/6E,IAGlC,KACTrwB,EAAA,EAAU0F,cAAc,gBAAiB,CACvCrH,SACAJ,MACAgtF,gBAKN,MAAMn0E,EAAS,YAAO,yDAA0D,CAC9E4U,SAWF,OARAt4B,KAAK2/F,SAASlwD,QAAQ/rB,EAAQ1jB,KAAK6hG,uBAEhCzlE,GACD,YAAiB1Y,EAAQ0Y,QAG3BmsB,EAAO90C,cAAc,mBAAmBzS,QAAQ0iB,GAG3C,GAAGgrF,GAAuB,YAAd3mG,EAAQqD,EAAiB,CAC1C,MAAMmB,EAAI5L,SAASC,cAAc,KACjC2L,EAAElL,OAAO,YAAK,iBACdgqB,EAAS9hB,KAAKgD,EAAG,aACTvM,KAAKwwF,gBAAgBhW,WAAWx6E,KAAKiL,SAAWjL,KAAKwwF,gBAAgB7wD,QAAQ3/B,KAAKiL,QAAQsT,OAAO05F,QACzGj4G,KAAKw3G,uBAAuB,QAASjvD,EAAQxgD,EAASsjB,GAC3B,cAAnBrrB,KAAK4wB,KAAKvwB,KAClBL,KAAKw3G,uBAAuB,sBAAuBjvD,EAAQxgD,EAASsjB,GAC5Dze,EAAA,EAAU+R,OAAS3e,KAAKiL,OAChCjL,KAAKw3G,uBAAuB,QAASjvD,EAAQxgD,EAASsjB,GAC9CrrB,KAAKwwF,gBAAgBzuD,OAAO/hC,KAAKiL,UAAYyjG,GAAS1uG,KAAK4wB,KAAK62E,WAAgC,SAAnBznG,KAAK4wB,KAAKvwB,KAC/FL,KAAKw3G,uBAAuB,WAAYjvD,EAAQxgD,EAASsjB,GAEzDrrB,KAAKw3G,uBAAuB,aAAcjvD,EAAQxgD,EAASsjB,GAO7D,GAAGA,EAAS1pB,OAAQ,CACC4mD,EAAO90C,cAAc,0BAC7BzS,WAAWqqB,GAGxB,MAAMwU,EAA+B+uD,EAAc,SAAW,UAC3D5uF,KAAKohG,gCACNphG,KAAKstG,gBAAkB,KAKrB,GAJAttG,KAAK6iG,UAAUhjE,GAAQ0oB,GACvBvoD,KAAKstG,qBAAkBjlG,GAGnBrI,KAAKihG,qBACP,OAAO,gBAIXjhG,KAAK6iG,UAAUhjE,GAAQ0oB,GAIvBvoD,KAAKmrG,oBAAsBpjG,EAAQ8C,IAI/B,uBAAuBqtG,EAAY,GAEzC,IAAI5jF,GAA6B,cAAnBt0B,KAAK4wB,KAAKvwB,MAAwB,EAAI,GAAK63G,EAGzD,MAAMnlG,GAAMlO,KAAK+B,IAAI0tB,GAErB,MAAO,CAACvhB,KAAIlI,KADChG,KAAK+B,IAAI5G,KAAKsgG,sBAAsBoX,kBAAkB3kG,KAI7D,0BAA6ColG,EAAaroF,EAAuDooF,EAAY,GACnI,MAAM,GAACnlG,EAAE,IAAElI,GAAO7K,KAAKo4G,uBAAuBF,GACxCnwG,EAA0F,CAC9FqD,EAAG+sG,EAAU,iBAAmB,UAChC3rF,KAAM,EACNzZ,KACAlI,MACA0gF,QAASvrF,KAAKwwF,gBAAgB6nB,cAAcr4G,KAAKiL,QACjDsT,OAAQ,CACNiyF,OAAO,IAgBX,OAZI2H,IACFpwG,EAAQA,QAAU,IAKpB,OAAA89C,GAAA,GAAwC99C,GAExC+nB,GAAQA,EAAK/nB,GAEb/H,KAAKixD,mBAAmBqnD,aAAa,CAACvwG,GAAU,CAACgF,QAAS,IAAIuG,MAC9DvL,EAAQ8C,IAAMA,EACP9C,EAGF,mBAEL,OG7hJW,UAA0B,gBAAC41F,EAAe,SAAExyE,EAAQ,UAAEotF,IAMnE,MAAM1a,EAAeF,EAAgBj5E,wBAC/B2G,EAAWlf,MAAMC,KAAKuxF,EAAgBjqF,iBAA8ByX,IAEpEqtF,EAAkC,GACtC5qE,EAA+B,GAC/B6qE,EAAuC,GACzC,IAAIC,GAAe,EACnB,IAAI,MAAM39F,KAAWsQ,EAAU,CAC7B,MAAM5G,EAAO1J,EAAQ2J,wBACfi0F,EAAcjb,GAAe3iF,EAAS4iF,GAAiB,EAAOl5E,EAAMo5E,GAG1E,IAAI+a,IADgBD,GAGlBD,GAAe,EACfE,EAAQhrE,GAERgrE,EADQF,EACAD,EAEAD,EAGVI,EAAMrvG,KAAK,CACTwR,UACA0J,OACAk0F,gBAIJ,GAAGJ,GAAa3qE,EAAQjsC,OAAQ,CAC9B,MACMk3G,EADSjrE,EAAQ,GAAGnpB,KAAKiU,IACP6/E,EAElBO,EADYlrE,EAAQA,EAAQjsC,OAAS,GAAG8iB,KAAKiB,OACrB6yF,EAE9B,IAAI,IAAkC32G,EAArB42G,EAAa72G,OAAqB,EAAGC,GAAK,IAAKA,EAAG,CACjE,MAAMmZ,EAAUy9F,EAAa52G,GAC1BmZ,EAAQ0J,KAAKiU,KAAOmgF,IACrBL,EAAapwG,OAAOxG,EAAG,GACvBgsC,EAAQtkC,QAAQyR,IAIpB,IAAI,IAAInZ,EAAI,EAAGD,EAAS82G,EAAgB92G,OAAQC,EAAID,IAAUC,EAAG,CAC/D,MAAMmZ,EAAU09F,EAAgB72G,GAC7BmZ,EAAQ0J,KAAKiB,QAAUozF,IACxBL,EAAgBrwG,OAAOxG,IAAK,KAC1BD,EACFisC,EAAQrkC,KAAKwR,KAOnB,MAAO,CAACy9F,eAAc5qE,UAAS6qE,mBHg+ItB7C,CAAiB,CACtBjY,gBAAiB39F,KAAKuP,WAAWnO,UACjC+pB,SAAU,4CACVotF,UAA8C,EAAnC1zG,KAAKJ,IAAI,IAAKw8B,GAAA,EAAWx9B,UAIjC,oBAAoBkC,EAAoDozG,GAG7E,MAAM,aAACP,EAAY,gBAAEC,GAAmB9yG,EAClCqzG,EAAYR,EAAa9wG,OAAO+wG,GACtC,IAAIO,EAAUr3G,OACZ,OAGC62G,EAAa72G,QAAQ3B,KAAKiJ,UAAU,OAAO,GAC3CwvG,EAAgB92G,QAAQ3B,KAAKiJ,UAAU,UAAU,GAEpD,MAAMgD,EAAO+sG,EAAUvsG,IAAI,EAAEsO,cAAcA,EAAQ7T,QAAQ2D,KAE3D,IAAIi8F,IACC0R,EAAa72G,UAAa82G,EAAgB92G,QAAWo3G,IACxDjS,EAAc,IAAI,GAAY9mG,KAAKuP,aAAcipG,EAAa72G,QAC9DmlG,EAAY9iD,QAGdhkD,KAAKkmG,oBAAoBj6F,GAAM,GAAO,GAEnC66F,EACDA,EAAYC,UACJyR,EAAa72G,SACrB3B,KAAKuP,WAAWg9F,mBAAqBvsG,KAAKuP,WAAWwgC,WAIlD,cAAci1D,GAEnB,GAAG,MAAchlG,KAAK+0C,6BAA+BiwD,EACnD,OAKF,MAAMr/F,EAAQ3F,KAAK41G,mBAEnB51G,KAAK61G,oBAAoBlwG,GAInB,UAAU6/C,EAAkB7gD,EAAgBs0G,GAAoB,GAEtE,GADmBj5G,KAAKuP,WAAWxG,UAAUy8C,KAAU7gD,EACvD,CAUA,GANA3E,KAAKuP,WAAWxG,UAAUy8C,GAAQ7gD,EAMtB,WAAT6gD,GAAqBxlD,KAAKwwF,gBAAgBj0D,YAAYv8B,KAAKiL,UAAYjL,KAAK4wB,KAAK8iB,aAA6B,CAC/G,MAAM,IAAC7oC,GAAO7K,KAAKo4G,uBA3+IW,GA4+I9B,GAAGzzG,EAAO,CACR,MAAM6rB,EAAaxwB,KAAK8wB,cAAc,IAC7B9wB,KAAKuP,WAAWxG,UAAU2c,SAAW1lB,KAAK6wB,QAAQhmB,IAAQ7K,KAAKqtG,6BAA+BjjG,GAGjGA,EAAUpK,KAAKqtG,2BAA6BrtG,KAAK4wB,KAAKqxE,WAAW1lB,mBAAmB,gCAAiC,CACzH1hD,QAAS76B,KAAKugG,gBAAgBzlE,gBAAgB96B,KAAKiL,OAAO8vB,aACzD,CAACm+E,aAAc,MAAMv1G,KAAKw1G,IAC3B,IAAI3oF,IAAc,OAQlBxwB,KAAKkgG,gBAAgBziC,aAAa07C,EAAkBz7C,OACpD19D,KAAKugG,gBAAgB5iC,aAAaw7C,EAAkBv7C,OAEpD,MAAMmkC,EAAmBoX,EAAkB3pG,SAAShG,QACpD,IAAIu4F,EACF,OAGFoX,EAAkB3pG,SAASjG,KAAKw4F,GAChC,MAAMh6F,EAAU/H,KAAKo5G,2BAA0B,EAAQrxG,IACrDA,EAAQA,QAAUg6F,EAAiBh6F,QACnCA,EAAQgtG,QAAUhT,EAAiBgT,QACnChtG,EAAQm2C,SAAW6jD,EAAiB7jD,SACpCn2C,EAAQwW,OAAOswE,WAAY,EAC3B9mF,EAAQg6F,iBAAmBA,GA1gJH,GA6gJ1B,OAAO18F,QAAQC,IAAI,CACjBtF,KAAKyqG,qBACLzqG,KAAKihG,uBACJt9F,KAAK,KACN,IAAI6sB,IAAc,OAEFxwB,KAAKyoG,qBAAqB,CAAC1gG,IAAU,GAAO,OAE7D4/B,QAAQ,KACT3nC,KAAKqtG,gCAA6BhlG,SAGpCrI,KAAKkmG,oBAAoB,CAACr7F,IAC1B7K,KAAKqtG,gCAA6BhlG,EAItC,GAAY,QAATm9C,GAAkB7gD,GAAS3E,KAAKwwF,gBAAgBke,MAAM1uG,KAAKiL,UAAYjL,KAAK4wB,KAAK8iB,aAAc,CAChG1zC,KAAKkiB,IAAI,0BAET,MAAMsO,EAAaxwB,KAAK8wB,gBACxB,OAAOzrB,QAAQ6E,QAAQlK,KAAKogG,kBAAkB9pB,WAAWt2E,KAAKiL,OAAOwL,aAAa9S,KAAK0yE,I,MACrF,IAAI7lD,IACF,OAGF,KAAqB,QAAjB,EAAA6lD,EAASgjC,gBAAQ,eAAEv9E,aAErB,YADA97B,KAAKs5G,gCAIP,MAAMvxG,EAAU/H,KAAKo5G,2BAA0B,EAAOrxG,IACpDA,EAAQA,QAAUsuE,EAASgjC,SAASv9E,cAGtC97B,KAAKi2G,0BAA0BluG,KAInC/H,KAAKs5G,iCAGA,gCACL,GAAGt5G,KAAKuP,WAAWxG,UAAU2vB,KAC3B14B,KAAKuP,WAAWxG,UAAU2c,aACGrd,IAA7BrI,KAAKmrG,sBAEHnrG,KAAK4wB,KAAK8iB,eACT1zC,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,QAAQ3C,OAEtDqV,OAAOg1C,KAAK3yD,KAAK6wB,SAASlvB,SACzB3B,KAAK01G,qBAEY,cAAnB11G,KAAK4wB,KAAKvwB,OAAyBsd,OAAOg1C,KAAK3yD,KAAK6wB,SAASlvB,QAEhE,CACA3B,KAAKkiB,IAAI,iCAET,MAAMna,EAAU/H,KAAKo5G,2BAA0B,GAG/C,OAFAp5G,KAAKi2G,0BAA0BluG,IAExB,EAGT,OAAO,EAWF,WAAW6C,EAAQ,EAAGnC,GAAU,EAAO+sG,GAAc,EAAO7G,EAAgB,EAAGj4D,GAAW,GAC/F,MAAMzrC,EAASjL,KAAKiL,OAEdsxB,EAAcv8B,KAAKwwF,gBAAgBj0D,YAAYtxB,GAE/C+1B,EAAYn8B,KAAKC,IAAI,GAAIm8B,GAAA,EAAWx9B,OAAS,GAAkB,GAIrE,IAAIiF,EAFkB6zB,EAAc,GAAM5e,OAAOg1C,KAAK3yD,KAAK6wB,SAASlvB,OAAS,EAAIkD,KAAKJ,IAAI,GAAIu8B,GAAaA,EAS3G,QAAmB34B,IAAhB23F,GAA2B,CAC5B,IAAGA,GAKD,MAAO,CAAChgF,QAAQ,EAAO5V,QAAS/E,QAAQ6E,SAAQ,IAJ7CyT,OAAOg1C,KAAK3yD,KAAK6wB,SAASlvB,OAAS,KAClCq+F,GASR,IAUIsW,EAVA3rG,EAAY,EAWhB,GAVG6qG,IACD7qG,EAAYjC,EAERD,IACFC,EAAY,IAMbimG,IAAkB6G,EACnB,GAAsB,WAAnBx1G,KAAK4wB,KAAKvwB,KACXi2G,EAAiB,CAAC3H,OACb,CACL,MACMhpG,EADiB3F,KAAKixD,mBAAmBk5C,kBAAkBl/F,EAAQjL,KAAK4wB,KAAKthB,UACtDxH,QAAQnC,MACrC,GAAGA,EAAMhE,OAAS+G,IAAc/C,EAAMg8B,MAAM,KAAS43E,MAAO,CAC1DjD,EAAiB3wG,EAAMA,QAGvB,IAAI,IAAI/D,EAAI00G,EAAe30G,OAAS,EAAGC,GAAK,IAAKA,EAAG,CAElD,IADgB5B,KAAK4wB,KAAKk6B,WAAWwrD,EAAe10G,IACzC4kG,WACN,MADkB8P,EAAeluG,OAAOxG,EAAG,GAIlDgJ,EAAQ0rG,EAAeA,EAAe30G,OAAS,IAAMiJ,GAQ3D,IACI4uG,EADAlvG,EAA6EtK,KAAK0lG,eAAe96F,EAAOlC,EAAWiC,GAIvH,MAAM4rG,GAAmBD,aAAc,EAAdA,EAAgB30G,SAAU2I,aAAkBjF,QAC/Do0G,EAAwBz5G,KAAKuhG,aAAe52F,GAAaL,aAAkBjF,SAAYkxG,EAC1FA,IACDiD,EAAgBlvG,EAChBA,EAAS,CAACxC,QAASwuG,IAIrBt2G,KAAKuhG,aAAc,EAEnB,MAAMmY,EAAsBC,GAAiC,mCAC3D,GAAG,mBAAoBA,GAAiBA,EAAc7xG,QAAQ65B,MAAM,KAASy0E,KAAM,CACjF,GAAsB,eAAnBp2G,KAAK4wB,KAAKvwB,KAAuB,CAElC,MAAMu5G,EAAwB55G,KAAKixD,mBAAmB4oD,iCAAiC75G,KAAKiL,OAAS,IAAMjL,KAAK4wB,KAAKthB,UAClHsqG,GAAuBD,EAAc7xG,QAAQyB,KAAKqwG,GACrDD,EAAc7xG,QAAQyB,QAAQvJ,KAAK4wB,KAAKuiC,aAAanzD,KAAK4wB,KAAKthB,UAAU7G,iBAGrEzI,KAAKiJ,UAAU,OAAO,OAI1B6wG,EAAOxvG,GASJ,eAA2B3G,KAAK,IAC9B+1G,EAAcpvG,IACpB3G,KAAK,IACC3D,KAAKyoG,qBAAqBn+F,EAAOxC,SAAuB,GAAIW,EAAS+sG,GAAce,GAAoB5H,IAI5GoL,EAAkBzvG,IACtB,MAAMF,EAAUE,EAAO3G,KAAM2G,IAGxB7B,EAAUzI,KAAKyqG,uBAAyBrgG,EAAUpK,KAAK0qG,0BAA4BtgG,IACpFpK,KAAKkiB,IAAI3E,KAAK,4BAEPlY,QAAQgqB,UAGdqnB,GAED12C,KAAKuP,WAAW83B,YAIT,GAIFyyE,EAAIxvG,GACTgG,IAEF,MADAtQ,KAAKkiB,IAAI1R,MAAM,oBAAqBF,GAC9BA,IAGR,OAAOlG,GAGT,IAAIA,EAA2B4V,EAC/B,GAAG1V,aAAkBjF,QACnB2a,GAAS,EACT5V,EAAU2vG,EAAezvG,OACpB,IAAGosC,EAGR,OADA12C,KAAKuP,WAAW83B,WACT,KAEPrnB,GAAS,EAET5V,EAAU0vG,EAAIxvG,GAKhB,MAAM0vG,EAAczD,EAAmBwD,EAAeP,GAAiBpvG,EAEvE,GAAGqvG,GAAwB7sG,EAAA,EAAU+2B,SAASC,kBAAkC,CAC9E,IAAIq2E,EAAQ1D,EAAmB,EAAI,EACnCv2G,KAAKohG,gCAAkC,KAGrC,GAFAphG,KAAKkiB,IAAI,qCAEJ+3F,EAAO,OAEZj6G,KAAKohG,qCAAkC/4F,EAEvBrI,KAAKw2G,gBAAgB7H,EAAe2H,EAAgBC,EAAkB5rG,EAAWC,GACzFjH,KAAK,KACXmM,WAAW,KACT9P,KAAK6qG,gBAAgBpiG,GAAS,IAC7B,WAIPzI,KAAKohG,qCAAkC/4F,EAQzC,OALCI,EAAUzI,KAAKyqG,qBAAuBuP,EAAch6G,KAAK0qG,wBAA0BsP,EACpFA,EAAYr2G,KAAK,KACd8E,EAAUzI,KAAKyqG,0BAAuBpiG,EAAYrI,KAAK0qG,6BAA0BriG,IAGjFquC,EACM,MAGTtsC,EAAQzG,KAAK,KAGW,SAAnB3D,KAAK4wB,KAAKvwB,MAITyP,WAAW,KACNrH,EACDzI,KAAK6qG,iBAAgB,GAAM,GAE3B7qG,KAAK6qG,iBAAgB,GAAO,IAE7B,KAMF,CAAC7qF,SAAQ5V,YAGX,qBACL,GAAwB,SAAnBpK,KAAK4wB,KAAKvwB,MAAsC,eAAnBL,KAAK4wB,KAAKvwB,KAC1C,OAGF,GAAGL,KAAKmtG,qBACN,OAGF,MAAM52D,EAAiBv2C,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UACxF,IAAIw7F,EAAY9qG,KAAKixD,mBAAmBg9C,qBAAqBjuG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UACpF,GAAIw7F,IAEJA,EAAYntF,OAAOg1C,KAAK3yD,KAAK6wB,SAC5BjlB,OAAOf,IAAQ7K,KAAK6wB,QAAQhmB,GAAK3K,UAAUuV,SAAS,WACpDhJ,IAAI7K,IAAMA,GACVyK,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GACnB8H,KAAKzS,GAAKA,EAAIkpG,GAEZA,GAAa9qG,KAAK6wB,QAAQi6E,IAAY,CACvC,IAAIviD,EAASvoD,KAAK6wB,QAAQi6E,GACvB9qG,KAAKqhG,mBAAqBrhG,KAAKqhG,oBAAsB94C,IACtDvoD,KAAKqhG,kBAAkBnhG,UAAUoE,OAAO,mBACxCtE,KAAKqhG,kBAAoB,MAGxByJ,IAAcv0D,EAAe3rC,OAC9B29C,EAAOroD,UAAUW,IAAI,mBAGvBb,KAAKqhG,kBAAoB94C,EACzBvoD,KAAKmtG,sBAAuB,GAIzB,wBACL,MAAM+M,EAAcl6G,KAAKs0F,kBAv0JP,EAu0J2C,EAC7D,IAAI10D,GAAU,EACd,IAAI,MAAMh+B,KAAK5B,KAAK4gG,aAAc,CAChC,MAAMiH,EAAc7nG,KAAK4gG,aAAah/F,GAEnCimG,EAAYzmG,UAAUqN,oBAAsByrG,IAC7CrS,EAAYzmG,UAAUkD,SACnBtE,KAAKs0F,mBACNt0F,KAAKs0F,kBAAkBtiD,UAAU61D,EAAYzmG,UAAWymG,EAAY72E,YAE/DhxB,KAAK4gG,aAAah/F,GACzBg+B,GAAU,GASVA,IAIJ5/B,KAAKs5G,gCACLt5G,KAAKulG,0BAIF,SAAS6P,KACd,MAAMrtF,EAAMpnB,SAAS4nB,gBAAgB,6BAA8B,OACnER,EAAIS,eAAe,KAAM,UAAW,aACpCT,EAAIS,eAAe,KAAM,QAAS,MAClCT,EAAIS,eAAe,KAAM,SAAU,MACnCT,EAAI7nB,UAAUW,IAAI,eAElB,MAAMusC,EAAMzsC,SAAS4nB,gBAAgB,6BAA8B,OAKnE,OAJA6kB,EAAI5kB,eAAe,KAAM,OAAQ,wBAEjCT,EAAI1mB,OAAO+rC,GAEJrlB,EI79JM,MAAM,GACnB,YAAY9c,EAAgBJ,EAAasvG,EAAc1sD,G,MACrD,IAAI/7C,EAAoBoqB,EAA0BgM,EAChDzM,EAAuC,GAAIY,EAA6C,GAE1F,MAAMm+E,EAAW,IAAgBC,cAAcpvG,GAEzCmxB,EAAW,CAACjF,EAA4CmjF,EAAmBC,KAC/EzqG,WAAW,KACT,IAAI1F,EAGAA,EAFD+vG,IAAUtvG,EACRuvG,EACS,IAAmBI,iBAAiBvvG,GAEpC,IAAmBwvG,mBAAmBxvG,GAGxC,IAAmByvG,oBAAoBzvG,EAAQJ,EAAKsvG,EAAOI,EAAQD,GAG5E7sD,GACDrjD,EAAQzG,KAAK8pD,IAEd,MAGL,GAAG0sD,EAAO,CACR,IAAIQ,EAA0B,eAC1B9vG,GAWF6G,EAAQ,yBACRoqB,EAAc,sBAXXs+E,GACD1oG,EAAQ,uBACRoqB,EAAc,oCACdgM,EAAkB,CAAC,KAA+C,QAAzC,MAAmB6lE,eAAe1iG,UAAO,eAAE3C,QAAS,MAE7EoJ,EAAQ,wBACRoqB,EAAc,8BACd6+E,EAAa,oBAOjBt/E,EAAQ9xB,KAAK,CACXiwB,QAASmhF,EACT3yE,UAAU,EACV5L,iBAEG,CACL1qB,EAAQ,uBACR,MAAMkpG,EAA6B,aAEhC3vG,EAAOm4B,aACR/H,EAAQ9xB,KAAK,CACXiwB,QAASohF,EACTx+E,SAAWjF,GAAYiF,EAASjF,GAAS,GAAQA,EAAQj0B,QAGxD,IAAgBq5B,YAAYtxB,EAAO8vB,YACpCe,EAAc,0BAEdA,EAAc,kBAEdG,EAAW1yB,KAAK,CACd+uB,KAAM,YACNnB,SAAS,OAIb2E,EAAc,sBAEX7wB,IAAW2B,EAAA,EAAU+R,KACtB0c,EAAQ9xB,KAAK,CACXiwB,QAASohF,EACTx+E,cAGFf,EAAQ9xB,KAAK,CACXiwB,QAASohF,EACTx+E,SAAWjF,GAAYiF,EAASjF,GAAUA,EAAQj0B,QAGpD+4B,EAAW1yB,KAAK,CACd+uB,KAAM,aACN2P,SAAU,CAAC,IAAI,KAAU,CAACh9B,WAAS8P,SACnCoc,SAAS,MAMjB,aAAgBkE,GAEF,IAAI,GAAU,oBAAqB,CAC/CpwB,SACA4sB,aAAcnmB,EACdmqB,mBAAoBC,EACpBE,oBAAqB8L,EACrBzM,UACAY,eAGImB,QC/GK,SAASy9E,GAAiB7kE,EAAY9zC,OAAOC,gBAC1D,IAAI6zC,IAAcA,EAAUknD,WAC1B,OAAO,EAGT,MAAM4d,EAAiB9kE,EAAUmnD,WAAW,GAC5C,OAAI2d,EAAepsD,aAAeosD,EAAeC,aCEpC,MAAM,WAAmC,GAEtD,YAAY9vG,EAAgBgB,EAAgBqoG,EAA2B7mD,GACrE9tD,MAAM,gCAAiC,CACrC87B,SAAS,EACTI,mBAAoB,aACpBR,QAAS,CAAC,CACR7B,QAAS,aACT4C,SAAU,KACJ53B,EAAW+xB,YAIfk3B,GAAaA,IACb,IAAmButD,eAAe/vG,EAAQgB,EAAMqoG,EAAQ9vG,EAAWG,OAAOhB,KAAK+0E,IACzEA,GAEJ9+C,GAAS,CACPC,YAAa,yBAKrBl3B,MAAM,IAGR,MAAMquB,EAAMrwB,SAASC,cAAc,OAGnCmwB,GAAY,CACVlX,IAHU,KAAmByuC,wBAAwB,GAA2B2yD,eAIhFjqF,MACAw1B,MAAO,GAA2By0D,cAClCz3G,MALW,IAMXC,OANW,IAOXH,MAAM,EACNc,MAAM,IACLujC,QAAQ,KACT3nC,KAAKo9B,SAGPp9B,KAAKuR,OAAOlQ,OAAO2vB,GAEnB,MAAMxsB,EAAa,IAAI,IAAW,CAChCuB,MAAO,aACPsP,UAAW,IACX1E,YAAa,0BAGfnM,EAAWpE,MAAMkB,iBAAiB,QAAS,KACzCtB,KAAKq7B,QAAQ,GAAGtgB,QAAQ2b,gBAAgB,YAAalyB,EAAW+xB,aAGlEv2B,KAAK2C,KAAKtB,OAAOmD,EAAWpD,YApDhB,GAAA65G,cAAgB,QCCjB,MAAM,WAA4B,GAC/C,YAAYhwG,EAAgBgB,EAAgBwhD,GAC1C9tD,MAAM,wBAAyB,CAACk4B,aAAc,2BAA4BwD,QAAS,GAAI14B,MAAM,IAE7FsJ,EAAOA,EAAKtG,QAEZ,MAAM01B,EAA8C,CAClD,CAAC,iBAAkB,yBACnB,CAAC,qBAAsB,6BACvB,CAAC,kBAAmB,+BACpB,CAAC,wBAAyB,gCAC1B,CAAC,kBAAmB,0BACpB,CAAC,4BAA6B,oCAC9B,CAAC,yBAA0B,kCAI7BA,EAAQ9wB,QAAQgC,IACd,MAAMmX,EAAS,YAFC,8BAEiB,CAAqB4U,KAAM/rB,EAAE,KAC9DvM,KAAK2C,KAAKtB,OAAOqiB,KAGnB,MAAMw3F,EAAwB,KAAmBC,4BAA4B,GAA2BF,eAExG,YAAiBj7G,KAAK2C,KAAO5C,IAC3B,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,eACnC45F,EAASj5E,EAAQ,OAAA8vB,GAAA,GAAWzwC,IAAS,GAE3CwgG,EAAsBv3G,KAAK,KACzB3D,KAAKmkC,OAEL,IAAI,GAA2Bl5B,EAAQgB,EAAMqoG,EAAQ7mD,MAEtD,CAAC57C,eAAgB7R,KAAK6R,iBAEzB7R,KAAK2C,KAAKwC,MAAMgnG,OAAS,UACzBnsG,KAAKo7G,UAAUj2G,MAAMk2G,UAAY,QAEjCr7G,KAAKo9B,QC5CM,MAAM,WAAuB,GAC1C,cACEz9B,MAAM,kBAAmB,CACvBk4B,aAAc,8BACdgE,mBAAoB,uBACpBG,oBAAqB,CAAC,YAAK,gCAC3BX,QAAS,CAAC,CACR7B,QAAS,KACT0oC,UAAU,GACT,CACD1oC,QAAS,2BACT4C,SAAU,KACRl6B,OAAOwS,KAAK,IAAKmC,OAAO,+BAA+B,KAEzDqrD,UAAU,MAId,MAAM3yD,EAAa,IAAI,SAAWlH,GAClCkH,EAAWilC,mBAAqB,KAC9BjlC,EAAWnO,UAAUlB,UAAUC,OAAO,gBAAiBoP,EAAWwgC,WAClExgC,EAAWnO,UAAUlB,UAAUC,OAAO,kBAAmBoP,EAAWg5F,iBAGtEvoG,KAAK87B,YAAY1O,YAAY7d,EAAWnO,WAExCmO,EAAWnO,UAAUC,OAAOrB,KAAK87B,aACjCvsB,EAAWnO,UAAUlB,UAAUW,IAAI,gBAEnCb,KAAKo9B,Q,2SClBM,MAAM,WAAyB,KAC5C,YACU6zB,EACAlpD,GAERpI,MAAM,qBAGD,KAAM,CAACqkC,UAAU,EAAM1I,iBAAiB,EAAM34B,MAAM,IANjD,KAAAsuD,qBACA,KAAAlpD,UAOR/H,KAAKgS,OAGO,O,0CACZ,MAAMjK,EAAU/H,KAAKixD,mBAAmBu+B,sBAAsBxvF,KAAK+H,SAE7DuzG,EAA0Bt7G,KAAKixD,mBAAmBsqD,+BAA+BxzG,GAIjF2mF,EAAmB,IAAI,GACvB8sB,EAAU,+BACXzzG,GAAO,CACV8C,IAAK,EACLkI,GAAI,EACJs3B,UAAW,OAAF,sBACPj/B,EAAG,mBACHo3B,QAAS,IAENz6B,EAAQsiC,WAAS,CAEpB9rB,OAAQ,GACRquE,iBAAkB,OAItB4uB,EAAWnxE,UAAU7H,QAAUg5E,EAAWnxE,UAAU7H,QAAQ/1B,IAAIo+E,GACvD,OAAP,wBACKA,GAAa,CAChBtsE,OAAQ,MAIZmwE,EAAiB18E,KAAKwpG,EAAY,SAClC9sB,EAAiBxvC,SACjBwvC,EAAiBxuF,UAAUW,IAAI,aAC/B6tF,EAAiBxuF,UAAUoE,OAAO,oBAElCoqF,EAAiBrtF,OAAOrB,KAAKy7G,UAE7Bz7G,KAAKuR,OAAOlQ,OAAOqtF,GAEnB,MAAMn7E,EAAgB5S,SAASC,cAAc,OAC7C2S,EAAcrT,UAAUW,IAAI,kBAC5B0S,EAAcrM,QAAQrD,UAAY,OAElC,MAAM63G,EAA8C,IAAIpoG,IAExD,IAAIqoG,GAAkB,EACtB,GAAGH,EAAWnxE,UAAU7H,QAAQ7gC,OAAQ,CACtC,MAAMmnC,EAAW9oC,KAAK47G,mBAAmB,YAAaJ,EAAWnxE,UAAU7H,QAAQ/Q,OAAO,CAACC,EAAK3L,IAAM2L,EAAM3L,EAAEzd,MAAO,IAErHomF,EAAiB1tF,QAAQ8nC,GACzB0yE,EAAWnxE,UAAU7H,QAAQl5B,QAAQw/B,EAAS+hD,eAC9C8wB,GAAkB,EAGpB,IAAIE,GAAsB,EAC1B,GAAGP,EACD,IACE,MAAMQ,QAAoB97G,KAAKixD,mBAAmB8qD,2BAA2Bh0G,EAAQkD,OAAQlD,EAAQ8C,KACrG,IAAIixG,EAAYn6G,OACd,KAAM,GAGR,MAAMmnC,EAAW9oC,KAAK47G,mBAAmB,SAAUE,EAAYn6G,QAE/D+sF,EAAiB1tF,QAAQ8nC,GACzB0yE,EAAWnxE,UAAU7H,QAAQl5B,QAAQw/B,EAAS+hD,eAC9CgxB,GAAsB,EACtB,MAAMvrG,IAKVkrG,EAAWnxE,UAAU7H,QAAQj4B,QAAQsgF,IACnC,MAAMt7E,EAAa,IAAI,SAAWlH,GAClCkH,EAAWnO,UAAUlB,UAAUW,IAAI,YAEnC,MAAMqU,EAAU,IAAI,GAAe,CACjCmrB,UAAU,EACV/C,aAAa,IAGT0+E,EAAW,GAAkB3tG,eAAe,CAChD8yE,WAAY,KAGd,GAAkB5yE,qBAAqBytG,EAAU,KAC/Ch8G,KAAKmkC,aACJ97B,GAAW,GAAO,GAErB6M,EAAQvD,QAAQtQ,OAAO26G,GACvBzsG,EAAWnO,UAAUC,OAAO6T,EAAQ9T,WAEpC,MAAM66G,EAAkD,WAA3BpxB,EAAc/hD,SACrCozE,EAA+C,WAA3BrxB,EAAc/hD,SAKxC,IAAI4wD,EAJD,CAAC,SAAU,aAAaz6D,SAAS4rD,EAAc/hD,YAChD+hD,EAAc/hD,cAAWzgC,GAI3B,MAAM2+B,EAAS,IAAI,GAAiB,CAClCz3B,aACA6uB,WAAY,IAAW,mCACrB,MAAM9zB,QAAetK,KAAKixD,mBAAmBkrD,2CAA2Cp0G,OAASM,EAAWwiF,EAAc/hD,SAAU4wD,EAAYuiB,EAAsBC,GAgCtK,OA/BAxiB,EAAapvF,EAAOovF,WAEpBpvF,EAAO8xG,SAAS7xG,QAAQ,EAAEU,SAAQ69B,eAChC,MAAM,IAAC9xB,GAAO,GAAkBC,aAAa,CAC3CC,OAAQjM,EACRiD,YAAY,EACZ9M,UAAW46G,EACX5rG,WAAY,GACZ+G,eAAe,EACf9G,WAAW,EACXF,YAAY,IAGd,GAAG24B,EAAU,CACX,MAAMw3B,EAAmB3/D,SAASC,cAAc,OAChD0/D,EAAiBpgE,UAAUW,IAAI,8BAG/BkwB,GAAY,CACVlX,IAHwB,KAAoBwiG,kBAAkBvzE,GAGvCG,YACvBjY,IAAKsvC,EACL98D,MAAO,GACPC,OAAQ,KAGVuT,EAAIuvB,OAAOllC,OAAOi/D,GAGpB,OAAA7vD,EAAA,GAAeuG,EAAII,gBAAiB,IAAgBC,oBAAoBpM,EAAOwL,gBAGzEijF,OAIZgiB,EAAQlhG,IAAIjL,EAAWnO,UAAW4lC,GAElCzzB,EAAclS,OAAOkO,EAAWnO,aAGlCpB,KAAK2C,KAAKtB,OAAOkS,GAEjB,MAAMtB,EAAY,OAAAokD,EAAA,GAAeq4B,EAAkBn7E,EAAe,CAACR,EAAIujD,KACrE,GAAGvjD,IAAQ27E,EAAiBjgF,kBAAoB,EAC9C,OAAO,EAGT,MAAMq6B,EAAW4lD,EAAiBn+D,SAASxd,GACrCkjD,EAAShkD,EAAUgkD,UACV,IAAZA,GACAy4B,EAAiBn+D,SAAS0lC,GAA4B+2B,aAAY,GAGrElkD,EAASkkD,aAAY,GAEN0uB,EAAQ/nG,IAAI2iD,GACpB7sD,SAITwI,EAAU,GAAG,GAEbjS,KAAKo9B,UAGC,mBAAmBjsB,EAAc7I,GACvC,MAAMwgC,EAAW,IAAI,GACrBA,EAAS92B,KAAK,SACd82B,EAAS+hD,cAAgB,CACvBz/E,EAAG,gBACH9C,MAAOA,EACPwgC,SAAU33B,GAEZ23B,EAAS+jD,qBAAoB,GAC7B/jD,EAASgkD,gBAET,MAAMwvB,EAAsB37G,SAASC,cAAc,OAInD,OAHA07G,EAAoBp8G,UAAUW,IAAI,mBAAoB,wBAAyB,SAAWsQ,GAC1F23B,EAAS9nC,QAAQs7G,GAEVxzE,GChMX,MACMyzE,GAAsBC,8BAMtBC,IAAqB,KASpB,MAAM,GASX,YACUjc,EACAngG,EACRmwB,GAFQ,KAAAgwE,sBACA,KAAAngG,OA8EF,KAAAgnC,SAAW,KACjBrnC,KAAK08G,aAAanyG,QAAQ,CAACoyG,EAAS3rF,KAClChxB,KAAK48G,oBAAoB5rF,EAAK2rF,MAuI1B,KAAAz5F,YAAenjB,I,MACrB,MAAM88G,EAAc,OAAA/xF,GAAA,GAAgB/qB,EAAE2a,OAAQ6hG,IAC9C,IAAIM,EACF,OAGF,MAAMF,EAAU38G,KAAK08G,aAAa/oG,IAAIkpG,GACtC,IAAIF,EACF,OAIF,KAAkB,QAAd,EAAAA,EAAQG,cAAM,eAAElhG,QAClB,OAGF,MAAM69D,EAASkjC,EAAQ55G,OACnB02E,GAIDA,EAAO79D,SACR69D,EAAOl2E,UAAW,EAClBk2E,EAAOpxB,YA3OT,MAAM00D,EAAiB/8G,KAAK+8G,eAAiBp8G,SAASC,cAAc,OACpEm8G,EAAe78G,UAAUW,IAAI27G,gCAC7BO,EAAe78G,UAAUW,IAAI27G,gCAAuCn8G,GAEpE,MAAM28G,EAAqBh9G,KAAKoB,UAAYT,SAASC,cAAc,OACnEo8G,EAAmB98G,UAAUW,IAnCJ,sBAqCzB,MAAMo8G,EAAsBj9G,KAAKuP,WAAsB,aAATlP,EAAsB,IAAI,SAAWgI,GAAa,IAAI,SAAYA,GAChH20G,EAAmB37G,OAAO47G,EAAoB77G,WAC9C67G,EAAoBzoE,mBAAqBx0C,KAAKqnC,SAC9C41E,EAAoBz2F,eAEpBy2F,EAAoB77G,UAAUlB,UAAUW,IAAI,gBAQ5Cb,KAAK08G,aAAe,IAAIppG,IACxBtT,KAAKk9G,eAAiB,uBAAyBxgE,KAAKC,MACpD6F,EAAA,EAAqB26D,qBAAqBn9G,KAAKk9G,gBAAgB,GAE3D,MACFF,EAAmB17G,iBAAiB,YAAatB,KAAKkjB,aAGxD,YAAiB85F,EAAqBj9G,IACpC,MAAM88G,EAAc,OAAA/xF,GAAA,GAAgB/qB,EAAE2a,OAAQ6hG,IAC9C,IAAIM,EAAa,OAEjB,MAAMF,EAAU38G,KAAK08G,aAAa/oG,IAAIkpG,GAClCF,GAEJ38G,KAAKwgG,oBAAoBmC,aAAa3iG,KAAK+H,QAAS40G,EAAQ7zE,YAG9Di0E,EAAe17G,OAAO27G,GAEtBh9G,KAAKwwB,WAAaA,UAAc,eAG3B,KAAKzoB,GACV/H,KAAK+H,QAAUA,EAEf,MAAMyoB,EAAaxwB,KAAKwwB,WAAW7c,MAE7BrJ,EAAStK,KAAKwgG,oBAAoBiC,+BAA+B16F,GACvE,OAAA4rC,GAAA,GAAYrpC,EAAS+/B,IACnB,IAAI7Z,MAAiB6Z,EAAU1oC,OAAQ,OACvC0oC,EAAU9/B,QAAQu+B,IAChB9oC,KAAKo9G,eAAet0E,KAGtB,MAAMu0E,EAAa,KACjBr9G,KAAKoB,UAAUlB,UAAUW,IAAI,eAG5ByJ,aAAkBjF,QACnB,aAAQg4G,GAERA,MAKC,UACLr9G,KAAKwwB,WAAW3U,QAChB7b,KAAKuP,WAAW8W,kBAChBrmB,KAAK08G,aAAa/tG,QAClB6zC,EAAA,EAAqB26D,qBAAqBn9G,KAAKk9G,gBAAgB,GAC/D16D,EAAA,EAAqBq3C,iBAAgB,EAAM75F,KAAKk9G,gBAAgB,GAS1D,mBACN,OAAOtwG,EAAA,EAAU+2B,SAASC,oBAAsB,KAG1C,eAAekF,GACrB,MAAM+zE,EAAcl8G,SAASC,cAAc,OAC3Ci8G,EAAY38G,UAAUW,IAAI07G,IAE1B,MAAMe,EAAiB38G,SAASC,cAAc,OAC9C08G,EAAep9G,UAAUW,IAAI07G,GAAsB,UAEnD,MAAMgB,EAAgB58G,SAASC,cAAc,OAC7C,IAAI48G,EACJD,EAAcr9G,UAAUW,IAAI07G,GAAsB,WAE/Cv8G,KAAKy9G,qBACND,EAAgB78G,SAASC,cAAc,OACvC48G,EAAct9G,UAAUW,IAAI07G,GAAsB,UAAW,SAG/D,MAAMI,EAAoC,CACxCa,gBACAD,gBACAz0E,SAAUA,EAASA,UAErB9oC,KAAK08G,aAAaliG,IAAIqiG,EAAaF,GAEnC,MAAMnsF,EAAaxwB,KAAKwwB,WAAW7c,MAG7BzQ,EA1IY,IAyIC,KAAqB,EAAI,MAGtCxD,EAAU,CACd8D,MAAON,EACPO,OAAQP,EACRuiD,UAAW,EACXT,YAAY,EACZY,WAAW,EACX30B,MAAOjxB,KAAKk9G,eACZ1sF,cAGF,GAAIxwB,KAAKy9G,mBASF,CACL,IAAI78C,GAAU,EACd7vC,GAAY,OAAD,QACTlX,IAAKivB,EAAS40E,iBACd1sF,IAAKusF,EACLn5G,MAAM,GACH1E,IACFiE,KAAK81E,IACN,OAAA5zB,GAAA,GAA0B4zB,GAE1BkjC,EAAQG,OAASrjC,EAEjBA,EAAOn4E,iBAAiB,aAAewkD,IAClC2zB,EAAO1zB,WAAaD,GACrB63D,EAAkBh6G,KAAMi6G,IACtB,OAAA/3D,GAAA,GAA0B+3D,GAC1BL,EAAcr9G,UAAUW,IAAI,QAC5B28G,EAAct9G,UAAUoE,OAAO,QAE5Bs8D,IACD+7C,EAAQ55G,OAAS66G,EACjBh9C,GAAU,IAEX32C,GAAA,MAGNA,GAAA,GAEH,MAAM0zF,EAAoB5sF,GAAY,OAAD,QACnClX,IAAKivB,EAAS45D,iBACd1xE,IAAKwsF,GACF99G,IACFiE,KAAK81E,IACN,OAAA5zB,GAAA,GAA0B4zB,GAEnBnwB,GAAA,EAAajlD,kBAAkBo1E,KACrC/oE,MAAMuZ,GAAA,eA5CFvqB,EAAQslD,kBACRtlD,EAAQkmD,UAEf70B,GAAY,OAAD,QACTlX,IAAKivB,EAASG,YACdjY,IAAKusF,GACF79G,IAyCP49G,EAAej8G,OAAOk8G,GACtBC,GAAiBF,EAAej8G,OAAOm8G,GACvCX,EAAYx7G,OAAOi8G,GACnBt9G,KAAKuP,WAAWlO,OAAOw7G,GAGjB,oBAAoB7rF,EAAkB2rF,GAG5C,MAAMW,EAAiBtsF,EAAI/E,kBACrB0sF,EAAcjb,GAAe1sE,EAAKhxB,KAAKuP,WAAWnO,WACxD,IAAImkB,EACJ,GAAIozF,EAeG,GAAGA,EAAYxa,SAASx4E,MAAQgzF,EAAYxa,SAAS7tD,MAAO,CACjE,MAAM7a,EAAO5wB,KAAK+B,IAAI+xG,EAAYl0F,KAAKkB,KAAOgzF,EAAYl0F,KAAK6rB,OAG/D/qB,EAAY,SAFE1gB,KAAKC,IAAI,SAAA2wB,EAAQ,GAAI,SAjOFooF,GAiO6B,GAAG,GAElC,SAE/Bt4F,EAAY,OArBG,CACf,IAAIo3F,EAAQY,cAAcr9G,UAAUuV,SAAS,UAAYknG,EAAQG,OAC/D,OAGCH,EAAQ55G,QACT45G,EAAQ55G,OAAOkC,OAGjB03G,EAAQG,OAAO73G,OACf03G,EAAQG,OAAOv5G,UAAW,EAC1Bo5G,EAAQY,cAAcr9G,UAAUoE,OAAO,QACvCq4G,EAAQa,cAAct9G,UAAUW,IAAI,QAEpC0kB,EAAY,GAUXk3F,KACDa,EAAen4G,MAAMogB,UAAYA,IChOxB,MAAM,GAyBnB,YACU+uC,EACA1jC,EACAqgC,EACAu/B,EACAstB,EACAC,EACAzd,EACAE,GAPA,KAAAlsC,WACA,KAAA1jC,OACA,KAAAqgC,qBACA,KAAAu/B,kBACA,KAAAstB,kBACA,KAAAC,iBACA,KAAAzd,wBACA,KAAAE,sBAsCF,KAAA5rC,cAAiB70D,IACvB,IAAIwoD,EAAqByoD,EAEzB,IACEA,EAAiB,OAAAlmF,GAAA,GAAgB/qB,EAAE2a,OAAQ,0BAC3C6tC,EAASyoD,EAAiBA,EAAejwG,cAAgB,OAAA+pB,GAAA,GAAgB/qB,EAAE2a,OAAQ,UACnF,MAAM3a,IAGR,IAAIwoD,GAAUA,EAAOroD,UAAUuV,SAAS,gBAAiB,OAEzD,IAAIsF,EAAU/a,KAAK+a,QAEnB,IADGhb,aAAa+pB,YAAc/pB,EAAEu4E,eAAe,oBAAoBv4E,EAAU0H,iBAC1EsT,GAAWA,EAAQ7a,UAAUuV,SAAS,UACvC,OAAO,GAEN1V,aAAa+pB,YAAc/pB,EAAEu4E,eAAe,mBAAkBv4E,EAAU80D,cAAe,GAE1F,IAAIhqD,GAAO09C,EAAOrhD,QAAQ2D,IAC1B,IAAIA,EAAK,OAET,MAAM+jF,EAAc5uF,KAAK4uF,YAAc/jF,EAAM,EAa7C,GAZA7K,KAAKg+G,aAAeh+G,KAAK4wB,KAAKolB,UAAUid,gBAAgB1K,GACxDvoD,KAAKiL,OAASjL,KAAK4wB,KAAK3lB,OAExBjL,KAAK0a,OAAS3a,EAAE2a,OAChB1a,KAAKi+G,gBAAkBpD,KACvB76G,KAAKk+G,eAAyC,MAAxBl+G,KAAK0a,OAAO43B,UACc,WAA7CtyC,KAAK0a,OAA6BA,QACnC1a,KAAK0a,OAAOxa,UAAUuV,SAAS,eAEjCzV,KAAKm+G,iBAA2C,MAAxBn+G,KAAK0a,OAAO43B,SAAmBtyC,KAAK0a,OAAOxa,UAAUuV,SAAS,WAGnFzV,KAAK4wB,KAAKolB,UAAUC,cAAgB+6D,EAAgB,CACrD,GAAGpiB,EACD,OAGF,MAAM3iF,EAAOjM,KAAK4wB,KAAKuiC,aAAatoD,GACpC,GAAGoB,EAAKtK,OAAS,EAAG,CAClB,MAAMy8G,EAAcp+G,KAAK4wB,KAAKolB,UAAUga,cAAchwD,KAAKiL,OAAQJ,GACjEA,EACAoB,EAAKoI,KAAKxJ,GAAO7K,KAAK4wB,KAAKolB,UAAUga,cAAchwD,KAAKiL,OAAQJ,IAC/DuzG,IACDvzG,EAAMuzG,IAKZp+G,KAAKq+G,eAAiBrN,EAEtB,MAAM3M,EAAc,OAAAv5E,GAAA,GAAgB9qB,KAAK0a,OAAQ,gBACjD1a,KAAKs+G,uBAAyBja,EAE5BrkG,KAAK6K,IADJw5F,GACWA,EAAYn9F,QAAQ2D,IAErBA,EAGb7K,KAAK+vD,WAAa/vD,KAAK4wB,KAAKolB,UAAUga,cAAchwD,KAAKiL,OAAQjL,KAAK6K,KACtE7K,KAAK+H,QAAU/H,KAAK4wB,KAAKk6B,WAAW9qD,KAAK6K,KACzC7K,KAAKu+G,YAAc3vB,IAAgB5uF,KAAKixD,mBAAmBE,WAAWnxD,KAAK+H,SAC3E/H,KAAKw+G,kBAAen2G,EACpBrI,KAAKy+G,wBAAqBp2G,EAE1B,MAAMq2G,EAAa1+G,KAAKgS,OACxB+I,EAAU2jG,EAAW3jG,QACrB,MAAM,QAACjN,EAAO,QAAE6wG,EAAO,YAAEC,EAAW,cAAEC,EAAa,sBAAEC,GAAyBJ,EAC9E,IAAIK,GAAyB,EAC7B,GAAGF,EAAe,CAChB,MAAM7wG,EAAY,aAIlB,GAHA+wG,EAAyBF,EAAcz9G,UAAUlB,UAAUuV,SAASzH,GACjE+wG,GAAwBF,EAAcz9G,UAAUlB,UAAUoE,OAAO0J,GAEvC,eAA1B8wG,EAAwC,CACzC,MAAME,EAAajkG,EAAmF,YAI9FkkG,GADiBD,EADS,GD9JHnB,GCgKW,EAClCqB,EAAwB,IAC9B,GAAGD,EAAkBC,EAAuB,CAC1C,MAAMC,EAAWH,EDnKUnB,ICmKIqB,EAAwBD,GAA8C,EACrGlkG,EAAQ5V,MAA2E,SAAIg6G,EAAU,OAMzG,MAAM35D,EAAyB+C,EAAOroD,UAAUuV,SAAS,SAAW,OAAS,QAG7E,aAAc1V,EAAiB6jB,QAAW7jB,EAAiB6jB,QAAQ,GAAK7jB,EAAiBgb,EAASyqC,EAAMo5D,GAErGC,IACDA,EAAc9B,eAAe53G,MAAMuzB,IAAM3d,EAAQ5V,MAAMuzB,IACvDmmF,EAAc9B,eAAe53G,MAAMwgB,KAAO5K,EAAQ5V,MAAMwgB,KACxDk5F,EAAc9B,eAAe53G,MAAMqB,YAAY,eAAgBuU,EAAkC,aAA1B+jG,EAAuC,eAAiB,eAAiB,MAChJ/jG,EAAQha,cAAcM,OAAOw9G,EAAc9B,gBACxCgC,GAA6BF,EAAcz9G,UAAUovC,YAG1D,aAAYz1B,EAAS,KAChB8jG,GACDA,EAAcz9G,UAAUlB,UAAUoE,OAAO,cAG3CtE,KAAK6K,IAAM,EACX7K,KAAKiL,YAAS5C,EACdrI,KAAK0a,OAAS,KACd1a,KAAKw+G,kBAAen2G,EACpBrI,KAAKy+G,wBAAqBp2G,EAC1ByF,IAEAgC,WAAW,KACT6uG,KACC,OAGFI,GACDF,EAAcz9G,UAAUlB,UAAUW,IAAI,eAoalC,KAAAu+G,qBAAuB,KAC1Bp/G,KAAK4wB,KAAKolB,UAAUC,YACrB,YAAmBj2C,KAAK4wB,KAAKolB,UAAU+d,qBAEvC,IAAI,GAAa/zD,KAAKiL,OAAQjL,KAAK4wB,KAAKuiC,aAAanzD,KAAK6K,OAItD,KAAAw0G,aAAe,KACrBr/G,KAAK4wB,KAAKxwB,MAAMunG,iBAAiB3nG,KAAK6K,MAGhC,KAAAy0G,YAAc,KACpBt/G,KAAK4wB,KAAKxwB,MAAMm/G,mBAAmBv/G,KAAK6K,MAGlC,KAAA20G,YAAc,KACpB,GAAG3E,KAAoB,CAUrBxiF,IATar4B,KAAK4wB,KAAKolB,UAAUC,YAC/B,IAAIj2C,KAAK4wB,KAAKolB,UAAUoY,aAAaz6C,IAAI3T,KAAKiL,SAASoB,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAC1E,CAACvM,KAAK6K,MAES4mB,OAAO,CAACC,EAAK7mB,KAC5B,MAAM9C,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,GACrC,OAAO6mB,IAAO3pB,aAAO,EAAPA,EAASA,SAAUA,EAAQA,QAAU,KAAO,KACzD,IAAI8H,aAIPlP,SAASk4B,YAAY,SAKjB,KAAA4mF,sBAAwB,KAC9BpnF,GAAqBr4B,KAAK0a,OAA6Bg+C,OAGjD,KAAAgnD,gBAAkB,KACxB,IAAIC,EACkB,eAAnB3/G,KAAK4wB,KAAKvwB,OACXs/G,EAAgB3/G,KAAKixD,mBAAmBxwC,iBAAiBzgB,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,WAGlF,MAAMorB,EAAW16B,KAAKwwF,gBAAgBp9C,gBAAgBusE,EAAgBA,EAAc1vG,OAASjQ,KAAKiL,QAC5F+/F,EAAQhrG,KAAKsgG,sBAAsB13C,mBAAmB5oD,KAAK6K,KACjE,IACIzD,EADAkT,EAAM,gBAEPogB,GACDpgB,GAAOogB,EAAW,KAAOilF,EAAgB3/G,KAAKsgG,sBAAsB13C,mBAAmB+2D,EAAczwB,SAASuoB,cAAgBzM,GAC3H2U,IAAerlG,GAAO,YAAc0wF,GACvC5jG,EAAM,eAENkT,GAAO,KAAOta,KAAKiL,OAAO8vB,WAAa,IAAMiwE,EAC1C2U,IAAerlG,GAAO,WAAata,KAAKsgG,sBAAsB13C,mBAAmB+2D,EAAc90G,MAClGzD,EAAM,yBAGRuyB,GAAM,IAAK9iB,OAAOzP,GAAK,IAEvBixB,GAAoB/d,IAGd,KAAAslG,WAAa,KACnB,IAAI,GAAgB5/G,KAAKiL,OAAQjL,KAAK6K,MAGhC,KAAAg1G,aAAe,KACrB,IAAI,GAAgB7/G,KAAKiL,OAAQjL,KAAK6K,KAAK,IAGrC,KAAAi1G,cAAgB,KACtB9/G,KAAK89G,gBAAgBl/D,SAAS5+C,KAAK+H,QAAS,KAGtC,KAAAg4G,WAAa,KACnB//G,KAAK89G,gBAAgBkC,SAAShgH,KAAK+H,UAG7B,KAAAysD,eAAiB,KACvB,GAAGx0D,KAAK4wB,KAAKolB,UAAUC,YACrB,YAAmBj2C,KAAK4wB,KAAKolB,UAAUqc,yBAClC,CACL,MAAMpmD,EAAOjM,KAAKs+G,qBAAuB,CAACt+G,KAAK6K,KAAO7K,KAAK4wB,KAAKuiC,aAAanzD,KAAK6K,KAClF,IAAI,GAAa,CACf,CAAC7K,KAAKiL,QAASgB,MAKb,KAAAwoD,cAAgB,KACtBz0D,KAAK4wB,KAAKolB,UAAUE,gBAAgB,OAAAprB,GAAA,GAAgB9qB,KAAK0a,OAAQ,iBAAmB,OAAAoQ,GAAA,GAAgB9qB,KAAK0a,OAAQ,YAG3G,KAAAg6C,sBAAwB,KAC9B10D,KAAK4wB,KAAKolB,UAAUiY,mBAGd,KAAA0G,cAAgB,KACnB30D,KAAK4wB,KAAKolB,UAAUC,YACrB,YAAmBj2C,KAAK4wB,KAAKolB,UAAUsc,oBAEvC,IAAI,GAAoBtyD,KAAKiL,OAAQjL,KAAKs+G,qBAAuB,CAACt+G,KAAK6K,KAAO7K,KAAK4wB,KAAKuiC,aAAanzD,KAAK6K,KAAM7K,KAAK4wB,KAAKvwB,OAvqB5HL,KAAK6R,eAAiB,IAAI,IAC1B7R,KAAKwwB,WAAa,eAEf,KACD,YAAiB8jC,EAAWv0D,IAC1B,GAAG6wB,EAAKolB,UAAUC,YAChB,OAGFrlB,EAAK1O,IAAI,WAAYniB,IAgBRA,EAAE2a,OAAuBulG,QAdjB,CACnB,QACA,cACA,SACA,YACA,gBACA,iBACA,IACA,wBACA,kBACA,iCACA,eACA,cAEyD70F,KAAK,SAE9D,OAAApB,EAAA,GAAYjqB,GAGZC,KAAK40D,cAAc70D,KAEpB,CAAC8R,eAAgB7R,KAAK4wB,KAAKC,QAAQhf,iBACjC,aAA0ByiD,EAAUt0D,KAAK40D,cAAe50D,KAAK4wB,KAAKC,QAAQhf,gBAgI5E,UACL7R,KAAK6R,eAAeO,YACpBpS,KAAK6+G,eAAiB7+G,KAAK6+G,cAAc/wG,UACzC9N,KAAKwwB,WAAW3U,QAGX,UACL7b,KAAK8N,UAGC,cAAcutB,GACpB,OAAGr7B,KAAK4uF,YACCvzD,EAAQzvB,OAAO8X,GACbA,EAAOkrE,aAGTvzD,EAAQzvB,OAAO8X,IACpB,IAAI+oC,EAWJ,OARGzsD,KAAK4wB,KAAKolB,UAAUC,cAAgBvyB,EAAOoxC,cAC5CrI,GAAO,GAEAzsD,KAAKq+G,cAAgB,KAA5B5xD,EACE/oC,EAAO5I,UAIJ2xC,IAKL,aACNzsD,KAAKq7B,QAAU,CAAC,CACdlqB,KAAM,QACNmnB,KAAM,sBACNopB,QAAS1hD,KAAKo/G,qBACdtkG,OAAQ,IAAyB,cAAnB9a,KAAK4wB,KAAKvwB,OAAyBL,KAAK+H,QAAQwW,OAAOuN,aACpE,CACD3a,KAAM,QACNmnB,KAAM,oCACNopB,QAAS1hD,KAAKo/G,qBACdtkG,OAAQ,IAAyB,cAAnB9a,KAAK4wB,KAAKvwB,MAAwBL,KAAK+vD,aAAe/vD,KAAK4wB,KAAKolB,UAAU+d,oBAAoBmsD,aAAa,YACzHC,UAAW,KAAM,EACjBrrD,eAAe,GACd,CACD3jD,KAAM,WACNmnB,KAAM,0BACNopB,QAAS,KACP1hD,KAAK4wB,KAAKxwB,MAAMggH,gBAAgB,KAC9B,OAAAv6D,GAAA,GAA4B7lD,KAAK+H,SACjC/H,KAAKixD,mBAAmBovD,YAAYrgH,KAAK+H,QAAS/H,KAAK+H,QAAQA,QAAS,CACtEu4G,aAActgH,KAAK4wB,KAAKxwB,MAAMkgH,aAC9BpiE,SAAUl+C,KAAK+H,QAAQm2C,WAGzBl+C,KAAK4wB,KAAKxwB,MAAMuM,eAAc,GAAO,IACpC,IAAI+vC,KAAyB,IAApB18C,KAAK+H,QAAQykB,QAE3B1R,OAAQ,IAAyB,cAAnB9a,KAAK4wB,KAAKvwB,MACvB,CACD8Q,KAAM,QACNmnB,KAAM,QACNopB,QAAS1hD,KAAKq/G,aACdvkG,OAAQ,IAAM9a,KAAK4wB,KAAK62E,YACrBznG,KAAK+H,QAAQwW,OAAOuN,eACnB9rB,KAAK4wB,KAAKxwB,MAAMy8F,cACC,cAAnB78F,KAAK4wB,KAAKvwB,MAEX,CACD8Q,KAAM,OACNmnB,KAAM,OACNopB,QAAS1hD,KAAKs/G,YACdxkG,OAAQ,IAAM9a,KAAKixD,mBAAmBsvD,eAAevgH,KAAK+H,QAAS,WAAa/H,KAAK4wB,KAAKxwB,MAAMy8F,cAC/F,CACD1rF,KAAM,OACNmnB,KAAM,OACNopB,QAAS1hD,KAAKw/G,YACd1kG,OAAQ,MAAO9a,KAAKu+G,aAAiBv+G,KAAK+H,QAA4BA,SAAY/H,KAAKi+G,gBAAoBj+G,KAAKk+G,gBAAmBl+G,KAAK+H,QAA4BA,UAAY/H,KAAK0a,OAAOkT,YAC3L,CACDzc,KAAM,OACNmnB,KAAM,wBACNopB,QAAS1hD,KAAKw/G,YACd1kG,OAAQ,KAAO9a,KAAKu+G,cAAiBv+G,KAAK+H,QAA4BA,SAAW/H,KAAKi+G,gBACrF,CACD9sG,KAAM,OACNmnB,KAAM,iCACNopB,QAAS1hD,KAAKw/G,YACd1kG,OAAQ,KACN,IAAI9a,KAAK+vD,YAAc/vD,KAAKu+G,WAC1B,OAAO,EAGT,IAAI,MAAOtzG,EAAQgB,KAASjM,KAAK4wB,KAAKolB,UAAUoY,aAC9C,IAAI,MAAMvjD,KAAOoB,EACf,GAAKjM,KAAKixD,mBAAmBxwC,iBAAiBxV,EAAQJ,GAAK9C,QACzD,OAAO,EAKb,OAAO,GAETo4G,UAAW,KAAM,EACjBrrD,eAAe,GACd,CACD3jD,KAAM,OACNmnB,KAAM,WACNopB,QAAS1hD,KAAKy/G,sBACd3kG,OAAQ,IAAM9a,KAAKk+G,eACnBppD,eAAe,GACd,CACD3jD,KAAM,OACNmnB,KAAM,6BACNopB,QAAS,KACPrpB,GAAoBr4B,KAAK0a,OAAOlM,YAElCsM,OAAQ,IAAM9a,KAAKm+G,iBACnBrpD,eAAe,GACd,CACD3jD,KAAM,OACNmnB,KAAM,4BACNopB,QAAS,KACPrpB,GAAoBr4B,KAAK0a,OAAOlM,YAElCsM,OAAQ,IAAM9a,KAAK0a,OAAOxa,UAAUuV,SAAS,kBAC7Cq/C,eAAe,GACd,CACD3jD,KAAM,OACNmnB,KAAM,kCACNopB,QAAS1hD,KAAK0/G,gBACd5kG,OAAQ,IAAM9a,KAAKwwF,gBAAgBtpD,UAAUlnC,KAAKiL,UAAYjL,KAAK+H,QAAQwW,OAAOuN,aACjF,CACD3a,KAAM,MACNmnB,KAAM,sBACNopB,QAAS1hD,KAAK4/G,WACd9kG,OAAQ,KAAO9a,KAAK+H,QAAQwW,OAAOuN,aACd,mBAAnB9rB,KAAK+H,QAAQqD,IACZpL,KAAK+H,QAAQwW,OAAOgxE,QACrBvvF,KAAKwwF,gBAAgB6pB,cAAcr6G,KAAKiL,SACrB,cAAnBjL,KAAK4wB,KAAKvwB,MACX,CACD8Q,KAAM,QACNmnB,KAAM,wBACNopB,QAAS1hD,KAAK6/G,aACd/kG,OAAQ,IAAO9a,KAAK+H,QAA4BwW,OAAOgxE,QAAUvvF,KAAKwwF,gBAAgB6pB,cAAcr6G,KAAKiL,SACxG,CACDkG,KAAM,WACNmnB,KAAM,+BACNopB,QAAS,KACP1hD,KAAK+9G,eAAe55D,YAAankD,KAAK+H,QAAgB0Q,MAAM9X,WAE9Dma,OAAQ,K,MACN,GAAG9a,KAAK+H,QAAQwW,OAAOuN,YACrB,OAAO,EAGT,MAAMjS,EAAgG,QAA7E,EAAC7Z,KAAK+H,QAA4B0Q,aAA2C,eAAE9X,SACxG,IAAIkZ,EAAK,OAAO,EAEhB,IAAI2mG,IAAc,KAClB,MAAMC,GAAc5mG,EAAIxZ,OAAU,CAAC,MAAO,QAAS,WAAoC4+B,SAASplB,EAAIxZ,MAEpG,OADGogH,IAAYD,EAAYA,KAAe,OAAA11F,GAAA,GAAgB9qB,KAAK0a,OAAQ,eAAiB,OAAAoQ,GAAA,GAAgB9qB,KAAK0a,OAAQ,UAC9G+lG,GAAcD,IAEtB,CACDrvG,KAAM,eACNmnB,KAAM,mBACNopB,QAAS1hD,KAAK8/G,cACdhlG,OAAQ,K,MACN,MAAM+8B,EAAkC,QAA1B,EAAA73C,KAAK+H,QAAgB0Q,aAAK,eAAEo/B,KAC1C,OAAOA,GAAQA,EAAKqC,cAAcv4C,SAAWk2C,EAAKt5B,OAAOy7B,SAAWnC,EAAKt5B,OAAOw5B,OAGjF,CACD5mC,KAAM,OACNmnB,KAAM,iBACNopB,QAAS1hD,KAAK+/G,WACdjlG,OAAQ,K,MACN,MAAM+8B,EAAkC,QAA1B,EAAA73C,KAAK+H,QAAgB0Q,aAAK,eAAEo/B,KAC1C,OAAO73C,KAAKixD,mBAAmBsvD,eAAevgH,KAAK+H,QAAS,SAAW8vC,IAASA,EAAKt5B,OAAOy7B,SAAWh6C,KAAK+H,QAAQwW,OAAOuN,cAG5H,CACD3a,KAAM,UACNmnB,KAAM,UACNopB,QAAS1hD,KAAKw0D,eACd15C,OAAQ,MAAO9a,KAAKu+G,YAAiC,cAAnBv+G,KAAK4wB,KAAKvwB,MAA0BL,KAAK+H,QAAQwW,OAAOuN,aAAgB9rB,KAAK+H,QAAQwW,OAAO6I,KAA2B,mBAAnBpnB,KAAK+H,QAAQqD,IAClJ,CACD+F,KAAM,UACNmnB,KAAM,oCACNopB,QAAS1hD,KAAKw0D,eACd15C,OAAQ,IAAM9a,KAAK4wB,KAAKolB,UAAUqc,qBAChCryD,KAAK+vD,aACJ/vD,KAAK4wB,KAAKolB,UAAUqc,oBAAoB6tD,aAAa,YACxDC,UAAW,KAAM,EACjBrrD,eAAe,GACd,CACD3jD,KAAM,OACNmnB,KAAM,aACNopB,QAAS,KACP,IAAI,GAAoB1hD,KAAKiL,OAAQ,CAACjL,KAAK6K,OAE7CiQ,OAAQ,KAAO9a,KAAK+H,QAAQwW,OAAO6I,KAA0B,YAAnBpnB,KAAK+H,QAAQqD,IAAoBpL,KAAK+H,QAAQwW,OAAOuN,aAAe9rB,KAAKwwF,gBAAgBtpD,UAAUlnC,KAAKiL,QAClJk1G,UAAW,KAAM,EACjBrrD,eAAe,GACd,CACD3jD,KAAM,SACNmnB,KAAM,yBACNopB,QAAS1hD,KAAKy0D,cACd35C,OAAQ,KAAQ9a,KAAK+H,QAAmCG,SAAWlI,KAAK+vD,YAAc/vD,KAAKg+G,aAC3FmC,UAAW,KAAM,EACjBrrD,eAAe,GACd,CACD3jD,KAAM,SACNmnB,KAAM,kCACNopB,QAAS1hD,KAAK00D,sBACd55C,OAAQ,IAAM9a,KAAK+vD,WACnBowD,UAAW,KAAM,EACjBrrD,eAAe,GACd,CACDpT,QAAS,KACP,GAAG1hD,KAAKw+G,aACNx+G,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQjL,KAAKw+G,mBAEV,KAAGx+G,KAAKy+G,mBAGb,OAAO,EAFP,IAAI,GAAiBz+G,KAAKixD,mBAAoBjxD,KAAK+H,WAKvD+S,OAAQ,KAAK,QAAC,OAAC9a,KAAKiL,OAAO82B,cAA4E,QAA7D,EAA2C,QAA3C,EAAC/hC,KAAK+H,QAA4BsiC,iBAAS,eAAEuiD,wBAAgB,eAAEjrF,SAAU3B,KAAKixD,mBAAmBsqD,+BAA+Bv7G,KAAK+H,WAC/Ko4G,UAAW,KAAM,GAChB,CACDhvG,KAAM,gBACNmnB,KAAM,SACNopB,QAAS1hD,KAAK20D,cACd75C,OAAQ,IAAM9a,KAAKixD,mBAAmBG,iBAAiBpxD,KAAK+H,UAC3D,CACDoJ,KAAM,gBACNmnB,KAAM,mCACNopB,QAAS1hD,KAAK20D,cACd75C,OAAQ,IAAM9a,KAAK+vD,aAAe/vD,KAAK4wB,KAAKolB,UAAUsc,mBAAmB4tD,aAAa,YACtFC,UAAW,KAAM,EACjBrrD,eAAe,GACd,CACD3jD,KAAM,OACNmnB,KAAM,8BACNopB,QAAS,KACP,IAAI,IAEN5mC,OAAQ,KAAM,EACd8zE,aAAa,IAIT,OACN5uF,KAAK8N,UACL9N,KAAK0gH,aAEL,MAAMj9B,EAAkBzjF,KAAK2gH,cAAc3gH,KAAKq7B,SAC1CtgB,EAAU/a,KAAK+a,QAAU,GAAW0oE,EAAiBzjF,KAAK6R,gBAChEkJ,EAAQhI,GAAK,qBACbgI,EAAQ7a,UAAUW,IAAI,eAEtB,MAAM+/G,EAAcn9B,EAAgBpvE,KAAKqP,IAAWA,EAAOvS,MAC3D,GAAGyvG,EAAa,CACd,MAAMv2E,EAAarqC,KAAK+H,QAA4BsiC,UAC9CihD,EAAkBjhD,aAAS,EAATA,EAAWuiD,iBAC7Bi0B,KAAuBv1B,aAAe,EAAfA,EAAiB3pF,QACxCm/G,EAAoB9gH,KAAKixD,mBAAmBsqD,+BAA+Bv7G,KAAK+H,SAAY/H,KAAKwwF,gBAAgB7wD,QAAQ3/B,KAAKiL,QAAwBsuD,wBAAqBlxD,EAC3K04G,EAAgB12E,EAAYA,EAAU7H,QAAQ/Q,OAAO,CAACC,EAAK3L,IAAM2L,EAAM3L,EAAEzd,MAAO,QAAKD,EAE3Fu4G,EAAY7lG,QAAQ7a,UAAUW,IAAI,UAAYggH,EAAqB,YAAc,WACjF,MAAMG,EAAW,IAAI,IAAK/mD,YAAY,CACpC7yD,IAAKy5G,OACmBx4G,IAAtBy4G,EAAkC,2BAA6B,uBAC7D,eACJ/uG,KAAM8uG,OACkBx4G,IAAtBy4G,EAAkC,CAACC,GAAiB,CAACD,EAAmBA,QACtEz4G,EACJ0S,QAAS6lG,EAAY3zD,cAGvB,IAAIg0D,EAGAA,EAFDJ,OACwBx4G,IAAtBy4G,EACU,YAAK,2BAA4B,CAACC,IAElC,YACTz1B,EAAgB3pF,SAAWm/G,EAAoB,2BAA6B,uBAC5E,CAACx1B,EAAgB3pF,OAAQm/G,IAIlB,YAAK,WAGlBG,EAAS/gH,UAAUW,IAAI,2BACvB+/G,EAAY7lG,QAAQ1Z,OAAO4/G,GAE3B,MAAMC,EAAc,EACdC,EAAqB,KAC3BH,EAASjmG,QAAQ5V,MAAMi8G,WAAa,SACpCJ,EAASjmG,QAAQ5V,MAAMk8G,aAAeR,EAAqBM,EAAqBt8G,KAAKC,IAAIo8G,EAAa51B,EAAgB3pF,QAAU,MAAQ,OACxI,MAAM6uB,EAAaxwB,KAAKwwB,WAAW7c,MACnC3T,KAAKixD,mBAAmBkrD,2CAA2Cn8G,KAAK+H,SAA4BpE,KAAM2G,IACxG,IAAIkmB,IACF,OAGCywF,GACDA,EAAS38G,SAGX,MAAM+lC,EAAY//B,EAAO8xG,SACnB2E,OAAsC14G,IAAtBy4G,EACpBx2G,EAAOg3G,eAELT,EACEx2E,EAAUz+B,OAAOk9B,GAAYA,EAASA,UAAUnnC,OAChD0oC,EAAU1oC,OAGhB,IAAI4/G,EACJ,GAAwB,IAArBl3E,EAAU1oC,OACX4/G,EAAW,IAAI,KAAU,CACvBt2G,OAAQo/B,EAAU,GAAGp/B,OACrByvD,eAAe,EACfxjD,QAAQ,IACP6D,UAEC8lG,GAAsBv2G,EAAOk3G,iBAAiB7/G,QAAU,KAC1D3B,KAAKw+G,aAAen0E,EAAU,GAAGp/B,aAE9B,GAAG41G,EAAoB,CAC5B,MAAMY,EAASV,IAAkB12E,EAAU1oC,aAAgC0G,IAAtBy4G,EACrDS,EAAW,YACTE,EAAS,2BAA6B,uBACtCA,EAAS,CAACV,GAAiB,CAACA,EAAe12E,EAAU1oC,cAGnD0oC,EAAU1oC,OAGZ4/G,EAAW,YAAK,cAAe,CAACl3E,EAAU1oC,SAF1Cq/G,EAASjmG,QAAQ5V,MAAMi8G,WAAa,GAYxC,GANGG,IACDA,EAASp8G,MAAMk8G,aAAeF,EAAqBt8G,KAAKC,IAAIo8G,EAAaH,GAAiB,MAC1FQ,EAASrhH,UAAUW,IAAI,2BACvB+/G,EAAY7lG,QAAQ1Z,OAAOkgH,IAG1Bl3E,EAAU1oC,OAAQ,CACnB,MAAM4tC,EAAU,IAAI,GAAe,CAACn/B,WAAY,KAChDm/B,EAAQ2P,OAAOosC,EAAkBA,EAAgB7+E,IAAIsZ,GAAK/lB,KAAKwwF,gBAAgBnqD,UAAUtgB,EAAEwlE,UAAYlhD,EAAU59B,IAAIq8B,GAAYA,EAAS79B,SAC1I21G,EAAY7lG,QAAQ1Z,OAAOkuC,EAAQnuC,WAIjCpB,KAAKy+G,oBAAqB,KAMlC,IAAIG,EACAC,EACAC,EACJ,GAAsB,YAAnB9+G,KAAK+H,QAAQqD,IAAoBpL,KAAK4wB,KAAKolB,UAAUC,cAAgBj2C,KAAK+H,QAAQwW,OAAOuN,cAAgB9rB,KAAK+H,QAAQwW,OAAOC,aAAc,CAC5IsgG,EAAyB,MAAY,KAAqC,aAAe,WACzFD,EAAgB7+G,KAAK6+G,cAAgB,IAAI,GAAkB7+G,KAAKwgG,oBAAqBse,EAAuB9+G,KAAKwwB,YACjHquF,EAAc7sG,KAAKhS,KAAKixD,mBAAmBu+B,sBAAsBxvF,KAAK+H,UAGtE,MAEM25G,EAFO,GACE,EAETC,EAAc,EAAGN,EAAe,EAEpCzC,EAD2B,aAA1BE,EACa,CACZpmF,IAAKipF,EAELh8F,KAAM+7F,GAGM,CACZhpF,IAAKgpF,EACLpxE,MAAO+wE,EACP17F,KAAMg8F,GAOZ,OAFA3hH,KAAK4wB,KAAKxvB,UAAUC,OAAO0Z,GAEpB,CACLA,UACAjN,QAAS,KACP9N,KAAK8N,UACL+wG,GAAiBA,EAAc/wG,WAEjC6wG,QAAS,KACP5jG,EAAQzW,SACRu6G,EAAc9B,eAAez4G,UAE/Bs6G,cACAC,gBACAC,0B,mCC3nBS,MAAM,GAKnB,YAAYp/G,GAQVM,KAAK4hH,gBAAkB,CAAC,CACtBzwG,KAAM,OACNmnB,KAAM,yBACNopB,QAAShiD,EAAQmiH,cACjB/mG,OAAQ,IAAoB,aAAd9a,KAAKK,MAClB,CACD8Q,KAAM,WACNmnB,KAAM,6BACNopB,QAAShiD,EAAQoiH,gBACjBhnG,OAAQ,IAAoB,aAAd9a,KAAKK,MAClB,CACD8Q,KAAM,WACNmnB,KAAM,wBACNopB,QAAShiD,EAAQoiH,gBACjBhnG,OAAQ,IAAoB,aAAd9a,KAAKK,OAGrBL,KAAK+hH,SAAW,GAAW/hH,KAAK4hH,gBAAiBliH,EAAQmS,gBACzD7R,KAAK+hH,SAAS7hH,UAAUW,IAAI,YAAanB,EAAQsiH,UAEjD,aAA0BtiH,EAAQuiH,iBAAmBliH,IAChDL,EAAQkU,SAAWlU,EAAQkU,WAI9B5T,KAAK4hH,gBAAgBr3G,QAAQmZ,IAC3BA,EAAO3I,QAAQ7a,UAAUC,OAAO,QAASujB,EAAO5I,YAGlD,OAAAkP,EAAA,GAAYjqB,GACZ,aAAYC,KAAK+hH,YAChBriH,EAAQmS,gBAGN,UAAU5G,GACfjL,KAAKK,KAAO4K,IAAW2B,EAAA,EAAU+R,KAAO,WAAa,Y,uBClC1C,MAAM,WAAwB,KAc3C,YAAoBiS,GAkBlB,GAjBAjxB,MAAM,oCAAqC,KAAM,CAACqkC,UAAU,EAAM27C,YAAa,SAAUh9E,MAAM,IAD7E,KAAAiuB,OAVZ,KAAAsQ,OAAS,EAmKT,KAAAghF,cAAgB,KACtBliH,KAAKmiH,QAwGP,KAAAh7G,QAAWpH,IACT,MAAM2a,EAAS3a,EAAE2a,OAEX0nG,EAAa,OAAAn8E,GAAA,GAAUvrB,EAAQ,SAC/B2nG,EAAU,OAAAC,GAAA,GAAa5nG,GACzB2nG,IACF3nG,EAAO3Z,cAAcb,UAAUW,IAAI,aACnCuhH,EAAWliH,UAAUoE,OAAO,iBAC5B89G,EAAWn2F,kBAAkB0e,gBAAgB,cAG/By3E,EAAW9lF,qBACb+lF,GAAWriH,KAAKuiH,UAAU9zG,kBAAoB,IAC1DzO,KAAKwiH,kBAGPxiH,KAAKy2B,gBAGP,KAAAk+B,cAAiB50D,IACf,MAAM2a,EAAS3a,EAAE2a,OACX3U,EAAQ,OAAAkgC,GAAA,GAAUvrB,EAAQ,SAC1B1S,EAAM,OAAAmjD,GAAA,GAAWplD,GAEpB/F,KAAKyiH,gBAAkBziH,KAAKyiH,eAAe,GAAG,KAAOz6G,IACtDhI,KAAKyiH,oBAAiBp6G,GAGxBtC,EAAMzB,SACNtE,KAAK0iH,kBAAkBt6G,OAAOJ,EAAK,GAEnChI,KAAK0iH,kBAAkBn4G,QAAQ,CAAC/F,EAAYwD,KAC1CxD,EAAW9E,QAAQijH,aAAahhH,OAAS,EACzC6C,EAAW9E,QAAQijH,aAAap5G,KAAKvB,EAAM,GACvB,IAAK46G,QAAQjvG,IAAInP,EAAWuB,MAAMkmB,mBAC1Cua,WAGdxmC,KAAKy2B,gBArSL,YAAMz2B,KAAK0R,MAAO,WAElB1R,KAAK6iH,mBAAqB,IAAI,IAAW,CACvClyG,YAAa,eACb5K,MAAO,eACPvF,KAAM,WACN6U,UA3BsB,MA8BxBrV,KAAK6R,eAAehR,IAAIb,KAAK6iH,mBAAmBziH,MAAhDJ,CAAuD,QAAS,KAC9DA,KAAKy2B,iBAGPz2B,KAAK0iH,kBAAoB,GAEH,cAAnB1iH,KAAK4wB,KAAKvwB,KAAsB,CACjC,MAAM0hH,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACb7hH,KAAK4wB,KAAKxwB,MAAM0iH,YAAa,EAC7B9iH,KAAKmiH,QAEPL,gBAAiB,KACf9hH,KAAK4wB,KAAKxwB,MAAMggH,gBAAgB,KAC9BpgH,KAAKmiH,UAGTH,SAAU,cACVC,iBAAkBjiH,KAAK4/E,aAGzBmiC,EAASgB,UAAU/iH,KAAK4wB,KAAK3lB,QAE7BjL,KAAKuR,OAAOlQ,OAAO0gH,EAASA,UAG9B/hH,KAAKuR,OAAOlQ,OAAOrB,KAAK6iH,mBAAmBzhH,WAE3C,MAAMg3C,EAAKz3C,SAASC,cAAc,MAC5B2gC,EAAI5gC,SAASC,cAAc,OACjC2gC,EAAErhC,UAAUW,IAAI,WAChB,YAAM0gC,EAAG,eAETvhC,KAAKuiH,UAAY5hH,SAASC,cAAc,QACxCZ,KAAKuiH,UAAUriH,UAAUW,IAAI,yBAE7B,MAAMmiH,EAAKriH,SAASC,cAAc,OAClCoiH,EAAG9iH,UAAUW,IAAI,wBAEjB,MAAMoiH,EAAkBtiH,SAASC,cAAc,OAC/CqiH,EAAgB/iH,UAAUW,IAAI,WAC9B,YAAMoiH,EAAiB,YAEnBjjH,KAAK4wB,KAAK4/D,gBAAgBj0D,YAAYv8B,KAAK4wB,KAAK3lB,UAClDjL,KAAKkjH,uBAAyB,IAAI,KAAc,CAC9C5qF,KAAM,oBACN93B,KAAM,cAERR,KAAKkjH,uBAAuB9iH,MAAM+2B,SAAU,EAC5C6rF,EAAG3hH,OAAOrB,KAAKkjH,uBAAuBn9G,QAGxC/F,KAAKmjH,sBAAwB,IAAI,KAAc,CAC7C7qF,KAAM,yBACN93B,KAAM,aAERR,KAAKojH,kBAAoB,IAAI,KAAc,CACzC9qF,KAAM,eACN93B,KAAM,SAGRR,KAAK6R,eAAehR,IAAIb,KAAKmjH,sBAAsB/iH,MAAnDJ,CAA0D,SAAU,KAClE,MAAMm3B,EAAUn3B,KAAKmjH,sBAAsB/iH,MAAM+2B,QACjDn3B,KAAKojH,kBAAkBhjH,MAAMs2B,gBAAgB,WAAYS,KAG3Dn3B,KAAK6R,eAAehR,IAAIb,KAAKojH,kBAAkBhjH,MAA/CJ,CAAsD,SAAU,KAC9D,MAAMm3B,EAAUn3B,KAAKojH,kBAAkBhjH,MAAM+2B,QAE5ChrB,MAAMC,KAAKpM,KAAKuiH,UAAUhyF,UAA4B9jB,IAAI3K,IACzDA,EAAG5B,UAAUC,OAAO,cAAeg3B,KAGjCA,IACFn3B,KAAKyiH,oBAAiBp6G,EACtBrI,KAAKqjH,kBAAkBz9G,iBAAiB,KAG1C09G,EAAa/4G,QAAQzI,GAAMA,EAAG5B,UAAUC,OAAO,QAASg3B,IAExDn3B,KAAKmjH,sBAAsB/iH,MAAMs2B,gBAAgB,WAAYS,GAC7Dn3B,KAAKy2B,iBAGPusF,EAAG3hH,OAAOrB,KAAKmjH,sBAAsBp9G,MAAO/F,KAAKojH,kBAAkBr9G,OAEnE,MAAMu9G,EAA8B,GAE9BC,EAAsB5iH,SAASC,cAAc,OACnD2iH,EAAoBrjH,UAAUW,IAAI,WAClC,YAAM0iH,EAAqB,2BAE3B,MAAMC,EAAS7iH,SAASC,cAAc,MAEhC6iH,EAAwB9iH,SAASC,cAAc,OACrD6iH,EAAsBvjH,UAAUW,IAAI,yBAEpCb,KAAKqjH,kBAAoB,IAAI,IAAW,CACtC1yG,YAAa,kCACb5K,MAAO,kCACPvF,KAAM,WACN6U,UAjIsB,MAoIxBrV,KAAK6R,eAAehR,IAAIb,KAAK6iH,mBAAmBziH,MAAhDJ,CAAuD,QAAS,KAC9DA,KAAKy2B,iBAGP,MAAMitF,EAAuB/iH,SAASC,cAAc,OACpD8iH,EAAqBxjH,UAAUW,IAAI,YACnC,YAAM6iH,EAAsB,wBAE5BD,EAAsBpiH,OAAOrB,KAAKqjH,kBAAkBjiH,UAAWsiH,GAE/DJ,EAAa/5G,KAAKi6G,EAAQD,EAAqBE,GAC/CH,EAAa/4G,QAAQzI,GAAMA,EAAG5B,UAAUW,IAAI,SAE5Cb,KAAK2C,KAAK5B,cAAcE,aAAam3C,EAAIp4C,KAAK2C,MAC9C3C,KAAK2C,KAAKtB,OAAOkgC,EAAGvhC,KAAKuiH,UAAW5hH,SAASC,cAAc,MAAOqiH,EAAiBD,KAAOM,GAE1F,YAAiBtjH,KAAK4/E,WAAY5/E,KAAKkiH,cAAe,CAACrwG,eAAgB7R,KAAK6R,iBAE5E7R,KAAKuP,WAAa,IAAI,IAAWvP,KAAK2C,MACtC3C,KAAKwiH,kBAELxiH,KAAK2jH,SAAW,KACN3jH,KAAK4jH,mBAAmBjiH,OAGlC3B,KAAKy2B,eAGC,mBAMN,OALgBtqB,MAAMC,KAAKpM,KAAKuiH,UAAUhyF,UAAU9jB,IAAI,CAAC3K,EAAIkG,KAC3D,MAAM5H,EAAQ0B,EAAG2R,cAAc,sBAC/B,OAAOrT,aAAiB+F,iBAAmB/F,EAAMuE,MAAQ,OAAAk/G,GAAA,GAAazjH,GAAO,GAAOuE,QACnFiH,OAAOk5B,KAAOA,EAAEj1B,QASb,W,MACN,MAAMmoC,EAAWh4C,KAAK6iH,mBAAmBl+G,MACzC,IAAIqzC,EACF,OAAO,EAGT,GAAGA,EAASr2C,OArLY,IAsLtB,OAAO,EAGT,GAAG3B,KAAKojH,kBAAkBhjH,MAAM+2B,WAA+B,QAAnB,EAAAn3B,KAAKyiH,sBAAc,eAAE9gH,QAC/D,OAAO,EAGT,MAAM22C,EAAUt4C,KAAK4jH,mBACrB,GAAGtrE,EAAQ32C,OAAS,EAClB,OAAO,EAIT,GADsB22C,EAAQjkC,KAAK/H,GAAKA,EAAE3K,OAjMpB,KAmMpB,OAAO,EAGT,MAAOgD,MAAOm/G,GAAgB,OAAAD,GAAA,GAAa7jH,KAAKqjH,kBAAkBjjH,OAAO,GACzE,QAAG0jH,EAAaniH,OAtMQ,KA6MlB,eACN,MAAMirE,EAAQ5sE,KAAKigF,WACnBjgF,KAAK4/E,WAAWlpD,gBAAgB,YAAak2C,GAGxC,KAAKm3C,GAAQ,GAClB,MAAM/rE,EAAWh4C,KAAK6iH,mBAAmBl+G,MAEnC2zC,EAAUt4C,KAAK4jH,oBAEdj/G,MAAOm/G,EAAc5lE,SAAU8lE,GAAwB,OAAAH,GAAA,GAAa7jH,KAAKqjH,kBAAkBjjH,OAElG,GAAsB,cAAnBJ,KAAK4wB,KAAKvwB,OAAyB0jH,EAKpC,YAJA/jH,KAAK4wB,KAAKxwB,MAAMggH,gBAAgB,KAC9BpgH,KAAKmiH,MAAK,KAMdniH,KAAKmkC,OAKL,MAAM5lB,EAAyB,GAE5Bve,KAAKkjH,yBAA2BljH,KAAKkjH,uBAAuB9iH,MAAM+2B,UACnE5Y,EAAOg9B,eAAgB,GAGtBv7C,KAAKmjH,sBAAsB/iH,MAAM+2B,UAClC5Y,EAAOi9B,iBAAkB,GAGxBx7C,KAAKojH,kBAAkBhjH,MAAM+2B,UAC9B5Y,EAAOw5B,MAAO,GAGhB,MAAMF,EAAa,CACjBzsC,EAAG,OACHmT,SACAy5B,WACAM,QAASA,EAAQ7rC,IAAI,CAAC9H,EAAOqD,KACpB,CACLoD,EAAG,aACHktB,KAAM3zB,EACNi0C,OAAQ,IAAItxB,WAAW,CAACtf,OAG5B+K,QAAI1K,GAIA47G,EAAiBjkH,KAAK4wB,KAAKktF,gBAAgBoG,kBAAkBrsE,EAAM73C,KAAKyiH,eAAgBqB,EAAcE,GAI5GhkH,KAAK4wB,KAAKqgC,mBAAmBuoC,UAAUx5F,KAAK4wB,KAAK3lB,OAAQg5G,EAAgB,OAAF,UAClEjkH,KAAK4wB,KAAKuzF,4BAGmB,UAA/BnkH,KAAK4wB,KAAKxwB,MAAMgkH,YACjBpkH,KAAK4wB,KAAKxwB,MAAMikH,cAGlBrkH,KAAK4wB,KAAKxwB,MAAMuM,eAAc,GAAO,GA4C/B,kBACN,MAAMu0B,EAASlhC,KAAKkhC,SACdl5B,EAAMhI,KAAKuiH,UAAU9zG,kBAAoB,EACzC61G,EAAgB,IAAI,IAAW,CACnC3zG,YAAa,2BACb5K,MAAO,sBACP48G,aAAc,CAAC36G,GACfxH,KAAM,YAAc0gC,EACpB7rB,UApUoB,MAsUtBrV,KAAK6R,eAAehR,IAAIyjH,EAAclkH,MAAtCJ,CAA6C,QAASA,KAAKmH,SAE3D,MAAMkwB,EAAa,IAAI,GAAW,CAChCiB,KAAM,GACN93B,KAAM,aAER62B,EAAWkC,KAAKl4B,OAAOijH,EAAcljH,WACrC,YAAiBkjH,EAAclkH,MAAO4pB,EAAA,EAAa,CAACnY,eAAgB7R,KAAK6R,iBACzEwlB,EAAWtxB,MAAM7F,UAAUW,IAAI,iBAC/Bw2B,EAAWj3B,MAAMmW,UAAW,EACxBvW,KAAKojH,kBAAkBhjH,MAAM+2B,SAC/BE,EAAWtxB,MAAM7F,UAAUoE,OAAO,eAEpCtE,KAAK6R,eAAehR,IAAIw2B,EAAWj3B,MAAnCJ,CAA0C,SAAU,KAElD,GADgBq3B,EAAWj3B,MAAM+2B,QACrB,CACV,MAAMnvB,EAAM,OAAAmjD,GAAA,GAAW9zB,EAAWtxB,OAClC/F,KAAKyiH,eAAiB,CAAC,IAAIn7F,WAAW,CAACtf,KACvChI,KAAKy2B,kBAIT,MAAMglE,EAAY96F,SAASC,cAAc,QACzC66F,EAAUv7F,UAAUW,IAAI,WAAY,eACpCyjH,EAAcljH,UAAUC,OAAOo6F,GAE/B,YAAiBA,EAAWz7F,KAAK20D,cAAe,CAAC9iD,eAAgB7R,KAAK6R,eAAgBgN,MAAM,IAE5F7e,KAAKuiH,UAAUlhH,OAAOg2B,EAAWtxB,OAEjC/F,KAAKuP,WAAWi0B,kBAAkB,CAChCzoB,QAAS/a,KAAKuiH,UAAUtpE,iBACxBtgB,SAAU,WAIZ34B,KAAK0iH,kBAAkBn5G,KAAK+6G,I,cC9XjB,SAASC,GAAe7/D,GACrC,MAAMrqC,EAAMqqC,EAAMrqC,IAElB,OAAOrC,MAAMqC,GACZ1W,KAAKsU,GAAYA,EAASusG,eAC1B7gH,KAAK6gH,IACJ,MAAMjjF,EAAI,IAAIja,WAAWk9F,GAGzB,IAAI/qG,EAAW,EACf,IAAI,IAAI7X,EAAI,EAAGD,EAAS4/B,EAAE5/B,OAAQC,EAAID,IAAUC,EAE9C,GAAW,IAAR2/B,EAAE3/B,IACW,KAAZ2/B,EAAE3/B,EAAI,IACM,GAAZ2/B,EAAE3/B,EAAI,IACM,GAAZ2/B,EAAE3/B,EAAI,GAAY,CAEpB,MAAMm1G,EAASx1E,EAAE3/B,EAAI,IAAM,EAAiB,IAAX2/B,EAAE3/B,EAAI,GAIvC6X,GAAYs9F,EAAQ,EAAI,GAAKA,EAIjC,OAAOt9F,EAAW,MCetB,IAAIgrG,GAEG,SAASC,KACd,OAAOD,GAGM,MAAM,WAAsB,KAezC,YAAoB7zF,EAAoB+zF,EAAeC,GAWrD,GAVAjlH,MAAM,mCAAoC,KAAM,CAACqkC,UAAU,EAAM27C,YAAa,aAAcklC,+BAA+B,EAAMliH,MAAM,IADrH,KAAAiuB,OAAoB,KAAA+zF,QAuIhC,KAAAG,UAAa/kH,IACnB,MAAM2a,EAAS3a,EAAE2a,OACjB,GAAGA,IAAW1a,KAAKI,MAAO,CACxB,GAAsB,UAAnBsa,EAAO43B,SAAuB53B,EAAOwlG,aAAa,mBACnD,OAGFlgH,KAAKI,MAAM6B,QACX,OAAAJ,GAAA,GAAgB7B,KAAKI,SA0MjB,KAAA2kH,WAAcl1C,IACpB,MAAMm1C,EAAahlH,KAAKglH,WAClBC,EAAiBjlH,KAAKilH,eAAep1C,EAAKxvE,MAE1C2d,EAAyB,GAC/BA,EAAO6xD,KAAOA,EAEd,MAAMq1C,EAAUvkH,SAASC,cAAc,OACvCskH,EAAQhlH,UAAUW,IAAI,cAEtBmd,EAAOknG,QAAUA,EAEjB,MAAM96G,EAAU66G,EAAiBjlH,KAAKmlH,YAAYt1C,EAAM7xD,EAAQknG,GAAWllH,KAAKolH,eAAev1C,EAAM7xD,EAAQknG,GAE7G,OADAF,EAAWK,gBAAgB97G,KAAKyU,GACzB5T,GApWPpK,KAAKglH,WAAa,CAChB3kH,KAAMukH,EACNS,gBAAiB,GACjBp0F,OAAO,GAGT,YAAiBjxB,KAAK4/E,WAAY,IAAM5/E,KAAKmiH,OAAQ,CAACtwG,eAAgB7R,KAAK6R,iBAErD,cAAnB7R,KAAK4wB,KAAKvwB,KAAsB,CACjC,MAAM0hH,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACb7hH,KAAK4wB,KAAKxwB,MAAM0iH,YAAa,EAC7B9iH,KAAKmiH,QAEPL,gBAAiB,KACf9hH,KAAK4wB,KAAKxwB,MAAMggH,gBAAgB,KAC9BpgH,KAAKmiH,UAGTH,SAAU,cACVC,iBAAkBjiH,KAAK4/E,WACvB/tE,eAAgB7R,KAAK6R,iBAGvBkwG,EAASgB,UAAU/iH,KAAK4wB,KAAK3lB,QAE7BjL,KAAKuR,OAAOlQ,OAAO0gH,EAASA,UAG9B/hH,KAAKslH,eAAiB3kH,SAASC,cAAc,OAC7CZ,KAAKslH,eAAeplH,UAAUW,IAAI,eAClC,MAAM0O,EAAa,IAAI,IAAW,MAClCA,EAAWnO,UAAUC,OAAOrB,KAAKslH,gBAEjCtlH,KAAKwE,WAAa,IAAI,IAAW,CAC/BmM,YAAa,mCACb5K,MAAO,UACPvF,KAAM,gBACN6U,UAAWzI,EAAA,EAAUklD,OAAOyzD,qBAE9BvlH,KAAKI,MAAQJ,KAAKwE,WAAWpE,MAE7BJ,KAAKwE,WAAWG,MAAQ3E,KAAKwlH,cAAgBxlH,KAAK4wB,KAAKxwB,MAAMqlH,kBAAkBrlH,MAAMoO,UACrFxO,KAAK4wB,KAAKxwB,MAAMqlH,kBAAkB9gH,MAAQ,GAE1C3E,KAAK2C,KAAKtB,OAAOkO,EAAWnO,WAC5BpB,KAAKoB,UAAUC,OAAOrB,KAAKwE,WAAWpD,WAEtCpB,KAAK0lH,cAEL1lH,KAAKsB,iBAAiB,QAAS,KAC7BtB,KAAK2kH,MAAQ,GACbF,QAAep8G,IAGjBo8G,GAAezkH,KAGV,YAAY+a,GACjB/a,KAAK2C,KAAKtB,OAAO0Z,GAGnB,WACE,OAAO/a,KAAKglH,WAAW3kH,KAGzB,SAASA,GACPL,KAAKglH,WAAW3kH,KAAOA,EAGjB,2B,MACN,MAAMosD,EAAOzsD,KAAK2kH,MAAMhjH,OAAS,EAC9B8qD,IAASzsD,KAAK2lH,oBACf3lH,KAAK2lH,mBAAqB,IAAI,KAAc,CAC1CrtF,KAAM,2BACN93B,KAAM,gBAERR,KAAKoB,UAAUC,UAAU,CAACrB,KAAK2lH,mBAAmB5/G,MAA8B,QAAvB,EAAA/F,KAAK4lH,0BAAkB,eAAE7/G,MAAO/F,KAAKwE,WAAWpD,WAAWwK,OAAOc,UAE3H1M,KAAKglH,WAAW/zF,OAAQ,EACxBjxB,KAAK2lH,mBAAmB//G,iBAAiB5F,KAAKglH,WAAW/zF,OAEzDjxB,KAAK6R,eAAehR,IAAIb,KAAK2lH,mBAAmBvlH,MAAhDJ,CAAuD,SAAU,KAC/D,MAAMm3B,EAAUn3B,KAAK2lH,mBAAmBxuF,QAExCn3B,KAAKglH,WAAW/zF,MAAQkG,EAExBn3B,KAAK0lH,iBAEC1lH,KAAK2lH,oBACb3lH,KAAK2lH,mBAAmB5/G,MAAM7F,UAAUC,OAAO,QAASssD,GAIpD,2B,MACN,MAAMA,IAASzsD,KAAK2kH,MAAMtwG,KAAKw7D,GAAQ,EAA2BlkE,IAAIkkE,EAAKxvE,OACxEosD,IAASzsD,KAAK4lH,oBACf5lH,KAAK4lH,mBAAqB,IAAI,KAAc,CAC1CttF,KAAM,6BACN93B,KAAM,mBAERR,KAAKoB,UAAUC,UAAU,CAAwB,QAAvB,EAAArB,KAAK2lH,0BAAkB,eAAE5/G,MAAO/F,KAAK4lH,mBAAmB7/G,MAAO/F,KAAKwE,WAAWpD,WAAWwK,OAAOc,UAE3H1M,KAAK4lH,mBAAmBhgH,iBAA0C,UAAzB5F,KAAKglH,WAAW3kH,MAEzDL,KAAK6R,eAAehR,IAAIb,KAAK4lH,mBAAmBxlH,MAAhDJ,CAAuD,SAAU,KAC/D,MAAMm3B,EAAUn3B,KAAK4lH,mBAAmBzuF,QAExCn3B,KAAKglH,WAAW3kH,KAAO82B,EAAU,QAAU,WAE3Cn3B,KAAK0lH,iBAEC1lH,KAAK4lH,oBACb5lH,KAAK4lH,mBAAmB7/G,MAAM7F,UAAUC,OAAO,QAASssD,GAIrD,SAASk4D,GACd,MAAMkB,EAASlB,EAAM/4G,OAAOikE,IACZ7vE,KAAK2kH,MAAMtwG,KAAKyxG,GACrBA,EAAMC,eAAiBl2C,EAAKk2C,cAAgBD,EAAMtlH,OAASqvE,EAAKrvE,MAAQslH,EAAM5iH,OAAS2sE,EAAK3sE,OAMpG2iH,EAAOlkH,SACR3B,KAAK2kH,MAAMp7G,QAAQs8G,GACnB7lH,KAAK0lH,eAgBD,KAAK3B,GAAQ,GACnB,GAAsB,cAAnB/jH,KAAK4wB,KAAKvwB,OAAyB0jH,EAKpC,YAJA/jH,KAAK4wB,KAAKxwB,MAAMggH,gBAAgB,KAC9BpgH,KAAKmiH,MAAK,KAMd,IAAI9kF,EAAUr9B,KAAKwE,WAAWG,MAC9B,GAAG04B,EAAQ17B,OAASiL,EAAA,EAAUklD,OAAOyzD,mBAEnC,YADA5rF,GAAM,IAAK9iB,OAAO,sCAAsC,IAI1D7W,KAAKmkC,OACL,MAAM6gF,EAAahlH,KAAKglH,WACxBA,EAAWgB,QAA8B,UAApBhB,EAAW3kH,WAA0BgI,EAC1D,MAAM,gBAACg9G,EAAe,QAAEW,GAAWhB,GAI7B,OAAC/5G,EAAM,MAAE7K,GAASJ,KAAK4wB,KAE7By0F,EAAgB96G,QAAQg3B,IACtBA,EAAE2jF,aAAU78G,IAGd,MAAM,OAAC1G,GAAU0jH,EACXY,EAAgBjmH,KAAK4wB,KAAKuzF,0BAChCnkH,KAAKw/C,QAAS6lE,IACThoF,GAAWgoF,EAAgB1jH,SAAWA,IACvC3B,KAAK4wB,KAAKqgC,mBAAmB4nC,SAAS5tF,EAAQoyB,EAAS,OAAF,wBAChD4oF,GAAa,CAChBzoB,YAAY,KAGdngE,OAAUh1B,GAGZ,MAAM0W,EAAI,OAAH,wBACFimG,GAAU,CACbK,oBAGFrlH,KAAK4wB,KAAKqgC,mBAAmBi1D,UAAUj7G,EAAQ8T,EAAEsmG,gBAAgB54G,IAAI80B,GAAKA,EAAEsuC,MAAOlyD,OAAOugD,OAAO,OAAD,wBAC3F+nD,GAAa,CAChB5oF,UACA2oF,QAASA,EACTxoB,YAAY,IACXz+E,IAEHse,OAAUh1B,IAGZjI,EAAM+lH,aAAenmH,KAAK4wB,KAAKthB,SAC/BlP,EAAMuM,gBAGA,YAAYkjE,EAAY7xD,EAAwBknG,GACtDA,EAAQhlH,UAAUW,IAAI,oBAItB,IAAIuJ,EACJ,GAHgBylE,EAAKxvE,KAAK+lH,WAAW,UAGzB,CACV,MAAMntG,EAAQ2mC,KACRymE,EAAS1lH,SAASC,cAAc,UACtCylH,EAAOhsG,IAAM2D,EAAOsoG,UAAY/8D,IAAIC,gBAAgBqmB,GACpD52D,EAAM1V,UAAW,EACjB0V,EAAMstG,UAAW,EACjBttG,EAAM8E,OAAQ,EAEd9E,EAAM3X,iBAAiB,aAAc,KACnC2X,EAAMhV,SACL,CAAC4a,MAAM,IAEVzU,EAAU,aAAY6O,GAAOtV,KAAK,KAChCqa,EAAOxa,MAAQyV,EAAMypC,WACrB1kC,EAAOva,OAASwV,EAAMutG,YACtBxoG,EAAOvE,SAAW5U,KAAKod,MAAMhJ,EAAMQ,UAEnC,MAAMgtG,EAAyBxtG,EAAcytG,4BAM7C,YAL6Br+G,IAA1Bo+G,IACDzoG,EAAO2oG,SAAWF,GAGpBvB,EAAQ7jH,OAAO4X,GACR,aAAsBA,GAAOtV,KAAK6qB,IACvCxQ,EAAOwQ,MAAQ,OAAH,QACVlU,IAAKivC,IAAIC,gBAAgBh7B,EAAMo5B,OAC5Bp5B,OAKTvV,EAAM5X,OAAOglH,OACR,CACL,MAAM33F,EAAM,IAAIygB,MAChB/kC,EAAU,IAAI/E,QAAe6E,IAC3BwkB,EAAIk4F,OAAS,KACX5oG,EAAOxa,MAAQkrB,EAAI6iD,aACnBvzD,EAAOva,OAASirB,EAAI8iD,cAEpB0zC,EAAQ7jH,OAAOqtB,GAEE,cAAdmhD,EAAKxvE,MACN2d,EAAO2oG,SAAU,EAEjBthH,QAAQC,IAAI,CACVi/G,GAAe71F,GAAK/qB,KAAK8V,IACvBuE,EAAOvE,SAAW5U,KAAKosC,KAAKx3B,KAG9B,aAAsBiV,GAAK/qB,KAAK6qB,IAC9BxQ,EAAOwQ,MAAQ,OAAH,QACVlU,IAAKivC,IAAIC,gBAAgBh7B,EAAMo5B,OAC5Bp5B,OAGN7qB,KAAK,KACNuG,OAGFA,OAKNwkB,EAAIrU,IAAM2D,EAAOsoG,UAAY/8D,IAAIC,gBAAgBqmB,GAGnD,OAAOzlE,EAGD,eAAeylE,EAAY7xD,EAAwBknG,GACzDA,EAAQhlH,UAAUW,IAAI,uBAEtB,MAAMgmH,EAAUh3C,EAAKxvE,KAAK+lH,WAAW,UAC/BU,EAAUj3C,EAAKxvE,KAAK+lH,WAAW,WAClCS,GAAWC,GAAWj3C,EAAK3sE,KAAO,OACnC8a,EAAOsoG,UAAY/8D,IAAIC,gBAAgBqmB,IAGzC,MAAMh2D,EAAM,CACVzO,EAAG,WACHykE,KAAMA,EACNzvD,UAAWyvD,EAAKrvE,MAAQ,GACxB0C,KAAM2sE,EAAK3sE,KACX7C,KAAMwmH,EAAU,QAAU,OAG5B,GAAG7oG,EAAOsoG,UAAW,CACnB,MAAMpsG,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxDK,EAAaI,IAAM0D,EAAOsoG,UAC1BpsG,EAAaioC,WAAa0tB,EAAK3sE,KAGjC,MAAMugD,EAASP,GAAa,CAC1Bn7C,QAAS,CACPqD,EAAG,UACHmT,OAAQ,CACNuN,aAAa,GAEfjhB,IAAK,EACLI,OAAQ,EACRwN,MAAO,CACLrN,EAAG,uBACHzK,SAAUkZ,MA2BhB,OAtBgB,IAAIxU,QAAe6E,IACjC,MAAM68G,EAAS,KACb7B,EAAQ7jH,OAAOoiD,GACfv5C,KAGF,GAAG28G,EAAS,CACV,MAAMn4F,EAAM,IAAIygB,MAChBzgB,EAAIrU,IAAM2D,EAAOsoG,UACjB53F,EAAIk4F,OAAS,KACX5oG,EAAOxa,MAAQkrB,EAAI6iD,aACnBvzD,EAAOva,OAASirB,EAAI8iD,cAEpBu1C,KAGFr4F,EAAIs4F,QAAUD,OAEdA,MAwBE,eAAeE,GACrB,MAAgC,UAAzBjnH,KAAKglH,WAAW3kH,MAAoB,EAA2BsL,IAAIs7G,GAGpE,WAEFjnH,KAAK+a,QAAQ7a,UAAUuV,SAAS,YAClCzV,KAAK6R,eAAehR,IAAIF,SAASgC,KAAjC3C,CAAuC,UAAWA,KAAK8kH,WACvD9kH,KAAKsB,iBAAiB,QAAS,KAC1BtB,KAAKwlH,gBACNxlH,KAAK4wB,KAAKxwB,MAAMqlH,kBAAkB9gH,MAAQ3E,KAAKwlH,iBAGnDxlH,KAAKo9B,QAID,WACN,MAAM,WAAC4nF,EAAU,MAAEtzG,EAAK,MAAEizG,GAAS3kH,KACnC,IAAIoH,EACJ,MAAM2K,EAA2B,GACjC,GAAuB,aAApBizG,EAAW3kH,KACZ+G,EAAM,yBACN2K,EAAKxI,KAAKo7G,EAAMhjH,YACX,CACL,IAAIulH,EAAc,EAAGC,EAAc,EAAGC,EAAa,EACnDzC,EAAMp6G,QAAQslE,IACTA,EAAKxvE,KAAK+lH,WAAW,YAAac,EAC7Br3C,EAAKxvE,KAAK+lH,WAAW,YAAae,IACnCC,IAGN,CAACF,EAAaC,EAAaC,GAAYx7G,OAAOy7G,GAAKA,EAAI,GAAG1lH,OAAS,GACpEyF,EAAM,yBACN2K,EAAKxI,KAAKo7G,EAAMhjH,SAQLulH,GACX9/G,EAAM,0BACN2K,EAAKxI,KAAK29G,IACFC,IACR//G,EAAM,0BACN2K,EAAKxI,KAAK49G,IAId,OAAA12G,EAAA,GAAeiB,EAAO,YAAKtK,EAAK2K,IAG1B,uBAAuBif,EAAkBhT,GAC/C,GAAGhe,KAAKilH,eAAejnG,EAAO6xD,KAAKxvE,MAAO,CACxC,MAAM6C,EAAO,OAAAkyF,GAAA,GAAep3E,EAAOxa,MAAOwa,EAAOva,OAAQ,IAAK,KAC9DutB,EAAI7rB,MAAM3B,MAAQN,EAAKM,MAAQ,KAC/BwtB,EAAI7rB,MAAM1B,OAASP,EAAKO,OAAS,KAGnCzD,KAAKslH,eAAejkH,OAAO2vB,GAGrB,QAAQrQ,GACd,MAAM,gBAAC0kG,GAAmBrlH,KAAKglH,WAC/B,IAAIhlH,KAAKglH,WAAW/zF,MAElB,YADAo0F,EAAgB96G,QAAQwxB,GAAKpb,EAAG,CAACob,KAInC,MAAMp6B,EAAS0jH,EAAgB1jH,OAC/B,IAAI,IAAIC,EAAI,EAAGA,EAAID,GAAS,CAC1B,MAAM2lH,EAAYjC,EAAgBzjH,GAAGiuE,KAAKxvE,KAC1C,IAAIs5C,EAAI,EACR,KAAMA,EAAI,IAAM/3C,EAAID,IAAUC,IAAK+3C,EAAG,CACpC,MAAMt5C,EAAOglH,EAAgBzjH,GAAGiuE,KAAKxvE,KACrC,GAAGL,KAAKilH,eAAeqC,KAAetnH,KAAKilH,eAAe5kH,GACxD,MAIJsgB,EAAG0kG,EAAgB1/G,MAAM/D,EAAI+3C,EAAG/3C,KAI5B,cACN,MAAM,MAAC+iH,EAAK,WAAEK,EAAU,eAAEM,GAAkBtlH,KAC5CglH,EAAWK,gBAAgB1jH,OAAS,EAEpC3B,KAAKunH,2BACLvnH,KAAKwnH,2BAELniH,QAAQC,IAAIq/G,EAAMl4G,IAAIzM,KAAK+kH,aAAaphH,KAAK,KAC3C2hH,EAAe92G,UAAY,GAEvBm2G,EAAMhjH,SAIV3B,KAAK+U,WAEL/U,KAAKw/C,QAAS6lE,IACZ,GAAGrlH,KAAKilH,eAAeI,EAAgB,GAAGx1C,KAAKxvE,OAASglH,EAAgB1jH,OAAS,EAAG,CAClF,MAAM8lH,EAAiB9mH,SAASC,cAAc,OAC9C6mH,EAAevnH,UAAUW,IAAI,mBAAoB,cACjD4mH,EAAepmH,UAAUgkH,EAAgB54G,IAAIqP,GAAKA,EAAEopG,UAEpDj7D,GAAa,CACX7oD,UAAWqmH,EACXt+G,MAAOk8G,EAAgB54G,IAAIyvB,IAAK,CAAEnd,EAAGmd,EAAE14B,MAAOkc,EAAGwc,EAAEz4B,UACnDmuB,SAAU,IACVC,SAAU,IACVC,QAAS,IAGXwzF,EAAejkH,OAAOomH,QAEtBpC,EAAgB96G,QAASyT,IACvBhe,KAAK0nH,uBAAuB1pG,EAAOknG,QAASlnG,UAIjDra,KAAK,KACN3D,KAAK2nH,cCzhBX,MAGMC,GAA0B,CAAC,UAAW,aACtCC,GAA0B,CAAC,YAAa,cAE/B,SAASC,IAAqB,KAAC15G,EAAI,KAAE/N,EAAI,SAAE6jC,EAAQ,KAAErlB,EAAI,WAAEkpG,IAOxE,IAAIC,GAAgBD,aAAU,EAAVA,EAAYpmH,QAAS,IAAIgG,IAAIogH,QAAc1/G,EAC/D,MAAM4/G,EAAW,IAAItgH,IAAa,OAATtH,EAAgBunH,GAAYlgH,OAAOmgH,IAAyB,MAATxnH,EAAewnH,GAAcD,IAEzG,IAAIltG,EACJ,MAAMwtG,EAAmB,IAChBxtG,GAAUtM,EAAKqF,cAAc,YAA4BrF,EAAK6d,kBAGjEk8F,EAAmB,CAACzgB,EAAkB0gB,KAC1C,GAAG1tG,IAAWgtF,EACZ,OAGF,IAAI2gB,GAAY,EACb3tG,IACD2tG,GAAY,EACZ3tG,EAAOxa,UAAUoE,OA5BG,WA+BtBoW,EAASgtF,EACLhtF,IACJA,EAAOxa,UAAUW,IAjCK,UAmCnBwnH,GAAa94G,GAAc64G,GAC5B,OAAAE,GAAA,GAAiB,CACflnH,UAAWmO,EACXwL,QAASL,EACTie,SAAU,SACVqzE,cAAe,IACfI,KAAe,MAAT/rG,EAAe,IAAM,QAK3BkoH,EAAiB,CAACC,EAAwBC,KAC9C,IAAIC,EAIJ,OAHWA,EAARD,EAAqBD,EAAclsF,oBAAsBluB,EAAK6d,kBAC/Cu8F,EAAcnxE,wBAA0BjpC,EAAK6qC,iBAExDyvE,GAqBT,IAAIC,EAEFA,EADU,OAATtoH,EACgB,CAACmoH,EAAephH,IACpB,YAARA,GAA6B,cAARA,EArBL,EAACohH,EAAwBC,KAC9C,MAAMG,EAAWH,EAAS,qBAAuB,yBAC3CI,EAAcJ,EAAS,oBAAsB,mBAC7CK,EAAcN,EAAc9jG,wBAElC,IAAIgkG,EAAaF,EAAcI,IAAax6G,EAAKy6G,GACjD,KAAMH,IAAeF,GAAe,CAClC,MAAMO,EAAaL,EAAWhkG,wBAC9B,GAAGqkG,EAAW3lG,IAAM0lG,EAAY1lG,GAAK2lG,EAAWzlG,IAAMwlG,EAAYxlG,EAChE,MAGFolG,EAAaA,EAAWE,IAAax6G,EAAKy6G,GAG5C,OAAOH,GAM+CM,CAAeR,EAAuB,cAARphH,GACtEmhH,EAAeC,EAAuB,eAARphH,GAG3B,CAACohH,EAAephH,IAAQmhH,EAAeC,EAAuB,eAARphH,GAAgC,cAARA,GAGjG,IAAI09G,EAAa/kH,IACf,MAAMqH,EAAMrH,EAAEqH,IACd,GAAI6gH,EAASt8G,IAAIvE,IAWjB,GAFA,OAAA4iB,EAAA,GAAYjqB,GAETqO,EAAKK,kBAAoB,EAAG,CAC7B,IAAI+5G,EAAgBN,IACpBM,EAAgBG,EAAeH,EAAephH,GAC9C+gH,EAAiBK,GAAe,SAbrB,UAARphH,GAA6B,OAAT/G,GAAyB,QAAR+G,KACtC,OAAA4iB,EAAA,GAAYjqB,GACZkpH,EAAWf,OAejB,MAAM34G,EAAa,OAAAub,GAAA,GAAgB1c,EAAM,cACzCA,EAAKlO,UAAUW,IAAI,kBAEnB,MAAMqiB,EAAenjB,IACnB,MAAM2a,EAAS,OAAAw1C,GAAA,GAAcnwD,EAAE2a,OAAQtM,GACnCsM,GAIJytG,EAAiBztG,GAAQ,IAGrBgnC,EAAW3hD,IACf,OAAAiqB,EAAA,GAAYjqB,GAEZ,MAAM2a,EAAS,OAAAw1C,GAAA,GAAcnwD,EAAE2a,OAAQtM,GACnCsM,IAIJytG,EAAiBztG,GAAQ,GACzBuuG,EAAWf,OAGPe,EAAcvuG,IAClB,MAAMwuG,EAAchlF,EAASxpB,SACVrS,IAAhB6gH,GAA6BA,EAAcrqG,IAC5CyjC,KAIJ,IAAI6mE,GAAW,EACf,MAAMx6F,EAAS,KACVw6F,IACHA,GAAW,EAGXxoH,SAASW,iBA5IQ,UA4IuBwjH,EAAW,CAACr1F,SAAS,EAAMvL,SAAS,IAC5E9V,EAAK9M,iBAAiB,YAAa4hB,EAAa,CAACgB,SAAS,IAC1D,YAAiB9V,EAAMszC,KAGnBY,EAAS,KACT6mE,IACJA,GAAW,EAEXxoH,SAASkN,oBArJQ,UAqJ0Bi3G,EAAW,CAACr1F,SAAS,IAChErhB,EAAKP,oBAAoB,YAAaqV,GACtC,YAAiB9U,EAAMszC,KAGnB0nE,EAAc,KACfpB,GACHG,EAAiB/5G,EAAK6d,mBAAmB,IAG3C,GAAG+7F,EAAe,CAChB,MAAMqB,EAAavE,EACnBA,EAAa/kH,IACRioH,EAAcr8G,IAAI5L,EAAEqH,OACrB,OAAA4iB,EAAA,GAAYjqB,GAEZY,SAASkN,oBArKI,UAqK8Bi3G,EAAW,CAACr1F,SAAS,IAChEq1F,EAAYuE,EACZ1oH,SAASW,iBAvKI,UAuK2BwjH,EAAW,CAACr1F,SAAS,EAAMvL,SAAS,IAE5E8jG,OAAgB3/G,EAChB+gH,WAIJA,IAKF,OAFAz6F,IAEO,CACLA,SACA2zB,SACA8mE,eCpLW,MAAM,WAA2B,IAoB9C,YAAY1pH,GAOVC,OAAM,GAtBE,KAAA2pH,QAAS,EA4CT,KAAAC,UAAY,KACjBvpH,KAAKsiD,QACNtiD,KAAKsiD,SAGP,MAAMl0C,EAAOpO,KAAKoO,MACZ,OAACugB,EAAM,OAAE2zB,EAAM,YAAE8mE,GAAetB,GAAqB,CACzD15G,OACA/N,KAAML,KAAKwpH,SACXtlF,SAAUlkC,KAAKkkC,SACfrlB,MAAM,EACNkpG,WAAY/nH,KAAK+nH,aAGnB/nH,KAAK2uB,OAASA,EACd3uB,KAAKsiD,OAASA,EACdtiD,KAAKopH,YAAcA,EACf,MAAcppH,KAAK0kF,iBACrB1kF,KAAK0kF,eAAiB,CACpBrkF,KAAM,sBACN0T,MAAO,KACL/T,KAAK0kF,oBAAiBr8E,EACtBrI,KAAKG,QAAO,IAEdspH,aAAa,GAGf92G,EAAA,EAAwBmB,SAAS9T,KAAK0kF,iBAGxC1kF,KAAKsB,iBAAiB,SAAU,KAC9BtB,KAAKopH,iBAAc/gH,EACnBrI,KAAK2uB,YAAStmB,EACdrI,KAAKsiD,YAASj6C,EAEd+F,EAAKI,UAAY,GACjB8zC,IAEGtiD,KAAK0kF,iBACN/xE,EAAA,EAAwB+2G,WAAW1pH,KAAK0kF,gBACxC1kF,KAAK0kF,oBAAiBr8E,IAEvB,CAACwW,MAAM,KA9DV,OAAA/V,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,sBAAuB,aAEpDnB,EAAQghC,SAASr/B,OAAOrB,KAAKoB,WAE7BpB,KAAK2pH,mBAEL3pH,KAAK4pH,YAAc5pH,KAAK4pH,WAAWC,UAAU7pH,MAGxC,qBAAqBuhB,GACvBA,EACDvhB,KAAK2uB,QAAU3uB,KAAK2uB,SAEpB3uB,KAAKsiD,QAAUtiD,KAAKsiD,SAiDd,mBACRtiD,KAAKsB,iBAAiB,UAAWtB,KAAKupH,WAGjC,OAAOplF,EAAgB2lF,GAAiB,EAAOC,GACpD,GAAG/pH,KAAKgS,KACN,OAOF,QAJY3J,IAAT87B,IACDA,EAAOnkC,KAAKoB,UAAUlB,UAAUuV,SAAS,gBAAkBzV,KAAKoB,UAAUlB,UAAUuV,SAAS,cAG5FzV,KAAKspH,SAAWnlF,EAKjB,YAJIA,GACFnkC,KAAKsS,cAAc,YAMvBtS,KAAKspH,OAASnlF,EAEVA,GAICnkC,KAAK0kF,iBACN/xE,EAAA,EAAwB+2G,WAAW1pH,KAAK0kF,gBACxC1kF,KAAK0kF,oBAAiBr8E,IAGpByhH,GAAkB9pH,KAAK4pH,YACzB5pH,KAAK4pH,WAAWI,mBAGfhqH,KAAKsiD,QACNtiD,KAAKsiD,WAbPtiD,KAAK4pH,YAAc5pH,KAAK4pH,WAAWI,iBAAiBhqH,MACpDA,KAAKsS,cAAc,YAgBrB,MAAM+wF,EAAUrjG,KAAK4pH,YAAczlF,EAAO,EAAI,EAE3CA,GACDnkC,KAAKsS,cAAc,UAGrB,aACEtS,KAAKoB,UACL,cACC+iC,EACDv3B,EAAA,EAAU+2B,SAASC,oBAAsBmmF,EAAgB,IAAM,EAC/D,KACE/pH,KAAKspH,QAAUtpH,KAAKsS,cAAc,WAEpC+wF,IClJS,MAAM,WAAuB,GAM1C,YAAY3iE,EAAuBkpF,GACjCjqH,MAAM,CACJ+gC,WACAkpF,aACAJ,SAAU,KACVtlF,SAAWxpB,IACD,GAAkBo8C,aAAa,CAACp8C,WAAS,GAEnDqtG,WAAY,CAAC,UAAW,eAG1B/nH,KAAKoB,UAAUlB,UAAUW,IAAI,mBAE7Bb,KAAKsB,iBAAiB,UAAW,KAC/BwO,WAAW,KACT9P,KAAKuP,WAAWnO,UAAU2uC,UAAY,GACrC,GAEHnjC,EAAA,EAAU0F,cAAc,oBAAoB,KAG9CtS,KAAKsB,iBAAiB,SAAU,KAC3BtB,KAAKiqH,iBACN9hG,EAAA,EAAWta,oBAAoB,eAAgB7N,KAAKiqH,gBACpDjqH,KAAKiqH,oBAAiB5hH,GAGxBuE,EAAA,EAAU0F,cAAc,oBAAoB,KAIzC,cAAcu2C,GACnB,MAAMr4B,EAAaxwB,KAAK4pH,WAAW94F,gBAEhC9wB,KAAKsuB,eACNtuB,KAAKsuB,cAAc3f,QAGrB,KAAmBwsG,4BAA4BtyD,GAC/C,KAAmBqhE,sBAAsBrhE,GACxCllD,KAAMyyF,IACL,IAAI5lE,IACF,OAGCxwB,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGd,MAAM5Q,EAAYpB,KAAKoO,KAAKlN,YAE5B,IAAIipH,EAEJnqH,KAAKsuB,cAAc3f,QAEjBw7G,EADC/zB,EAASz0F,OACF,IAAI0D,QAAe6E,IACzB,MAAM84B,EAA2B,GACjCozD,EAAS7rF,QAAQs8C,IACfzlD,EAAUC,OAAOrB,KAAKk2F,qBAAqBN,cAAc/uC,OAAuBx+C,EAAW26B,MAG5F39B,QAAQC,IAAI09B,GAA2B2E,QAAQz9B,KAG1C7E,QAAQ6E,UAGlBigH,EAAMxmH,KAAK,KACT3D,KAAKoO,KAAKgf,YAAYhsB,GACtBpB,KAAKoO,KAAOhN,EAERpB,KAAKiqH,iBACPjqH,KAAKiqH,eAAiB,KACpB,MAAMzmH,EAASxD,KAAKoO,KAAKK,kBAAoB0Z,EAAA,EAAWqvB,OAAOi8B,WAAWjwE,OAAUxD,KAAKoO,KAAKK,kBAAoB,GAClHzO,KAAKoO,KAAKjJ,MAAM3B,MAAQA,EAAQ,MAElC2kB,EAAA,EAAW7mB,iBAAiB,eAAgBtB,KAAKiqH,iBAGnDjqH,KAAKiqH,iBAELjqH,KAAKG,QAAQi2F,EAASz0F,QACtB3B,KAAKuP,WAAWwgC,UAAY,MAKxB,OACR/vC,KAAKoO,KAAOzN,SAASC,cAAc,OACnCZ,KAAKoO,KAAKlO,UAAUW,IAAI,2BAA4B,kBAEpDb,KAAKoB,UAAUC,OAAOrB,KAAKoO,MAE3BpO,KAAKuP,WAAa,IAAI,IAAWvP,KAAKoB,WACtCpB,KAAKsuB,cAAgB,IAAI,IACzBtuB,KAAKk2F,qBAAuB,IAAI,GAAqBl2F,KAAKsuB,cAAe4C,KC7G7E,MAAMk5F,GAAa,KACjB,MAAM59F,EAAO,IAAIkwB,KAGjB,OADAlwB,EAAKqvC,SAAS,EAAG,EAAG,EAAG,GAChBrvC,GAGH69F,GAAa,KACjB,MAAM79F,EAAO,IAAIkwB,KAGjB,OAFAlwB,EAAKu7D,YAAYv7D,EAAK2vC,cAAgB,GACtC3vC,EAAKsvC,QAAQtvC,EAAKw7D,UAAY,GACvBx7D,GAOM,MAAM,WAAsB,GACzC,YAAYw6D,EAAgBC,EAAqCqjC,GALjD,IAAC99F,EAuBf,GAjBA7sB,OANe6sB,EAMCw6D,GALNhrB,UAAYquD,KAAaruD,UAAY,IAAItf,KAASlwB,EAKjCy6D,EAAQ,CACjCC,WAAW,EACXzrD,SAAS,EACTuI,UAAU,EACV27C,aAAa,EACbxlB,QAASiwD,KACTxtD,QAASytD,KACT5+F,UAAU,EACVg+D,oBAAoB,EACpBo7B,+BAA+B,IAGjC7kH,KAAK+a,QAAQ7a,UAAUW,IAAI,kBAC3Bb,KAAKuR,OAAOlQ,OAAOrB,KAAKioF,aACxBjoF,KAAK0R,MAAM0b,YAAYptB,KAAKkoF,YAC5BloF,KAAK2C,KAAKtB,OAAOrB,KAAK4/E,YAEnB0qC,EAAmB,CACpB,MAAMC,EAAoB,YAAO,4DAA6D,CAACjyF,KAAM,4BACrGt4B,KAAK2C,KAAKtB,OAAOkpH,GAEjB,YAAiBA,EAAmB,KAClCtjC,EjBrDkC,YiBsDlCjnF,KAAKmkC,W,wBCvCE,SAASqmF,GAAsBC,EAAoBC,GAAe,GAC/E,MAAMhhC,EAAkB,GAClBl0D,EAAiB,GAEjBhzB,EAAMN,OAAOC,eACnB,IAAIwoH,EACAC,EACJ,GAAGpoH,GAAOA,EAAI06F,WAAY,CACxB,MAAM76F,EAAQG,EAAI26F,WAAW,GACvB0tB,EAAcxoH,EAAMwoH,YAC1B,GACExoH,EAAMyoH,gBACNzoH,EAAMyoH,gBAAkBzoH,EAAM0oH,cAC9BF,GAAexoH,EAAM2oH,UACrB,CAEA,MAAMC,EAA8BJ,EAAc,EAC5C39B,EAAau9B,EAAMv9B,WACzB,GAAG7qF,EAAMyoH,iBAAmBL,GAASv9B,EAAW+9B,GAA8B,CAC5EN,EAAUz9B,EAAW+9B,GACrBL,EAAY,EAEZ,IAAI,IAAIhpH,EAAI,EAAGA,EAAIS,EAAM2oH,YAAappH,EAAG,CACvC,MAAMspH,EAAOh+B,EAAWtrF,GAClB+C,EAAQumH,EAAKz3B,WAAcy3B,EAA0BC,IAExDxmH,IACDimH,GAAajmH,EAAMhD,cAIvBgpH,EAAUtoH,EAAMyoH,eAChBF,EAAYC,GAKlB,MAAM3sE,EAA4BwsE,EAAe,QAAKriH,EACtD,OAAA+iH,GAAA,GAAoBX,EAAO/gC,EAAOl0D,EAAMm1F,EAASC,EAAW1sE,GAEzD1oB,EAAK7zB,QACN+nF,EAAMngF,KAAKisB,EAAKpK,KAAK,KAGvB,IAAIzmB,EAAQ+kF,EAAMt+D,KAAK,MACvB,MAAMigG,EAAW1mH,EAAMwgB,QAAQ,KAU/B,OATgB,GAAbkmG,IACD1mH,EAAQA,EAAM2mH,OAAO,EAAGD,GAAY1mH,EAAM2mH,OAAOD,EAAW,IAE9D1mH,EAAQA,EAAMe,QAAQ,UAAW,KAE9Bw4C,GACD,IAAkBqtE,oBAAoBrtE,GAGjC,CAACv5C,QAAOu5C,WAAUmtE,YCzDZ,MAAM,WAAoB,GAGvC,YAAY3qF,EACVkpF,EACA5tB,EACQhJ,GACRrzF,MAAM,CACJ+gC,WACAkpF,aACAJ,SAAU,IACVtlF,SAAWxpB,IACTshF,EAAUpI,gBAAgBL,GAAoB74E,IAAgB,MAN1D,KAAAs4E,kBAURhzF,KAAKoB,UAAUlB,UAAUW,IAAI,gBAGrB,OACRb,KAAKoO,KAAOzN,SAASC,cAAc,OACnCZ,KAAKoO,KAAKlO,UAAUW,IAAI,sBAAuB,gBAE/Cb,KAAKoB,UAAUC,OAAOrB,KAAKoO,MAE3BpO,KAAKuP,WAAa,IAAI,IAAYvP,KAAKoB,WAEvCpB,KAAKsB,iBAAiB,UAAW,KAC/BwO,WAAW,KACT9P,KAAKuP,WAAWnO,UAAUm8F,WAAa,GACtC,KAIA,OAAO9K,EAAkBs1B,GAC9B,GAAG/nH,KAAKgS,KAAM,CACZ,IAAIygF,EAAO9wF,OACT,OAGF3B,KAAKgS,OACLhS,KAAKgS,KAAO,MAGdygF,EAASA,EAAO9sF,MAAM,EAAG,KAEfhE,SACR3B,KAAKoO,KAAKI,UAAY,GACtBikF,EAAOloF,QAAQi8C,IACb0sC,GAAY1sC,EAAOxmD,KAAKoO,MAAM,GAAO,MAIzCpO,KAAK+nH,WAAaA,EAAa,CAAC,UAAW,kBAAe1/G,EAC1DrI,KAAKG,QAAQsyF,EAAO9wF,QAOf,WAAWyN,EAAeo8G,GAC/B,MAAMh7F,EAAaxwB,KAAK4pH,WAAW94F,gBACnC9wB,KAAKgzF,gBAAgBy4B,uBAAuB9nH,KAAK,KAC/C,IAAI6sB,IACF,OAGF,MAAMoS,EAAIxzB,EAAM1J,QAAQ,KAAM,IACxB+sF,EAASzyF,KAAKgzF,gBAAgB04B,aAAa9oF,GACjD5iC,KAAKk/C,OAAOuzC,EAAsB,MAAd+4B,MCrEX,MAAM,WAA+B,GAKlD,YACE9qF,EACAkpF,EACU57G,EACVk2B,GAEAvkC,MAAM,CACJ+gC,WACAkpF,aACAJ,SAAU,IACVtlF,aAPQ,KAAAl2B,YAUVhO,KAAKoB,UAAUlB,UAAUW,IAAI,GAAuBouC,WAAYjhC,GAGxD,OACRhO,KAAKoO,KAAOzN,SAASC,cAAc,OACnCZ,KAAKoO,KAAKlO,UAAUW,IAAI,GAAuBouC,WAAa,QAASjvC,KAAKgO,UAAY,SAEtFhO,KAAKoB,UAAUC,OAAOrB,KAAKoO,MAE3BpO,KAAKuP,WAAa,IAAI,IAAWvP,KAAKoB,WAEtCpB,KAAKsB,iBAAiB,UAAW,KAC/BwO,WAAW,KACT9P,KAAKuP,WAAWnO,UAAU2uC,UAAY,GACrC,KAIA,OAAOiY,EAA+D2jE,GAC3E,GAAG3rH,KAAKgS,KAAM,CACZ,IAAIg2C,EAAKrmD,OACP,OAGF3B,KAAKgS,OACLhS,KAAKgS,KAAO,KAGXg2C,EAAKrmD,SACN3B,KAAKoO,KAAKI,UAAY,GACtBw5C,EAAKz9C,QAAQg3B,IACX,MAAMvQ,EAAM,GAAuB46F,YAAY,CAC7C59G,UAAWhO,KAAKgO,UAChB/C,OAAQs2B,EAAEt2B,OACVzK,KAAM+gC,EAAE/gC,KACRs7B,YAAayF,EAAEzF,cAGjB97B,KAAKoO,KAAK/M,OAAO2vB,MAIjB26F,GACF3rH,KAAKG,QAAQ6nD,EAAKrmD,QAIf,mBAAmBjC,GAMxB,MAAMmsH,EAAO,GAAuBC,wBACpCpsH,EAAQsO,WAAa,gBAErB,MAAMgjB,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAIgrH,EAAMnsH,EAAQsO,WAChCgjB,EAAI9pB,QAAQ+D,OAAS,GAAKvL,EAAQuL,OAElC,MAAM+jC,EAAS,IAAI,GACnBA,EAAO9uC,UAAUW,IAAI,YAAagrH,EAAO,UAAWnsH,EAAQsO,UAAY,WACxEghC,EAAOnY,kBAAkB,CACvB2E,UAAU,EACVvwB,OAAQvL,EAAQuL,SAGlB,MAAMzK,EAAOG,SAASC,cAAc,OAepC,GAdAJ,EAAKN,UAAUW,IAAIgrH,EAAO,QAASnsH,EAAQsO,UAAY,SACnDtO,EAAQc,KAQV,OAAAssB,EAAA,GAAatsB,EAAM,IAAkB+rB,cAAc7sB,EAAQc,OAP3DA,EAAKa,OAAO,IAAI,KAAU,CACxB4J,OAAQvL,EAAQuL,OAChBiM,QAAQ,EACRwjD,eAAe,EACf96D,WAAW,IACVmb,SAKLiW,EAAI3vB,OAAO2tC,EAAQxuC,GAEhBd,EAAQo8B,YAAa,CACtB,MAAMA,EAAcn7B,SAASC,cAAc,OAC3Ck7B,EAAY57B,UAAUW,IAAIgrH,EAAO,eAAgBnsH,EAAQsO,UAAY,gBACrE,OAAA8e,EAAA,GAAagP,EAAa,IAAkBvP,cAAc7sB,EAAQo8B,cAClE9K,EAAI3vB,OAAOy6B,GAGb,OAAO9K,GC3GJ,SAAS+6F,GAA2Bt9F,EAAoErf,GAC7G,MAAM48G,EAA8B,GAAGtkH,OAAO+mB,EAAK4qF,UACnD,IAAIn0F,OAES7c,IAAV+G,IACD8V,EAAQ,IAAI,KAAoB,CAC9B+mG,YAAY,KAKhB,MAAMC,EAA2B,IAAI54G,IAkBrC,IAAI8T,EACJ,GAlBA4kG,EAASzhH,QAAQ4hH,IACfA,EAAQD,SAAS3hH,QAAQ,CAAC6hH,EAAYpkH,KACpC,MAAM8vB,EAAI,IAAMs0F,EAAWC,QAC3BH,EAAS1xG,IAAI4xG,EAAWC,QAAS,CAC/BphH,OAAQkhH,EAAQvlF,QAAQrb,UAAS,GACjC8gG,QAASD,EAAWC,QACpB7rH,KAAMs3B,EACNgE,YAAaswF,EAAWtwF,YACxB5W,MAAOld,IAGNkd,GACDA,EAAMstE,YAAY45B,EAAWC,QAASv0F,OAMxC5S,EAEG,CACL,MAAMonG,EAAQpnG,EAAMytE,OAAOvjF,GAC3BgY,EAAMjb,MAAMC,KAAKkgH,GAAO7/G,IAAI4/G,GAAWH,EAASv4G,IAAI04G,SAHpDjlG,EAAM,IAAI8kG,EAASroF,UAQrB,OAFAzc,EAAMA,EAAI/a,KAAK,CAACC,EAAGC,IAAM2/G,EAASv4G,IAAIrH,EAAE+/G,SAASnnG,MAAQgnG,EAASv4G,IAAIpH,EAAE8/G,SAASnnG,OAE1EkC,EDtCU,GAAA6nB,WAAa,2BACb,GAAA68E,wBAA0B,GAAuB78E,WAAa,gBCwClE,MAAM,WAAuB,GAC1C,YAAYvO,EACVkpF,EACA5tB,EACQoE,EACAF,GACRvgG,MAAM+gC,EACJkpF,EACA,kBACClvG,IACC,MAAMlM,EAAYkM,EAAOjH,cAAc,IAAI,GAAuBq4G,gCAAgCt9G,UAClG,OAAOwtF,EAAUuwB,eAAe,KAC9BvwB,EAAUa,aAAaruF,UAAYA,EACnCwtF,EAAUjD,aAAY,OATpB,KAAAqH,oBACA,KAAAF,kBAcH,WAAW9wF,EAAenE,GAC/B,IAAIjL,KAAKkgG,gBAAgBwO,MAAMzjG,GAC7B,OAAO,EAGT,MAAMulB,EAAaxwB,KAAK4pH,WAAW94F,gBAWnC,OAVAzrB,QAAQ6E,QAAQlK,KAAKogG,kBAAkB7tD,mBAAmBtnC,IAAStH,KAAK8qB,IACtE,IAAI+B,IACF,OAGF,MAAMolB,EAAWm2E,GAA2Bt9F,EAAMrf,GAClDpP,KAAKk/C,OAAOtJ,MAIP,GClFI,MAAM,GAArB,cACU,KAAA42E,QAAmC,IAAI7kH,IACvC,KAAA6oB,WAAa,eAWd,qBAAqBjP,GAC1B,IAAI,MAAMikE,KAAUxlF,KAAKwsH,QACvBhnC,EAAOinC,qBAAqBlrG,GAIzB,gBAEL,OADAvhB,KAAKwwB,WAAW3U,QACT7b,KAAKwwB,WAAW7c,MAGlB,UAAU6xE,GACfxlF,KAAKwsH,QAAQ3rH,IAAI2kF,GAGZ,iBAAiBknC,GACtB1sH,KAAKwsH,QAAQjiH,QAAQi7E,IAChBA,IAAWknC,GACZlnC,EAAOrlF,QAAO,GAAM,KAIpBusH,GACF1sH,KAAKwwB,WAAW3U,SChCP,MAAM,WAAuB,GAC1C,YAAY6kB,EACVkpF,EACA5tB,EACQoE,EACAF,GACRvgG,MAAM+gC,EACJkpF,EACA,kBACClvG,IACC,MAAM6wB,EAAO20D,EAAgB10D,QAAS9wB,EAAuBxT,QAAQ+D,OAAOwL,YAC5E,IAAcihD,EAAVn1C,EAAM,GACPgpB,EAAK7Q,SACNnY,EAAM,IAAMgpB,EAAK7Q,UAEjBnY,EAAMgpB,EAAKG,YAAcH,EAAKI,UAC9B+rB,EAAS,CACPtsD,EAAG,2BACHzJ,OAAQ4gB,EAAI5gB,OACZ2yB,OAAQ,EACRsS,QAAS2E,EAAKx4B,KAIlBwP,GAAO,IACPy5E,EAAU2wB,cAAcpqG,EAAKm1C,KArBzB,KAAA0oC,oBACA,KAAAF,kBAyBH,WAAW9wF,EAAenE,EAAgB2hH,GAC/C,MAAMC,EAAUz9G,EAAMS,OACtB,GAAGT,EAAMzN,SAAWkrH,EAAQlrH,OAAQ,OAAO,EAE3C,MAAM6uB,EAAaxwB,KAAK4pH,WAAW94F,gBAkBnC,OAjBA9wB,KAAKogG,kBAAkB0sB,YAAY7hH,GAAUA,EAAO8vB,WAAY8xF,EAASD,GAAUjpH,KAAK0S,IACtF,IAAIma,IAAc,OAElB,MAAMkK,EAAWmyF,EAAQlnH,MAAM,GAAG69C,cAClCxjD,KAAKk/C,OAAO7oC,EAAQ5J,IAAIxB,IACtB,MAAMsgC,EAAOvrC,KAAKkgG,gBAAgB10D,QAAQvgC,GAC1C,IAAGsgC,EAAK7Q,UAAY6Q,EAAK7Q,SAAS8oB,gBAAkB9oB,EAIpD,MAAO,CACLzvB,SACA6wB,YAAayP,EAAK7Q,SAAW,IAAM6Q,EAAK7Q,cAAWryB,KAEpDuD,OAAOc,aAGL,G,aC3CI,MAAM,WAAsB,GAUzC,YAAYhN,GAOVC,MAAM,CACJob,QAASpa,SAASC,cAAc,SAsE5B,KAAAmsH,iBAAoBhtH,IAC1B,MAAM2a,EAAS3a,EAAE6jB,QAAQ,GAAGlJ,OACxB,OAAAw1C,GAAA,GAAcx1C,EAAQ1a,KAAK+a,UAAYL,IAAW1a,KAAKgtH,WACzD,OAAAhjG,EAAA,GAAYjqB,GACZC,KAAKG,QAAO,KAvEd,OAAA2I,EAAA,GAAW9I,KAAMN,GAEjBM,KAAK+a,QAAQ7a,UAAUW,IAAI,GAAcouC,YACzCjvC,KAAK+a,QAAQ5V,MAAMC,QAAU,OAE7BpF,KAAKitH,qBAAqBjtH,KAAKgtH,SAAUhtH,KAAK6R,gBAC9C7R,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,uBAAwB,EAAEiL,aACxDjL,KAAKiL,SAAWA,IACdjL,KAAKktH,qBAAuBltH,KAAKg7F,YAClCh7F,KAAKk/C,SAGP,eAA2Bv7C,KAAK,KAC9B3D,KAAKmtH,uBAMH,OA6CR,OA5CAntH,KAAK0gC,SAASr/B,OAAOrB,KAAK+a,SAE1B/a,KAAK6R,eAAehR,IAAIb,KAAxBA,CAA8B,OAAQ,KACpCA,KAAKk/C,SAEF,OACDl/C,KAAKotH,cAAgBptH,KAAK6R,eAAehR,IAAIF,SAASgC,KAAjC3C,CAAuC,aAAcA,KAAK+sH,iBAAkB,CAAC7oG,SAAS,EAAOuL,SAAS,IAC3HzvB,KAAK6R,eAAehR,IAAIb,KAAxBA,CAA8B,QAAS,KACrCA,KAAK6R,eAAevN,OAAOtE,KAAKotH,gBAC/B,CAACvuG,MAAM,OAId7e,KAAK6R,eAAehR,IAAIb,KAAK+a,QAA7B/a,CAAsC,QAAUD,IAC9C,MAAM2a,EAAS,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,OACzC,IAAIA,EACF,OAGF,MAAMra,EAAOqa,EAAOxT,QAAQ7G,MACtB,OAAC4K,GAAUjL,KACjB,OAAOK,GACL,IAAK,6BACH28E,GAAkB,CAChBnlD,aAAc,2BACdnU,OAAQ,CACN8V,QAAS,MAEXqC,mBAAoB,oCACnBl4B,KAAK,KACN3D,KAAKixD,mBAAmBo8D,YAAYpiH,EAAQ2B,EAAA,EAAU+R,QAExD,MAGF,QACE3e,KAAKixD,mBAAmB4nC,SAAS5tF,EAAQyP,EAAOxT,QAAQoxB,MAK5Dt4B,KAAKG,QAAO,KAGPR,MAAMqS,OAWR,kBACL,MAAM4mF,EAAc54F,KAAKstH,iBACJ,4BAAlB10B,EAAYxtF,GACZwtF,EAAYr6E,OAAO+qG,QACnB1wB,EAAYr6E,OAAO08C,OACpB29B,EAAYr6E,OAAO08C,MAAO,EAC1Bj7D,KAAKg8F,UAAU2L,iBAAiB/O,EAAY/tF,MAIxC,iB,MACN,OAAyE,QAAlE,EAAA7K,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,QAAQ2tF,mBAAW,QAAI,CAC3ExtF,EAAG,qBAIA,OAAOwtF,EAA+C54F,KAAKstH,kBAChEttH,KAAK+a,QAAQvM,UAAY,GAEzB,IAAI,MAAMqnB,KAAO+iE,EAAYxgE,KAAM,CACjC,MAAMpH,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI,GAAcouC,WAAa,QAE7C,IAAI,MAAMvrB,KAAUmS,EAAIwF,QAAS,CAC/B,MAAMg4C,EAAM1yE,SAASC,cAAc,UACnCyyE,EAAInzE,UAAUW,IAAI,GAAcouC,WAAa,UAAW,OACxD,OAAAniB,EAAA,GAAaumD,EAAK,IAAkB9mD,cAAc7I,EAAO4U,OACzD+6C,EAAInsE,QAAQoxB,KAAO5U,EAAO4U,KAC1B+6C,EAAInsE,QAAQ7G,KAAOqjB,EAAOtY,EAC1B4lB,EAAI3vB,OAAOgyE,GAGbrzE,KAAK+a,QAAQ1Z,OAAO2vB,IAIjB,kBAAkB4nE,EAA2B54F,KAAKstH,kB,MACvD,MAAMnpF,EAAyB,sBAAlBy0D,EAAYxtF,KAAiF,QAAnD,EAACwtF,EAA8CxgE,YAAI,eAAEz2B,QAO5G,OANA3B,KAAKgtH,SAAS9sH,UAAUC,OAAO,OAAQgkC,GAEpCA,GACDnkC,KAAKG,QAAO,IAGNgkC,EAGH,QAAQl5B,GACbjL,KAAKiL,OAASA,EAEdjL,KAAKktH,oBACLltH,KAAKmtH,mBAlJQ,GAAAl+E,WAAa,iB,qTCSf,MAAM,WAAqB,GAQxC,YAAYvO,EACVkpF,EACQh5F,EACAsvE,EACAzG,GACR95F,MAAM,CACJ+gC,WACAkpF,aACAJ,SAAU,KACVzB,WAAY,CAAC,UAAW,aACxB7jF,SAAWxpB,IACT,IAAIA,EAAQ,OAAO,EACnB,MAAM,OAACzP,EAAM,MAAE6rF,EAAK,QAAEK,GAAWn3F,KAAKoO,KAAKlH,QAC3C,OAAOlH,KAAK4wB,KAAKxwB,MAAMmsH,eAAe,KACpC,MAAMl0B,EAAoBr4F,KAAKy5F,qBAAqBnC,YAAYH,EAAUz8E,EAAuBxT,QAAQqwF,UACzGv3F,KAAKy5F,qBAAqB8zB,iBAAiBtiH,EAAOsgB,WAAYurE,EAAOuB,EAAmB,OAAF,wBACjFr4F,KAAK4wB,KAAKuzF,2BAAyB,CACtC3mB,YAAY,KAGdx9F,KAAK4wB,KAAKxwB,MAAMuM,eAAc,GAAM,QAlBlC,KAAAikB,OACA,KAAAsvE,kBACA,KAAAzG,uBAuCH,KAAA+zB,YAAc,CAAMviH,EAAgByvB,EAAkBtrB,IAAkB,mCAC7E,MAAMohB,EAAaxwB,KAAK4pH,WAAW94F,gBAE7BwV,QAAatmC,KAAKkgG,gBAAgBlG,gBAAgBt/D,GACxD,IAAIlK,IACF,KAAM,eAGR,GAAc,SAAX8V,EAAKl7B,EACN,KAAM,YAGR,MAAMi6C,EAAgBrlD,KAAKy5F,qBAAqBQ,iBAAiBhvF,EAAQq7B,EAAKvzB,GAAI3D,GAAOzL,KAAKuzF,I,MAC5F,IAAI1mE,IACF,KAAM,eAGLxwB,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGd,MAAM5D,EAAOpO,KAAKoO,KAAKlN,YACvBkN,EAAKlH,QAAQ+D,OAAS,GAAKA,EAC3BmD,EAAKlH,QAAQ4vF,MAAQ,GAAKxwD,EAAKvzB,GAC/B3E,EAAKlH,QAAQiwF,QAAU,GAAKD,EAAWE,SAEvC,MAAMq2B,EAAc,IAAI,GAAY,KAjFlB,gBAiFyCztH,KAAKuP,YAAY,GAE5EvP,KAAKsuB,cAAc3f,QACnB3O,KAAKk2F,qBAAqBvnF,QAE1B,MAAMyf,EAA+B,GAC/Bs/F,IAAcx2B,EAAW34E,OAAOovG,QAEtC,IAAI,MAAMvkH,KAAQ8tF,EAAW10D,QAAS,CACpC,MAAMphC,EAAYT,SAASC,cAAc,OACzCQ,EAAUlB,UAAUW,IAAI,wBACxBO,EAAU8F,QAAQqwF,SAAWnuF,EAAK2J,GAElC,MAAMugG,EAAUoa,OAAYrlH,EAAY1H,SAASC,cAAc,OAS/D,GARG0yG,IACDA,EAAQpzG,UAAUW,IAAI,gCAEtBO,EAAUC,OAAOiyG,IAGnBllG,EAAK/M,OAAOD,GAERssH,EAsBFtsH,EAAUlB,UAAUW,IAAI,iBAtBX,CACbyyG,EAAQpzG,UAAUW,IAAI,SACtB,OAAAisB,EAAA,GAAawmF,EAAS,IAAkB/mF,cAAc,IAAInjB,EAAKsI,MAAM7B,QAAQ,KAE7E,MAAM6B,EAAQ/Q,SAASC,cAAc,OACrC8Q,EAAMxR,UAAUW,IAAI,8BACpB,OAAAisB,EAAA,GAAapb,EAAO,IAAkB6a,cAAcnjB,EAAKsI,QAEzD,MAAMoqB,EAAcn7B,SAASC,cAAc,OAC3Ck7B,EAAY57B,UAAUW,IAAI,oCAC1B,OAAAisB,EAAA,GAAagP,EAAa,IAAkB+X,aAAazqC,EAAK0yB,YAAa,CACzE8xF,YAAY,EACZz1B,SAAS,KAGX/2F,EAAUC,OAAOqQ,EAAOoqB,GAExB,MAAM+xF,EAAYltH,SAASC,cAAc,OACzCitH,EAAU3tH,UAAUW,IAAI,2BAExBuN,EAAK/M,OAAOwsH,GAKd,GAAc,oBAAXzkH,EAAKgC,GACN,GAAGhC,EAAKolB,OAAoD,IAA3CplB,EAAKolB,MAAMuyB,UAAU57B,QAAQ,UAAiB,CAC7D,IAAImgG,EACDhS,GACDgS,EAAiB3kH,SAASC,cAAc,OACxC0yG,EAAQjyG,OAAOikH,IAEfA,EAAiBlkH,EAGnBkkH,EAAeplH,UAAUW,IAAI,mBAC7B6sH,GAAapI,EAAeplH,UAAUW,IAAI,oBAE1Cb,KAAKsuB,cAAc/kB,KAAK,CACtBynB,IAAK5vB,EACLqI,KAAM,IACG0Q,GAAA,EAAmBoV,SAAS,CACjCu+F,KAAM,EACNr2G,SAAU,CACRrM,EAAG,uBACH0kE,YAAc1mE,EAAKolB,MAAkCshD,YACrDx1D,IAAKlR,EAAKolB,MAAMlU,KAElBpX,KAAMkG,EAAKolB,MAAMtrB,KACjB+jH,SAAU79G,EAAKolB,MAAMuyB,YACpBp9C,KAAKikD,IACN,MAAMlD,EAAQ,IAAIvV,MAClBuV,EAAMxkD,UAAUW,IAAI,eACpB,OAAAktH,GAAA,GAAkBnmE,GAAMjkD,KAAKqqH,IAC3B9oE,GAAsBogE,EAAgB5gE,EAAOspE,GAAS,cAM3D,CACL,MAAMv1G,EAAQrP,EAAKzI,UAA0ByI,EAAKjB,MAClD,GAAI,CAAC,UAAW,OAAgC82B,SAA8B,QAApB,EAAAxmB,SAAoB,eAAEpY,OAASqtH,EACvF,OAAA7nE,GAAA,GAAuBptC,GAEL,QAAfA,EAAMpY,KACPotH,EAAY5sH,IAAI4X,EAAOrX,GACA,YAAfqX,EAAMpY,OACde,EAAUlB,UAAUW,IAAI,iBACxBb,KAAKk2F,qBAAqBN,cAAcn9E,EAAOrX,EAAWgtB,GACrC,IAAlB3V,EAAMouC,SACP7mD,KAAKk2F,qBAAqBL,mBAAmBz0F,SAG5C,GAAGqX,EAAO,CACf,MAAMvV,EAAOwqH,EAAY,QAAKrlH,EAC9BqlH,GAAatsH,EAAUlB,UAAUW,IAAI,oBACrCotB,GAAU,CACR9lB,MAAOsQ,EACPrX,UAAWssH,EAAYtsH,EAAYkyG,EACnCplF,SAAUhrB,EACVirB,UAAWjrB,EACXstB,aACAlC,cAAetuB,KAAKsuB,cACpBF,mBAMR,OAAO/oB,QAAQC,IAAI8oB,GAAczqB,KAAK,KACpC,IAAI6sB,IAEF,YADAi9F,EAAY9+G,QAIdP,EAAKlO,UAAUC,OAAO,aAAcutH,GACpCt/G,EAAKlO,UAAUC,OAAO,iBAAkButH,GACxC1tH,KAAKoB,UAAUlB,UAAUC,OAAO,aAAcutH,GAQ9C,MAAMx+D,EAASlvD,KAAKoO,KAAKrN,cAEzB,GADAmuD,EAAOz+B,YAAc,GAClBymE,EAAW+2B,UAAW,CACvB,MAAMC,EAAgB,YAAO,6DAC7B,OAAAphG,EAAA,GAAaohG,EAAe,IAAkB3hG,cAAc2qE,EAAW+2B,UAAU31F,OACjF,YAAiB41F,EAAgBnuH,IAC/BC,KAAKy5F,qBAAqB00B,WAAWljH,EAAQq7B,EAAKvzB,GAAImkF,EAAW+2B,UAAUtW,eAE7EzoD,EAAO7tD,OAAO6sH,GAEhBh/D,EAAO7tD,OAAOrB,KAAKoO,KAAOA,GAEvBpO,KAAKytH,aACNztH,KAAKytH,YAAYnrE,SAEnBtiD,KAAKytH,YAAcA,EACnBA,EAAY9+F,SAER3uB,KAAKiqH,iBACPjqH,KAAKiqH,eAAiB,KACpB,GAAGjqH,KAAKoO,KAAKlO,UAAUuV,SAAS,cAAe,CAC7C,MAAMjS,EAASxD,KAAKoO,KAAKK,kBAAoB0Z,EAAA,EAAWqvB,OAAOi8B,WAAWjwE,OAAUxD,KAAKoO,KAAKK,kBAAoB,GAClHzO,KAAKoO,KAAKjJ,MAAM3B,MAAQA,EAAQ,UAEhCxD,KAAKoO,KAAKjJ,MAAM3B,MAAQ,IAG5B2kB,EAAA,EAAW7mB,iBAAiB,eAAgBtB,KAAKiqH,iBAGnDjqH,KAAKiqH,iBAELjqH,KAAKG,QAAQ+2F,EAAW10D,QAAQ7gC,SAAWu1F,EAAW+2B,WACtDjuH,KAAKuP,WAAWwgC,UAAY,MAIhC,MAAO,CAACxE,KAAMjF,EAAM+e,oBAlNpBrlD,KAAKoB,UAAUlB,UAAUW,IAAI,iBAE7Bb,KAAKsB,iBAAiB,UAAW,KAC/BwO,WAAW,KACT9P,KAAKuP,WAAWnO,UAAU2uC,UAAY,GACrC,KAGL/vC,KAAKouH,WAAa,OAAAp0F,GAAA,GAASh6B,KAAKwtH,YAAa,KAAK,GAAM,GAExDxtH,KAAKsB,iBAAiB,SAAU,KAC3BtB,KAAKiqH,iBACN9hG,EAAA,EAAWta,oBAAoB,eAAgB7N,KAAKiqH,gBACpDjqH,KAAKiqH,oBAAiB5hH,KAwMlB,OACRrI,KAAKoO,KAAOzN,SAASC,cAAc,OACnCZ,KAAKoO,KAAKlO,UAAUW,IAAI,yBAExBb,KAAKoB,UAAUC,OAAOrB,KAAKoO,MAE3BpO,KAAKuP,WAAa,IAAI,IAAWvP,KAAKoB,WACtCpB,KAAKsuB,cAAgB,IAAI,IACzBtuB,KAAKk2F,qBAAuB,IAAI,GAAqBl2F,KAAKsuB,cAjQtC,kB,aChBT,MAAM,WAAwB,GAG3C,YACEoS,EACQs7D,EACAoE,GAERzgG,MAAM+gC,OAAUr4B,EATD,eASyBqS,IACtC,MAAMlM,EAAYkM,EAAOjH,cAAc,IAAI,GAAuBq4G,gCAAgCt9G,UAClG,OAAOwtF,EAAUuwB,eAAe,KAC9BvwB,EAAUa,aAAaruF,UAAYA,EACnCwtF,EAAUjD,aAAY,GACtB/4F,KAAKG,QAAO,OARR,KAAA67F,YACA,KAAAoE,oBAYH,UAAUrpF,EAAgByZ,G,MAC/B,GAAGxwB,KAAK+W,SAAWA,KAAmB,QAAT,EAAA/W,KAAKoO,YAAI,eAAEK,mBAMxC,OADAzO,KAAK+W,OAASA,EACP,OAAA48B,GAAA,GAAY3zC,KAAKogG,kBAAkB9pB,WAAWv/D,GAAU0X,IAC7D,IAAI+B,IAAc,OAClB,MAAMolB,EAAWm2E,GAA2Bt9F,GAKtChrB,EAA2B,GAAlBmyC,EAASj0C,OAHJ,EAEG,GAEvB3B,KAAKoB,UAAU+D,MAAMqB,YAAY,WAAY/C,EAAS,MAEtDzD,KAAKk/C,OAAOtJ,KAfZ51C,KAAKG,QAAO,ICuEH,MAAM,GAkInB,YACUywB,EACAqgC,EACAqvC,EACAyd,EACAxd,EACA/P,EACAiQ,EACAuC,EACA3C,EACAguB,EACAC,EACAt7B,EACAkN,EACAzG,EACA2G,GAdA,KAAAxvE,OACA,KAAAqgC,qBACA,KAAAqvC,wBACA,KAAAyd,iBACA,KAAAxd,kBACA,KAAA/P,kBACA,KAAAiQ,qBACA,KAAAuC,eACA,KAAA3C,mBACA,KAAAguB,oBACA,KAAAC,0BACA,KAAAt7B,kBACA,KAAAkN,kBACA,KAAAzG,uBACA,KAAA2G,oBAxIF,KAAAmuB,QAAU,GACV,KAAAC,aAAe,EAiBf,KAAAC,cAIJ,GAeI,KAAAC,gBAA2B,KAW5B,KAAA17D,WAAY,EACX,KAAA27D,gBAAiB,EAGjB,KAAAC,gBAAkB,EAclB,KAAAC,UAAW,EACX,KAAAC,gBAAkB,GACT,KAAAC,YAAwB,GACxB,KAAAC,gBAA4B,GACrC,KAAAC,gBAAkB,GAq3BlB,KAAAC,oBAAuBnvH,IAC1BA,GACD,OAAAiqB,EAAA,GAAYjqB,GAGdC,KAAK2uH,gBAAiB,EACtB3uH,KAAKmvH,SAASlqH,OACdmqH,GAAA,EAAqBC,cAAa,IAG5B,KAAAC,gBAAkB,KACxB,MAAMC,EAAc,KAAqB,YAAc,SACvDvvH,KAAKwvH,mBAAmBtvH,UAAUC,OAAOovH,GAAa,IAGhD,KAAAE,iBAAmB,KACzB,MAAMF,EAAc,KAAqB,YAAc,SACvDvvH,KAAKwvH,mBAAmBtvH,UAAUC,OAAOovH,GAAa,IAOjD,KAAAnP,gBAAkB,CAAChkF,EAAuBp8B,KAAK+4F,YAAYryF,KAAK1G,MAAM,GAAOgnF,EAAW,IAAItqC,QACjG,MAAM,OAACzxC,GAAUjL,KAAK4wB,KAChBJ,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBAC/Bw5F,EAAoB19G,EAAA,EAAU+R,OAAS1T,GAAUA,EAAO82B,UAAY/hC,KAAKkgG,gBAAgBwvB,oBAAoBzkH,GAEnH,IAAI,GAAc+7E,EAAWprB,IAC3B,IAAIprC,IACF,OAICorC,GAD4C,IAAzBlf,KAAKC,MAAQ,IAAO,KAExCif,OAAYvzD,GAGdrI,KAAKsgH,aAAe1kD,EACpBx/B,IAEsB,cAAnBp8B,KAAK4wB,KAAKvwB,MAAwBu7D,GACnC9rD,WAAW,KACL0gB,KAIJxwB,KAAKgjG,aAAa2sB,cAAc1kH,IAC/B,IAEJq/G,GAAmBltF,QAmjBhB,KAAAwyF,uBAAyB,KAC/B5vH,KAAKgvH,gBAAgBzlH,KAAKvJ,KAAK68F,aAAaruF,WACrC,IAAMxO,KAAKivH,gBAAkBjvH,KAAK68F,aAAaruF,WAGhD,KAAAqhH,SAAW,CAAC9vH,EAAUM,EAAuByvH,KACnD,OAAA9lG,EAAA,GAAYjqB,GAEZ,IAAI+oB,EAAO9oB,KAAK68F,aAAaruF,UAC7B,GAAGsa,GAAQA,IAASgnG,EAAU,CAC5B9vH,KAAK6uH,UAAW,EAEhB,IAAIkB,EAAgB,EACpB,EAAG,CACDpvH,SAASk4B,YAAYx4B,GAAM,EAAO,MAClC,MAAM2vH,EAAchwH,KAAK68F,aAAaruF,UACtC,GAAGsa,IAASknG,GACV,KAAKD,EAAgB,EACnB,WAGFA,EAAgB,EAGlBjnG,EAAOknG,QACDlnG,IAASgnG,GAEjB9vH,KAAK6uH,UAAW,IA0GZ,KAAAoB,uBAA0BlwH,IAEhC,MAAMmwH,EAA4C,CAChD,KAAQ,OACR,KAAQ,SACR,KAAQ,YACR,KAAQ,gBACR,KAAQ,YACR,KAAQ,WAGPlwH,KAAKgjG,aAAamtB,gBACnBD,EAAiB,KAAI,QAGvB,MAAMjpH,EAAOlH,EAAEkH,KACTmpH,EAAgBF,EAAWjpH,GAejC,GAbkBtG,SAASwB,eACdusD,WAAW7+C,OAAOlO,QAAUyuH,IAE3B,SAATnpH,EACDjH,KAAKgjG,aAAamtB,cAAcE,iBAEhCrwH,KAAKowH,cAAcA,GAGrB,OAAApmG,EAAA,GAAYjqB,IAIF,SAATkH,EAAiB,CAClB,IAAI6hB,EAAO9oB,KAAK68F,aAAaruF,UAE1BzO,EAAEyH,SACAxH,KAAK+uH,YAAYptH,SAClB3B,KAAKgvH,gBAAgBzlH,KAAKuf,GAC1BA,EAAO9oB,KAAK+uH,YAAY1lH,MACxBrJ,KAAK6vH,SAAS9vH,EAAG,OAAQ+oB,GACzBA,EAAO9oB,KAAK68F,aAAaruF,UACzBxO,KAAK8uH,gBAAkB9uH,KAAK+uH,YAAYptH,OAASmnB,EAAO,GACxD9oB,KAAKivH,gBAAkBnmG,IAItB9oB,KAAKgvH,gBAAgBrtH,QAAY3B,KAAKivH,iBAAmBnmG,IAAS9oB,KAAKivH,kBACxEjvH,KAAK+uH,YAAYxlH,KAAKuf,GACtBA,EAAO9oB,KAAKgvH,gBAAgB3lH,MAC5BrJ,KAAK6vH,SAAS9vH,EAAG,OAAQ+oB,GAGzB9oB,KAAKivH,gBAAkBjvH,KAAK8uH,gBAAkB9uH,KAAK68F,aAAaruF,aAMhE,KAAA8hH,eAAkBvwH,I,MAexB,MAAO4E,MAAO4rH,EAAWryE,SAAUsyE,EAAgB,SAAEnF,GAAYb,GAAsBxqH,KAAKylH,kBAAkBrlH,OAGxGuE,EAAQ,IAAkB8rH,cAAcF,EAAWC,GAAkB,GACrEtyE,EAAW,IAAkBwyE,cAAcF,EAAkB,IAAkBG,cAAchsH,IAIhG3E,KAAK8uH,kBAAoB9uH,KAAK6uH,UAAY7uH,KAAK68F,aAAaruF,YAAcxO,KAAK8uH,kBAChF9uH,KAAK8uH,gBAAkB,GACvB9uH,KAAK+uH,YAAYptH,OAAS,GAG5B,MAAMivH,KAA4G,QAAhB,EAAA5wH,KAAKqgH,mBAAW,eAAE5nG,QAAsC,wBAA7BzY,KAAKqgH,YAAY5nG,MAAMrN,IAAgC8yC,EAAStyC,OAAO7L,GAAa,qBAARA,EAAEqL,GAAoC,yBAARrL,EAAEqL,GACzO,GAAGwlH,EAAYjvH,OACb,IAAI,MAAM+1D,KAAUk5D,EAAa,CAC/B,IAAIt2G,EACJ,GAAgB,yBAAbo9C,EAAOtsD,EACRkP,EAAMo9C,EAAOp9C,SAIb,GAFAA,EAAMi2G,EAAU5qH,MAAM+xD,EAAOpjC,OAAQojC,EAAOpjC,OAASojC,EAAO/1D,SAEvD2Y,EAAI2kB,SAAS,aAAc3kB,EAAI2kB,SAAS,YAC3C,SAMJ,GAAGj/B,KAAKuuH,UAAYj0G,EAAK,CACvBta,KAAKuuH,QAAUj0G,EAEf,MAAMlQ,EAAUpK,KAAK6wH,kBAAoB,KAAW5+C,kBAAkB,CACpEpyC,OAAQ,sBACR65E,cAAgBoX,GACP9wH,KAAKygG,mBAAmBswB,YAAYD,GAE7C9yG,OAAQ,CACN1D,SAED3W,KAAMgtB,IACJ3wB,KAAK6wH,oBAAsBzmH,IAASpK,KAAK6wH,uBAAoBxoH,GAC7DrI,KAAKuuH,UAAYj0G,IACF,YAAfqW,EAAQvlB,GAGTpL,KAAKgxH,WAAW,UAAW,OAAUrgG,EAAQ+iF,WAAa/iF,EAAQjf,OAAS,UAAWif,EAAQmL,aAAenL,EAAQrW,KAAO,WACrHta,KAAKixH,UACZjxH,KAAK0uH,gBAAkB/9F,GACf3wB,KAAK0uH,iBACb1uH,KAAKkxH,oBAKX,WAEMlxH,KAAKuuH,UACbvuH,KAAKuuH,QAAU,UACRvuH,KAAKixH,UACZjxH,KAAK0uH,gBAAkB,KAEpB1uH,KAAKokH,WACNpkH,KAAKmxH,aAELnxH,KAAKqkH,eAKT,IADiBkM,EAAU1gH,OAEtB7P,KAAKwuH,cACNxuH,KAAKixD,mBAAmBvI,UAAU1oD,KAAK4wB,KAAK3lB,OAAQ,CAACG,EAAG,4BAGvDpL,KAAKgjG,aAAamtB,eACnBnwH,KAAKgjG,aAAamtB,cAAchsF,OAK/BxjC,SAASqB,gBAAkBhC,KAAK68F,cAEjC/sF,WAAW,KACNnP,SAASqB,gBAAkBhC,KAAK68F,cACjC78F,KAAKoxH,0BAEN,OAGA,CACL,MAAM30E,EAAOC,KAAKC,MACfF,EAAOz8C,KAAKwuH,cAAgB,MAC7BxuH,KAAKwuH,aAAe/xE,EACpBz8C,KAAKixD,mBAAmBvI,UAAU1oD,KAAK4wB,KAAK3lB,OAAQ,CAACG,EAAG,6BAGvDpL,KAAKqxH,aACNrxH,KAAKqxH,YAAYlxH,QAAO,GAIzBH,KAAKqxH,aACNrxH,KAAKsxH,0BAGHtxH,KAAKuxH,WACPvxH,KAAKwxH,qBAGPxxH,KAAKyxH,kBAAkBlB,EAAWlF,EAAUntE,GAE5Cl+C,KAAK0xH,iBA0EA,KAAA99B,gBAAkB,CAACptC,EAAe/lD,KACvCT,KAAK2sH,cAAcnmE,EAAO,IAAkBmrE,wBAAwBnrE,GAAQ/lD,IA0HtE,KAAAmxH,eAAkB7xH,IAGxB,GAFA,OAAAiqB,EAAA,GAAYjqB,IAERC,KAAKmvH,UAAYnvH,KAAKgzD,YAAchzD,KAAKsiH,gBAAkBtiH,KAAK6xH,YAAc7xH,KAAKuxH,UAClFvxH,KAAKgzD,UACFtW,KAAKC,MAAQ38C,KAAK4uH,gBAxjEN,IAyjEd5uH,KAAKkvH,sBAELlvH,KAAKmvH,SAASlqH,OAGhBjF,KAAK+4F,kBAEF,CACL,GAAG/4F,KAAK4wB,KAAK3lB,OAAOm4B,cAAgBpjC,KAAK4wB,KAAK62E,QAAQ,cAEpD,YADA9tE,GAjkE0B,sDAqkE5B35B,KAAKg8F,UAAU97F,UAAUW,IAAI,aAC7B,OAAA2wD,GAAA,KAEAxxD,KAAKmvH,SAASloG,QAAQtjB,KAAK,KACzB3D,KAAK8xH,qBAAuB,GAA2BC,iBACvD/xH,KAAK2uH,gBAAiB,EAEtB3uH,KAAKgyH,cAAa,GAClB5C,GAAA,EAAqBC,cAAa,GAElC,MAAM4C,EAAmB,KACvB,IAAI,GAAU,sBAAuB,CACnCp6F,aAAc,2BACdgE,mBAAoB,iCACpBR,QAAS,CAAC,CACR7B,QAAS,4BACT4C,SAAU,KACR,YAAmBp8B,KAAKkyH,mBAEzB,CACD14F,QAAS,WACT0oC,UAAU,MAEX9kC,QAGLp9B,KAAKmyH,yBAA2BnyH,KAAK6R,eAAehR,IAAIF,SAASgC,KAAjC3C,CAAuC,YAAcD,IAC/E,OAAA+qB,GAAA,GAAgB/qB,EAAE2a,OAAQ,eAAkB,OAAAoQ,GAAA,GAAgB/qB,EAAE2a,OAAQ,yBACxE,OAAAsP,EAAA,GAAYjqB,GACZkyH,MAED,CAACxiG,SAAS,EAAMvL,SAAS,IAE5BvR,EAAA,EAAwBmB,SAAS9T,KAAKoyH,wBAA0B,CAC9D/xH,KAAM,QACN0T,MAAO,KACLjE,WAAW,KACTmiH,KACC,IAEI,KAIXjyH,KAAK4uH,gBAAkBlyE,KAAKC,MAE5B,MAAM01E,EAAyCryH,KAAKmvH,SAASkD,WAGvDC,EAFUD,EAAWjlH,QAEFmlH,iBACzBF,EAAWG,QAAQF,GAEnBA,EAASG,QAAU,GAEnB,MAAMC,EAAgB,IAAIprG,WAAWgrG,EAASK,mBACxCluH,EAA6B,IAAvBiuH,EAAc/wH,OAE1B,IAAIokB,EAAI,KACN,IAAI/lB,KAAKgzD,UAAW,OAEpBs/D,EAASM,qBAAqBF,GAE9B,IAAIn+F,EAAM,EACVm+F,EAAcnoH,QAAQ5F,IACpB4vB,GAAO5vB,IAGT,IAAI0gB,EAAWxgB,KAAKC,IAAI,EAAIyvB,EAAM9vB,EAXxB,KAcVzE,KAAK6yH,eAAe1tH,MAAMogB,UAAY,SAASF,KAE/C,IAAIoQ,EAAOinB,KAAKC,MAAQ38C,KAAK4uH,gBACzBkE,EAAKr9F,EAAO,IAEZ5uB,EAAYyb,GAASmT,EAAO,KAAQ,KAAO,KAAO5wB,KAAKE,MAAM+tH,EAAK,KAAKntH,OAAO,GAElF3F,KAAK+yH,aAAanlG,UAAY/mB,EAE9B,aAAQkf,IAGVA,MACCrV,MAAO3Q,IACR,OAAOA,EAAES,MACP,IAAK,kBACHm5B,GAAM,0CACN,MAGF,IAAK,mBACHA,GAAM55B,EAAEgI,SACR,MAGF,QACEwI,QAAQC,MAAM,wBAAyBzQ,EAAGA,EAAES,KAAMT,EAAEgI,SACpD4xB,GAAM55B,EAAEgI,SAIZ/H,KAAKgyH,cAAa,GAClBhyH,KAAKg8F,UAAU97F,UAAUoE,OAAO,iBAK9B,KAAA4sH,eAAiB,CAACnxH,EAAWgkH,KAKnC,GAJGhkH,GACD,OAAAiqB,EAAA,GAAYjqB,GAGXC,KAAK0uH,gBAAiB,CACvB,MAAMH,EAAUvuH,KAAKuuH,QACrB,IAAIyE,GAAa,EAcjB,GAbGhzH,KAAKokH,aAEJpkH,KAAKmxH,aAGP6B,GAAa,GAIfhzH,KAAKuuH,QAAUA,EACfvuH,KAAKixH,WAAY,EACjBjxH,KAAK0uH,gBAAkB,KAEpBsE,EAAY,OAGjB,GAAuB,SAApBhzH,KAAKokH,aAA0BL,EAAO,CACvC,MAAMh8G,EAAU/H,KAAKqgH,YACf17G,EAAQ,IAAkB8rH,cAAczwH,KAAKylH,kBAAkB9gH,MAAO,IAC5E,GAAGoD,EAAQA,UAAYpD,EAWrB,YAVA,IAAI,GAAU,kBAAmB,CAC/B02B,QAAS,CAAC,CACR7B,QAAS,wBACT4C,SAAU,KACRp8B,KAAKkxH,oBAAe7oH,GAAW,MAGnCwzB,mBAAoB,0BACnBuB,OAMPp9B,KAAKqkH,cACLrkH,KAAK0xH,iBAGC,KAAAuB,cAAiBlzH,IAGvB,GAFA,OAAAiqB,EAAA,GAAYjqB,GAER,OAAA+qB,GAAA,GAAgB/qB,EAAE2a,OAAQ,SAC9B,GAAuB,YAApB1a,KAAKokH,WAA0B,CAChC,MAAM,gBAAC8O,GAAmBlzH,KACvBkzH,GAAmB,OAAuBA,EAAgB9xH,UAAUlB,UAAUuV,SAAS,WACxF,aAAYy9G,EAAgB9xH,eAEF,UAApBpB,KAAKokH,WACbpkH,KAAK4wB,KAAK+0E,aAAa3lG,KAAKmmH,cACA,SAApBnmH,KAAKokH,YACbpkH,KAAK4wB,KAAK+0E,aAAa3lG,KAAKuxH,YAjlE9BvxH,KAAK6R,eAAiB,IAAI,IAGrB,YACL7R,KAAKg8F,UAAYr7F,SAASC,cAAc,OACxCZ,KAAKg8F,UAAU97F,UAAUW,IAAI,cAC7Bb,KAAKg8F,UAAU72F,MAAMC,QAAU,OAE/BpF,KAAKm0D,eAAiBxzD,SAASC,cAAc,OAC7CZ,KAAKm0D,eAAej0D,UAAUW,IAAI,wBAElCb,KAAKmzH,mBAAqBxyH,SAASC,cAAc,OACjDZ,KAAKmzH,mBAAmBjzH,UAAUW,IAAI,wBAEtCb,KAAKozH,YAAczyH,SAASC,cAAc,OAC1CZ,KAAKozH,YAAYlzH,UAAUW,IAAI,eAAgB,sBAE/Cb,KAAKmzH,mBAAmB9xH,OAAOrB,KAAKozH,aAEpC,MAAMzpD,EAAOyrC,KACbp1G,KAAKozH,YAAY/xH,OAAOsoE,GAExB,MAAM0pD,EAAkBrzH,KAAKqzH,gBAAkB1yH,SAASC,cAAc,OACtEyyH,EAAgBnzH,UAAUW,IAAI,eAAgB,qBAE9C,MAAMyyH,EAAuBtzH,KAAKszH,qBAAuB3yH,SAASC,cAAc,OAChF0yH,EAAqBpzH,UAAUW,IAAI,eAAgB,0BAEnDb,KAAKm0D,eAAe9yD,OAAOrB,KAAKmzH,mBAAoBE,EAAiBC,GACrEtzH,KAAKg8F,UAAU36F,OAAOrB,KAAKm0D,gBAE3Bn0D,KAAKuzH,UAAY,EAAa,CAACpiH,KAAM,aAAcnD,UAAW,+CAC9DhO,KAAKm0D,eAAe9yD,OAAOrB,KAAKuzH,WAEhC,YAAiBvzH,KAAKuzH,UAAYxzH,IAChC,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAK4wB,KAAKC,QAAQ2iG,iBACjB,CAAC3hH,eAAgB7R,KAAK6R,iBAqEzB,MAAMimB,EAAI93B,KAAKyzH,iBAAmB9yH,SAASC,cAAc,OACzDk3B,EAAE53B,UAAUW,IAAI,qBAAsB,sBACtCb,KAAKm0D,eAAe9yD,OAAOy2B,GAGtB,uBACL93B,KAAKyuH,cAAcrtH,UAAYT,SAASC,cAAc,OACtDZ,KAAKyuH,cAAcrtH,UAAUlB,UAAUW,IAAI,iBAE3Cb,KAAKyuH,cAAciF,QAAU,EAAW,IACxC1zH,KAAKyuH,cAAckF,UAAY,EAAW,qBAAsB,CAACliH,UAAU,IAE3EzR,KAAKyuH,cAAcrtH,UAAUC,OAAOrB,KAAKyuH,cAAciF,QAAS1zH,KAAKyuH,cAAckF,WAInF,MAAMC,EAAoB,KACxBC,GAAmB,EACZ7zH,KAAK8zH,uBAGRC,EAAqB,KACzBF,GAAmB,GAGfX,EAAgDlzH,KAAKkzH,gBAAkB,GAC7E,IAAIW,GAAmB,EACvB,MAAMG,EAA0C,CAC9Cd,EAAgBvnG,WAAa,CAC3B2M,KAAM,kCACNopB,QAASkyE,EACTt8F,cAAe,IAAI,KAAc,CAACH,SAAS,KAE7C+7F,EAAgBe,WAAa,CAC3B37F,KAAM,kCACNopB,QAASkyE,EACTt8F,cAAe,IAAI,KAAc,CAACH,SAAS,KAE7C+7F,EAAgBgB,YAAc,CAC5B57F,KAAM,wCACNopB,QAASqyE,EACTz8F,cAAe,IAAI,KAAc,CAACH,SAAS,KAE7C+7F,EAAgBiB,YAAc,CAC5B77F,KAAM,wCACNopB,QAASqyE,EACTz8F,cAAe,IAAI,KAAc,CAACH,SAAS,KAE7C+7F,EAAgBkB,WAAa,CAC3B97F,KAAM,oCACNopB,QAAS,KACP1hD,KAAKq0H,0BAEPljH,KAAM,YAGJmjH,EAAiBpB,EAAgB9xH,UAAY,GAAW4yH,EAAgBh0H,KAAK6R,gBAG7E0e,EAAWpkB,MAAMC,KAAKkoH,EAAe/jG,UAkD3C,GA9CM,CAAC,CACLlF,SAAUkF,EAAS5qB,MAAM,EAAG,GAC5B+J,SAAU,CAAC/K,EAAO5E,KAChB,MAAMo3B,KAAaxyB,EAChBkvH,IACD7zH,KAAKu0H,0BAA4Bp9F,GAGnC,MAAMq9F,EAAax0H,KAAKyuH,cAAcrtH,UAAUqS,cAAc,gBAC9D,GAAG+gH,EAAY,CACb,MAAM1yH,EAAK0yH,EAAWvoG,kBAChBrqB,EAAI,IAAKghH,QAAQjvG,IAAI7R,GACrB+3B,EAA2Bq5F,EAAgBvnG,WAAW2L,cAAcH,QAAU,yBAA2B,wBAC/Gv1B,EAAEwF,IAAMyyB,EACRj4B,EAAE4kC,YAGL,CACDnb,SAAUkF,EAAS5qB,MAAM,EAAG,GAC5B+J,SAAW/K,IACT,MAAMwyB,KAAaxyB,EACnB,IAAI4H,EAEFA,EADC4qB,QAA6C9uB,IAAlCrI,KAAKu0H,yBACbv0H,KAAKu0H,yBAA2BrB,EAAgBe,WAAaf,EAAgBvnG,WAE7EwL,EAAU+7F,EAAgBvnG,WAAaunG,EAAgBe,WAG7D1nH,EAAE+qB,cAAcH,SAAU,KAGvB5sB,QAAQ0mB,IACb,MAAM7vB,EAAY41B,GAAU/F,EAAM5F,SAAS5e,IAAI1M,IACtC,CACLqB,UAAWrB,EACXK,MAAOL,EAAE0T,cAAc,YAEvBwd,EAAMvhB,UAEJ0oC,EAAKz3C,SAASC,cAAc,MAClCQ,EAAUC,OAAO+2C,GACjBk8E,EAAejzH,OAAOD,KAGxBkzH,EAAejzH,OAAO6xH,EAAgBkB,WAAWr5G,UAE7C,KAAoB,CACD/a,KAAKy0H,aAAe,IAAI,GAAc,CACzD15G,QAASu5G,IAIbpB,EAAgBwB,WAAaV,EAAeruH,MAAM,GAAI,GACtD3F,KAAKyuH,cAAcrtH,UAAUC,OAAOizH,GAEpCpB,EAAgBwB,WAAWnqH,QAAQ,CAACgC,EAAGvE,KACrC,MAAM,MAAC5H,GAASmM,EAAE+qB,cAClBl3B,EAAMC,KAAO,QACbD,EAAMI,KAAOwH,EAAM,EAAI,SAAW,UAClC5H,EAAMuE,MAAQ,OAAQqD,EAAM,KAK9BhI,KAAK20H,kBAAoBh0H,SAASC,cAAc,OAChDZ,KAAK20H,kBAAkBz0H,UAAUW,IAAI,uBAErCb,KAAK40H,gBAAkBj0H,SAASC,cAAc,OAC9CZ,KAAK40H,gBAAgB10H,UAAUW,IAAI,iCAEnCb,KAAK60H,eAAiBl0H,SAASC,cAAc,OAC7CZ,KAAK60H,eAAe30H,UAAUW,IAAI,4BAA6B,6BAA8B,eAE7F,MAAMi0H,EAAyC,CAAC,CAC9Cx8F,KAAM,qBACNopB,aAASr5C,IAGX,IAAI0sH,EACJ,MAAMC,EAAsBpnF,IACvBA,IACDmnF,EAAiB/0H,KAAKi1H,cAGxB,MAAM/+F,EAAYl2B,KAAKi1H,eAAiBF,EAClC1xB,GAAWz1D,GAAW1X,EAAY,EAAI,EAE5C,aAAcl2B,KAAK60H,eAAgB,aAAcjnF,EAvZpB,SAuZyDvlC,EAAWg7F,GAC7FntE,GACF,aAAc6+F,EAAgB,cAAennF,EAzZlB,SAyZuDvlC,EAAWg7F,IAwBjG,GApBA,GAAiB,CACf5xF,UAAU,EACVI,eAAgB7R,KAAK6R,eACrBzQ,UAAWpB,KAAK40H,iBACf,YAAaE,EAAe,KAC7BE,GAAmB,IAClB,KACDA,GAAmB,KAGrBF,EAAc,GAAG/5G,QAAQ7a,UAAUW,IAAI,wBACvCb,KAAKk1H,cAAgBl1H,KAAK40H,gBAAgB3oG,kBAC1CjsB,KAAKk1H,cAAch1H,UAAUW,IAAI,aAAc,gBAC/Cb,KAAK40H,gBAAgBvzH,OAAOrB,KAAK60H,gBAEjC70H,KAAKwvH,mBAAqB,EAAW,wBAAyB,CAAC/9G,UAAU,IAEzEzR,KAAKm1H,sBAAwBx0H,SAASC,cAAc,OACpDZ,KAAKm1H,sBAAsBj1H,UAAUW,IAAI,2BAEnB,SAAnBb,KAAK4wB,KAAKvwB,KAAiB,CAC5BL,KAAKo1H,kBAAoBz0H,SAASC,cAAc,QAChDZ,KAAKo1H,kBAAkBl1H,UAAUW,IAAI,QAAS,WAAY,iBAC1Db,KAAKuzH,UAAUlyH,OAAOrB,KAAKo1H,mBAE3Bp1H,KAAKq1H,aAAe,EAAa,CAAClkH,KAAM,UAAWnD,UAAW,6CAC9DhO,KAAKs1H,qBAAuB30H,SAASC,cAAc,QACnDZ,KAAKs1H,qBAAqBp1H,UAAUW,IAAI,QAAS,WAAY,iBAC7Db,KAAKq1H,aAAah0H,OAAOrB,KAAKs1H,sBAC9Bt1H,KAAKm0D,eAAe9yD,OAAOrB,KAAKq1H,cAEhC,YAAiBr1H,KAAKq1H,aAAet1H,IACnC,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKixD,mBAAmBskE,gBAAgBv1H,KAAK4wB,KAAK3lB,SACjD,CAAC4G,eAAgB7R,KAAK6R,iBAEzB7R,KAAKw1H,aAAe,EAAW,qCAAsC,CAAC/jH,UAAU,IAEhF,YAAiBzR,KAAKw1H,aAAez1H,IACnCC,KAAKgjG,aAAa2sB,cAAc3vH,KAAK4wB,KAAK3lB,SACzC,CAAC4G,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAiB,EAAEiL,aACjDjL,KAAK4wB,KAAK3lB,SAAWA,GAIxBjL,KAAKw1H,aAAat1H,UAAUoE,OAAO,UAGrCtE,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAoB,EAAEiL,aACpDjL,KAAK4wB,KAAK3lB,SAAWA,GAIxBjL,KAAKixD,mBAAmBolD,qBAAqBr2G,KAAK4wB,KAAK3lB,QAAQtH,KAAKgB,IAClE3E,KAAKw1H,aAAat1H,UAAUC,OAAO,QAASwE,EAAMhD,YAItD3B,KAAKy1H,qBAAuB,EAAW,wCAAyC,CAAChkH,UAAU,IAC3FzR,KAAK01H,cAAgB,IAAI,GAAc,CACrCh1F,SAAU1gC,KAAKozH,YACfvhH,eAAgB7R,KAAK6R,eACrBo/C,mBAAoBjxD,KAAKixD,mBACzB+7D,SAAUhtH,KAAKy1H,qBACfz5B,UAAWh8F,OAEbA,KAAK6R,eAAehR,IAAIb,KAAK01H,cAA7B11H,CAA4C,OAAQ,IAAMA,KAAKy1H,qBAAqBv1H,UAAUW,IAAI,WAClGb,KAAK6R,eAAehR,IAAIb,KAAK01H,cAA7B11H,CAA4C,QAAS,IAAMA,KAAKy1H,qBAAqBv1H,UAAUoE,OAAO,WAEtGtE,KAAKqxH,YAAc,IAAI,GAAgBrxH,KAAKozH,YAAapzH,KAAMA,KAAKogG,mBACpEpgG,KAAK21H,kBAAoBh1H,SAASC,cAAc,OAChDZ,KAAK21H,kBAAkBz1H,UAAUW,IAAI,4BAErC,MAAM+0H,EAASj1H,SAASC,cAAc,OACtCg1H,EAAO11H,UAAUW,IAAI,uCAErB,MAAMsQ,EAAOnR,KAAK61H,gBAAkBl1H,SAASC,cAAc,OAC3DuQ,EAAKjR,UAAUW,IAAI,qBAAsB,4BACzC+0H,EAAOv0H,OAAO8P,GACdnR,KAAK21H,kBAAkBt0H,OAAOu0H,GAE9B,YAAiB51H,KAAK21H,kBAAoB51H,IACxC,OAAAiqB,EAAA,GAAYjqB,GACIoR,EAAKjR,UAAUuV,SAAS,eAEtCzV,KAAKqxH,YAAYlxH,QAAO,GACxBgR,EAAKjR,UAAUoE,OAAO,gBAEtBtE,KAAKqxH,YAAYyE,UAAU91H,KAAK4wB,KAAK3lB,OAAOwL,WAAYzW,KAAK4wB,KAAKC,QAAQC,iBAC1E3f,EAAKjR,UAAUW,IAAI,gBAEpB,CAACgR,eAAgB7R,KAAK6R,iBAEzB7R,KAAKqxH,YAAY/vH,iBAAiB,UAAW,KAC3C6P,EAAKjR,UAAUW,IAAI,gBAGrBb,KAAKqxH,YAAY/vH,iBAAiB,SAAU,KAC1C6P,EAAKjR,UAAUoE,OAAO,gBAI1BtE,KAAK+1H,kBAAoB,CAAC,CACxB5kH,KAAM,QACNmnB,KAAM,iCACNopB,QAAS,KACP1hD,KAAKg2H,UAAUrxH,MAAQ,GACvB,MAAMsxH,EAAS,IAAI,GAA4B7qG,KAAK,MACpDprB,KAAKg2H,UAAUz1H,aAAa,SAAU01H,GACtCj2H,KAAK4kH,eAAiB,QACtB5kH,KAAKg2H,UAAU71F,SAEjBrlB,OAAQ,IAAM9a,KAAK4wB,KAAK62E,QAAQ,eAC/B,CACDt2F,KAAM,WACNmnB,KAAM,6BACNopB,QAAS,KACP1hD,KAAKg2H,UAAUrxH,MAAQ,GACvB3E,KAAKg2H,UAAUrrF,gBAAgB,UAC/B3qC,KAAK4kH,eAAiB,WACtB5kH,KAAKg2H,UAAU71F,SAEjBrlB,OAAQ,IAAM9a,KAAK4wB,KAAK62E,QAAQ,eAC/B,CACDt2F,KAAM,OACNmnB,KAAM,OACNopB,QAAS,KACP,IAAI,GAAgB1hD,KAAK4wB,MAAMwM,QAEjCtiB,OAAS7P,GAAWA,EAAOm4B,aAAepjC,KAAK4wB,KAAK62E,QAAQ,gBAG9DznG,KAAKk2H,WAAa,GAAiB,CAACzkH,UAAU,EAAMI,eAAgB7R,KAAK6R,gBAAiB,WAAY7R,KAAK+1H,mBAC3G/1H,KAAKk2H,WAAWh2H,UAAUW,IAAI,cAAe,gBAC7Cb,KAAKk2H,WAAWh2H,UAAUoE,OAAO,cAIjCtE,KAAK+yH,aAAepyH,SAASC,cAAc,OAC3CZ,KAAK+yH,aAAa7yH,UAAUW,IAAI,eAEhCb,KAAKg2H,UAAYr1H,SAASC,cAAc,SACxCZ,KAAKg2H,UAAU31H,KAAO,OACtBL,KAAKg2H,UAAUG,UAAW,EAC1Bn2H,KAAKg2H,UAAU7wH,MAAMC,QAAU,OAE/BpF,KAAK20H,kBAAkBtzH,UAAU,CAACrB,KAAK40H,gBAAiB50H,KAAK21H,kBAAmB31H,KAAKwvH,mBAAoBxvH,KAAKm1H,sBAAuBn1H,KAAKw1H,aAAcx1H,KAAKy1H,qBAAsBz1H,KAAKk2H,WAAYl2H,KAAK+yH,aAAc/yH,KAAKg2H,WAAWpqH,OAAOc,UAE9O1M,KAAKozH,YAAY/xH,OAAOrB,KAAKyuH,cAAcrtH,WAC3CpB,KAAKo2H,6BAA+B,IAAI,GACxCp2H,KAAKq2H,eAAiB,IAAI,GAAer2H,KAAKozH,YAAapzH,KAAKo2H,8BAChEp2H,KAAKs2H,YAAc,IAAI,GAAYt2H,KAAKozH,YAAapzH,KAAKo2H,6BAA8Bp2H,KAAMA,KAAKgzF,iBACnGhzF,KAAKu2H,eAAiB,IAAI,GAAev2H,KAAKozH,YAAapzH,KAAKo2H,6BAA8Bp2H,KAAMA,KAAK4wB,KAAKwvE,kBAAmBpgG,KAAK4wB,KAAKsvE,iBAC3IlgG,KAAKw2H,eAAiB,IAAI,GAAex2H,KAAKozH,YAAapzH,KAAKo2H,6BAA8Bp2H,KAAMA,KAAK4wB,KAAKwvE,kBAAmBpgG,KAAK4wB,KAAKsvE,iBAC3IlgG,KAAKy2H,aAAe,IAAI,GAAaz2H,KAAKozH,YAAapzH,KAAKo2H,6BAA8Bp2H,KAAK4wB,KAAM5wB,KAAKkgG,gBAAiBlgG,KAAKy5F,sBAChIz5F,KAAKozH,YAAY/xH,OAAOrB,KAAK20H,mBAE7B30H,KAAKkyH,gBAAkB,EAAW,iDAElClyH,KAAK02H,iBAAmB/1H,SAASC,cAAc,OAC/CZ,KAAK02H,iBAAiBx2H,UAAUW,IAAI,sBAEpCb,KAAK6yH,eAAiBlyH,SAASC,cAAc,OAC7CZ,KAAK6yH,eAAe3yH,UAAUW,IAAI,iBAElCb,KAAK22H,QAAU,EAAW,2DAC1B32H,KAAK22H,QAAQxtG,mBAAmB,aAAc,4MAO9CnpB,KAAK02H,iBAAiBr1H,OAAOrB,KAAK6yH,eAAgB7yH,KAAK22H,SAEjC,cAAnB32H,KAAK4wB,KAAKvwB,OACXL,KAAK+hH,SAAW,IAAI,GAAS,CAC3BF,cAAe,KACb7hH,KAAK8iH,YAAa,EAClB9iH,KAAK+4F,eAEP+oB,gBAAiB,KACf9hH,KAAKogH,qBAAgB/3G,IAEvBwJ,eAAgB7R,KAAK6R,eACrBmwG,SAAU,WACVC,iBAAkBjiH,KAAK22H,QACvB/iH,OAAQ,KACE5T,KAAKsiH,kBAAoB3kG,OAAOg1C,KAAK3yD,KAAK6xH,YAAYlwH,SAIlE3B,KAAK02H,iBAAiBr1H,OAAOrB,KAAK+hH,SAASA,WAG7C/hH,KAAKm0D,eAAe9yD,OAAOrB,KAAKkyH,gBAAiBlyH,KAAK02H,kBAEtD,GAAkBzJ,qBAAqBjtH,KAAKwvH,mBAAoBxvH,KAAK6R,gBACrE7R,KAAK6R,eAAehR,IAAI,GAAxBb,CAA2C,OAAQA,KAAKsvH,iBACxDtvH,KAAK6R,eAAehR,IAAI,GAAxBb,CAA2C,QAASA,KAAKyvH,kBAEzDzvH,KAAK42H,0BAWL52H,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAoB,MAClDA,KAAKq2H,gBAAkBr2H,KAAKs2H,eAE7Bt2H,KAAK62H,cAAgB,GACrB72H,KAAKyxH,qBAQJzxH,KAAKylH,mBACNzlH,KAAKylH,kBAAkBqR,gBAI3B92H,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAiB,EAAEiL,SAAQqE,WAAUynH,QAAOhT,YAC1E/jH,KAAK4wB,KAAKthB,WAAaA,GAAYtP,KAAK4wB,KAAK3lB,SAAWA,GAC3DjL,KAAKi4F,SAAS8+B,GAAO,EAAMhT,KAG7B/jH,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAkB4wB,IAChD5wB,KAAK4wB,OAASA,GACf5wB,KAAKg3H,cAITh3H,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,gBAAiB,EAAEoM,OAAMyqC,SACvD72C,KAAK4wB,OAASxkB,EACfpM,KAAKo2H,6BAA6B3J,sBAAqB,GAC/CzsH,KAAK4wB,OAASimB,GACtB72C,KAAKo2H,6BAA6B3J,sBAAqB,KAIxDzsH,KAAK40H,iBACN50H,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAqBiL,IACnDA,EAAOi8B,aAAelnC,KAAK4wB,KAAK3lB,SAAWA,GAC5CjL,KAAKi3H,iBAKW,cAAnBj3H,KAAK4wB,KAAKvwB,KACXL,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAoB,EAAEiL,SAAQgB,WAC5DjM,KAAK4wB,KAAK3lB,SAAWA,GAAUgB,EAAKgzB,SAASj/B,KAAKuxH,YACnDvxH,KAAK2M,mBAIT3M,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,iBAAkB,EAAEiL,SAAQQ,WAC1DzL,KAAK4wB,KAAK3lB,SAAWA,IACnBQ,EAAKE,IAAI3L,KAAKuxH,YACfvxH,KAAK2M,gBAGJ3M,KAAKmmH,cAAgB16G,EAAKE,IAAI3L,KAAKmmH,eACpCnmH,KAAKqkH,YAAY,YASvBrkH,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,sBAAwB8gC,IACtDA,EAAQ9gC,KAAK4wB,KAAK3lB,UAChBjL,KAAK63F,aAAe,KACrB73F,KAAKuuG,gBAELvuG,KAAK6zD,QAAO,OAMpB,IACE7zD,KAAKmvH,SAAW,IAAI,KAAS,CAG3B+H,kBAAmB,KACnBC,YAAa,EACbC,iBAAkB,EAClBC,cAAe,EACfC,aAAa,IAEf,MAAMhnH,GACNC,QAAQC,MAAM,8BAA+BF,GAG/CtQ,KAAK0xH,gBAEL1xH,KAAK6R,eAAehR,IAAIb,KAAKg2H,UAA7Bh2H,CAAwC,SAAWD,IACjD,IAAI4kH,EAAS5kH,EAAE2a,OAA0CiqG,MACrDA,EAAMhjH,SAIV,IAAI,GAAc3B,KAAK4wB,KAAMzkB,MAAMC,KAAKu4G,GAAOh/G,QAAS3F,KAAK4kH,gBAC7D5kH,KAAKg2H,UAAUrxH,MAAQ,MACtB,GAkBH,YAAiB3E,KAAK22H,QAAS32H,KAAK4xH,eAAgB,CAAC//G,eAAgB7R,KAAK6R,eAAgB0lH,gBAAgB,IAEvGv3H,KAAKmvH,WACN,YAAiBnvH,KAAKkyH,gBAAiBlyH,KAAKkvH,oBAAqB,CAACr9G,eAAgB7R,KAAK6R,iBAEvF7R,KAAKmvH,SAASqI,OAAS,KACrBx3H,KAAKgyH,cAAa,GAClBhyH,KAAKg8F,UAAU97F,UAAUoE,OAAO,aAChCtE,KAAK6yH,eAAe1tH,MAAMogB,UAAY,IAGxCvlB,KAAKmvH,SAASsI,gBAAmBC,IAgB/B,GAfG13H,KAAK8xH,uBACN9xH,KAAK8xH,uBACL9xH,KAAK8xH,0BAAuBzpH,GAG3BrI,KAAKmyH,2BACNnyH,KAAK6R,eAAevN,OAAOtE,KAAKmyH,0BAChCnyH,KAAKmyH,8BAA2B9pH,GAG/BrI,KAAKoyH,0BACNz/G,EAAA,EAAwB+2G,WAAW1pH,KAAKoyH,yBACxCpyH,KAAKoyH,6BAA0B/pH,GAG9BrI,KAAK2uH,eACN,OAGF,MAAM,OAAC1jH,EAAM,SAAEqE,GAAYtP,KAAK4wB,KAC1Bu1F,EAAenmH,KAAKmmH,aAEpB1sG,GAAYijC,KAAKC,MAAQ38C,KAAK4uH,iBAAmB,IAAO,EACxD+I,EAAW,IAAIC,KAAK,CAACF,GAAa,CAACr3H,KAAM,cAK/C+uH,GAAA,EAAqByI,OAAOH,GAAY,GAAM/zH,KAAK2G,IAGjD8kH,GAAA,EAAqBC,cAAa,GAGlCrvH,KAAKixD,mBAAmB6mE,SAAS7sH,EAAQ0sH,EAAU,CACjDI,gBAAgB,EAChB/R,SAAS,EACTvsG,WACA4N,SAAU/c,EAAO+c,SACjBi/F,UAAWh8G,EAAOgQ,IAClB6rG,eACA72G,WACAkuF,YAAY,IAGdx9F,KAAK2M,eAAc,GAAO,OAKhC,YAAiB3M,KAAKyuH,cAAckF,UAAW3zH,KAAKkxH,eAAgB,CAACr/G,eAAgB7R,KAAK6R,iBAC1F,YAAiB7R,KAAKyuH,cAAcrtH,UAAWpB,KAAKizH,cAAe,CAACphH,eAAgB7R,KAAK6R,iBAEzF7R,KAAKwxH,mBAAqB,OAAAx3F,GAAA,GAAS,IAAMh6B,KAAKg3H,YAAa,MAAM,GAAO,GAExEh3H,KAAKg4H,YAAc,YAAO,mEAC1Bh4H,KAAKg4H,YAAY32H,OAAO,YAAK,aAE7B,YAAiBrB,KAAKg4H,YAAa,KACjC,MAAM,WAACngC,GAAc73F,KACrB,QAAkBqI,IAAfwvF,EACD,OAGF,MAAM13F,EAASH,KAAKi4H,4BAA8B,aAAiB,CAACj4H,KAAKg4H,cAAc,GACjF/sH,EAASjL,KAAK4wB,KAAK3lB,OACnBulB,EAAaxwB,KAAK4wB,KAAKC,QAAQC,cAAc,IAC1C9wB,KAAK4wB,KAAK3lB,SAAWA,GAAUjL,KAAK63F,aAAeA,GAAc73F,KAAKi4H,8BAAgC93H,GAG/GH,KAAKixD,mBAAmB6mC,SAAS7sF,EAAOwL,gBAAYpO,EAAWwvF,GAAYl0F,KAAK,KAC3E6sB,MACDrwB,IACAH,KAAKi4H,iCAA8B5vH,EACnCrI,KAAKuuG,oBAGR,CAAC18F,eAAgB7R,KAAK6R,iBAEzB7R,KAAKyzH,iBAAiBpyH,OAAOrB,KAAKg4H,aAG7B,yBACLh4H,KAAKk4H,iBAAmB,YAAO,kEAAmE,CAAC/mH,KAAM,UACzGnR,KAAKyzH,iBAAiBpyH,OAAOrB,KAAKk4H,kBAElCl4H,KAAK6R,eAAehR,IAAIb,KAAKk4H,iBAA7Bl4H,CAA+C,QAAS,KACtD,MAAMiL,EAASjL,KAAK4wB,KAAK3lB,OAEzB,IAAI,GAAgBA,EAAQ,GAAG,EAAM,KACnCjL,KAAK4wB,KAAKoyE,aAAa7vD,UAGvB,MAAMglF,EAAen4H,KAAK4wB,KAAKoyE,aAAapyE,KACzCunG,EAAahzB,OAAOC,eACrB+yB,EAAahzB,OAAOC,cAAcgzB,uBAAuBj4H,QAAO,OAKtEH,KAAKg8F,UAAU97F,UAAUW,IAAI,eAGxB,OAAOmS,GAAU,GACtB,MAAMqlH,EAAsBr4H,KAAKs4H,yBACjC,IAAID,IAAwBr4H,KAAKm0D,eAAej0D,UAAUuV,SAAS,gBACjE,OAGF,GAAG4iH,IAAwBr4H,KAAKu4H,cAC9B,OAUF,MAAMjF,EAAuB+E,GAAuBr4H,KAAKu4H,cACnD9mE,IAAa4mE,EACbG,EAAmBx4H,KAAKu4H,cAC9B,IAAuC7kE,EAAnCnuC,EAAY,GAAIkzG,EAAe,GAEjC,MAAMC,EAAoBpF,EAAqB5uG,wBACzCi0G,EAAe34H,KAAKqzH,gBAAgB3uG,wBACpCivC,EAAYglE,EAAan1H,MACzBowD,EAAU8kE,EAAkBl1H,MAElC,GAAGmwD,IAAcC,EAAS,CACxB,MAAMglE,EAAQ,EAAsBjlE,EAC9BklE,GAAkBllE,EAAYC,GAAW,EAG/C,GAFAF,EAAiBglE,EAAkB/yG,KAAOgzG,EAAahzG,KAAOkzG,EAE3DpnE,IACDlsC,EAAY,cAAcmuC,eAA4BklE,KAGnDA,EAAQ,GAAG,CACZ,MAAME,EAAK,GACXL,EAAqBK,EAAKA,GAAM,EAAIF,GAAU,MAOtD54H,KAAKu4H,cAAgBF,EAErB,MAAM5+G,EAAWzG,EAAU,IAAM,EAMjC,OALA,aAAchT,KAAKm0D,eAAgB,eAAgB1C,EAAUh4C,GAC7D,aAAczZ,KAAKmzH,mBAAoB,6BAA8B1hE,GAAY4mE,GAAuBA,EAAoBn4H,UAAUuV,SAAS,uBAAwBgE,GACvKzZ,KAAKozH,YAAYjuH,MAAMogB,UAAYA,EACnCvlB,KAAKozH,YAAYjuH,MAAMszH,aAAeA,EAE/B,CACLlzG,YACAkzG,eACA/kE,eAAgB8kE,IAEVH,GACAA,EAAoBn4H,UAAUuV,SAAS,uBACvC+iH,IAAqBx4H,KAAKszH,sBACvBkF,EAAiBt4H,UAAUuV,SAAS,wBACrB,GAAlBi+C,EAAuBA,EAC7BC,YACAC,WAIG,cAAcikC,GAChB73F,KAAK63F,aAAeA,IAIvB73F,KAAK63F,WAAaA,EAClB73F,KAAK6zD,QAAO,IAGP,yBACL,OAAG7zD,KAAK4wB,KAAKolB,UAAUC,YACdj2C,KAAKszH,0BACgBjrH,IAApBrI,KAAK63F,aACZ73F,KAAK4wB,KAAK62E,WACQ,WAAnBznG,KAAK4wB,KAAKvwB,MACVL,KAAK4wB,KAAKmoG,sBAEH/4H,KAAKyzH,sBALP,EA8CF,eAAer3F,GACpB,MAA0B,cAAnBp8B,KAAK4wB,KAAKvwB,MAAwBL,KAAKogH,gBAAgBhkF,IAAW,IAASA,KAAY,GAiCzF,iBACL,IAAIp8B,KAAKo1H,kBACP,OAGF,MAAMl+G,EAASlX,KAAKixD,mBAAmB4oB,cAAc75E,KAAK4wB,KAAK3lB,QACzD3C,EAAQ4O,aAAM,EAANA,EAAQg3F,aAItB,GAHAluG,KAAKo1H,kBAAkBxnG,UAAY,IAAMtlB,GAAS,IAClDtI,KAAKo1H,kBAAkBl1H,UAAUC,OAAO,aAAcH,KAAKsuH,wBAAwBhiF,iBAAiBtsC,KAAK4wB,KAAK3lB,QAAQ,IAEnHjL,KAAKs1H,sBAA2C,SAAnBt1H,KAAK4wB,KAAKvwB,KAAiB,CACzD,MAAM24H,MAAiB9hH,aAAM,EAANA,EAAQ+hH,yBAAyB/hH,EAAOg3F,cAC/DluG,KAAKs1H,qBAAqB1nG,UAAYorG,EAAc,GAAM9hH,EAA4B,sBAAI,GAC1FlX,KAAKq1H,aAAan1H,UAAUC,OAAO,aAAc64H,IAI9C,YACL,IAAIh5H,KAAK4wB,KAAK3lB,QAAUjL,KAAKuxH,WAAgC,cAAnBvxH,KAAK4wB,KAAKvwB,KAAsB,OAE1E,MAAM,MAACsE,EAAK,SAAEu5C,GAAY,OAAA2lE,GAAA,GAAa7jH,KAAKylH,kBAAkBrlH,OAE9D,IAAI22H,GACDpyH,EAAMhD,QAAU3B,KAAKmmH,gBACtB4Q,EAAQ,CACN3rH,EAAG,eACHohB,KAAM,cAAM,GAAQxsB,KAAKquH,kBAAkB9xE,iBAC3Cx0C,QAASpD,EACTu5C,SAAUA,EAASv8C,OAASu8C,OAAW71C,EACvCkW,OAAQ,CACN26G,WAAYl5H,KAAKixH,WAEnBlsB,gBAAiB/kG,KAAKmmH,eAI1BnmH,KAAKqgG,iBAAiB84B,UAAUn5H,KAAK4wB,KAAK3lB,OAAQjL,KAAK4wB,KAAKthB,SAAUynH,GAGjE,UAGL/2H,KAAK6R,eAAeO,YAGf,QAAQgnH,GAAY,GACrBp5H,KAAK4wB,KAAK3lB,SACZjL,KAAKg8F,UAAU72F,MAAMC,QAAU,OAC/BpF,KAAKuzH,UAAUrzH,UAAUW,IAAI,SAG/BotD,KAEAjuD,KAAKwuH,aAAe,EACpBxuH,KAAK63F,gBAAaxvF,EAEfrI,KAAKi4H,8BACNj4H,KAAKi4H,8BACLj4H,KAAKi4H,iCAA8B5vH,GAGlCrI,KAAK68F,eACN78F,KAAKq5H,aACLD,GAAap5H,KAAKqkH,eAIf,SAAS0S,EAAwBuC,GAAa,EAAMvV,GAAQ,GACjE,SAAKA,IAAU,OAAAzB,GAAA,GAAatiH,KAAK68F,eAAqC,cAAnB78F,KAAK4wB,KAAKvwB,QAEzD02H,IACFA,EAAQ/2H,KAAKqgG,iBAAiBk5B,SAASv5H,KAAK4wB,KAAK3lB,OAAQjL,KAAK4wB,KAAKthB,YAyBlEtP,KAAKylH,kBAAkB9gH,QAAUoyH,EAAMyC,UAAYx5H,KAAKmmH,eAAiB4Q,EAAMhyB,mBAE/Eu0B,GACDt5H,KAAKqkH,cAGPrkH,KAAKixH,UAAY8F,EAAMx4G,OAAO26G,WAC3BnC,EAAMhyB,iBACP/kG,KAAK2nG,iBAAiBovB,EAAMhyB,iBAG9B/kG,KAAKy5H,cAAc1C,EAAMyC,SAAUF,EAAYA,IACxC,IAlCAvV,IAIE/jH,KAAK4wB,KAAKxvB,UAAUlB,UAAUuV,SAAS,qBACxCzV,KAAKsU,IAGPtU,KAAKylH,kBAAkBiU,UAAUjpG,YAAc,GAC/CzwB,KAAKylH,kBAAkBqR,aAAY,IAEjC92H,KAAK4wB,KAAKC,QAAQowE,sBAAwB57F,QAAQ6E,WAA4BvG,KAAK,KACnF,aAAQ,KACN3D,KAAK2M,sBAKJ,IAmBN,iBAAiBkrF,GACtB,MAAM5sF,EAASjL,KAAK4wB,KAAK3lB,QAEnB,gBAACioH,EAAe,aAAEsC,EAAY,cAAEE,EAAa,SAAE3T,EAAQ,UAAEwR,EAAS,UAAEv3B,EAAS,gBAAE44B,EAAe,kBAAEe,GAAqB31H,KAC3Hg8F,EAAU72F,MAAMC,QAAU,GAE1B,MAAMm3B,EAAcv8B,KAAKwwF,gBAAgBj0D,YAAYtxB,GAmBrD,GAlBAsoH,EAAUrzH,UAAUC,OAAO,eAAgBo8B,GAC3Cg3F,EAAUrzH,UAAUoE,OAAO,QAExBtE,KAAKo1H,mBACNp1H,KAAKooG,iBAGe,WAAnBpoG,KAAK4wB,KAAKvwB,MACX27F,EAAU97F,UAAUC,OAAO,UAAWH,KAAKwwF,gBAAgB6pB,cAAcpvG,IAIxEioH,IACDlzH,KAAKu0H,0BAA2B,EAChCrB,EAAgBgB,YAAY58F,cAAc1xB,kBAAiB,GAC3DstH,EAAgBvnG,WAAW2L,cAAc1xB,kBAAiB,IAGzD4vH,EAAc,CACfA,EAAat1H,UAAUW,IAAI,QAC3B,MAAM2vB,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBACrC9wB,KAAKixD,mBAAmBolD,qBAAqBprG,GAAQtH,KAAKsI,IACpDukB,KACJglG,EAAat1H,UAAUC,OAAO,QAAS8L,EAAKtK,UAQhD,GAJG3B,KAAK20H,mBACN30H,KAAK25H,aAAa,MAAM,GAAO,GAG9BhE,IACD31H,KAAK45H,oBAAiBvxH,EACtBrI,KAAKqxH,YAAYlxH,QAAO,OAAMkI,GAAW,GACzCrI,KAAKsxH,yBAAwB,GAC7BqE,EAAkBrxH,SACftE,KAAKwwF,gBAAgBke,MAAMzjG,IAAS,CACrC,MAAM8L,EAAS9L,EAAOwL,WAChB+Z,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBAC/B+oG,EAAoB75H,KAAKogG,kBAAkB9pB,WAAWv/D,GAC5D,OAAA48B,GAAA,GAAYkmF,EAAoBxjD,IAC1B7lD,KACJxwB,KAAK85H,kBAAkBzjD,IAAYwjD,aAA6Bx0H,YAKnEuvH,IACE50H,KAAKi1H,eACNj1H,KAAKi1H,aAAa3wH,SAClBtE,KAAKi1H,kBAAe5sH,GAGtBusH,EAAgBtwH,SAChBtE,KAAK+5H,kBAAe1xH,EACpBrI,KAAKg6H,2BAAwB3xH,EAE7BrI,KAAKi3H,cAAa,IAGjBvB,GACDA,EAAcviF,QAAQloC,GAGrB82G,GACDA,EAASgB,UAAU93G,GAGlBjL,KAAK68F,aACN78F,KAAKi6H,qBACGj6H,KAAKk4H,kBACbl4H,KAAKk4H,iBAAiB72H,OAAO,YAAKrB,KAAKwwF,gBAAgB6pB,cAAcr6G,KAAK4wB,KAAK3lB,QAAU,sBAAwB,yBAMnHjL,KAAK63F,WAAaA,EAElB73F,KAAK6zD,QAAO,GAGN,aAAaxzD,EAAyBoxD,EAAmBs4D,EAAyB1mB,GACrFhjG,EACDL,KAAK20H,kBAAkBztH,QAAQotB,OAASj0B,SAEjCL,KAAK20H,kBAAkBztH,QAAQotB,OAGxC,aAAct0B,KAAK20H,kBAAmB,aAAcljE,EAAUs4D,EAAgB,EAAI,SAAK1hH,EAAWg7F,GAG5F,kBAAkBhtB,EAA6B0zC,GACrD/pH,KAAK45H,eAAiBvjD,EAASgjC,UAAYhjC,EAASgjC,SAAS6S,SAASvqH,OACtE3B,KAAKsxH,wBAAwBvH,GAGvB,wBAAwBA,GAC9B,MAAM,kBAAC4L,EAAiB,eAAEiE,GAAkB55H,KAEtCo9B,IAASw8F,GAAkB55H,KAAKsiH,eACtC,IAAIsX,EAAgB,CAClB,IAAIjE,EAAkB50H,cACpB,OAGF40H,EAAkBrxH,SAGpB,MAAMmtD,EAAWr0B,EACXimE,EAAUsyB,EAAkB50H,cAAgB,EAAI,EAElD40H,EAAkB50H,eACpBf,KAAK20H,kBAAkB3zH,QAAQ20H,GAGjC31H,KAAK25H,aAAa,WAAYloE,EAAUs4D,EAAe1mB,GAGjD,oBAAoBhtF,GAC1B,MAAMglB,EAAmChlB,EAAQ5J,IAAI,CAACstH,EAAc/xH,KAClE,MAAMilD,EAActsD,SAASC,cAAc,OAErCovB,EAAWrvB,SAASC,cAAc,OAexC,OAdAovB,EAAS9vB,UAAUW,IAAI,0BACpBk5H,EAAah4F,SACd/R,EAAS3uB,OAAO,YAAK,gCACb04H,IAAiB/5H,KAAK4wB,KAAK3lB,OACnC+kB,EAAS3uB,OAAO,YAAK,8BAErB2uB,EAAS3uB,OAAOrB,KAAKogG,kBAAkB/8D,qBAAqB02F,EAAah/F,aAG3EkyB,EAAY5rD,OACV,IAAI,KAAU,CAAC4J,OAAQ8uH,IAAeh/G,QACtCiV,GAGK,CACL0xB,QAAS15C,EAAM,KACb,MAAMkyH,EAAgBl6H,KAAK4wB,KAAK3lB,OAChC,GAAGivH,EAAchzF,YAAa,CAC5B,MAAMizF,EAAcn6H,KAAKogG,kBAAkB/2D,kBAAkB6wF,EAAcn/F,YAC3E,GAAGo/F,EAAa,CACdA,EAAYC,gBAAkBp6H,KAAKwwF,gBAAgB6nB,cAAc0hB,GACjE/5H,KAAK+5H,aAAeA,EACpB/5H,KAAKq6H,mBAAmBN,GACxB/5H,KAAKs6H,gCAEL,MAAM9pG,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBAC/BypG,EAAuB,KAC3B,GAAGv6H,KAAK+5H,eAAiBA,IAAiBvpG,IAAc,OACxD,MAAMna,EAAUrW,KAAKw6H,cAAc70H,QACnC,OAAAsO,EAAA,GAAiBoC,EAAS0jH,GAC1B1jH,EAAQ/M,QAAQywH,GAChB/5H,KAAKy6H,oBAAoBpkH,IAGxBzJ,EAAA,EAAU+2B,SAASC,kBACpB9zB,WAAWyqH,EAAsB,KAEjCA,KAMN,KAAW3/F,UAAU,6BAA8B,CACjD0L,KAAMtmC,KAAKwwF,gBAAgBvZ,iBAAiBijD,GAC5CQ,QAAS16H,KAAKwwF,gBAAgBvZ,iBAAiB8iD,WAE/C1xH,EACJ4kD,iBAIEgQ,EAAU,GAAW5hC,GAC3BA,EAAQ9wB,QAAQ,CAACmZ,EAAQ1b,KACvB,MAAMiD,EAASoL,EAAQrO,GACjBgnC,EAAS,IAAI,GACnBA,EAAO9uC,UAAUW,IAAI,YAAa,sBAClCmuC,EAAOnY,kBAAkB,CAAC5rB,WAEtBjD,GACFgnC,EAAO9uC,UAAUW,IAAI,UAGvB6iB,EAAO3I,QAAQ/Z,QAAQguC,KAGzB7iC,MAAMC,KAAKpM,KAAKk1H,cAAc3kG,UAAU5qB,MAAM,GAAG4E,QAAQ2gH,GAAQA,EAAK5mH,UACtEtE,KAAKk1H,cAAc7zH,UAAU8K,MAAMC,KAAK6wD,EAAQ1sC,WAG1C,mBAAmBwpG,EAAsBhQ,GAC/C,MAAMgL,EAAiB/0H,KAAKi1H,aAC5B,GAAGF,GACEA,EAAe9pH,SAAW8uH,EAC3B,OAIAhF,IACFhL,GAAgB,GAGlB,IAAI1mB,EAAU0mB,EAAgB,EAAI,EAClC,MAAMtwG,EAAWswG,EAAgB,EAn0CF,IAo0CzB/6E,EAAShvC,KAAKi1H,aAAe,IAAI,GACvCjmF,EAAO9uC,UAAUW,IAAI,6BAA8B,aACnDmuC,EAAOnY,kBAAkB,CACvB2E,UAAU,EACVvwB,OAAQ8uH,IAGV,aAAc/qF,EAAQ,cAAc,EAAMv1B,OAAUpR,EAAWg7F,GAC5D0xB,GACD,aAAcA,EAAgB,cAAc,EAAOt7G,EAAU,KAC3Ds7G,EAAezwH,UACd++F,GAGLrjG,KAAK40H,gBAAgBvzH,OAAO2tC,GAGtB,mBAEN,OAAO,OAAA2E,GAAA,GAAY3zC,KAAKogG,kBAAkBu6B,eAAe36H,KAAK4wB,KAAK3lB,OAAO8vB,YAAco/F,GAC/EA,EAAYC,gBAAkBp6H,KAAKwwF,gBAAgBnqD,UAAU8zF,EAAYC,sBAAmB/xH,GAI/F,aAAa0hH,GACnB,MAAM9+G,EAASjL,KAAK4wB,KAAK3lB,OACzB,IAAIA,EAAOi8B,aAAelnC,KAAKg6H,sBAC7B,OAGF,MAAMxpG,EAAaxwB,KAAK4wB,KAAKC,QAAQC,cAAc,KACzC9wB,KAAKg6H,uBAAyBh6H,KAAKg6H,wBAA0BA,IAGjE,gBAACpF,GAAmB50H,KACpBkW,EAASjL,EAAO8vB,WAChBzwB,EAAStK,KAAK46H,mBAGjBtwH,aAAkBjF,UACnB0kH,OAAgB1hH,GAGlB,MAAMwyH,EAAqB,OAAAlnF,GAAA,GAAYrpC,EAASyvH,IAC9C,IAAIvpG,UAAiCnoB,IAAjB0xH,EAA4B,OAEhD/5H,KAAK+5H,aAAeA,EACpB/5H,KAAKq6H,mBAAmBN,EAAchQ,GACtC/pH,KAAKs6H,gCAELt6H,KAAKugG,gBAAgBu6B,UAAU5kH,GAAQvS,KAAK62D,IAC1C,IAAIhqC,IAAc,OAElB,MAAMna,EAAUmkD,EAAM/tD,IAAK65B,GAAStmC,KAAKwwF,gBAAgBnqD,UAAUC,IACnEtmC,KAAKw6H,cAAgBnkH,EAAQ1Q,QAE7B,OAAAsO,EAAA,GAAiBoC,EAAS0jH,GAC1B1jH,EAAQ/M,QAAQywH,GAChB/5H,KAAKy6H,oBAAoBpkH,KAG3B,IAAIgtF,EAAU,EACVuxB,EAAgB7zH,gBAClBf,KAAK20H,kBAAkB3zH,QAAQ4zH,GAC/BvxB,EAAU,GAGZrjG,KAAK25H,aAAa,MAAM,EAAM5P,EAAe1mB,GAE7CrjG,KAAKg6H,2BAAwB3xH,IAGzB2xH,EAAwBh6H,KAAKg6H,sBAAwB30H,QAAQ6E,QAAQ2wH,GAC3E,OAAOb,EAGD,gCACN,MAAMp4H,EAAI,IAAKghH,QAAQjvG,IAAI3T,KAAK68F,cAChC,GAAGj7F,EAAG,CACJ,MAAM,OAACqJ,EAAM,SAAEqE,GAAYtP,KAAK4wB,KAChC,IAAIxpB,EAEFA,EADCkI,EACK,UACEtP,KAAKwwF,gBAAgBj0D,YAAYtxB,GACnC,wBACyB5C,IAAtBrI,KAAK+5H,cAA8B/5H,KAAK+5H,eAAiBntH,EAAA,EAAU+R,MAC5E3e,KAAKixD,mBAAmB8pE,mBAAmB9vH,GACrC,kBAEA,UAGRrJ,EAAEg8E,iBAAiB,CAACx2E,SAIjB,qBACL,MAAM,UAAC40F,EAAS,WAAEk6B,EAAU,aAAEr5B,GAAgB78F,MACxC,OAACiL,EAAM,SAAEqE,GAAYtP,KAAK4wB,KAC1By/E,EAAWrwG,KAAK4wB,KAAK62E,UACVzL,EAAU97F,UAAUuV,SAAS,gBACxB46F,IAEpBrU,EAAU97F,UAAUW,IAAI,iBACxBm7F,EAAU97F,UAAUC,OAAO,aAAckwG,GACpCrU,EAAUxrD,WACfwrD,EAAU97F,UAAUoE,OAAO,kBAG7BtE,KAAKs6H,gCAEL,MAAM1sF,EAAU5tC,KAAK+1H,kBAAkBnqH,OAAO8X,IAC5C,MAAM+oC,EAAO/oC,EAAO5I,OAAO7P,EAAQqE,GAEnC,OADAoU,EAAO3I,QAAQ7a,UAAUC,OAAO,QAASssD,GAClCA,IAGL4jD,GAGFxT,EAAat8F,aAAa,kBAAmB,QAC7CP,KAAKi4F,cAAS5vF,GAAW,GAErBw0F,EAAaruF,WACfxO,KAAKylH,kBAAkBqR,eANzBj6B,EAAalyD,gBAAgB,mBAU/BurF,EAAWx/F,gBAAgB,YAAakX,EAAQjsC,QAChDu0H,EAAWh2H,UAAUC,OAAO,gBAAiBytC,EAAQjsC,QACrD3B,KAAK0xH,gBAGC,0BACN,MAAMsJ,EAAgBh7H,KAAKylH,kBAC3BzlH,KAAKylH,kBAAoB,IAAI,IAAW,CACtC90G,YAAa,UACbnQ,KAAM,UACNwS,SAAS,IAGXhT,KAAKylH,kBAAkBrlH,MAAMF,UAAUwF,QAAQ,oBAAqB,uBACpE1F,KAAKylH,kBAAkBiU,UAAUx5H,UAAUwF,QAAQ,oBAAqB,uBACxE1F,KAAK68F,aAAe78F,KAAKylH,kBAAkBrlH,MAC3CJ,KAAK68F,aAAa38F,UAAUW,IAAI,gBAChCb,KAAKi7H,8BAEF,MACD,OAAAC,GAAA,GAA6Bl7H,KAAK68F,cAGjCm+B,GACDA,EAAc56H,MAAMgtB,YAAYptB,KAAKylH,kBAAkBrlH,OACvD46H,EAActB,UAAUtsG,YAAYptB,KAAKylH,kBAAkBiU,YAE3D15H,KAAKm1H,sBAAsB9zH,OAAOrB,KAAKylH,kBAAkBrlH,MAAOJ,KAAKylH,kBAAkBiU,WAInF,8BACN15H,KAAK6R,eAAehR,IAAIb,KAAK68F,aAA7B78F,CAA2C,UAAYD,IACrD,MAAMqH,EAAMrH,EAAEqH,IACd,GAAG,OAAA+zH,GAAA,GAAsBp7H,GACvB,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAK+4F,mBACA,GAAGh5F,EAAEwH,SAAWxH,EAAEuH,QACvBtH,KAAKiwH,uBAAuBlwH,QACvB,IAAY,WAARqH,GAA4B,aAARA,KAAwBrH,EAAEyH,SAGvD,GAFAzH,EAAE0H,iBAES,WAARL,EAAkB,CACnB,MAAM/E,EAAQ1B,SAASyB,cACjBI,EAAMN,OAAOC,eAEnBE,EAAM+4H,SAASp7H,KAAK68F,aAAa3P,WAAW,IAAMltF,KAAK68F,aAAc,GACrEx6F,EAAME,UAAS,GAEfC,EAAIC,kBACJD,EAAIE,SAASL,QAEb,OAAAR,GAAA,GAAgB7B,KAAK68F,gBAKxB,MACD,YAAiB78F,KAAK68F,aAAe98F,IACnCC,KAAKgjG,aAAa/wF,UAAU,GAE5B,GAAkB9R,QAAO,IACxB,CAAC0R,eAAgB7R,KAAK6R,iBA8B3B7R,KAAK6R,eAAehR,IAAIb,KAAK68F,aAA7B78F,CAA2C,QAASA,KAAKswH,gBACzDtwH,KAAK6R,eAAehR,IAAIb,KAAK68F,aAA7B78F,CAA2C,QAAS,KAClDA,KAAKyxH,sBAGe,SAAnBzxH,KAAK4wB,KAAKvwB,MAAsC,eAAnBL,KAAK4wB,KAAKvwB,MACxCL,KAAK6R,eAAehR,IAAIb,KAAK68F,aAA7B78F,CAA2C,UAAW,KACjDA,KAAK4wB,KAAKC,QAAQthB,WAAWxG,UAAU2c,QACxC1lB,KAAKixD,mBAAmBoqE,eAAer7H,KAAK4wB,KAAK3lB,OAAQjL,KAAK4wB,KAAKthB,YAqCpE,cAAcjP,EAAoBq4D,GACvC,MAEM4iE,EAAsE,CAC1EC,KAAM,OACNC,OAAQ,SACRC,UAAW,YACXC,cAAe,gBACfC,UAAW,IAAMh7H,SAASk4B,YAAY,YAAY,EAP7B,yBAQrBoE,KAAMy7B,EAAO,IAAM/3D,SAASk4B,YAAY,cAAc,EAAO6/B,GAAQ,IAAM/3D,SAASk4B,YAAY,UAAU,EAAO,MACjHsqE,QAAS,IAAMxiG,SAASk4B,YAAY,YAAY,EAR7B,YAWrB,IAAIyiG,EAAYj7H,GACd,OAAO,EAGT,MAAMgsH,EAAUiP,EAAYj7H,GAItBu7H,EAAe57H,KAAK4vH,yBACpBiM,EAAkB,GAuCxB,GAFAA,EAAStyH,KAAK5I,SAASk4B,YAAY,gBAAgB,EAAO,SAE9C,cAATx4B,GAAiC,YAATA,EAAoB,CAC7C,IAAIy7H,GAAe,EAGnB,MAAM9lF,EAAY9zC,OAAOC,eACzB,IAAI6zC,EAAU+lF,YAAa,CACzB,MAAM15H,EAAQ2zC,EAAUmnD,WAAW,GAC7B6+B,EAAM,KAAa37H,GAEnB6qH,EAAO7oH,EAAM45H,yBACf/Q,EAAK3xE,WAA2BtuB,QAAQ+wG,EAAIzjH,QAAW2yG,aAAgB1/F,aAAe0/F,EAAKjgG,QAAQ+wG,EAAIzjH,UACzGujH,GAAe,GAMhBA,EACDD,EAAStyH,KAAKvJ,KAAKoxH,0BAEnByK,EAAStyH,KAAyB,mBAAd,EAA2B8iH,IAAY1rH,SAASk4B,YAAYwzF,GAAS,EAAO,YAGlGwP,EAAStyH,KAAyB,mBAAd,EAA2B8iH,IAAY1rH,SAASk4B,YAAYwzF,GAAS,EAAO,OAWlG,OARAwP,EAAStyH,KAAK5I,SAASk4B,YAAY,gBAAgB,EAAO,UAG1D+iG,IACG57H,KAAKgjG,aAAamtB,eACnBnwH,KAAKgjG,aAAamtB,cAAc+L,yBAG3B,EAGD,yBACN,OAAOv7H,SAASk4B,YAAY,YAAY,EAAO,UA8L1C,cAAcsjG,EAAoBC,EAA8BC,GAAW,GAChF,MAAO13H,MAAO23H,EAAS,SAAEjR,EAAQ,SAAEntE,GAAYssE,GAAsBxqH,KAAK68F,cACpE5xC,EAAMogE,GAAY,EAAIA,EAAWiR,EAAU36H,OAC3CupB,EAASoxG,EAAUhR,OAAO,EAAGrgE,GAC7Bi5B,EAASo4C,EAAUhR,OAAOrgE,GAE1BhgC,EAAUoxG,EAAWnxG,EAAO3S,MAAM,GAAUgkH,uBAAyB,KAErEC,EAAavxG,EAAUA,EAAQ/F,OAAS+F,EAAQ,GAAGtpB,OAASspB,EAAQ,GAAGtpB,QAAUupB,EAAOvpB,OAExF86H,EADYvxG,EAAOvlB,MAAM,EAAG62H,GACLL,EAAaj4C,EAGpCw4C,EAAc,IAAkB/L,cAAc2L,GACpD,IAAkB5L,cAAcxyE,EAAUw+E,GAG1C,MAAMC,EAAeP,EAAev3H,KAAKJ,IAAI23H,EAAaz6H,OAAQw6H,EAAWx6H,QAAUw6H,EAAWx6H,OAC5Fi7H,EAA+B,GAClCR,IACDQ,EAAYrzH,KAAK6yH,GACjBA,EAAa9nG,OAASkoG,GAIxB,MAAM/mG,EAAOxK,EAAU0xG,EAAe1xG,EAAQ,GAAGtpB,OAASg7H,EAC1Dz+E,EAAS3zC,QAAQmtD,IACZA,EAAOpjC,QAAUkoG,IAClB9kE,EAAOpjC,QAAUmB,KAIrB,IAAkBi7F,cAAcxyE,EAAU0+E,GAEqB,CAC7D,MAAMC,EAAgD,CACpDzxH,EAAG,qBACHkpB,OAAQkoG,EAAaG,EACrBh7H,OAAQ,GAGV,IAAIm7H,EAAqB,EACzB,IAAI,IAAIn7H,EAASu8C,EAASv8C,OAAQm7H,EAAqBn7H,IAAUm7H,EAAoB,CAEnF,GADe5+E,EAAS4+E,GACdxoG,OAASuoG,EAAYvoG,OAC7B,MAIJ4pB,EAAS91C,OAAO00H,EAAoB,EAAGD,GAKzC,MAAMl4H,EAAQ,OAAA+0E,GAAA,GAAuB,IAAkBC,cAAc8iD,EAAU,CAACv+E,cAChFl+C,KAAKylH,kBAAkB7/G,iBAAiBjB,GAAO,GAE/C,MAAMo4H,EAAQ/8H,KAAK68F,aAAappF,cAAc,iBAC3CspH,KCtgEQ,SAAoB7R,GAGjC,MAAM8R,EAAe9R,EAGrB,GAAqB,KAFrBA,EAAOA,EAAK+R,iBAEJzpC,SAAgB,CACtB,MAAM0pC,EAAUv8H,SAASw8H,eAAe,IACxCjS,EAAK3xE,WAAWt4C,aAAai8H,EAAUF,EAAa77H,aAAe67H,EAAa77H,YAAYqyF,WAAa03B,EAAK13B,SAA0BwpC,EAAa77H,YAA5B67H,GACzH9R,EAAOgS,EAGT,GAAGh7H,OAAOC,cAAgBxB,SAASyB,YAAa,CAC9C,MAAMC,EAAQ1B,SAASyB,cACpB8oH,IACD7oH,EAAM+6H,cAAclS,GACpB7oH,EAAMg7H,WAAWnS,GACjB7oH,EAAM+4H,SAASlQ,EAAMA,EAAKz3B,UAAU9xF,SAGtCU,EAAME,UAAS,GAEf,MAAMC,EAAMN,OAAOC,eACnBK,EAAIC,kBACJD,EAAIE,SAASL,ID++DXi7H,CAAWP,GACXA,EAAMz4H,UAIRtE,KAAKswH,iBAWC,kBAAkB3rH,EAAgB0mH,EAAmBntE,GAG3D,QAAa71C,IAAV1D,EAAqB,CACtB,MAAMohB,EAAIykG,GAAsBxqH,KAAKylH,kBAAkBrlH,OAAO,GAC9DuE,EAAQohB,EAAEphB,MACV0mH,EAAWtlG,EAAEslG,SACbntE,EAAWn4B,EAAEm4B,SAOf,IAJiB,IAAdmtE,IACDA,EAAW1mH,EAAMhD,aAGH0G,IAAb61C,EAAwB,CACzB,MAAMq/E,EAAS,IAAkB9M,cAAc9rH,EAAOu5C,GAAU,GAChEA,EAAW,IAAkBwyE,cAAcxyE,EAAU,IAAkByyE,cAAc4M,IAKvF,GAFA54H,EAAQA,EAAMgB,MAAM,EAAG0lH,GAEpBrrH,KAAK62H,gBAAkBlyH,EACxB,OAGF3E,KAAK62H,cAAgBlyH,EAErB,MAAMsmB,EAAUtmB,EAAM4T,MAAM,GAAUgkH,uBACtC,IAAIiB,EACJ,GAAGvyG,EAAS,CACV,MAAMysC,EAASxZ,EAAS,GAExB,IAAI9uC,EAAQ6b,EAAQ,GACpB,MAAMugG,EAAYp8G,EAAM,GAExB,GAAGpP,KAAKq2H,gBACNzpH,EAAA,EAAU+2B,SAASyyD,SAASqnC,SAC5Bz9H,KAAK4wB,KAAK62E,QAAQ,kBACJ,wBAAd/vC,aAAM,EAANA,EAAQtsD,IAA8BssD,EAAO/1D,SAAWgD,EAAMhD,SAAW+1D,EAAOpjC,OAChFkpG,EAAcx9H,KAAKq2H,eACnBr2H,KAAKq2H,eAAeqH,cAAc/4H,QAC7B,GAAiB,MAAd6mH,EAAmB,CAC3B,MAAMoB,EAAW5sH,KAAK4wB,KAAKthB,SAAWtP,KAAKsgG,sBAAsB13C,mBAAmB5oD,KAAK4wB,KAAKthB,eAAYjH,EACvGrI,KAAKw2H,eAAepI,WAAWh/G,EAAOpP,KAAK4wB,KAAK3lB,OAAO82B,SAAW,KAAe/hC,KAAK4wB,KAAK3lB,OAAQ2hH,KACpG4Q,EAAcx9H,KAAKw2H,qBAEZvrG,EAAQ,IAAoB,MAAdugG,EAIf5+G,EAAA,EAAU+2B,SAAS6iB,MAAMi3E,UACjCruH,EAAQA,EAAM1J,QAAQ,OAAQ,IAC1Bf,EAAM4T,MAAM,mBAAsB5T,EAAM4T,MAAM,uBAAwBnJ,IACxEouH,EAAcx9H,KAAKs2H,YACnBt2H,KAAKs2H,YAAYlI,WAAWh/G,EAAOo8G,KAPlCxrH,KAAKu2H,eAAenI,WAAWh/G,EAAOpP,KAAK4wB,KAAK3lB,UACjDuyH,EAAcx9H,KAAKu2H,gBAWzBiH,EAAcx9H,KAAK29H,wBAAwBh5H,EAAO64H,GAElDx9H,KAAKo2H,6BAA6BpM,iBAAiBwT,GAG7C,wBAAwB74H,EAAe64H,GAC7C,IAAII,GAAkB,EAEtB,IAAIJ,EAAa,CACf,MAAMK,EAAcl5H,EAAM4T,MAAM,4BAChC,GAAGslH,EAAa,CACd,MAAMnjG,EAAWmjG,EAAY,GACvBzuH,EAAQzK,EAAMgB,MAAMk4H,EAAY,GAAGl8H,QACzCi8H,EAAkBC,EAAY,GAAGl8H,SAAWgD,EAAMhD,OAElD67H,EAAcx9H,KAAKy2H,aAEfz2H,KAAK89H,aAKP,aAAc99H,KAAK89H,aAAc,QAAQ,EAAM,MAJ/C99H,KAAK89H,aAAe,EAAW,8CAA+C,CAACrsH,UAAU,IACzF,aAAazR,KAAK89H,cAAc,GAChC99H,KAAKm1H,sBAAsBp0H,cAAcE,aAAajB,KAAK89H,aAAc99H,KAAKm1H,sBAAsBh0H,cAKtGnB,KAAKy2H,aAAarI,WAAWpuH,KAAK4wB,KAAK3lB,OAAQyvB,EAAUtrB,GAAOzL,KAAK,EAAE4nC,OAAM8Z,oBACxEu4E,GAAmBryF,EAAKwsD,yBACzB/3F,KAAK68F,aAAa31F,QAAQ62H,kBAAoBxyF,EAAKwsD,wBAGrD1yC,EAAc1hD,KAAK,KACjB,aAAc3D,KAAK89H,aAAc,QAAQ,EAAO,SAEjDptH,MAAMuZ,GAAA,IAcb,OAVI2zG,UACK59H,KAAK68F,aAAa31F,QAAQ62H,kBAGhCP,IAAgBx9H,KAAKy2H,cACnBz2H,KAAK89H,cACN,aAAc99H,KAAK89H,aAAc,QAAQ,EAAO,KAI7CN,EAGD,aAAa74H,GAChB3E,KAAKgzD,YAAcruD,IAItB,aAAc3E,KAAKg8F,UAAW,eAAgBr3F,EAAO,KACrD3E,KAAKgzD,UAAYruD,EACjB3E,KAAK0xH,iBA+LC,yBACN,GAAG1xH,KAAKg+H,qBAAsB,OAC9Bh+H,KAAKg+H,sBAAuB,EAE5B,MAAMnM,EAAa,OAAA/wG,GAAA,GAAK9gB,KAAK6xH,YACvBV,EAAanxH,KAAKmxH,WACxBnxH,KAAKqkH,cACLrkH,KAAK0xH,gBACL,IAAInzF,GAAW,EACD,IAAI,GAAaszF,EAAY,KACzCtzF,GAAW,IAGPj9B,iBAAiB,QAAS,KAC9BtB,KAAKg+H,sBAAuB,EAExBz/F,GACF4yF,MAKC,WAAW8M,GAAc,EAAMC,GAAY,EAAMC,EAAa,IACnE,GAAGx9H,SAASqB,gBAAkBhC,KAAK68F,cAAgB,KAAkB,CACnE,MAAMj7F,EAAIjB,SAASC,cAAc,SACjCD,SAASgC,KAAKtB,OAAOO,GACrB,OAAAw8H,GAAA,GAAqBx8H,GACrB5B,KAAKylH,kBAAkB7/G,iBAAiBu4H,GACxC,OAAAC,GAAA,GAAqBp+H,KAAK68F,cAC1Bj7F,EAAE0C,cAEFtE,KAAKylH,kBAAkB7/G,iBAAiBu4H,GAGvC,OAODn+H,KAAK8uH,gBAAkB,GACvB9uH,KAAK+uH,YAAYptH,OAAS,EAC1B3B,KAAKgvH,gBAAgBrtH,OAAS,EAC9B3B,KAAKivH,gBAAkB,IAGzB,IAAIz0G,GAAM,EACPyjH,IACDzjH,EAAMxa,KAAKi4F,cAAS5vF,GAAW,KAG7BmS,GAAO0jH,GACTl+H,KAAKswH,iBAIF,eACL,OAAO,OAAAhO,GAAA,GAAatiH,KAAK68F,cAGpB,gBACL,IAAI1rF,EAEJ,MAAMmxG,EAAetiH,KAAKsiH,eAEPnxG,EAAhBnR,KAAKuxH,UAAkB,QACjBvxH,KAAKmvH,UAAYnvH,KAAKgzD,YAAcsvD,GAAgBtiH,KAAK6xH,WAAsC,cAAnB7xH,KAAK4wB,KAAKvwB,KAAuB,WAAa,OACvH,SAEZ,CAAC,OAAQ,SAAU,OAAQ,YAAYkK,QAAQ3I,IAC7C5B,KAAK22H,QAAQz2H,UAAUC,OAAOyB,EAAGuP,IAASvP,KAGzC5B,KAAKw1H,cACNx1H,KAAKw1H,aAAat1H,UAAUC,OAAO,OAAQmiH,GAG1CtiH,KAAKy1H,sBACNz1H,KAAKy1H,qBAAqBv1H,UAAUC,OAAO,OAAQmiH,GAIhD,cAAc+W,GAAa,EAAMgF,GAChB,cAAnBr+H,KAAK4wB,KAAKvwB,MACXL,KAAKixD,mBAAmBoqE,eAAer7H,KAAK4wB,KAAK3lB,OAAQjL,KAAK4wB,KAAKthB,UAAU,GAG/EtP,KAAKsgH,kBAAej4G,EACpBrI,KAAK8iH,gBAAaz6G,EAElB,MAAM1D,EAAQ3E,KAAKylH,kBAAkB9gH,MACpB,IAAkBgsH,cAAchsH,GACkBiH,OAAO8rD,GAAuB,uBAAbA,EAAOtsD,GAC7Eb,QAAQmtD,IACpB,MAAMlR,EAAQ,aAAoBkR,EAAO4mE,SACzCt+H,KAAKgzF,gBAAgBurC,gBAAgB/3E,KAGpC6yE,IACDr5H,KAAKuuH,QAAU,UACRvuH,KAAKixH,UACZjxH,KAAK0uH,gBAAkB,KACvB1uH,KAAKq5H,eAGJgF,GAAchF,IACfr5H,KAAKqkH,cAGPrkH,KAAK0xH,gBAGA,YAAY3N,GAAQ,GACzB,MAAM,UAACwN,EAAS,KAAE3gG,GAAQ5wB,KAC1B,GAAiB,cAAd4wB,EAAKvwB,OAAyB0jH,IAAUwN,EAEzC,YADAvxH,KAAKogH,kBAIP,MAAM,OAACn1G,GAAU2lB,GACX,UAACqgG,GAAajxH,KACdimH,EAAgBjmH,KAAK4wB,KAAKuzF,2BAE1B,MAACx/G,EAAK,SAAEu5C,GAAY,OAAA2lE,GAAA,GAAa7jH,KAAKylH,kBAAkBrlH,OAG9D,GAAGmxH,EAAW,CACZ,MAAMxpH,EAAU/H,KAAKqgH,YACrB,IAAG17G,EAAMkL,SAAU9H,EAAQ0Q,MAUzB,YAFA,IAAI,GAAoBxN,EAAQ,CAACsmH,GAAY3gG,EAAKvwB,MAPlDL,KAAKixD,mBAAmBovD,YAAYt4G,EAASpD,EAAO,CAClDu5C,WACA+yE,UAAWA,IAGbjxH,KAAK2M,qBAMChI,EAAMkL,SACd7P,KAAKixD,mBAAmB4nC,SAAS5tF,EAAQtG,EAAO,OAAF,sBAC5Cu5C,YACG+nE,GAAa,CAChBgL,UAAWA,EACXH,QAAS9wH,KAAK6wH,uBAAoBxoH,EAAYrI,KAAK0uH,gBACnDlxB,YAAY,KAGdx9F,KAAK2M,eAAc,GAAO,IAK5B,GAAG3M,KAAK6xH,WAAY,CAClB,MAAMA,EAAa,OAAA/wG,GAAA,GAAK9gB,KAAK6xH,YAC7B/hH,WAAW,KACT,IAAI,MAAM8iD,KAAci/D,EACtB7xH,KAAKixD,mBAAmButE,gBAAgBvzH,EAAQ2nD,EAAWrnC,WAAYsmG,EAAWj/D,GAAa,OAAF,wBACxFqzD,GAAa,CAChBwY,WAAYz+H,KAAKkzH,iBAAmBlzH,KAAKkzH,gBAAgBe,WAAW38F,cAAcH,QAClFunG,aAAc1+H,KAAK2+H,wBAInBh6H,GACF3E,KAAK2M,iBAEN,IAMA,wBAAwBhM,EAA+BojH,GAAQ,EAAOvmB,GAAa,G,MAGxF,MAAM93D,EAAyB,aAF/B/kC,EAAWX,KAAK+9G,eAAejkG,OAAOnZ,IAEhBN,KAAqB,gBAAqC,QAAlBM,EAASN,KAAiB,YAAc,aACtG,OAAGL,KAAK4wB,KAAK3lB,OAAOm4B,cAAgBpjC,KAAK4wB,KAAK62E,QAAQ/hE,IACpD/L,GAl6E4B,uDAm6ErB,GAGa,cAAnB35B,KAAK4wB,KAAKvwB,MAAyB0jH,IAKnCpjH,IACDX,KAAKixD,mBAAmB6mE,SAAS93H,KAAK4wB,KAAK3lB,OAAQtK,EAAU,OAAF,wBACtDX,KAAK4wB,KAAKuzF,2BAAyB,CACtC6B,SAAS,EACTxoB,WAAYA,QAAcn1F,KAE5BrI,KAAK2M,cAAc6wF,GAAY,GAEV,YAAlB78F,EAASN,OACmB,QAA7B,KAAkBm8F,mBAAW,SAAE/F,kBAAkB91F,KAG5C,IAhBPX,KAAKogH,gBAAgB,IAAMpgH,KAAKgzE,wBAAwBryE,GAAU,EAAM68F,KACjE,GAqBH,sBACN,MAAM,gBAAC01B,GAAmBlzH,KAC1B,IAAIkzH,EAAiB,OAAO,EAC5B,MAAM0L,EAA2B1L,EAAgBiB,YAAY78F,cAC7D,OAAQsnG,EAAyBznG,SAC/B,OAAA8O,GAAA,GAAU24F,EAAyB74H,MAAO,QAAQ7F,UAAUuV,SAAS,QAGjE,qBACN,OAAQzV,KAAK8zH,sBAeR,mBAAmBjpH,GACxB,MAAM9C,EAA2B/H,KAAK4wB,KAAKk6B,WAAWjgD,GAEtD,IAAIzK,EAAQ,OAAAs5E,GAAA,GAAuB,IAAkBC,cAAc5xE,EAAQA,QAAS,CAACm2C,SAAUn2C,EAAQ4vD,iBACvG,MAAMv4B,EAAI,KACR,MAAMy/F,EAAgB7+H,KAAKixD,mBAAmBvgC,oBAAoB3oB,OAASM,EAAW,CAACN,EAAQ8C,MAC/F7K,KAAKgxH,WAAW,OAAQ5xF,EAAG,YAAK,mBAAoBy/F,EAAez+H,EAAO2H,GAE1E/H,KAAKuxH,UAAY1mH,EACjB7K,KAAKqgH,YAAct4G,EACnB3H,OAAQiI,GAEV+2B,IAGK,oBAAoB0/F,GACzB,MAAM1/F,EAAI,KAER,MAAM2/F,EAAcphH,OAAOg1C,KAAKmsE,GAAiBryH,IAAImmD,GAAcA,EAAWrnC,YACxEyzG,EAAoB,IAAIr3H,IAC9B,IAAIhG,EAAS,EAAGs9H,EAA6B,EAE7CF,EAAYx0H,QAAQqoD,IAClB,MAAM3mD,EAAO6yH,EAAgBlsE,GAC7B3mD,EAAK1B,QAAQM,I,MACX,MAAM9C,EAA2B/H,KAAKixD,mBAAmBxwC,iBAAiBmyC,EAAY/nD,KACnE,QAAhB,EAAA9C,EAAQmnF,gBAAQ,eAAE+lB,YAAcltG,EAAQkI,QAAWlI,EAAQu+E,UAG5D04C,EAAKn+H,IAAI,IAAMkH,EAAQkI,QAFvB+uH,EAAKn+H,IAAI,IAAMkH,EAAQmnF,SAAS+lB,WAK/BltG,EAAQ0Q,OAAS1Q,EAAQA,WACxBk3H,IAINt9H,GAAUsK,EAAKtK,SAGjB,MAAM+4D,EAAgBskE,EAAK97H,KAAO,EAC5Bg8H,EAAa,IAAIF,GAAMvyH,IAAIuyH,IAC/B,MAAM3+H,EAAO2+H,EAAK,GAElB,GADAA,EAAOA,EAAKr5H,MAAM,GACN,MAATtF,EAAc,CACf,MAAM4K,EAAS+zH,EAAKzzG,WACpB,OAAOtgB,IAAW2B,EAAA,EAAU+R,KAAO,YAAK,8BAAgC,IAAI,KAAU,CAAC1T,SAAQiM,QAAQ,EAAOwjD,kBAAgB3/C,QAE9H,OAAO2/C,EAAgBskE,EAAK37E,MAAM,KAAK,GAAK27E,KAI1C,gBAAC9L,GAAmBlzH,KACb,OAAAimC,GAAA,GAAUitF,EAAgBgB,YAAY58F,cAAcvxB,MAAO,QACnE7F,UAAUC,OAAO,QAAS8+H,GAC/B,MAAM9K,EAAcjB,EAAgBiB,YAAY78F,cAAcH,QAC3D8nG,GAA8B9K,EAC/BjB,EAAgBe,WAAW38F,cAAc1xB,kBAAiB,QAChByC,IAAlCrI,KAAKu0H,2BACZv0H,KAAKu0H,yBAA2BrB,EAAgBe,WAAaf,EAAgBvnG,YAAY2L,cAAc1xB,kBAAiB,GAG3H,MAAMu5H,EAAwBjM,EAAgBvnG,WAAW2L,cAAcH,QAAU,yBAA2B,wBACtGzlB,EAAQ,YAAKytH,EAAU,CAACx9H,IAExBy9H,EAAez+H,SAASi7B,yBAO9B,IAAIyjG,EAA+BC,EACnC,GAPGJ,EAAWv9H,OAAS,EACrBy9H,EAAa/9H,UAAU,YAAK69H,GAAY,IAExCE,EAAa/9H,OAAO69H,EAAW,GAAI,YAAK,WAAY,CAACA,EAAWv9H,OAAS,KAIjD,IAAvBo9H,EAAYp9H,OAAc,CAC3B,MAAMixD,EAAamsE,EAAY,GACzB9yH,EAAO6yH,EAAgBlsE,GAI7B,GAHAysE,EAAer/H,KAAKixD,mBAAmBxwC,iBAAiBmyC,EAAY3mD,EAAK,IAEzEqzH,IAAmBD,EAAa74B,WAC7B84B,EAAgB,CACjB,MAAMC,EAAYv/H,KAAKixD,mBAAmB2zC,iBAAiBy6B,IACxDE,EAAU59H,SAAWA,GAAU49H,EAAUlrH,KAAKxJ,IAAQoB,EAAKgzB,SAASp0B,OACrEy0H,GAAiB,IAKvB,MAAMjnE,EAAmB13D,SAASi7B,yBAElC,GAAG0jG,GAA6B,IAAX39H,EAAc,CACjC,MAAMsK,EAAO6yH,EAAgBC,EAAY,IACnCF,EAAgB7+H,KAAKixD,mBAAmBvgC,oBAAoB2uG,OAAch3H,EAAW4D,GAC3FosD,EAAiBh3D,OACf+9H,EALc,KAOdP,QAGFxmE,EAAiBh3D,OACf,YAAK,+BAXS,KAad+9H,GAIJ,IAAII,EAAWx/H,KAAKgxH,WAAW,UAAW5xF,EAAG1tB,EAAO2mD,GAEpD66D,EAAgBwB,WAAWnqH,QAAQ,CAACgC,EAAGvE,KACrC,MAAMswB,EAAO/rB,EAAE0gD,YACTwyE,EAAyB,IAAK7c,QAAQjvG,IAAI2kB,GAChDmnG,EAAK1tH,KAAO,CAAC/J,EAAM,EAAI+2H,EAAYp9H,OAASs9H,GAC5CQ,EAAKj5F,WAGJxmC,KAAKy0H,cACNz0H,KAAKy0H,aAAaxH,qBAAqBuS,EAAUx/H,KAAK6R,gBAGxD7R,KAAK6xH,WAAaiN,GAGpB1/F,IAGK,iBAAiBv0B,GACtB,GAAG7K,KAAKmmH,eAAiBt7G,EACvB,OAGF,IAAI9C,EAAmB/H,KAAK4wB,KAAKk6B,WAAWjgD,GAC5C,MAAMu0B,EAAI,KACR,IAAIsgG,EACa,iBAAd33H,EAAQqD,GACTs0H,EAAc,YAAK,WAEnB1/H,KAAK4wB,KAAKqgC,mBAAmB0/B,kBAAkB3wF,KAAK4wB,KAAK3lB,OAAQJ,GAAKlH,KAAMg8H,IACvE3/H,KAAKmmH,eAAiBt7G,IAIzB9C,EAAU43H,EACO,iBAAd53H,EAAQqD,EACTpL,KAAKqkH,YAAY,SAEjBjlF,QAIJsgG,EAAc,IAAI,KAAU,CAC1Bz0H,OAAQlD,EAAQkI,OAChBiH,QAAQ,IACP6D,QAGL/a,KAAKgxH,WAAW,QAAS5xF,EAAGsgG,EAAa33H,GAAYA,EAA4BA,aAASM,EAAWN,GACrG/H,KAAKmmH,aAAet7G,GAEtBu0B,IAGK,YAAY/+B,GACM,SAApBL,KAAKokH,YAAkC,SAAT/jH,GAC/BL,KAAKq5H,aAGJh5H,IACDL,KAAKuuH,QAAU,UACRvuH,KAAKixH,UACZjxH,KAAK0uH,gBAAkB,MAGb,UAATruH,IACDL,KAAKmmH,kBAAe99G,EACpBrI,KAAK6xH,gBAAaxpH,GAGpBrI,KAAKuxH,UAAYvxH,KAAKqgH,iBAAch4G,EACpCrI,KAAKokH,WAAapkH,KAAKmxH,gBAAa9oH,EAEjCrI,KAAK4wB,KAAKxvB,UAAUlB,UAAUuV,SAAS,sBACxC9C,EAAA,EAAwB6B,aAAa,gBACrCxU,KAAK4wB,KAAKxvB,UAAUlB,UAAUoE,OAAO,oBACrCtE,KAAKsU,KAID,IAEN,aAActU,KAAK4wB,KAAKxvB,UADN,sBAC4B,EAAM,IAAK,KACvDpB,KAAK4wB,KAAKxvB,UAAUlB,UAAUoE,OAFd,wBAMb,cAAcK,EAAegK,GAAQ,EAAM1M,GAAQ,GACpD0C,IAAOA,EAAQ,IAEhBgK,EAAO3O,KAAKq5H,YAAW,GAAO,EAAO10H,GACnC3E,KAAKylH,kBAAkB7/G,iBAAiBjB,GAE7C,aAAQ,KACN1C,GAAS,OAAAJ,GAAA,GAAgB7B,KAAK68F,cAC9B78F,KAAKswH,iBACLtwH,KAAK68F,aAAa9sD,UAAY/vC,KAAK68F,aAAajmC,eAI7C,WACLv2D,EACAu/H,EACAluH,EAAyC,GACzCse,EAA4C,GAC5C5vB,EACA2H,GAEA,GAAG/H,KAAK0uH,iBAA4B,UAATruH,EACzB,OAGU,YAATA,IACDL,KAAKqkH,YAAYhkH,GACjBL,KAAKokH,WAAa/jH,EAClBL,KAAKmxH,WAAayO,GAGpB,MAAMC,EAAc7/H,KAAKyuH,cAAcrtH,UACjC0+H,EAAWD,EAAY5mF,iBAAiB5B,uBACxC0oF,EAAYD,EAAS5/H,UAAUuV,SAAS,SAE9CzV,KAAKyuH,cAAciF,QAAQtmG,YAAYptB,KAAKyuH,cAAciF,QAAU,GAAqB,YAATrzH,EAAqB,OAASA,GAAQ,qBAAsB,CAACoR,UAAU,KACvJ,MAAM+tH,EAAWz1E,GAAUr4C,EAAOse,EAAUjoB,GAsC5C,OArCGg4H,EACDD,EAAS1yG,YAAYoyG,GAErBK,EAAY5+H,aAAau+H,EAAUK,EAAY5mF,kBAGrC,YAAT54C,IACDm/H,EAASr6H,MAAM0oC,OAAS,WAGtB7tC,KAAK4wB,KAAKxvB,UAAUlB,UAAUuV,SAAS,sBACzCzV,KAAK4wB,KAAKxvB,UAAUlB,UAAUW,IAAI,oBAClCb,KAAKsU,KAQH,MACF3B,EAAA,EAAwBmB,SAAS,CAC/BzT,KAAM,eACN0T,MAAO,KACL/T,KAAKkxH,yBAKE7oH,IAAVjI,GACDJ,KAAKy5H,cAAcr5H,GAGrB0P,WAAW,KACT9P,KAAK0xH,iBACJ,GAEI8N,GAxtFM,GAAAjD,sBAAwB,yDErF1B,MAAM,GAenB,YAAY78H,GAJF,KAAAsgI,UAAW,EAanB,OAAAl3H,EAAA,GAAW9I,KAAMN,GAEjB,MAAM,cAACugI,EAAa,UAAEjyH,GAAahO,KACnCigI,EAAc7+H,UAAUlB,UAAUW,IA9Bf,mBA8BmC,QACtDo/H,EAAcvuH,MAAMxR,UAAUW,IAAIq/H,0BAClCD,EAAcjwG,SAAS9vB,UAAUW,IAAIq/H,6BACrCD,EAActuH,QAAQzR,UAAUW,IAAIq/H,4BAEpClgI,KAAKy7G,SAAW96G,SAASC,cAAc,UACvCZ,KAAKy7G,SAASv7G,UAAUW,IAAIq/H,yBAA2B,UAAUlyH,UAAmB,WAAY,eAEhGhO,KAAKk0G,QAAUvzG,SAASC,cAAc,OACtCZ,KAAKk0G,QAAQh0G,UAAUW,IAAIq/H,4BAC3B,OAAAhoG,GAAA,GAAOl4B,KAAKk0G,SAEZl0G,KAAKmgI,aAAex/H,SAASC,cAAc,OAC3CZ,KAAKmgI,aAAajgI,UAAUW,IAAIq/H,kCAChClgI,KAAKmgI,aAAa9+H,OAAOrB,KAAKy7G,UAE9Bz7G,KAAKk0G,QAAQ7yG,UAAU8K,MAAMC,KAAK6zH,EAAc7+H,UAAUmvB,UAAWvwB,KAAKmgI,cAE1EF,EAAc7+H,UAAUC,OAAOrB,KAAKk0G,SAEpCl0G,KAAKogI,mBAAmBpgI,KAAKy7G,UAGxB,mBAAmB/wF,GACxB,YAAiBA,EAAO3qB,IACtB,OAAAiqB,EAAA,GAAYjqB,KAEVC,KAAKyU,QAAUzU,KAAKyU,UAAY,OAASpP,QAAQ6E,SAAQ,IAAOvG,KAAK08H,IAClEA,GACDrgI,KAAKG,QAAO,MAGf,CAAC0R,eAAgB7R,KAAK6R,iBAGpB,OAAOsyB,GACZ,MAAM6wE,EAAWh1G,KAAKigI,cAAc7+H,UAAUlB,UAAUuV,SAAS,QACjE,QAAYpN,IAAT87B,EACDA,GAAQ6wE,OACH,GAAG7wE,IAAS6wE,EACjB,OAKF,MAAMsrB,GAActgI,KAAKggI,UAAY73G,EAAA,EAAWC,YAAc+b,EAG9DnkC,KAAKigI,cAAc7+H,UAAUlB,UAAUC,OAAO,cAAemgI,GAC7DtgI,KAAKigI,cAAc7+H,UAAUlB,UAAUC,OAAO,OAAQgkC,GAEtDnkC,KAAKmlG,OAAO/jG,UAAUlB,UAAUC,OAAO,qBAAsBmgI,GAC7DtgI,KAAKmlG,OAAO/jG,UAAUlB,UAAUC,OAAO,aAAaH,KAAKgO,mBAAoBm2B,GAU7EnkC,KAAKmlG,OAAOo7B,cACZvgI,KAAKmlG,OAAOq7B,gBAGP,YACL,OAAQxgI,KAAKigI,cAAc7+H,UAAUlB,UAAUuV,SAAS,QAGnD,aACL,OAAOzV,KAAKigI,cAAc7+H,UAAUlB,UAAUuV,SAAS,eAGlD,KAAK/D,EAAgDse,EAAmDjoB,GAC7G/H,KAAKigI,cAAc7+H,UAAU8F,QAAQ+D,OAAS,GAAKlD,EAAQkD,OAC3DjL,KAAKigI,cAAc7+H,UAAU8F,QAAQ2D,IAAM,GAAK9C,EAAQ8C,IACxD7K,KAAKigI,cAAcnwG,KAAKpe,EAAOse,EAAUjoB,GACzC/H,KAAKmlG,OAAOq7B,iBCjHD,MAAM,WAAuB,GAK1C,YAAsB3uH,EAA0C0S,GAAW,GACzE5kB,MAAM,CACJolB,KAAM,IACNjgB,IAAK,EACLL,IAAK,EACL8f,YACC,GANiB,KAAA1S,iBAA0C,KAAA0S,WAsCxD,KAAAk8G,YAAe1gI,IACrBA,GAAK,OAAAiqB,EAAA,GAAYjqB,GACjB,GAA2Bge,OAAS,GAA2BA,OAG1D,KAAA2iH,UAAY,KAEjB,MAAM,OAAC5iH,EAAM,MAAEC,GAAS,GACxB,IACI4iH,EAEFA,GADE7iH,GAAUC,EACA,EACJD,EAAS,GACL,EACJA,EAAS,GAAKA,EAAS,IACnB,EAEA,EAGd,GAAe8iH,MAAMr2H,QAAQ4G,GAAQnR,KAAKmR,KAAKjR,UAAUoE,OAAO,SAAW6M,IAC3EnR,KAAKmR,KAAKjR,UAAUW,IAAI,SAAW,GAAe+/H,MAAMD,IAEpD3gI,KAAKmkB,WACPnkB,KAAKglB,YAAYjH,EAAQ,EAAID,IAtD/B9d,KAAKwmB,eACLxmB,KAAKymB,YAAY,CACf5B,QAASvL,IACP,MAAM3U,EAAQE,KAAKJ,IAAII,KAAKC,IAAIwU,EAAa,GAAI,GAIjD,GAA2ByE,OAAQ,EACnC,GAA2BD,OAASnZ,KAQxC,MACM0uE,EAAMrzE,KAAKqzE,IAAM1yE,SAASC,cAAc,OAC9CyyE,EAAInzE,UAAUW,IAAI,WAFA,iBAGlB,MAAMsQ,EAAOnR,KAAKmR,KAAOxQ,SAASC,cAAc,QAChDuQ,EAAKjR,UAAUW,IAAImN,uBAEnBqlE,EAAIhyE,OAAO8P,EAAMnR,KAAKoB,WAEtB,YAAiB+P,EAAMnR,KAAKygI,YAAa,CAAC5uH,eAAgB7R,KAAK6R,iBAC/D7R,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,wBAAyBA,KAAK0gI,WAEjE1gI,KAAK0gI,aAvCQ,GAAAE,MAAQ,CAAC,aAAc,cAAe,cAAe,aCWvD,MAAM,WAAkB,GAOrC,YAAsBz7B,EAA8Bv0E,EAAsBqgC,GACxEtxD,MAAM,CACJwlG,SACAv0E,OACA/e,eAAgBszF,EAAOtzF,eACvB7D,UAAW,QACXiyH,cAAe,IAAIpwG,GACjB,eACA,CAACne,EAAgDse,KAC/C,OAAAvf,EAAA,GAAezQ,KAAKigI,cAAcvuH,MAAOA,GACzC,OAAAjB,EAAA,GAAezQ,KAAKigI,cAAcjwG,SAAUA,KAGhDvb,QAAS,KACP,GAA2BxP,QAE7B+6H,UAAU,IAhBQ,KAAA76B,SAA8B,KAAAv0E,OAAsB,KAAAqgC,qBAsGlE,KAAA4vE,iBAAoBngH,IAC1B1gB,KAAK8gI,SAAS5gI,UAAUC,OAAO,SAAUugB,EAAenG,aAAe,GAEvEva,KAAK+gI,SAAS7gI,UAAUoE,OAAO,qBAAsB,6BACrDtE,KAAK+gI,SAAS7gI,UAAUW,IAAI6f,EAAepd,KAAO,4BAA8B,sBAChFtD,KAAK+gI,SAAS7gI,UAAUC,OAAO,SAAUugB,EAAepd,MAAQod,EAAe3b,QAGzE,KAAAyW,QAAU,KAChBxb,KAAKghI,SAAS9gI,UAAUoE,OAAO,cAGzB,KAAA28H,OAAS,KACfjhI,KAAKG,QAAO,IAGN,KAAA+gI,YAAc,EAAErnH,MAAK9R,UAAS0Q,QAAOiI,qB,QAC3C,IAAIhP,EAAgDse,EACpD,MAAMmxG,EAAuB,UAAbtnH,EAAIxZ,MAAiC,UAAbwZ,EAAIxZ,KAC5C,GAAI8gI,EAKG,CACL,MAAM90G,EAAiBxS,EAAIsG,WAAW9L,KAAMoW,GAAoB,2BAAXA,EAAKrf,GAC1DsG,EAAQ,IAAkB6a,cAAmC,QAArB,EAAAF,aAAc,EAAdA,EAAgB3a,aAAK,QAAImI,EAAIuG,WACrE4P,GAAW3D,aAAc,EAAdA,EAAgBhM,WAAY,IAAkBkM,cAAcF,EAAehM,WAAa,YAAK,2BAPxG3O,EAAQ,IAAI,KAAU,CAACzG,OAAQlD,EAAQkI,OAAQmxH,SAA0B,QAAhB,EAAAr5H,EAAQmnF,gBAAQ,eAAE+lB,YAAYl6F,QAGvFiV,EAAW,aAAmBjoB,EAAQykB,MAOxCxsB,KAAK8gI,SAAS5gI,UAAUC,OAAO,OAAQghI,GACvCnhI,KAAK+gI,SAAS7gI,UAAUC,OAAO,QAASghI,GAExCnhI,KAAK6gI,iBAAiBngH,GACtB1gB,KAAKqhI,eAAeX,YAEpB1gI,KAAKktB,aAAarS,SAASpC,GAE3BzY,KAAK8vB,KAAKpe,EAAOse,EAAUjoB,GAE3B/H,KAAKghI,SAAS9gI,UAAUC,OAAO,aAAcsY,EAAMmD,QACnD5b,KAAKG,QAAO,IA5HZH,KAAKigI,cAAclwG,OAAOzrB,SAE1B,MAAMg9H,EAAS,EAAW,qBAAsB,CAAC7vH,UAAU,IACrD8vH,EAAS,EAAW,sBAAuB,CAAC9vH,UAAU,IAEtD+vH,EAAc,CAAC92G,EAAmB0R,KACtC,YAAiB1R,EAAO3qB,IACtB,OAAAiqB,EAAA,GAAYjqB,GACZq8B,KACC,CAACvqB,eAAgB7R,KAAKmlG,OAAOtzF,kBAGlC2vH,EAAYF,EAAQ,KAClB,GAA2B/4H,aAG7Bi5H,EAAYD,EAAQ,KAClB,GAA2B/4H,SAG7BxI,KAAKghI,SAAW,EAAW,GAAI,CAACvvH,UAAU,IAC1CzR,KAAKghI,SAAS9gI,UAAUW,IAAI,SAAU,mBAAoB,SAC1D2gI,EAAYxhI,KAAKghI,SAAU,KACzB,GAA2B7gI,WAE7BH,KAAKk0G,QAAQlzG,QAAQhB,KAAKk0G,QAAQjoF,kBAAmBq1G,EAAQthI,KAAKghI,SAAUO,GAE5EvhI,KAAKqhI,eAAiB,IAAI,GAAerhI,KAAK6R,gBAAgB,GAC9D,MAAM4vH,EAA8B9gI,SAASC,cAAc,OAC3D6gI,EAA4BvhI,UAAUW,IAAI,2BAC1C4gI,EAA4BpgI,OAAOrB,KAAKqhI,eAAejgI,WACvD,MAAMsgI,EAAS/gI,SAASC,cAAc,OACtC8gI,EAAOxhI,UAAUW,IAAI,8BACrBb,KAAKqhI,eAAehuD,IAAInzE,UAAUW,IAAI,sBAAuB,UAC7Db,KAAKqhI,eAAehuD,IAAIryE,QAAQ0gI,GAChC1hI,KAAKqhI,eAAehuD,IAAIhyE,OAAOogI,GAE/BzhI,KAAK+gI,SAAW,EAAW,eAAgB,CAACtvH,UAAU,IACtD+vH,EAAYxhI,KAAK+gI,SAAU,KACzB,MAAM/iH,EAAS,GAA2BH,oBACtCG,EAAOjZ,MAEDiZ,EAAO1a,MACf,GAA2ByB,OAAQ,EACnC,GAA2BzB,MAAO,GAElC,GAA2BA,MAAQ,GAA2BA,KAL9D,GAA2ByB,OAAQ,IASvC,MAAM+7H,EAAW9gI,KAAK8gI,SAAW,EAAW,cAAe,CAACrvH,UAAU,IACtE+vH,EAAYV,EAAU,KACpB,GAA2BvmH,aAAeumH,EAAS5gI,UAAUuV,SAAS,UAAY,EAAI,OAGxFzV,KAAKmgI,aAAan/H,QAAQhB,KAAKqhI,eAAehuD,IAAKytD,EAAU9gI,KAAK+gI,UAElE,MAAMY,EAAkBhhI,SAASC,cAAc,OAC/C+gI,EAAgBzhI,UAAUW,IAAI,iCAE9Bb,KAAKktB,aAAe,IAAI,QAAkB7kB,OAAWA,GAAW,GAAM,GACtErI,KAAKktB,aAAa9rB,UAAUlB,UAAUW,IAAI,yBAC1C8gI,EAAgBtgI,OAAOrB,KAAKktB,aAAa9rB,WACzCpB,KAAKk0G,QAAQjzG,aAAa0gI,EAAiB3hI,KAAKmgI,cAEhDngI,KAAKmlG,OAAOtzF,eAAehR,IAAI+L,EAAA,EAA/B5M,CAA0C,aAAcA,KAAKkhI,aAC7DlhI,KAAKmlG,OAAOtzF,eAAehR,IAAI+L,EAAA,EAA/B5M,CAA0C,cAAeA,KAAKwb,SAC9Dxb,KAAKmlG,OAAOtzF,eAAehR,IAAI+L,EAAA,EAA/B5M,CAA0C,aAAcA,KAAKihI,QAC7DjhI,KAAKmlG,OAAOtzF,eAAehR,IAAI+L,EAAA,EAA/B5M,CAA0C,wBAAyBA,KAAK6gI,kBAExE,MAAMe,EAAiB,GAA2BrmH,oBAC/CqmH,IACD5hI,KAAKkhI,YAAYU,GACjB5hI,KAAK6gI,iBAAiBe,EAAelhH,iBAIlC,UACF1gB,KAAKktB,cACNltB,KAAKktB,aAAa7G,mBChIxB,IAAKw7G,IAAL,SAAKA,GACH,kBACA,kBACA,sBACA,mBACA,mBALF,CAAKA,QAAW,KAYD,MAAMC,GAArB,cAYU,KAAAC,SAAW,CAAC3+G,EAAWE,EAAW9f,EAAeC,EAAgBy4C,IAChE,IAAI94B,KAAKE,EAAI44B,KAAUA,KAAUA,WAAgB14C,OAAWC,EAAS,EAAIy4C,KAAUA,KAAUA,YAAiB14C,OAG/G,KAAAw+H,YAAc,CAACjvH,EAAYkvH,EAAmB35H,KAGpD,IAAIi5B,EAAI,GAKJ,GAAa,IAAVj5B,EACLi5B,EAAIvhC,KAAK+hI,SAAS,EAAG,EA5Bb,EA4BuBE,EARlB,GAQuCjiI,KAAK+hI,SAAS,EAAGE,EAAYC,EA5BzE,EA4ByFD,EARpF,QAUb,IAAI,IAAIrgI,EAAI,EAAGA,EAAI0G,IAAS1G,EAC1B2/B,GAAKvhC,KAAK+hI,SAAS,GAAIE,EAhCnB,GAgCsCrgI,EA/BpC,EA+B8CqgI,EAXzC,GAyBf,OAVIjiI,KAAKmiI,WACPniI,KAAKmiI,SAAWxhI,SAAS4nB,gBAAgB,6BAA8B,YACvEvoB,KAAKsnD,KAAO3mD,SAAS4nB,gBAAgB,6BAA8B,QAEnEvoB,KAAKmiI,SAAS9gI,OAAOrB,KAAKsnD,OAG5BtnD,KAAKmiI,SAASpvH,GAAKA,EACnB/S,KAAKsnD,KAAK9+B,eAAe,KAAM,IAAK+Y,GAE7BvhC,KAAKmiI,UAGN,KAAAC,aAAe,CAAC95H,EAAe4c,KACrC,IAAI+8G,EAaJ,OAZG35H,GAAS,EACV25H,EAAYJ,GAAYQ,IACN,IAAV/5H,EACR25H,EAAYJ,GAAYS,IACN,IAAVh6H,EACR25H,EAAYJ,GAAYU,MACN,IAAVj6H,EACR25H,EAAYJ,GAAYW,KAChBl6H,EAAQ,IAChB25H,EAAYJ,GAAYY,MAGnBR,GAGD,KAAAS,cAAgB,CAACp6H,EAAe4c,KACtC,IAAIy9G,EAaJ,OAZGr6H,GAAS,EACVq6H,EAAad,GAAYQ,IACP,IAAV/5H,EACRq6H,EAAad,GAAYS,IACP,IAAVh6H,EACRq6H,EAAad,GAAYU,MACP,IAAVj6H,EACRq6H,EAAad,GAAYW,KACjBl6H,EAAQ,IAChBq6H,EAAad,GAAYY,MAGpBE,GAGD,KAAAC,kBAAoB,CAAC19G,EAAe+8G,EAAmB35H,IAChD,IAAVA,EACM,EACW,IAAVA,EACA4c,EAAY+8G,EAvFd,EAuFU,EAGL,IAAV35H,EACG4c,EAEgB,IAAVA,EACD+8G,EA9FH,EAiGa,EAAZA,EAAgBC,EAAU,EALxB,GAODD,EAnGF,GAmGqB/8G,EAIvB,KAAA29G,mBAAqB,CAAC39G,EAAe5c,EAAe25H,EAAmBa,IAC1Ex6H,GAAS,GAIT4c,GAAS,EAHH,EAKCA,GAAU5c,EAAQ,EACnBw6H,EAAcjB,GAAYQ,IAAMJ,GAIjC/8G,EAAQ,GAAK+8G,EAnHb,EAmHyB/8G,EAI3B,KAAA69G,eAAiB,CAACz6H,EAAe25H,IAChC35H,GAAS,EAAIu5H,GAAYQ,IAAMJ,EAAY35H,EAxH1C,GAwHyDA,EAAQ,GAGpE,OAAOA,EAAe4c,GAS3B,GARIllB,KAAK+vB,SACP/vB,KAAK+vB,OAASpvB,SAASC,cAAc,OACrCZ,KAAK+vB,OAAO7vB,UAAUW,IA5HT,yBA8Hbb,KAAKk0G,QAAUvzG,SAASC,cAAc,OACtCZ,KAAK+vB,OAAO1uB,OAAOrB,KAAKk0G,UAGb,IAAV5rG,EAOD,OANGtI,KAAKsI,QAAUA,IAChBtI,KAAKk0G,QAAQlmG,UAAY,kCACzBhO,KAAK+vB,OAAO7vB,UAAUoE,OAAO,8BAC7BtE,KAAKk0G,QAAQ1lG,UAAYxO,KAAKk0G,QAAQ/uG,MAAM2X,QAAU,IAGjD9c,KAAK+vB,OAGd,MAAMkyG,EAAYjiI,KAAKoiI,aAAa95H,EAAO4c,GACrCy9G,EAAa3iI,KAAK0iI,cAAcp6H,EAAO4c,GACvC49G,EAAc9iI,KAAK+iI,eAAez6H,EAAO25H,GAEzCe,EAAa,YAAY16H,EACzB65H,EAAWniI,KAAKgiI,YAAYgB,EAAYf,EAAW35H,GAEnD26H,EAAiBjjI,KAAK4iI,kBAAkB19G,EAAO+8G,EAAW35H,GAC1D46H,EAAkBljI,KAAK6iI,mBAAmB39G,EAAO5c,EAAO25H,EAAWa,GAwCzE,OAtCA9iI,KAAK+vB,OAAO7vB,UAAUC,OAAO,6BAAsBmI,EAAQ,GAExD4c,GAAS,GACVllB,KAAK+vB,OAAO7vB,UAAUW,IAAI,eAC1Bb,KAAK+vB,OAAO7vB,UAAUoE,OAAO,aACrB4gB,GAAU5c,EAAQ,GAC1BtI,KAAK+vB,OAAO7vB,UAAUW,IAAI,YAC1Bb,KAAK+vB,OAAO7vB,UAAUoE,OAAO,gBAE7BtE,KAAK+vB,OAAO7vB,UAAUW,IAAI,WAAY,eAGxCb,KAAKk0G,QAAQlmG,UAAY,gCACzBhO,KAAKk0G,QAAQ/uG,MAAM2X,QAAU,mBAAmBkmH,2BAAoCF,+BAAyCI,QAEzHljI,KAAK+nB,MACP/nB,KAAK+nB,IAAMpnB,SAAS4nB,gBAAgB,6BAA8B,OAClEvoB,KAAK+nB,IAAIS,eAAe,KAAM,SAAU,KACxCxoB,KAAK+nB,IAAIS,eAAe,KAAM,QAAS,KAEvCxoB,KAAKmjI,KAAOxiI,SAAS4nB,gBAAgB,6BAA8B,QACnEvoB,KAAKmjI,KAAK9hI,OAAO8gI,GAEjBniI,KAAK+nB,IAAI1mB,OAAOrB,KAAKmjI,MAErBnjI,KAAKojI,KAAOziI,SAASC,cAAc,OACnCZ,KAAKojI,KAAKljI,UAAUW,IAAI,+BAGtBb,KAAK+nB,IAAIhnB,eACXf,KAAKk0G,QAAQ7yG,OAAOrB,KAAK+nB,IAAK/nB,KAAKojI,MAGrCpjI,KAAKojI,KAAKj+H,MAAM2X,QAAU,WAAW6lH,8BAAuCM,QAE5EjjI,KAAKsI,MAAQA,EACbtI,KAAKklB,MAAQA,EAENllB,KAAK+vB,Q,2SC/KhB,MAAMszG,GAOJ,cAHA,KAAAjrG,KAAgF,GAI9Ep4B,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAU4M,UAAYq1H,GAAcp0F,WAGpC,OAAO/pB,EAAeo+G,GAAe,GAC1C,GAAGtjI,KAAKo4B,KAAKlT,GAAQ,OAAOllB,KAAKo4B,KAAKlT,GAAOnK,QAC7C,MAAM8a,EAAMl1B,SAASC,cAAc,OAC7BggE,GAAWjjD,OAAOg1C,KAAK3yD,KAAKo4B,MAAMz2B,SAAW2hI,EAInD,OAHAztG,EAAI7nB,UAAYq1H,GAAcp0F,WAAa,QAAU2xB,EAAU,GAAK,mBACpE5gE,KAAKo4B,KAAKlT,GAAS,CAACnK,QAAS8a,EAAKjf,KAAK,GACvC5W,KAAKoB,UAAUC,OAAOw0B,GACfA,EAGF,SAAS3Q,GACVllB,KAAKo4B,KAAKlT,KACdllB,KAAKo4B,KAAKlT,GAAOnK,QAAQzW,gBAClBtE,KAAKo4B,KAAKlT,IAGZ,UAAUq+G,GACZvjI,KAAK8Q,cAAcA,aAAa9Q,KAAK8Q,cACxC9Q,KAAK8Q,aAAe5O,OAAO4N,WAAW,KACpC,IAAI,MAAMlO,KAAK5B,KAAKo4B,MACdx2B,IAAM2hI,GACVvjI,KAAKwjI,UAAU5hI,IAEhByhI,GAAcI,UAGZ,UAAUv+G,EAAew+G,GAAS,GACvC,MAAM7tG,EAAM71B,KAAKo4B,KAAKlT,GACnB2Q,EAAIjf,MACF8sH,GACD7tG,EAAI9a,QAAQ7a,UAAUoE,OAAO,QACxBuxB,EAAI9a,QAAQy1B,YAEjB3a,EAAI9a,QAAQ7a,UAAUoE,OAAO,YAAa,eAGrCuxB,EAAIjf,KAGb5W,KAAK2jI,UAAUz+G,GAGV,QAAQA,EAAe0+G,EAAuBC,EAAU3+G,EAAQ0+G,EAAeE,GAAiB,GACrG,GAAG5+G,IAAU0+G,EACX,OAAO5jI,KAAK+jI,UAAU7+G,GAGxB,MAAM2Q,EAAM71B,KAAKo4B,KAAKlT,GAChB8+G,EAAchkI,KAAKo4B,KAAKwrG,GAC9B,IAAII,IAAgBF,EAClB,OAAO9jI,KAAK+jI,UAAU7+G,GAGxB,MAAMgO,EAAQ,CAAC,WAAY,eACvB2wG,GAAS3wG,EAAMzqB,UAEnBotB,EAAI9a,QAAQ7a,UAAUW,IAAIqyB,EAAM,IAChC2C,EAAI9a,QAAQ7a,UAAUoE,OAAO4uB,EAAM,IAChC8wG,IACDA,EAAYjpH,QAAQ7a,UAAUW,IAAIqyB,EAAM,IACxC8wG,EAAYjpH,QAAQ7a,UAAUoE,OAAO4uB,EAAM,KAG1C2C,EAAIjf,KACL5W,KAAK+jI,UAAU7+G,GAAO,GAGxB2Q,EAAI9a,QAAQ7a,UAAUC,OAAO,aAAa,GAC1C6jI,GAAeA,EAAYjpH,QAAQ7a,UAAUC,OAAO,aAAa,GAajEH,KAAK2jI,UAAUz+G,IA5FV,GAAAu+G,SAAW,IACX,GAAAx0F,WAAa,iBA+FtB,MAAMg1F,GAYJ,YAAoBx7H,GAAU,GAAV,KAAAA,UARpB,KAAAsZ,SAIM,GACN,KAAAmiH,eAAiB,EAIflkI,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAU4M,UAAYi2H,GAAgBh1F,WAG7C,WAAW/pB,GACT,GAAGllB,KAAK+hB,SAASmD,GAAQ,OAAOllB,KAAK+hB,SAASmD,GAC9C,MAAM9b,EAAOzI,SAASC,cAAc,OACpCwI,EAAK4E,UAAYi2H,GAAgBh1F,WAAa,WAE9C,MAAMt+B,EAAchQ,SAASC,cAAc,OAC3C+P,EAAY3C,UAAYi2H,GAAgBh1F,WAAa,uBAErD,MAAMk1F,EAAgB,IAAId,GAO1B,OANAc,EAAc/iI,UAAU4M,UAAYi2H,GAAgBh1F,WAAa,mBAEjE7lC,EAAK/H,OAAOsP,EAAawzH,EAAc/iI,WAEvCpB,KAAKoB,UAAUC,OAAO+H,GAEfpJ,KAAK+hB,SAASmD,GAAS,CAAC9jB,UAAWgI,EAAMuH,cAAawzH,iBAG/D,MAAM17C,GACDzoF,KAAK8Q,cAAcA,aAAa9Q,KAAK8Q,cAExC,MAAMiR,GAAY,GAAK0mE,GAAQ9mF,OAC5BogB,GAAY/hB,KAAK+hB,SAASpgB,SAI7B3B,KAAK8Q,aAAe5O,OAAO4N,WAAW,KAClB9P,KAAK+hB,SAAS3Z,OAAO2Z,EAAU/hB,KAAK+hB,SAASpgB,OAASogB,GAC9DxX,QAAS65H,IACjBA,EAAQhjI,UAAUkD,YAEnB++H,GAAcI,WAYnB,SAASh7C,GACP,MAAM1mE,GAAY,GAAK0mE,GAAQ9mF,OACb3B,KAAK+hB,SAASpc,MAAMoc,GAC5BxX,QAAS65H,IACjB,MAAMC,GAAyBD,EAAQzzH,YAAYid,WAAa,EACpDw2G,EAAQD,cAAcG,OAAOL,GAAgBM,aAAa,GACtEH,EAAQD,cAAcnxH,QAAQixH,GAAgBM,YAAaF,EAAuBrkI,KAAKyI,QAAUggF,EAASzoF,KAAKkkI,eAAiBz7C,EAASzoF,KAAKkkI,gBAAgB,KAGhKlkI,KAAK2O,MAAM85E,GAGb,SAASA,GAGP,MAAM+7C,EAAoBr4H,MAAMC,KAAK,GAAKpM,KAAKkkI,gBAAgBz3H,IAAI46G,IAAMA,GACvDl7G,MAAMC,KAAK,GAAKq8E,GAAQh8E,IAAI46G,IAAMA,GAC1C98G,QAAQ,CAACk6H,EAAez8H,K,MAChC,MAAMo8H,EAAUpkI,KAAK0kI,WAAW18H,GAE1B6tB,EAAMuuG,EAAQD,cAAcG,OAAOG,GAAe,GAClDJ,EAA8C,QAAtB,EAAAG,EAAkBx8H,UAAI,QAAIi8H,GAAgBM,YACxE1uG,EAAIjI,UAAYw2G,EAAQzzH,YAAYid,UAAY,GAAK62G,EAErDL,EAAQD,cAAcnxH,QAAQyxH,EAAeJ,EAAuBrkI,KAAKyI,QAAUggF,EAASzoF,KAAKkkI,eAAiBz7C,EAASzoF,KAAKkkI,gBAAgB,KAGlJlkI,KAAK2kI,SAASl8C,GAEdzoF,KAAKkkI,eAAiBz7C,GAxFjB,GAAA87C,aAAe,EACf,GAAAt1F,WAAa,mBA2FP,MAAM,GA4CnB,YAAoBk2D,EAA4Bv0E,EAAoBqgC,EAAgDu/B,GAAhG,KAAA2U,SAA4B,KAAAv0E,OAAoB,KAAAqgC,qBAAgD,KAAAu/B,kBArC5G,KAAAo0C,aAAe,EAChB,KAAAC,UAAY,EACZ,KAAAC,aAAe,EACd,KAAAC,eAAiB,EACjB,KAAAC,oBAAsB,EAEvB,KAAAC,QAAS,EACR,KAAAC,qBAAsB,EAEvB,KAAA58H,MAAQ,EACP,KAAA2D,KAAiB,GACjB,KAAAuyB,YAAc,EAEd,KAAAN,SAAU,EACV,KAAAinG,cAAe,EACf,KAAAC,WAAY,EAOZ,KAAAC,yBAA2C,KAE5C,KAAA/b,QAAS,EAER,KAAAgc,uBAAuC,KAKvC,KAAAC,UAAW,EAEX,KAAAC,OAAQ,EAKdxlI,KAAK6R,eAAiB,IAAI,IAE1B,MAAM4zH,EAAM,IAAI,GAAe,kBAC/BzlI,KAAKo4H,uBAAyB,IAAI,GAAgB,CAChDjzB,SACAv0E,OACA/e,eAAgB7R,KAAK6R,eACrB7D,UAAW,UACXiyH,cAAewF,EACfhxH,QAAS,IAAW,mCAOlB,OANG+7E,EAAgB6pB,cAAcr6G,KAAKmlG,OAAOl6F,QAC3C,IAAI,GAAgBjL,KAAKmlG,OAAOl6F,OAAQjL,KAAK6kI,WAAW,GAExD,IAAI,GAAgB7kI,KAAKmlG,OAAOl6F,OAAQ,GAAG,IAGtC,OAIXjL,KAAK0lI,oBAAsB,IAAI5D,GAC/B2D,EAAI11G,OAAO3C,YAAYptB,KAAK0lI,oBAAoBxmF,OAAO,EAAG,IAE1Dl/C,KAAK2lI,iBAAmB,IAAItC,GAC5BoC,EAAIz1G,SAAS3uB,OAAOrB,KAAK2lI,iBAAiBvkI,WAE1CpB,KAAK4lI,cAAgB,IAAIvC,GACzBrjI,KAAK4lI,cAAcxkI,UAAUlB,UAAUW,IAAI,kCAC3C4kI,EAAI9zH,QAAQ3Q,QAAQhB,KAAK4lI,cAAcxkI,WAEvCpB,KAAK6lI,gBAAkB,IAAI5B,IAAgB,GAC3CwB,EAAI/zH,MAAMrQ,OAAO,YAAK,iBAAkB,IAAKrB,KAAK6lI,gBAAgBzkI,WAElE,MAAMq6G,EAAWz7G,KAAKo4H,uBAAuB3c,SAASv6G,WAAU,GAChElB,KAAKo4H,uBAAuBgI,mBAAmB3kB,GAC/CgqB,EAAIrkI,UAAUJ,QAAQy6G,GAEtBz7G,KAAK8lI,QAAU,EAAW,wDAAyD,CAACr0H,UAAU,IAE9FzR,KAAKo4H,uBAAuB+H,aAAan/H,QAAQhB,KAAK8lI,SAEtD,YAAiB9lI,KAAK8lI,QAAU/lI,IAC9B,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKmlG,OAAO4gC,YAAW,IACtB,CAACl0H,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,uBAAwB,EAAEiL,aACxDA,IAAWjL,KAAKmlG,OAAOl6F,SAGnBjL,KAAKspH,QACNtpH,KAAKo4H,uBAAuBj4H,OAAOH,KAAKspH,QAAS,GAGnDtpH,KAAKolI,UAAYplI,KAAKmlI,cAAe,EACrCnlI,KAAK8kI,aAAe,EACpB9kI,KAAK6kI,UAAY,EACjB7kI,KAAKsI,MAAQ,EACbtI,KAAKiM,KAAO,GACZjM,KAAKw+B,YAAc,EACnBx+B,KAAK4kI,aAAe,EACpB5kI,KAAKgmI,gBAAgB,MAK3BhmI,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,qBAAsB,EAAEiL,aACtDA,IAAWjL,KAAKmlG,OAAOl6F,QACxBjL,KAAKo4H,uBAAuBj4H,OAAOH,KAAKspH,QAAS,KAMrDtpH,KAAKimI,iBAAmB,OAAAjsG,GAAA,GAAS,IAAMh6B,KAAKkmI,oBAAqB,KAAK,GAAM,GAC5ElmI,KAAKqlG,yBAA2B,OAAA78C,GAAA,GAASxoD,KAAKgmI,gBAAgBt/H,KAAK1G,MAAO,KAAK,GAE/EA,KAAKulI,SAA8B,eAAnBvlI,KAAK4wB,KAAKvwB,KAGrB,UACLL,KAAKo4H,uBAAuB6H,cAAc7+H,UAAUkD,SACpDtE,KAAKo4H,uBAAuBj4H,QAAO,GACnCH,KAAK6R,eAAeO,YACpBpS,KAAKmmI,yBAAwB,GAGxB,gBAAgB7gC,GACrB,GAAGtlG,KAAKulI,SAAU,OAGlB,GAAGvlI,KAAKilI,QAAUjlI,KAAKspH,OACrB,OAGF,IAAItpH,KAAKmlI,cAAgBnlI,KAAKolI,aAAeplI,KAAKsI,MAChD,OAIF,IAAIxG,EAAK9B,KAAK4wB,KAAKC,QAAQg+E,iBAAiB,UAE5C,IAAI/sG,EAAI,OAIR,MAAM+I,EAAM/I,EAAGoF,QAAQ2D,IACpB/I,QAAcuG,IAARwC,GAEP7K,KAAKomI,SAASv7H,EAAKy6F,GAIhB,QAAQz6F,EAAay6F,GAC1B,GAAGtlG,KAAKulI,SAAU,OAGlB,GAAGvlI,KAAKspH,OAAQ,OAIhB,IAAIia,EAAuBvjI,KAAKiM,KAAKmP,UAAUyrE,GAAQA,GAAQh8E,GAC/D,IAAqB,IAAlB04H,GAAwBvjI,KAAKqmI,aAAa9C,GAEtC,MAAGvjI,KAAKolI,WAAav6H,EAAM7K,KAAKiM,KAAKjM,KAAKiM,KAAKtK,OAAS,IAQ7D,YAJI3B,KAAKslI,yBACPtlI,KAAKslI,uBAAyBtlI,KAAKsmI,gBAAgBz7H,OAA6BxC,IAAxBi9F,KAH1Di+B,EAAevjI,KAAKiM,KAAKtK,OAAS,EAAI3B,KAAKw+B,iBAH3C+kG,GAAgBvjI,KAAKw+B,YAqBvB,GADgBx+B,KAAK8kI,cAAgBvB,EACzB,CACV,GAAGvjI,KAAKklI,0BAA+C78H,IAAxBi9F,IACL,IAArBtlG,KAAK8kI,aAAqB9kI,KAAK8kI,YAAcvB,GAC9C,OAIJvjI,KAAK8kI,YAAcvB,EACnBvjI,KAAK6kI,UAAY7kI,KAAKiM,KAAKoI,KAAKwyE,GAAQA,GAAQh8E,IAAQ7K,KAAKiM,KAAKjM,KAAKiM,KAAKtK,OAAS,GACrF3B,KAAKimI,oBAID,aAAa1C,GACnB,OAAQvjI,KAAKsI,MAAQ,GAAkBuyD,cAEjC76D,KAAKmlI,cAAgB5B,GAAgB,GAAkBgD,cACvDvmI,KAAKolI,WAAcplI,KAAKsI,MAAQ,EAAIi7H,GAAiB,GAAkBgD,aAKjE,gBAAgB17H,EAAa27H,GAAe,G,0CACxD,IAAGxmI,KAAKk+B,QAAR,CACAl+B,KAAKk+B,SAAU,EAEf,IACE,IAAIuoG,GAAU,EACd,MAAMzjG,EAAW,CACfhjC,KAAKixD,mBAAmBjmD,UAAU,CAChCC,OAAQjL,KAAKmlG,OAAOl6F,OACpBE,YAAa,CAACC,EAAG,6BACjBR,MAAOC,EACPK,MAAO,GAAkB2vD,WACzBlwD,UAAW,GAAkBkwD,aAE9Bl3D,KAAKoiB,IACJ0gH,GAAU,EACH1gH,KAIX,IAAI/lB,KAAK4kI,aAAc,CACrB,MAAMx6H,EAAUpK,KAAKixD,mBAAmBy1E,iBAAiB1mI,KAAKmlG,OAAOl6F,QAAQtH,KAAKo4B,IAC5EA,EAAEnxB,QACN5K,KAAK4kI,aAAe7oG,EAAEnxB,OAElB67H,GAAWD,IACbxmI,KAAKiM,KAAO,CAACjM,KAAK4kI,cAClB5kI,KAAKsI,MAAQyzB,EAAEzzB,MACftI,KAAK8kI,YAAc,EACnB9kI,KAAK6kI,UAAY7kI,KAAKiM,KAAK,GAC3BjM,KAAKimI,uBAKTjjG,EAASz5B,KAAKa,GAGhB,MAAME,SAAgBjF,QAAQC,IAAI09B,IAAW,GAE7C,IAAI2jG,EAAcr8H,EAAOxC,QAAQsT,UAAUrT,GAAWA,EAAQ8C,KAAOA,IACjD,IAAjB87H,IACDA,EAAcr8H,EAAOxC,QAAQnG,QAK/B3B,KAAKw+B,YAAcl0B,EAAOs8H,iBAAmBt8H,EAAOs8H,iBAAmBD,EAAc,EACrF3mI,KAAKiM,KAAO3B,EAAOxC,QAAQ2E,IAAI1E,GAAWA,EAAQ8C,KAAKlF,QACvD3F,KAAKsI,MAAQgC,EAAOhC,MAEhBtI,KAAKsI,OACPtI,KAAKo4H,uBAAuBj4H,QAAO,GAGrCH,KAAKolI,UAAaplI,KAAKw+B,YAAcx+B,KAAKiM,KAAKtK,SAAY3B,KAAKsI,MAChEtI,KAAKmlI,cAAgBnlI,KAAKw+B,YAE1Bx+B,KAAKwlI,OAASxlI,KAAK4wB,KAAK1O,IAAI,gCAAiCrX,EAAKP,EAAQq8H,EAAa3mI,KAAKw+B,YAAax+B,KAAKolI,UAAWplI,KAAKmlI,cAC9H,MAAM70H,GACNtQ,KAAK4wB,KAAK1O,IAAI1R,MAAM,8BAA+BF,GAGrDtQ,KAAKk+B,SAAU,EAEZl+B,KAAKilI,OACNjlI,KAAKomI,QAAQv7H,GACL27H,GACRxmI,KAAKgmI,gBAAgB,GAGvBhmI,KAAKslI,uBAAyB,SAIzB,wBACLtlI,KAAKklI,qBAAsB,EAEvBllI,KAAKqlI,2BACPrlI,KAAKqlI,yBAA2B,IAAI,IChf3B,SAA+B36G,EAAmB86B,EAAwBppB,EAAsBvqB,GAC7G,GAAG,KAAoB,CACrB,IAAIg1H,EACJ,MAAMnnI,EAAU,CAACwkB,SAAS,GAC1BrS,EAAehR,IAAI6pB,EAAnB7Y,CAAyB,aAAe9R,IACnCA,EAAE6jB,QAAQjiB,OAAS,EACpBqiB,KAIF6iH,EAAQ9mI,EAAE6jB,QAAQ,GAAGE,QAErBjS,EAAehR,IAAI6pB,EAAnB7Y,CAAyB,YAAa8R,EAAajkB,GACnDmS,EAAehR,IAAI6pB,EAAnB7Y,CAAyB,WAAYmS,EAAYtkB,KAChDA,GAEH,MAAMikB,EAAe5jB,IACnB,MAAM+jB,EAAU/jB,EAAE6jB,QAAQ,GAAGE,QAEvBgjH,EAAShjH,EAAU+iH,EACb,WAATrhF,GAAqBshF,EAAQ1qG,IACf,QAATopB,GAAmBshF,GAAQ1qG,IACnCyqG,EAAQ/iH,GAIJE,EAAa,KACjBnS,EAAe0+C,aAAa7lC,EAAM,YAAa/G,EAAajkB,GAC5DmS,EAAe0+C,aAAa7lC,EAAM,WAAY1G,EAAYtkB,SAG5DmS,EAAehR,IAAI6pB,EAAnB7Y,CAAyB,QAAU9R,IACjC,MAAM+mI,EAAS/mI,EAAEuoE,OAAS,EAEd,WAAT9iB,GAAqBshF,EAAQ1qG,IACf,QAATopB,GAAmBshF,GAAQ1qG,KAClC,CAAClY,SAAS,ID6cX6iH,CAAsB/mI,KAAK4wB,KAAKC,QAAQthB,WAAWnO,UAAW,SAAU,KACtEpB,KAAKmmI,2BACJnmI,KAAKqlI,2BAIL,wBAAwB2B,GAAkB,GAC/ChnI,KAAKklI,qBAAsB,EAExBllI,KAAKqlI,2BACNrlI,KAAKqlI,yBAAyBjzH,YAC9BpS,KAAKqlI,yBAA2B,MAG/B2B,GACDhnI,KAAKgmI,gBAAgB,GAIZ,+B,0CACXhmI,KAAKilI,QAAS,EAEdjlI,KAAKwlI,OAASxlI,KAAK4wB,KAAK1O,IAAI,sCAC5B,IACEliB,KAAKinI,wBAEL,MAAM5lF,EAAiBrhD,KAAK4wB,KAAKywB,eAC9BA,aAA0Bh8C,gBACrBg8C,SAIF,eAEHrhD,KAAKslI,+BACAtlI,KAAKslI,wBAGbtlI,KAAKwlI,OAASxlI,KAAK4wB,KAAK1O,IAAI,8CAC5BliB,KAAKilI,QAAS,EAOd,MAAM30H,GACNtQ,KAAK4wB,KAAK1O,IAAI1R,MAAM,4CAA6CF,GAEjEtQ,KAAKilI,QAAS,EACdjlI,KAAKklI,qBAAsB,EAC3BllI,KAAKgmI,gBAAgB,OAIZ,oBAAoBn7H,G,0CAC/B,MAAM9C,EAAU/H,KAAK4wB,KAAKk6B,WAAWjgD,GAClC9C,IAAYA,EAAQ63B,UACrB5/B,KAAK4wB,KAAK+0E,aAAa96F,IACtB7K,KAAK4wB,KAAKywB,gBAAkBh8C,QAAQ6E,WAAWvG,KAAK,KACnD3D,KAAKknI,+BACLlnI,KAAKomI,QAAQpmI,KAAK8kI,aAAgB9kI,KAAKsI,MAAQ,EAAKtI,KAAK4kI,aAAe/5H,EAAM,SAKvE,oB,0CAQT,MAAMvC,EAAQtI,KAAKsI,MACnB,GAAGA,EAAO,CACR,MAAMw8H,EAAc9kI,KAAK8kI,YACnB/8H,EAAU/H,KAAK4wB,KAAKk6B,WAAW9qD,KAAK6kI,WAKlCsC,EAAyB,IAAhBrC,EACf9kI,KAAK6lI,gBAAgBzkI,UAAUlB,UAAUC,OAAO,UAAWgnI,GAEvDA,GACFnnI,KAAK6lI,gBAAgBuB,SAAS9+H,EAAQw8H,GAK1C9kI,KAAKo4H,uBAAuBj4H,QAAO,GAEnC,MAAM0jI,EAAUiB,EAAc9kI,KAAK+kI,eAEnC/kI,KAAKwlI,OAASxlI,KAAK4wB,KAAK1O,IAAI,kCAAmC2hH,EAASiB,EAAa9kI,KAAK+kI,gBAE1F,MAAMsC,EAAUrnI,KAAK2lI,iBAAiBrB,OAAOQ,GACvCwC,EAAetnI,KAAK4lI,cAActB,OAAOQ,GAC/CwC,EAAapnI,UAAUW,IAAI,wBAE3B,MAAMutB,EAA+B,GAC/BkD,EAAarB,GAAuB,CACxCve,WAAOrJ,EACPqkB,QAAS,KACTsD,SAAUjoB,EAAQA,QAClBmoB,WAAYm3G,EACZt/H,UACAooB,QAASm3G,EACTl5G,uBAGI/oB,QAAQC,IAAI8oB,GAElBpuB,KAAKo4H,uBAAuB6H,cAAc7+H,UAAUlB,UAAUC,OAAO,WAAYmxB,GAG/EtxB,KAAK2lI,iBAAiB3yH,QAAQ8xH,EAAa9kI,KAAK+kI,gBAC7CzzG,GACDtxB,KAAK4lI,cAAc5yH,QAAQ8xH,EAAa9kI,KAAKglI,qBAC7ChlI,KAAKglI,oBAAsBF,GAE3B9kI,KAAK4lI,cAAcjC,YAIvB3jI,KAAK0lI,oBAAoBxmF,OAAO52C,EAAOA,EAAQw8H,EAAc,GAC7D9kI,KAAK+kI,eAAiBD,EACtB9kI,KAAKo4H,uBAAuB6H,cAAc7+H,UAAU8F,QAAQ2D,IAAM,GAAK9C,EAAQ8C,SAE/E7K,KAAKo4H,uBAAuBj4H,QAAO,GACnCH,KAAK+kI,eAAiB,EAGxB/kI,KAAKo4H,uBAAuB6H,cAAc7+H,UAAUlB,UAAUC,OAAO,UAAWH,KAAKsI,MAAQ,OAxalF,GAAAuyD,WAAa,GACb,GAAA0rE,YAAc,EErNhB,OAFiB,G,SCajB,MAAM,WAAkB,GACrC,YAAYt7H,GACVtL,MAAM,aAAc,CAClBsL,SACA4sB,aAAc,gBACdwD,QAAS,CAAC,CACR7B,QAAS,wBACT4C,SAAU,KACR,IAAmBmrG,SAASt8H,GAAkB,IAAVwxC,EAAc,KAAa,OAAA+qF,GAAA,IAAM,GAAQ/qF,MAGjF95C,MAAM,IAGR,MAsBMy1B,EArBgD,CAAC,CACrDqkB,KAFe,KAGfjjB,QAAS,uBACR,CACDijB,KAAMgrF,MACNjuG,QAAS,wBACR,CACDijB,KAAMgrF,MACNjuG,QAAS,wBACR,CACDijB,KAAMgrF,MACNjuG,QAAS,sBACR,CACDijB,KAAMgrF,OACNjuG,QAAS,uBACR,CACDijB,MAAO,EACPjjB,QAAS,0BAIQ/sB,IAAKgwC,GACV,IAAI,GAAI,CAClBplB,WAAY,IAAI,GAAW,CACzBmC,QAASijB,EAAKjjB,QACdh5B,KALO,YAMPmE,MAAO,GAAK83C,EAAKA,UAOvB,IAAIA,EACJ,MAAMirF,EAAYvvG,GAAkBC,EAAOzzB,IACzC83C,GAAQ93C,IAGVyzB,EAAKA,EAAKz2B,OAAS,GAAG01B,WAAWF,SAAU,EAE3C,MAAMjiB,EAAU,IAAI,GAAe,CAACmrB,UAAU,EAAM/C,aAAa,IACjEpoB,EAAQvD,QAAQtQ,OAAOqmI,GACvB1nI,KAAK2C,KAAKtB,OAAO6T,EAAQ9T,WAEzBpB,KAAKo9B,QCpBM,MAAM,GA8BnB,YACUxM,EACA+mB,EACAsZ,EACAu/B,EACA+P,EACA+tB,EACAluB,EACAF,EACAynC,GARA,KAAA/2G,OACA,KAAA+mB,kBACA,KAAAsZ,qBACA,KAAAu/B,kBACA,KAAA+P,kBACA,KAAA+tB,0BACA,KAAAluB,oBACA,KAAAF,kBACA,KAAAynC,uBAmKF,KAAAC,cAAiB7nI,IACvB,MAAM8nI,IAAe9nI,MAAQC,KAAK8nI,UAAW9nI,KAAK8nI,QAAQ5nI,UAAUuV,SAAS,cAE7E1V,GAAK,OAAAiqB,EAAA,GAAYjqB,GAEjB,MAAM6nI,EAAiBvsG,IACrBA,EAAQ9wB,QAAQmZ,IACdA,EAAO3I,QAAQ7a,UAAUC,OAAO,QAASujB,EAAO5I,aAIjD+sH,IACDD,EAAc5nI,KAAK+nI,aAGnB/nI,KAAK+nI,YAAY/nI,KAAK+nI,YAAYpmI,OAAS,GAAGoZ,QAAQoS,UAAUC,YAAY,YAAKptB,KAAKwwF,gBAAgBw3C,oBAAoBhoI,KAAKiL,WAGjI28H,EAAc5nI,KAAKioI,kBAGb,KAAAC,sBAAyB7nI,I,MAC/B,IAAI,IAA2BL,KAAKiL,OAAO82B,SAAU,OAAO,EAE5D,MAAMomG,EAAmBnoI,KAAK2nI,qBAAqBS,UAC7ClyH,EAASlW,KAAKiL,OAAO8vB,WAC3B,IAAGotG,aAAgB,EAAhBA,EAAkBjyH,UAAWA,EAC9B,OAAO,EAGT,GAAG7V,IACGL,KAAKiL,OAAOsxB,eAA0B,UAATl8B,GAC9BL,KAAKiL,OAAOuvE,cAAyB,cAATn6E,GAC7B,OAAO,EAKX,OAAmC,QAA5B,EADML,KAAKugG,gBAAgB8nC,aAAanyH,GAClBqI,cAAM,eAAE+pH,cAAetoI,KAAKugG,gBAAgBt+D,UAAU/rB,EAAQ,gBAGrF,KAAAqyH,iBAAoBloI,IAC1B,IAAI,KAAsBL,KAAKiL,OAAO82B,SAAU,OAAO,EACvD,MAAMhrB,EAAS/W,KAAKiL,OAAOwL,WACrB4/D,EAAWr2E,KAAKogG,kBAAkBooC,kBAAkBzxH,GAE1D,QAASs/D,MAAwB,UAATh2E,EAAmBg2E,EAAS93D,OAAOkqH,sBAAwBpyD,EAAS93D,OAAOmqH,wBAsN7F,KAAAC,qBAAuB,KAC7B3oI,KAAK4wB,KAAKoyE,aAAa4lC,cAAc5oI,KAAKiL,SAiIpC,KAAAw1H,YAAc,KACpB,IAAI,GAAUzgI,KAAKiL,SAGb,KAAA49H,SAAW,KACjB7oI,KAAKwgI,eAAc,GACnBxgI,KAAKugI,eAGC,KAAAtW,eAAiB,CAAC79G,EAAkByqC,KAC1C72C,KAAKoB,UAAUlB,UAAUC,OAAO,qBAAsBgoB,EAAA,EAAWC,UAEjEpoB,KAAKolG,eAAiBplG,KAAKolG,cAAcgzB,uBAAuB6H,cAAc7+H,UAAUlB,UAAUC,OAAO,cAAe02C,IAAO,IAAWE,QAC1I/2C,KAAK6oI,YA0KA,KAAArI,cAAgB,CAACsI,GAAS,KAE5B9oI,KAAK+oI,aAAa7mI,OAAO+jB,qBAAqBjmB,KAAK+oI,aAEnD,MAAaD,GACd9oI,KAAKgpI,UAAU9oI,UAAUW,IAAI,QAI/Bb,KAAK+oI,YAAc7mI,OAAO8jB,sBAAsB,KAKvC,MAAa8iH,GACd9oI,KAAKgpI,UAAU9oI,UAAUoE,OAAO,QAIlC,MAAMd,EAAmCxD,KAAKgpI,UAAUtkH,wBAAwBlhB,MAChFxD,KAAK4wB,KAAK1O,IAAI,eAAgB1e,GAC9BxD,KAAKoB,UAAU+D,MAAMqB,YAAY,gBAAiBhD,EAAQ,MAI5DxD,KAAK+oI,YAAc,KAOlB,KAAAxI,YAAc,KACnB,MACMj4H,EADa,CAACtI,KAAKipI,UAAWjpI,KAAKolG,eAAiBplG,KAAKolG,cAAcgzB,wBAAwBxsH,OAAOc,SACnF+kB,OAAO,CAACC,EAAKtwB,KACpC,MAAMk/H,EAAal/H,EAAUk/H,aAG7B,OAFAtgI,KAAKoB,UAAUlB,UAAUC,OAAO,aAAaiB,EAAU4M,qBAAsBsyH,GAEzEl/H,EAAUyzF,YAIPnjE,IAAO4uG,EAHL5uG,GAIR,GACH1xB,KAAKoB,UAAU8F,QAAQ84H,SAAW,GAAK13H,GAGlC,KAAA4pC,cAAgB,CAACC,GAAY,KAClC,IAAInyC,KAAKgwB,SAAU,OAEnB,MAAM/kB,EAASjL,KAAKiL,OACpBjL,KAAK4wB,KAAKoyE,aAAa9wD,cAAclyC,KAAKiL,OAAQjL,KAAKgwB,SAAUmiB,GAAW,EAAO,IAAMlnC,IAAWjL,KAAKiL,SAjxBzGjL,KAAK6R,eAAiB,IAAI,IAE1B7R,KAAK+nI,YAAc,GACnB/nI,KAAKioI,gBAAkB,GAGlB,YAGLjoI,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,iBAAkB,UAC/Cb,KAAKoB,UAAU8F,QAAQ84H,SAAW,IAElChgI,KAAKkpI,QAAU,EAAW,4BAA6B,CAACz3H,UAAU,IAGlEzR,KAAKmpI,kBAAoBxoI,SAASC,cAAc,OAChDZ,KAAKmpI,kBAAkBjpI,UAAUW,IAAI,uBAErCb,KAAKopI,SAAWzoI,SAASC,cAAc,OACvCZ,KAAKopI,SAASlpI,UAAUW,IAAI,aAE5B,MAAMwoI,EAAS1oI,SAASC,cAAc,OACtCyoI,EAAOnpI,UAAUW,IAAI,UAErB,MAAM8Q,EAAUhR,SAASC,cAAc,OACvC+Q,EAAQzR,UAAUW,IAAI,WAEtB,MAAM63B,EAAM/3B,SAASC,cAAc,OACnC83B,EAAIx4B,UAAUW,IAAI,OAElBb,KAAK0R,MAAQ/Q,SAASC,cAAc,OACpCZ,KAAK0R,MAAMxR,UAAUW,IAAI,cAEzB63B,EAAIr3B,OAAOrB,KAAK0R,OAEhB,MAAMgU,EAAS/kB,SAASC,cAAc,OACtC8kB,EAAOxlB,UAAUW,IAAI,UAElBb,KAAKgwB,UACNtK,EAAOrkB,OAAOrB,KAAKgwB,UAGrBre,EAAQtQ,OAAOq3B,EAAKhT,GACjB1lB,KAAKspI,eACND,EAAOhoI,OAAOrB,KAAKspI,eAGrBD,EAAOhoI,OAAOsQ,GACd3R,KAAKopI,SAAS/nI,OAAOgoI,GAGrBrpI,KAAKgpI,UAAYroI,SAASC,cAAc,OACxCZ,KAAKgpI,UAAU9oI,UAAUW,IAAI,cAE7Bb,KAAKipI,UAAY,IAAI,GAAUjpI,KAAMA,KAAK4wB,KAAM5wB,KAAKixD,oBAElDjxD,KAAK+nI,YAAYpmI,SAClB3B,KAAK8nI,QAAU,GAAiB,CAACj2H,eAAgB7R,KAAK6R,gBAAiB,cAAe7R,KAAK+nI,YAAa/nI,KAAK4nI,gBAG/G5nI,KAAKgpI,UAAU3nI,UAAU,CAEvBrB,KAAKolG,cAAgBplG,KAAKolG,cAAcgzB,uBAAuB6H,cAAc7+H,UAAY,KACzFpB,KAAKupI,QACLvpI,KAAKwpI,UACLxpI,KAAKypI,QACLzpI,KAAK0pI,aACL1pI,KAAK2pI,QACL3pI,KAAK4pI,UACL5pI,KAAK8nI,SACLl8H,OAAOc,UAET1M,KAAK6pI,mBAAmB7pI,KAAKypI,QAASzpI,KAAKuoI,iBAAiB7hI,KAAK1G,KAAM,UACvEA,KAAK6pI,mBAAmB7pI,KAAK0pI,aAAc1pI,KAAKkoI,uBAEhDloI,KAAKmpI,kBAAkB9nI,OAAOrB,KAAKkpI,QAASlpI,KAAKopI,SAAUppI,KAAKgpI,WAChEhpI,KAAKoB,UAAUC,OAAOrB,KAAKmpI,mBAExBnpI,KAAKipI,WAENjpI,KAAKoB,UAAUC,OAAOrB,KAAKipI,UAAUhJ,cAAc7+H,WAOrDpB,KAAK6R,eAAehR,IAAIqB,OAAxBlC,CAAgC,SAAUA,KAAK6oI,UAC/C7oI,KAAK6R,eAAehR,IAAIsnB,EAAA,EAAxBnoB,CAAoC,eAAgBA,KAAKiqH,gBAEzD,YAAiBjqH,KAAKoB,UAAYrB,IAChC,MAAMqB,EAAY,OAAA0pB,GAAA,GAAgB/qB,EAAE2a,OAAQ,oBAE5C,GADA,OAAA82C,GAAA,KACGpwD,EAAW,CAGZ,GAFA,OAAA4oB,EAAA,GAAYjqB,GAET,OAAA+qB,GAAA,GAAgB/qB,EAAE2a,OAAQ,iBAC3B,OAGF,MAAM7P,GAAOzJ,EAAU8F,QAAQ2D,IAC/B,GAAGzJ,EAAUlB,UAAUuV,SAAS,kBAE5BzV,KAAKolG,cAAc0kC,oBAAoBj/H,OAEpC,CACL,MAAMI,EAAS7J,EAAU8F,QAAQ+D,OAAOsgB,WAClCzgB,EAAgB,GAA2Bi/H,mBACjD/pI,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,SACAy4F,UAAW74F,EACXxK,KAAMyK,EAAckC,YAAc,YAAelC,EAAcwE,SAAW,kBAAejH,EACzFiH,SAAUxE,EAAcwE,iBAIzB6Y,EAAA,EAAW6hH,eAAiB,IAAWlzF,QAAUn2C,SAASgC,KAAKzC,UAAUuV,SlEhKxC,wBkEiKlCw0H,IACQ,OAAAhkG,GAAA,GAAUlmC,EAAE2a,OAAQ,kBAC5B1a,KAAK23C,gBAAgBX,eAAer2C,SAASgC,KAAKzC,UAAUuV,S3I3MzB,0B2I6MnCzV,KAAK23C,gBAAgBX,eAAc,IAGtC,CAACnlC,eAAgB7R,KAAK6R,iBAEzB,MAAMo4H,EAAkBlqI,IAOtB,GANGA,GACD,OAAAiqB,EAAA,GAAYjqB,GAKXooB,EAAA,EAAW6hH,eAAiB,IAAWlzF,QAAUn2C,SAASgC,KAAKzC,UAAUuV,SlEjLtC,wBkEkLpCzV,KAAK4wB,KAAKoyE,aAAa7vD,QAAQ,CAACloC,OAAQjL,KAAKiL,aACxC,CACL,MAAMi/H,EAAkE,IAApDlqI,KAAK4wB,KAAKoyE,aAAaplC,MAAMz4C,QAAQnlB,KAAK4wB,MAC9Dje,EAAA,EAAwBG,KAAKo3H,EAAc,KAAO,UAYtD,YAAiBlqI,KAAKkpI,QAASe,EAAgB,CAACp4H,eAAgB7R,KAAK6R,iBAG/D,mBAAmBkJ,EAAsBD,GAC3CC,GAIJ/a,KAAKioI,gBAAgB1+H,KAAK,CAACwR,UAASD,WAoD/B,iBACL9a,KAAK+nI,YAAc,CAAC,CAClB52H,KAAM,SACNmnB,KAAM,SACNopB,QAAS,KACP1hD,KAAK4wB,KAAK2zD,cAEZzpE,OAAQ,IAAMqN,EAAA,EAAWC,UAMtB,CACHjX,KAAM,OACNmnB,KAAM,wBACNopB,QAAS1hD,KAAKygI,YACd3lH,OAAQ,IAAyB,SAAnB9a,KAAK4wB,KAAKvwB,MAAmBuM,EAAA,EAAU+R,OAAS3e,KAAKiL,SAAWjL,KAAKsuH,wBAAwBhiF,iBAAiBtsC,KAAKiL,QAAQ,IACxI,CACDkG,KAAM,SACNmnB,KAAM,0BACNopB,QAAS,KACP1hD,KAAKixD,mBAAmBplB,eAAe7rC,KAAKiL,SAE9C6P,OAAQ,IAAyB,SAAnB9a,KAAK4wB,KAAKvwB,MAAmBuM,EAAA,EAAU+R,OAAS3e,KAAKiL,QAAUjL,KAAKsuH,wBAAwBhiF,iBAAiBtsC,KAAKiL,QAAQ,IACvI,CACDkG,KAAM,WACNmnB,KAAM,iBACNopB,QAAS,KACP,MAAMlxB,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBACrCzrB,QAAQ6E,QAAQlK,KAAKogG,kBAAkBu6B,eAAe36H,KAAKiL,OAAO8vB,aAAap3B,KAAKw2H,IAC/E3pG,KAAgB2pG,EAAYgQ,gBAC7BnqI,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQkvH,EAAYgQ,eAAe5+G,UAAS,QAKpDzQ,OAAQ,K,MACN,MAAMiiB,EAAW/8B,KAAKogG,kBAAkB/2D,kBAAkBrpC,KAAKiL,OAAO8vB,YACtE,MAA0B,SAAnB/6B,KAAK4wB,KAAKvwB,SAAuD,QAAlC,EAAC08B,SAAiC,eAAEotG,kBAE3E,CACDh5H,KAAM,QACNmnB,KAAM,OACNopB,QAAS1hD,KAAKoqI,YAAY1jI,KAAK1G,KAAM,SACrC8a,OAAQ9a,KAAKuoI,iBAAiB7hI,KAAK1G,KAAM,UACxC,CACDmR,KAAM,cACNmnB,KAAM,YACNopB,QAAS1hD,KAAKoqI,YAAY1jI,KAAK1G,KAAM,SACrC8a,OAAQ9a,KAAKuoI,iBAAiB7hI,KAAK1G,KAAM,UACxC,CACDmR,KAAM,YACNmnB,KAAM,6BACNopB,QAAS1hD,KAAK2oI,qBACd7tH,OAAQ9a,KAAKkoI,sBAAsBxhI,KAAK1G,KAAM,cAC7C,CACDmR,KAAM,YACNmnB,KAAM,4BACNopB,QAAS1hD,KAAK2oI,qBACd7tH,OAAQ9a,KAAKkoI,sBAAsBxhI,KAAK1G,KAAM,UAC7C,CACDmR,KAAM,SACNmnB,KAAM,2BACNopB,QAAS,KACP,MAAM1L,EAAYh2C,KAAK4wB,KAAKolB,UAC5BA,EAAUuY,iBAAgB,GAAM,GAChCr1B,EAAA,EAAgBC,WAAWx1B,KAAKy1B,IAC9B,GAAGA,EAAMixG,4BACP,OAGF,MAAMhuG,EAAW2Z,EAAUE,gBAAgBxvC,KAAKsvC,GAChDA,EAAUE,gBAAmBqS,IAC3BrvB,EAAA,EAAgB61C,YAAY,+BAA+B,GAC3Dp1C,GAAM,YAAK,mBAEXqc,EAAUE,gBAAkB7Z,EAC5B2Z,EAAUE,gBAAgBqS,OAIhCztC,OAAQ,KAAO9a,KAAK4wB,KAAKolB,UAAUC,eAAiBj2C,KAAK4wB,KAAKC,QAAQ6kF,qBACrE,CACDvkG,KAAM,SACNmnB,KAAM,2BACNopB,QAAS,KACP1hD,KAAK4wB,KAAKolB,UAAUiY,mBAEtBnzC,OAAQ,IAAM9a,KAAK4wB,KAAKolB,UAAUC,aACjC,CACD9kC,KAAM,UACNmnB,KAAM,aACNopB,QAAS,KACP,IAAI1hD,KAAK23C,gBAAgB6F,YAAY,IAAoB,CACvD,MAAMpqC,EAAM,IAAI,GAAkBpT,KAAK23C,iBACvCvkC,EAAInI,OAASjL,KAAKiL,OAClBmI,EAAIsB,OAEJ1U,KAAK23C,gBAAgBX,eAAc,KAGvCl8B,OAAQ,IAAM9a,KAAKiL,OAAO82B,WAAa/hC,KAAKwwF,gBAAgBplD,UAAUprC,KAAKiL,SAC1E,CACDkG,KAAM,UACNmnB,KAAM,eACNopB,QAAS,KACP,MAAM4oF,EAAgBtqI,KAAKiL,OAC3B,IAAI,GAAc,CAChBm5B,UAAW,CAAC,UAAW,YACvBF,SAAWj5B,GACF,IAAI5F,QAAQ,CAAC6E,EAASmlB,KAC3B,IAAI,GAAU,GAAI,CAChBwI,aAAc,mBACdgE,mBAAoB,yBACpBG,oBAAqB,CAAC,IAAI,KAAU,CAAC/wB,SAAQiM,QAAQ,IAAO6D,SAC5DsgB,QAAS,CAAC,CACR7B,QAAS,OACT4C,SAAU,KACRlyB,IAEAlK,KAAKixD,mBAAmBo8D,YAAYpiH,EAAQq/H,GAC5CtqI,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAACtiD,aAEtC,CACDuuB,QAAS,SACT4C,SAAU,KACR/M,KAEF6yC,UAAU,IAEZj3D,SACAqwB,iBAAiB,IAChB8B,SAGPzsB,YAAa,gCACb6wB,iBAAkB,gBAClBzC,aAAc,kBAGlBjkB,OAAQ,IAAMlO,EAAA,EAAU+R,OAAS3e,KAAKiL,QAAUjL,KAAKiL,OAAO82B,UAAY/hC,KAAKwwF,gBAAgBplD,UAAUprC,KAAKiL,WAAajL,KAAKkgG,gBAAgB10D,QAAQxrC,KAAKiL,OAAOwL,YAAY01B,OAC7K,CACDh7B,KAAM,OACNmnB,KAAM,YACNopB,QAAS,KACP,IAAI,GAAU,GAAI,CAChBz2C,OAAQjL,KAAKiL,OACb4sB,aAAc,YACdgE,mBAAoB,0BACpBG,oBAAqB,CAAC,IAAI,KAAU,CAAC/wB,OAAQjL,KAAKiL,SAAS8P,SAC3DsgB,QAAS,CAAC,CACR7B,QAAS,YACTwO,UAAU,EACV5L,SAAU,KACRp8B,KAAKkgG,gBAAgB/7B,YAAYnkE,KAAKiL,QAAQ,GAAMtH,KAAKgB,IACpDA,GACDi1B,GAAS,CAACC,YAAa,uBAK9BuD,QAELtiB,OAAQ,K,MACN,IAAI9a,KAAKiL,OAAO82B,SAAU,OAAO,EACjC,MAAMs0C,EAAWr2E,KAAKogG,kBAAkBooC,kBAAkBxoI,KAAKiL,OAAOwL,YACtE,OAAOzW,KAAKiL,SAAW2B,EAAA,EAAU+R,MAAQ03D,KAA4B,QAAf,EAAAA,EAAS93D,cAAM,eAAE8lD,WAExE,CACDlzD,KAAM,UACNmnB,KAAM,UACNopB,QAAS,KACP1hD,KAAKkgG,gBAAgB/7B,YAAYnkE,KAAKiL,QAAQ,GAAOtH,KAAKgB,IACrDA,GACDi1B,GAAS,CAACC,YAAa,qBAI7B/e,OAAQ,K,MACN,MAAMu7D,EAAWr2E,KAAKogG,kBAAkBooC,kBAAkBxoI,KAAKiL,OAAOwL,YACtE,SAAyB,QAAhB,EAAA4/D,aAAQ,EAARA,EAAU93D,cAAM,eAAE8lD,WAE5B,CACDlzD,KAAM,gBACNmnB,KAAM,SACNopB,QAAS,KACP,IAAI,GAAkB1hD,KAAKiL,SAE7B6P,OAAQ,IAAyB,SAAnB9a,KAAK4wB,KAAKvwB,QAAqBL,KAAKixD,mBAAmB4oB,cAAc75E,KAAKiL,UAG1FjL,KAAK4pI,UAAY,EAAW,UAC5B5pI,KAAKoyC,iBAAiBpyC,KAAK4pI,UAAY7pI,IACrCC,KAAK4wB,KAAK2zD,eACT,GAGE,iBAAiBziF,EAAiB6e,EAA6ByQ,GACpE,YAAiBtvB,EAAK/B,IACpB,OAAAiqB,EAAA,GAAYjqB,IACXqxB,GAAU,OAAAogC,GAAA,KACX7wC,EAAG5gB,IACF,CAAC8R,eAAgB7R,KAAK6R,iBAGnB,YAAYxR,GAClBL,KAAK4wB,KAAKoyE,aAAaE,SAASljG,KAAKiL,OAAOwL,WAAYpW,GAOnD,uBAqGL,OApGAL,KAAKspI,cAAgB,IAAI,GACzBtpI,KAAKspI,cAAc9tG,UAAW,EAC9Bx7B,KAAKspI,cAAcppI,UAAUW,IAAI,YAAa,iBAE9Cb,KAAKgwB,SAAWrvB,SAASC,cAAc,OACvCZ,KAAKgwB,SAAS9vB,UAAUW,IAAI,QAE5Bb,KAAKolG,cAAgB,IAAI,GAAkBplG,KAAMA,KAAK4wB,KAAM5wB,KAAKixD,mBAAoBjxD,KAAKwwF,iBAE1FxwF,KAAKupI,QAAU,YAAO,gDACtBvpI,KAAKypI,QAAU,EAAW,SAC1BzpI,KAAK0pI,aAAe,EAAW,aAC/B1pI,KAAKwpI,UAAY,EAAW,WAC5BxpI,KAAK2pI,QAAU,EAAW,QAE1B3pI,KAAKoyC,iBAAiBpyC,KAAKypI,QAASzpI,KAAKoqI,YAAY1jI,KAAK1G,KAAM,UAChEA,KAAKoyC,iBAAiBpyC,KAAK0pI,aAAc1pI,KAAK2oI,sBAE9C3oI,KAAKoyC,iBAAiBpyC,KAAKwpI,UAAW,KACpCxpI,KAAK+lI,YAAW,KAGlB/lI,KAAKoyC,iBAAiBpyC,KAAK2pI,QAAS3pI,KAAKygI,aAEzCzgI,KAAKoyC,iBAAiBpyC,KAAKupI,QAAS,KAClC,MAAM/4G,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBACrC9wB,KAAKupI,QAAQhpI,aAAa,WAAY,QAEtC,MAAM2V,EAASlW,KAAKiL,OAAO8vB,WAC3B,IAAI3wB,EAEFA,EADCpK,KAAKugG,gBAAgBr5D,UAAUhxB,GACtBlW,KAAKugG,gBAAgBgqC,YAAYr0H,GAEjClW,KAAKugG,gBAAgB5qD,YAAYz/B,EAAQtJ,EAAA,EAAU+R,MAG/DvU,EAAQu9B,QAAQ,KACVnX,KAIJxwB,KAAKupI,QAAQ5+F,gBAAgB,gBAIjC3qC,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,cAAgBkW,I,QACjD,GAAGlW,KAAKiL,SAAWiL,EAAOqV,UAAS,GAAO,CACxC,MAAMqF,EAAO5wB,KAAKugG,gBAAgB1jE,QAAQ3mB,GAE1ClW,KAAKupI,QAAQrpI,UAAUC,OAAO,SAAkC,QAAzB,EAAiB,QAAjB,EAACywB,SAAgB,eAAErS,cAAM,eAAEoH,OAClE3lB,KAAKwgI,gBACLxgI,KAAK4nI,mBAIT5nI,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,yBAA2BkX,IACzDA,EAAOjM,SAAWjL,KAAKiL,QACxBjL,KAAKwqI,kBAITxqI,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,eAAgB,EAAEiL,aAChDjL,KAAKiL,SAAWA,GACjBjL,KAAKkyC,kBAITlyC,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,cAAgB+W,IAC9C/W,KAAKiL,SAAW8L,EAAOwU,YACxBvrB,KAAKkyC,kBAITlyC,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,mBAAqBiL,IACnDjL,KAAKiL,SAAWA,GACjBjL,KAAK4nI,kBAIN5nI,KAAKolG,eACNplG,KAAK4wB,KAAKtvB,iBAAiB,UAAW,CAACuJ,EAAK4/H,KAC1C,MAAMj6G,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBACrCoI,EAAA,EAAgBC,WAAWx1B,KAAMy1B,IAC3B5I,MAEJxwB,KAAKolG,cAAckkB,SAAWlwF,EAAMsxG,qBAAqB1qI,KAAK4wB,KAAK3lB,QAEhEw/H,GACDzqI,KAAKolG,cAAc+gC,0BACnBnmI,KAAKolG,cAAcghC,QAAQv7H,EAAK,IACvB7K,KAAKolG,cAAc6/B,SAC5BjlI,KAAKolG,cAAc8hC,+BACnBlnI,KAAKolG,cAAcghC,QAAQv7H,SAMnC7K,KAAK8yC,sBAAwB5wC,OAAO6wC,YAAY/yC,KAAKkyC,cAAe,KAE7DlyC,KAGF,yBACLA,KAAK6R,eAAehR,IAAI+L,EAAA,EAAxB5M,CAAmC,uBAAwB,EAAEiL,SAAQgB,WAChEhB,IAAWjL,KAAKiL,QAEhBgB,GACDjM,KAAK+U,aAKJ,6BACL/U,KAAKolG,cAAgB,IAAI,GAAkBplG,KAAMA,KAAK4wB,KAAM5wB,KAAKixD,mBAAoBjxD,KAAKwwF,iBAGrF,WAAWm6C,GAChB3qI,KAAK4wB,KAAKoyE,aAAaz1C,aAAa,CAClCtiD,OAAQjL,KAAKiL,OACby4F,UAAWinC,GAAa3qI,KAAKolG,cAAcgzB,uBAAuB6H,cAAc7+H,UAAU8F,QAAQ2D,IAAM,EACxGxK,KAAM,WAoBH,UAELL,KAAK6R,eAAeO,YACpBlQ,OAAO+6C,cAAcj9C,KAAK8yC,uBAEvB9yC,KAAKolG,eACNplG,KAAKolG,cAAcuZ,UAGlB3+G,KAAKipI,WACNjpI,KAAKipI,UAAUtqB,iBAGV3+G,KAAKipI,iBACLjpI,KAAKolG,cAGP,QAAQn6F,GACbjL,KAAK4qI,UAAY5qI,KAAKiL,OACtBjL,KAAKiL,OAASA,EAEdjL,KAAKoB,UAAU+D,MAAMC,QAAU6F,EAAS,GAAK,OAGxC,iBAAiB2iG,EAAmBU,EAAiB5K,G,QAC1D,MAAMz4F,EAASjL,KAAKiL,OAEjBjL,KAAKspI,eACNtpI,KAAKspI,cAAczyG,kBAAkB,CAAC5rB,WAGxC,MAAMsxB,EAAcv8B,KAAKwwF,gBAAgBj0D,YAAYtxB,GAErD,GADAjL,KAAK2pI,SAAW3pI,KAAK2pI,QAAQzpI,UAAUC,OAAO,QAASo8B,GACpDv8B,KAAKupI,QACN,GAAGvpI,KAAKwwF,gBAAgBptD,UAAUn4B,GAAS,CACzC,MAAMiL,EAASjL,EAAO8vB,WACtB,OAAAtqB,EAAA,GAAezQ,KAAKupI,QAAS,YAAKvpI,KAAKugG,gBAAgBhkE,YAAYrmB,GAAU,iBAAmB,gBAChGlW,KAAKupI,QAAQrpI,UAAUC,OAAO,SAAqD,QAA5C,EAAoC,QAApC,EAAAH,KAAKugG,gBAAgB1jE,QAAQ3mB,UAAO,eAAEqI,cAAM,eAAEoH,YAErF3lB,KAAKupI,QAAQrpI,UAAUW,IAAI,QAI/Bb,KAAKwgI,gBAELxgI,KAAK4nI,gBAEL,MAAMp3G,EAAaxwB,KAAK4wB,KAAKC,QAAQC,gBACrC,GAAG9wB,KAAKolG,cACN,GAAsB,SAAnBplG,KAAK4wB,KAAKvwB,KAAiB,CAC5B,QAAsBgI,IAAnBrI,KAAK4qI,UAAyB,CAC/B,MAAMC,EAAmB,IAAI,GAAkB7qI,KAAMA,KAAK4wB,KAAM5wB,KAAKixD,mBAAoBjxD,KAAKwwF,iBAC9FxwF,KAAKolG,cAAcgzB,uBAAuB6H,cAAc7+H,UAAUgsB,YAAYy9G,EAAiBzS,uBAAuB6H,cAAc7+H,WACpIpB,KAAKolG,cAAcuZ,UAEnB3+G,KAAKolG,cAAgBylC,EAGvB3xG,EAAA,EAAgBC,WAAWx1B,KAAMy1B,IAC3B5I,MAEJxwB,KAAKolG,cAAckkB,SAAWlwF,EAAMsxG,qBAAqBz/H,GAErD2iG,GACF5tG,KAAKolG,cAAc4gC,gBAAgB,UAGZ,eAAnBhmI,KAAK4wB,KAAKvwB,OAClBL,KAAKolG,cAAcy/B,UAAY7kI,KAAK4wB,KAAKthB,SACzCtP,KAAKolG,cAAc98F,MAAQ,EAC3BtI,KAAKolG,cAAc0/B,YAAc,EACjC9kI,KAAKolG,cAAc8gC,qBAIvB,aAAQ,KACNlmI,KAAK+U,WACL/U,KAAKkyC,eAAc,GACnBlyC,KAAKwqI,kBAIF,SAASliI,GACd,IAAIokB,EACkB,WAAnB1sB,KAAK4wB,KAAKvwB,MACaqsB,OAAXrkB,IAAVC,EAA+B,YAAK,WACxB,YAAK,sBAAuB,CAACA,SAE/BD,IAAVC,GACDtI,KAAKixD,mBAAmBqK,kBAAkBt7D,KAAKiL,OAAQ,CAAC,CAACG,EAAG,+BAA+B,GAAOzH,KAAK2G,IACrG,MAAMhC,EAAQgC,EAAO,GAAGhC,MAIxB,GAHAtI,KAAK+U,SAASzM,IAGVA,EAAO,CACTtI,KAAK4wB,KAAKoyE,aAAa7vD,UAGvB,MAAMglF,EAAen4H,KAAK4wB,KAAKoyE,aAAapyE,KACzCunG,EAAahzB,OAAOC,eACrB+yB,EAAahzB,OAAOC,cAAcgzB,uBAAuBj4H,QAAO,OAK7C,cAAnBH,KAAK4wB,KAAKvwB,MAGhBqsB,EAFC1sB,KAAKiL,SAAW2B,EAAA,EAAU+R,KAEjB,YAAK,aAEL,YAAK,0BAIJtW,IAAVC,GACDtI,KAAKixD,mBAAmBolD,qBAAqBr2G,KAAKiL,QAAQtH,KAAKsI,IAC7DjM,KAAK+U,SAAS9I,EAAKtK,WAGI,eAAnB3B,KAAK4wB,KAAKvwB,MACMqsB,OAAXrkB,IAAVC,EAA+B,YAAK,WACxB,YAAK,sBAAuB,CAACA,SAE/BD,IAAVC,GACDjD,QAAQC,IAAI,CACVtF,KAAKixD,mBAAmB05C,WAAW3qG,KAAKiL,OAAQ,EAAG,EAAG,EAAGjL,KAAK4wB,KAAKthB,UACnEjK,QAAQ6E,YACPvG,KAAK,KACN,MAAM2E,EAAQtI,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,OAAQjL,KAAK4wB,KAAKthB,UAAUhH,MAC5E,OAAVA,EACDwH,WAAW,KACT9P,KAAK+U,YACJ,IAEH/U,KAAK+U,SAASzM,MAIO,SAAnBtI,KAAK4wB,KAAKvwB,OAClBqsB,EAAU,IAAI,KAAU,CACtBzhB,OAAQjL,KAAKiL,OACbiM,QAAQ,IACP6D,SAGL,OAAAtK,EAAA,GAAezQ,KAAK0R,MAAOgb,GAEL,SAAnB1sB,KAAK4wB,KAAKvwB,MACXL,KAAK0R,MAAMrQ,UAAU6rC,GAAmBltC,KAAKiL,SAI1C,gBACL,IAAIjL,KAAK2pI,QAAS,OAElB,MAAM1+H,EAASjL,KAAKiL,OACpB,IAAI8S,EAAQ/d,KAAKsuH,wBAAwBhiF,iBAAiBrhC,GAAQ,GAC/DjL,KAAKwwF,gBAAgBj0D,YAAYtxB,IAClCjL,KAAK2pI,QAAQzpI,UAAUoE,OAAO,aAAc,gBAC5CtE,KAAK2pI,QAAQzpI,UAAUW,IAAIkd,EAAQ,eAAiB,cACpD/d,KAAK2pI,QAAQxkI,MAAMC,QAAU,IAE7BpF,KAAK2pI,QAAQxkI,MAAMC,QAAU,QC1yBpB,MAAM,WAA4B,EAAjD,c,oBAMU,KAAAkK,SAAW,EACX,KAAAF,MAAQ,GAGhB,qBACEpP,KAAK8qI,UAAUC,YAAY/qI,KAAKiL,OAAQjL,KAAKsP,SAAUtP,KAAKoP,OAGpD,OACRpP,KAAKoB,UAAU2R,GAAK,2BACpB/S,KAAKoB,UAAUlB,UAAUW,IAAI,sBAC7Bb,KAAKmgF,YAAc,IAAI,EAAY,UACnCngF,KAAK0R,MAAM0b,YAAYptB,KAAKmgF,YAAY/+E,WAExCpB,KAAKgrI,YAAc,EAAW,iCAC9BhrI,KAAKuR,OAAOlQ,OAAOrB,KAAKgrI,aAExB,MAAMlzG,EAAIn3B,SAASC,cAAc,OACjCk3B,EAAE53B,UAAUW,IAAI,sBAChBb,KAAKuP,WAAWnO,UAAUgsB,YAAY0K,GACtC93B,KAAK8qI,UAAY,IAAI,EAAUhzG,EAAG93B,KAAKmgF,YAAa,CAClD3wE,SAAU,IAAI,EAAY,4BAA6B,cAI3D,KAAKvE,EAAgBqE,EAAmBwzF,EAAgD1zF,GACtF,MAAM5B,EAAM7N,MAAM+U,OAsBlB,OApBI1U,KAAKiL,OAiBPjL,KAAK8qI,UAAUC,YAAY/qI,KAAKiL,OAAQjL,KAAKsP,SAAUF,IAhBvDpP,KAAKoP,MAAQA,EACbpP,KAAKiL,OAASA,EACdjL,KAAKsP,SAAWA,EAChBtP,KAAK8iG,WAAaA,EAElB9iG,KAAKgrI,YAAY9qI,UAAUC,OAAO,QAASH,KAAK8iG,YAC7C9iG,KAAK8iG,YACN,YAAiB9iG,KAAKgrI,YAAa,KACjC,IAAI,GAAgB,IAAItuF,KAAQ18C,KAAK8iG,YAAY1lE,SAIrDhuB,GAASpP,KAAK8qI,UAAUl8H,YAAYpK,WAAWoB,iBAAiBwJ,GAEhE,GAAgB4nC,eAAc,IAKzBxpC,GC9CI,MAAM,GAuBnB,YAAoB23F,EAA4Bv0E,EAAYxhB,GAAxC,KAAA+1F,SAA4B,KAAAv0E,OANxC,KAAA3hB,WAAa,EACb,KAAAg8H,cAAgB,EA6HhB,KAAArjD,YAAe7nF,IACrB,OAAAiqB,EAAA,GAAYjqB,GACZ,IAAI,GAAgB,IAAI28C,KAAQ18C,KAAK4wB,KAAKC,QAAQiyE,YAAY1lE,QAwCxD,KAAA8tG,eAAkBnrI,IACxB,MAAM2a,EAAS,OAAAurB,GAAA,GAAUlmC,EAAE2a,OAAQ,MAChCA,GACD1a,KAAKmrI,aAAazwH,IAId,KAAA0wH,cAAiBrrI,IACpBC,KAAKiP,aACNjP,KAAK4wB,KAAKC,QAAQstB,iBAAiBj+C,UAAUC,OAAO,yBACpDH,KAAKwiC,QAAQtiC,UAAUC,OAAO,YAI1B,KAAAkrI,UAAatrI,IACnB,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKmrI,aAAanrI,KAAKgQ,YAAY5B,KAAKmiB,SAASvwB,KAAKirI,cAAgB,KAGhE,KAAAK,YAAevrI,IACrB,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKmrI,aAAanrI,KAAKgQ,YAAY5B,KAAKmiB,SAASvwB,KAAKirI,cAAgB,KAtLtEjrI,KAAK+a,QAAUpa,SAASC,cAAc,OACtCZ,KAAK+a,QAAQ7a,UAAUW,IAAI,iBAAkB,cAAe,sBAE5Db,KAAKqjF,QAAU1iF,SAASC,cAAc,UACtCZ,KAAKqjF,QAAQnjF,UAAUW,IAAI,WAAY,aAAc,wBACrD,OAAAq3B,GAAA,GAAOl4B,KAAKqjF,SAEZ,MAAMxxE,EAAiB7R,KAAK6R,eAAiB,IAAI,IAE3C2vH,EAAc,CAACzmH,EAAsBqhB,KACzC,YAAiBrhB,EAASqhB,EAAU,CAACvqB,oBAGvC2vH,EAAYxhI,KAAKqjF,QAAS,KACxBrjF,KAAK2+G,YAGP3+G,KAAKmgF,YAAc,IAAI,EAAY,UAGnCngF,KAAKwiC,QAAU7hC,SAASC,cAAc,OACtCZ,KAAKwiC,QAAQtiC,UAAUW,IAAI,sBAAuB,sBAElDb,KAAKgQ,YAAc,IAAI,GAAY,EAAO,gBAAY3H,EAAW,IAAI,GACrEm5H,EAAYxhI,KAAKgQ,YAAY5B,KAAMpO,KAAKkrI,gBAExClrI,KAAK8qI,UAAY,IAAI,EAAU9qI,KAAKwiC,QAASxiC,KAAKmgF,YAAa,CAC7D3wE,SAAUxP,KAAKgQ,aACb1H,IACFtI,KAAKiP,WAAa3G,EAEdtI,KAAKiP,WAOPjP,KAAKmrI,aAAanrI,KAAKgQ,YAAY5B,KAAKmiB,SAAS,KANjD,OAAA9f,EAAA,GAAezQ,KAAKurI,aAAcvrI,KAAKmgF,YAAYx7E,MAAQ,YAAK,YAAc,IAC9E3E,KAAKwiC,QAAQtiC,UAAUoE,OAAO,UAC9BtE,KAAK4wB,KAAKC,QAAQstB,iBAAiBj+C,UAAUoE,OAAO,yBACpDtE,KAAKwrI,MAAMjrI,aAAa,WAAY,QACpCP,KAAKyrI,QAAQlrI,aAAa,WAAY,WAK1CP,KAAK8qI,UAAUC,YAAY/qI,KAAK4wB,KAAK3lB,OAAQjL,KAAK4wB,KAAKthB,UAGvDtP,KAAK4wB,KAAKC,QAAQstB,iBAAiB98C,OAAOrB,KAAKwiC,SAG/CxiC,KAAK0rI,OAAS/qI,SAASC,cAAc,OACrCZ,KAAK0rI,OAAOxrI,UAAUW,IAAI,sBAE1B2gI,EAAYxhI,KAAK0rI,OAAQ1rI,KAAKorI,eAC9B,OAAAlzG,GAAA,GAAOl4B,KAAK0rI,QAEZ1rI,KAAKurI,aAAe5qI,SAASC,cAAc,QAC3CZ,KAAKurI,aAAarrI,UAAUW,IAAI,qBAEhCb,KAAK2rI,QAAUhrI,SAASC,cAAc,UACtCZ,KAAK2rI,QAAQzrI,UAAUW,IAAI,WAAY,kBAEvCb,KAAKumH,SAAW5lH,SAASC,cAAc,OACvCZ,KAAKumH,SAASrmH,UAAUW,IAAI,wBAE5Bb,KAAKwrI,MAAQ7qI,SAASC,cAAc,UACpCZ,KAAKwrI,MAAMtrI,UAAUW,IAAI,WAAY,YACrCb,KAAKyrI,QAAU9qI,SAASC,cAAc,UACtCZ,KAAKyrI,QAAQvrI,UAAUW,IAAI,WAAY,cAEvCb,KAAKwrI,MAAMjrI,aAAa,WAAY,QACpCP,KAAKyrI,QAAQlrI,aAAa,WAAY,QAEtCihI,EAAYxhI,KAAK2rI,QAAS3rI,KAAK4nF,aAC/B45C,EAAYxhI,KAAKwrI,MAAOxrI,KAAKqrI,WAC7B7J,EAAYxhI,KAAKyrI,QAASzrI,KAAKsrI,aAC/BtrI,KAAKumH,SAASllH,OAAOrB,KAAKwrI,MAAOxrI,KAAKyrI,SAEtCzrI,KAAK0rI,OAAOrqI,OAAOrB,KAAKurI,aAAcvrI,KAAK2rI,QAAS3rI,KAAKumH,UAEzDvmH,KAAKmlG,OAAO/jG,UAAUL,cAAcE,aAAajB,KAAK0rI,OAAQ96G,EAAKxwB,MAAM47F,WAGzEh8F,KAAK+a,QAAQ1Z,OAAOrB,KAAKqjF,QAASrjF,KAAKmgF,YAAY/+E,WAEnDpB,KAAKmlG,OAAO/jG,UAAUlB,UAAUW,IAAI,eACpCb,KAAKmlG,OAAO/jG,UAAUL,cAAcM,OAAOrB,KAAK+a,SAEhD/a,KAAKmgF,YAAY//E,MAAM6B,QAEpBmN,GACDpP,KAAKs2C,SAASlnC,GAGZ,OACFpP,KAAK0kF,eAAiB,CACpBrkF,KAAM,gBACN0T,MAAO,KACL/T,KAAK2+G,YAIThsG,EAAA,EAAwBmB,SAAS9T,KAAK0kF,iBAInC,UACL1kF,KAAKmlG,OAAO/jG,UAAUlB,UAAUoE,OAAO,eACvCtE,KAAK+a,QAAQzW,SACbtE,KAAKmgF,YAAY77E,SACjBtE,KAAKwiC,QAAQl+B,SACbtE,KAAK0rI,OAAOpnI,SACZtE,KAAK6R,eAAeO,YACpBpS,KAAK4wB,KAAKC,QAAQstB,iBAAiBj+C,UAAUoE,OAAO,yBACpDtE,KAAK4wB,KAAK+hE,YAAStqF,EACnBsK,EAAA,EAAwB+2G,WAAW1pH,KAAK0kF,gBAGnC,SAASt1E,GACdpP,KAAKmgF,YAAY37E,WAAWG,MAAQyK,EAQ9B,aAAasb,GACnB,GAAG1qB,KAAKqhD,eAAgB,OAAOrhD,KAAKqhD,eAEpC,MAAMp2C,EAASyf,EAAKxjB,QAAQ+D,OAAOsgB,WAC7Bm4E,GAAah5E,EAAKxjB,QAAQ2D,UAAOxC,EAEjC6c,EAAQ,OAAAimC,GAAA,GAAWzgC,GAEtBxF,IAAWllB,KAAKiP,WAAa,EAC9BjP,KAAKwrI,MAAMjrI,aAAa,WAAY,QAEpCP,KAAKwrI,MAAM7gG,gBAAgB,YAGzBzlB,EAGFllB,KAAKyrI,QAAQ9gG,gBAAgB,YAF7B3qC,KAAKyrI,QAAQlrI,aAAa,WAAY,QAKxCP,KAAKwiC,QAAQtiC,UAAUoE,OAAO,UAC9BtE,KAAK4wB,KAAKC,QAAQstB,iBAAiBj+C,UAAUoE,OAAO,yBAEpD,MAAMyL,EAAM/P,KAAK4wB,KAAKuiB,QAAQloC,EAAQy4F,GACtC1jG,KAAKqhD,gBAAmBtxC,aAAe1K,QAAU0K,EAAM1K,QAAQ6E,QAAQ6F,IAAuBpM,KAAK,KACjG3D,KAAKirI,cAAgB/lH,EACrB,OAAAzU,EAAA,GAAezQ,KAAKurI,aAAc,YAAK,KAAM,CAACrmH,EAAQ,EAAGllB,KAAKiP,cAE9D,MAAM28H,EAAgB5rI,KAAKgQ,YAAY5B,KAAKK,kBACzCzO,KAAKirI,eAAkBW,EAAgB,GACxC5rI,KAAK8qI,UAAUn7H,eAEhBg4B,QAAQ,KACT3nC,KAAKqhD,eAAiB,QCzLb,MAAM,GAYnB,cACErhD,KAAK6rI,SAAW,IAAIlkI,IAGf,mBAAmBjI,GACxB,IAAIosI,EAAW9rI,KAAK+rI,UAAU13H,KAAMy3H,GAC3B,OAAAjrH,GAAA,GAAUirH,EAASpsI,QAASA,IASrC,OANIosI,IACFA,EAAW,IAAI,GACfA,EAAS95H,KAAKtS,GACdM,KAAK+rI,UAAUxiI,KAAKuiI,IAGfA,EAGF,KAAKpsI,GAUVM,KAAKN,QAAUA,EAGV,eAAewF,GAKpB,OAAOlF,KAAKijD,mBAAmBjjD,KAAKN,QAAQ4a,KAAK3W,KAAK,IAC7C3D,KAAKgsI,WAAW9mI,IAInB,mBAAmBoV,GACzB,GAAGta,KAAKisI,0BAA2B,OAAOjsI,KAAKisI,0BAC/C,MAAMv9G,EAAM1uB,KAAK0uB,IAAM/tB,SAASC,cAAc,OAE9C,OADA8tB,EAAIw9G,YAAc,YACXlsI,KAAKisI,0BAA4B,OAAAhpF,GAAA,GAA0Bv0B,EAAKpU,GAAK,GAAO3W,KAAK,IAAM+qB,GAmCzF,QAAQxpB,GACblF,KAAK6rI,SAAS15H,OAAOjN,GAEjBlF,KAAK6rI,SAAS3oI,OAChB,OAAA+Q,EAAA,GAAiB,GAA8B83H,UAAW/rI,MAEvDA,KAAKmsI,WACN5iF,IAAImT,gBAAgB18D,KAAKmsI,YAKxB,WAAWjnI,GAChB,MAAMkI,EAAUlI,EAAOyP,WAAW,MAC/BvH,EAAQk+D,qBAAqB8gE,eAC9Bh/H,EAAQwH,UAAU,EAAG,EAAG1P,EAAO1B,MAAO0B,EAAOzB,QAI/C,MAAMirB,EAAM1uB,KAAK0uB,IAEjB,IAAI29G,EAAa39G,EAAIlrB,MAAO8oI,EAAc59G,EAAIjrB,OAG5C4oI,GADcnnI,EAAOzB,OAAS6oI,EAE9BA,EAAcpnI,EAAOzB,OAGpBzD,KAAKN,QAAQ6sI,MACdn/H,EAAQk+D,UAAY,OACpBl+D,EAAQm+D,SAAS,EAAG,EAAGrmE,EAAO1B,MAAO0B,EAAOzB,QAC5C2J,EAAQo/H,yBAA2B,mBAEnCp/H,EAAQo/H,yBAA2B,cAGrC,IAAI,IAAIppH,EAAI,EAAGA,EAAIle,EAAO1B,MAAO4f,GAAKipH,EACpC,IAAI,IAAI/oH,EAAI,EAAGA,EAAIpe,EAAOzB,OAAQ6f,GAAKgpH,EACrCl/H,EAAQq0C,UAAU/yB,EAAKtL,EAAGE,EAAG+oH,EAAYC,GAQxC,oBAAoBpnI,GACzB,MAAMoB,EAAmBzB,KAAKC,IAAI,EAAG5C,OAAOoE,kBAC5CpB,EAAO1B,MAAQxD,KAAKN,QAAQ8D,MAAQ8C,EACpCpB,EAAOzB,OAASzD,KAAKN,QAAQ+D,OAAS6C,GAAoB6hB,EAAA,EAAW6hH,eAAiB,IAAWyC,MAAQ,IAAM,GAG1G,eACL,MAAMvnI,EAASvE,SAASC,cAAc,UAGtC,OAFAZ,KAAK6rI,SAAShrI,IAAIqE,GAClBlF,KAAK0sI,oBAAoBxnI,GAClBA,EAGF,OAAO1B,EAAeC,GAC3BzD,KAAKgS,KAAK,OAAD,wBACJhS,KAAKN,SAAO,CACf8D,QACAC,YAGF,MAAMu/B,EAA2B,GACjC,IAAI,MAAM99B,KAAUlF,KAAK6rI,SACvB7rI,KAAK0sI,oBAAoBxnI,GACzB89B,EAASz5B,KAAKvJ,KAAK2sI,eAAeznI,IAGpC,OAAOG,QAAQC,IAAI09B,GAGd,uBAAuBx/B,EAAeC,GAC3C,OAAO4B,QAAQC,IAAItF,KAAK+rI,UAAUt/H,IAAIq/H,GAAYA,EAAShD,OAAOtlI,EAAOC,MAvK5D,GAAAsoI,UAA6C,GC+B/C,MAAM,WAAa,IAuChC,YACS/oC,EACAzC,EACAwd,EACAtkB,EACAxoC,EACAu/B,EACA2P,EACAC,EACAH,EACAC,EACAO,EACAqd,EACA7b,EACA5B,EACAguB,EACAthH,EACAuhH,EACAt7B,EACAsN,EACAqnC,EACAnnC,GAEP7gG,QAtBO,KAAAqjG,eACA,KAAAzC,kBACA,KAAAwd,iBACA,KAAAtkB,uBACA,KAAAxoC,qBACA,KAAAu/B,kBACA,KAAA2P,mBACA,KAAAC,oBACA,KAAAH,qBACA,KAAAC,kBACA,KAAAO,qBACA,KAAAqd,kBACA,KAAA7b,aACA,KAAA5B,mBACA,KAAAguB,oBACA,KAAAthH,UACA,KAAAuhH,0BACA,KAAAt7B,kBACA,KAAAsN,wBACA,KAAAqnC,uBACA,KAAAnnC,sBAIPxgG,KAAKK,KAAO,OAEZL,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,OAAQ,YAErCb,KAAK4sI,aAAejsI,SAASC,cAAc,OAC3CZ,KAAK4sI,aAAa1sI,UAAUW,IAAI,mBAIhCb,KAAKkiB,IAAM,OAAAkzC,EAAA,GAAO,OAAQ,IAASy3E,IAAM,IAASC,KAAO,IAASC,MAAQ,IAAS39G,OAGnFpvB,KAAKiL,OAAS,KAEdjL,KAAKoB,UAAUC,OAAOrB,KAAK4sI,cAC3B5sI,KAAKgjG,aAAa1kE,eAAej9B,OAAOrB,KAAKoB,WAE7CpB,KAAKgtI,iBAAmB,EAGnB,cAAc1yH,EAAayvG,GAChC,MAAMn7C,EAAQhiE,EAAA,EAAUuiE,WAExB,IAAI/lE,EAEJ,KAD4BwlE,EAAMD,WAAW9xB,QAAU+xB,EAAMD,WAAWG,OAASF,EAAMD,WAAWE,WAGtD,aAA1CluE,SAAS22C,gBAAgBnyC,MAAM0oC,QAC/B7tC,KAAK+rE,mBACJ/rE,KAAKitI,gBAIN,OAFAjtI,KAAKktI,eAAehmI,QAAQikE,OAASyD,EAAMD,WAAW9xB,MACtD78C,KAAK+rE,iBAAiB/5D,KAAKhS,KAAKktI,gBACzB7nI,QAAQ6E,UAGjB,MAAMg3B,IAAWlhC,KAAKgtI,iBAEhBG,EAA2BntI,KAAK+rE,iBAChCqhE,EAA0BptI,KAAKitI,gBAE/BI,GADyBrtI,KAAKktI,eACNltI,KAAKstI,eAEnCttI,KAAK+rE,iBACH/rE,KAAKitI,gBACLjtI,KAAKktI,eACLltI,KAAKstI,mBAELjlI,EAEF,MAAMwmE,EAAYD,EAAMD,WAAWE,WAAaD,EAAMD,WAAWE,UAAY,IACvE0+D,IAAkB1+D,GAAaA,EAAY,EAEjD,IAAIo+D,EAEAC,EA2CAnhE,EA5CAuhE,EAAgBlkI,aAAI,EAAJA,EAAM6iB,kBAE1B,IAAI7iB,EAIF,GAHAA,EAAOzI,SAASC,cAAc,OAC9BwI,EAAKlJ,UAAUW,IAAI,wBAEhByZ,EACD,GAAGu0D,EAAW,CACZzlE,EAAKlJ,UAAUW,IAAI,cAEnB,MAAM4jB,EAAOzkB,KAAKgjG,aAAa1kE,eAAe5Z,wBAC9CuoH,EAAkBjtI,KAAKitI,gBAAkB,GAA8BO,YAAY,CACjFlzH,MACA9W,MAAOihB,EAAKjhB,MACZC,OAAQghB,EAAKhhB,OACb8oI,KAAMgB,IAGRD,EAAgBttI,KAAKstI,cAAgBL,EAAgBnhE,eACrDwhE,EAAcptI,UAAUW,IAAI,8BAA+B,uCAExD0sI,GACDnkI,EAAKlJ,UAAUW,IAAI,gBAcb+tE,EAAMD,WAAWG,MACzB1lE,EAAKlJ,UAAUW,IAAI,iBAEb+tE,EAAMD,WAAW9xB,OACzBzzC,EAAKlJ,UAAUW,IAAI,YAKvB,MAAMg8C,EAAQ+xB,EAAMD,WAAW9xB,MAC/B,GAAGA,EAAO,CAER,MAAM,OAAC33C,EAAQ6mE,iBAAkB0hE,GAAqB,GAA+B/7D,OAAO70B,GAC5FkvB,EAAmB/rE,KAAK+rE,iBAAmB0hE,EAC3CP,EAAiBltI,KAAKktI,eAAiBhoI,EACvCgoI,EAAehtI,UAAUW,IAAI,8BAA+B,qCAEzD+L,EAAA,EAAU+2B,SAASC,mBACpBmoC,EAAiBF,eAAc,GAQnC,GAAGohE,EAAiB,EACGM,EAAgBL,EAAiBI,GACzCnoI,MAAMqB,YAAY,gBAAiB,GAAK3B,KAAK+B,IAAIioE,IAGhE,MAAMzkE,EAAU,IAAI/E,QAAe6E,IACjC,MAAMyW,EAAK,KACT,GAAG3gB,KAAKgtI,mBAAqB9rG,EAS3B,OARG+rG,GACDA,EAAgBn/H,QAAQw/H,QAGvBvhE,GACDA,EAAiBj+D,WAMrB,MAAMiT,EAAO/gB,KAAK4sI,aAAa3zF,iBAE/B,GAAGl4B,IAAS3X,EAEV,YADAc,IAIF,MAAM7I,EAAS,CACb6rI,EAEAI,GACA1hI,OAAOc,SACNrL,EAAOM,QACRyH,EAAK/H,UAAUA,GAGjBrB,KAAK4sI,aAAavrI,OAAO+H,GAEzB,aAAcA,EAAM,cAAc,EAAO2gH,EAAsB,EAAN,IAAShpG,EAAO,KACpEqsH,GACDA,EAAwBt/H,QAAQu/H,GAG/BF,GACDA,EAAyBr/H,UAG3BiT,EAAKzc,UACH,KAAM,GAEV4F,KAGF,GAAG+iI,EAAiB,CACWA,EAAgBN,eAAeW,GACvC3pI,KAAK,KACxB,GAAG3D,KAAKgtI,mBAAqB9rG,EAC3B,OAGF,IAAI92B,EAIFA,EAAU/E,QAAQ6E,UAGpBE,EAAQzG,KAAKgd,UAEPrG,EACR,OAAA2oC,GAAA,GAAmB75C,EAAMkR,EAAKqG,GAE9BA,MAIJ,OAAO3gB,KAAK0tI,qBAAuBroI,QAAQqlC,KAAK,CAC9C,OAAAzmC,GAAA,GAAM,KACNmG,IAIG,QAAQ/J,GACbL,KAAKK,KAAOA,EAEK,cAAdL,KAAKK,OACNL,KAAKkN,mBAAqB,IAAMlN,KAAKixD,mBAAmBhkD,4BAA4BjN,KAAKiL,SAKtF,OAGLjL,KAAKmlG,OAAS,IAAI,GAAWnlG,KAAM,GAAiBA,KAAKixD,mBAAoBjxD,KAAKwwF,gBAAiBxwF,KAAKugG,gBAAiBvgG,KAAKsuH,wBAAyBtuH,KAAKogG,kBAAmBpgG,KAAKkgG,gBAAiBlgG,KAAK2nI,sBAC1M3nI,KAAK6wB,QAAU,IAAI,GAAY7wB,KAAMA,KAAKixD,mBAAoBjxD,KAAKigG,mBAAoBjgG,KAAKkgG,gBAAiBlgG,KAAKy5F,qBAAsBz5F,KAAKmgG,iBAAkBngG,KAAKwwF,gBAAiBxwF,KAAKogG,kBAAmBpgG,KAAKqgG,iBAAkBrgG,KAAKsgG,sBAAuBtgG,KAAKugG,gBAAiBvgG,KAAKwgG,oBAAqBxgG,KAAKygG,oBACrTzgG,KAAKI,MAAQ,IAAI,GAAUJ,KAAMA,KAAKixD,mBAAoBjxD,KAAKsgG,sBAAuBtgG,KAAK+9G,eAAgB/9G,KAAKugG,gBAAiBvgG,KAAKwwF,gBAAiBxwF,KAAKygG,mBAAoBzgG,KAAKgjG,aAAchjG,KAAKqgG,iBAAkBrgG,KAAKquH,kBAAmBruH,KAAKsuH,wBAAyBtuH,KAAKgzF,gBAAiBhzF,KAAKkgG,gBAAiBlgG,KAAKy5F,qBAAsBz5F,KAAKogG,mBAC5VpgG,KAAKg2C,UAAY,IAAI,GAAch2C,KAAMA,KAAK6wB,QAAS7wB,KAAKI,MAAOJ,KAAKixD,oBACxEjxD,KAAK2tI,YAAc,IAAI,GAAgB3tI,KAAK6wB,QAAQstB,iBAAkBn+C,KAAMA,KAAKixD,mBAAoBjxD,KAAKwwF,gBAAiBxwF,KAAK89G,gBAAiB99G,KAAK+9G,eAAgB/9G,KAAKsgG,sBAAuBtgG,KAAKwgG,qBAEtL,SAAdxgG,KAAKK,MACNL,KAAKmlG,OAAOyoC,iBACZ5tI,KAAKmlG,OAAO0oC,wBACU,WAAd7tI,KAAKK,KACbL,KAAKmlG,OAAO2oC,yBACU,eAAd9tI,KAAKK,OACbL,KAAKmlG,OAAOyoC,iBACZ5tI,KAAKmlG,OAAO4oC,8BAGd/tI,KAAKmlG,OAAO76E,YACZtqB,KAAKI,MAAMkqB,YAEM,SAAdtqB,KAAKK,MACNL,KAAK6wB,QAAQg9G,uBACb7tI,KAAKI,MAAMytI,wBACW,WAAd7tI,KAAKK,MACbL,KAAK6wB,QAAQi9G,yBACb9tI,KAAKI,MAAM0tI,0BACW,cAAd9tI,KAAKK,MACbL,KAAK6wB,QAAQm9G,4BACbhuI,KAAKI,MAAMytI,wBACW,eAAd7tI,KAAKK,OACbL,KAAK6wB,QAAQg9G,uBACb7tI,KAAKI,MAAMytI,wBAGI,cAAd7tI,KAAKK,MAAyB,MAC/BL,KAAK6wB,QAAQo9G,6BAGfjuI,KAAKoB,UAAUlB,UAAUW,IAAI,QAAUb,KAAKK,MAC5CL,KAAKoB,UAAUC,OAAOrB,KAAKmlG,OAAO/jG,UAAWpB,KAAK6wB,QAAQstB,iBAAkBn+C,KAAKI,MAAM47F,WAEvFh8F,KAAK6wB,QAAQhf,eAAehR,IAAI+L,EAAA,EAAhC5M,CAA2C,iBAAkB,EAAEmnC,cAAaC,gBACvEpnC,KAAKiL,SAAWk8B,GACjBnnC,KAAKmzC,QAAQ/L,KAIjBpnC,KAAK6wB,QAAQhf,eAAehR,IAAI+L,EAAA,EAAhC5M,CAA2C,cAAgBD,IACtDA,EAAEkL,SAAWjL,KAAKiL,QACnBjL,KAAKgjG,aAAa7vD,YAKjB,gBACLnzC,KAAK6wB,QAAQ/iB,UAGP,sBACJ9N,KAAKgtI,iBACJhtI,KAAKitI,kBACNjtI,KAAKitI,gBAAgBn/H,QAAQ9N,KAAKstI,eAClCttI,KAAKitI,qBAAkB5kI,GAGtBrI,KAAK+rE,mBACN/rE,KAAK+rE,iBAAiBj+D,UACtB9N,KAAK+rE,sBAAmB1jE,GAIrB,UAGLrI,KAAKmlG,OAAOwZ,UACZ3+G,KAAK6wB,QAAQ8tF,UACb3+G,KAAKI,MAAMu+G,UACX3+G,KAAK2tI,aAAe3tI,KAAK2tI,YAAYhvB,UAErC3+G,KAAKkuI,2BAEEluI,KAAKmlG,cACLnlG,KAAK6wB,eACL7wB,KAAKI,aACLJ,KAAKg2C,iBACLh2C,KAAK2tI,YAEZ3tI,KAAKoB,UAAUkD,SAKV,QAAQ80H,GAAY,GACzBp5H,KAAKI,MAAM0N,QAAQsrH,GACnBp5H,KAAKg2C,UAAUloC,UAGV,QAAQ7C,EAAgBy4F,EAAoB7L,GAC7C5sF,EAEOjL,KAAK66F,SACX76F,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGdhS,KAAK66F,QAAS,GAPd76F,KAAK66F,YAASxyF,EAUhB,MAAMolG,EAAWztG,KAAKiL,SAAWA,EACjC,GAAIwiG,GAGG,GAAGztG,KAAKqhD,eACb,YAHAz0C,EAAA,EAAU0F,cAAc,gBAAiBtS,MACzCA,KAAKiL,OAASA,GAAU,KAQ1B,IAAIA,EAOF,OANA,GAAgB+rC,eAAc,GAC9Bh3C,KAAK8N,SAAQ,GACb9N,KAAKmlG,OAAOhyD,QAAQloC,GACpBjL,KAAK6wB,QAAQsiB,QAAQloC,QACrB2B,EAAA,EAAU0F,cAAc,eAAgBrH,GAM1C,IAAIwiG,EAAU,CACZ,MAAM0gC,EAAY,GAAgB55H,OAAO,IACtC45H,GACDA,EAAUvwG,QAGZ59B,KAAKu+G,WAAav+G,KAAKwwF,gBAAgB+tB,WAAWtzG,GAClDjL,KAAK0zC,aAAe1zC,KAAKwwF,gBAAgB98C,aAAazoC,GACtDjL,KAAKoB,UAAUlB,UAAUC,OAAO,cAAeH,KAAKu+G,YAEpD,GAAgBrnE,eAAe/D,QAAQloC,EAAQjL,KAAKsP,UACpDtP,KAAKI,MAAMikH,cACXrkH,KAAKg2C,UAAUloC,UACf9N,KAAKouI,uBAGPpuI,KAAKq2C,YAAco3D,OAEDplG,IAAfwvF,GAA4B73F,KAAK+4H,wBAClClhC,EAAa,MAGf,MAAMvtF,EAAStK,KAAK6wB,QAAQsiB,QAAQloC,EAAQy4F,EAAW7L,GACvD,IAAIvtF,EACF,OAGF,MAAM,QAACF,GAAWE,EAIZ+2C,EAAiBrhD,KAAKqhD,eAAiBj3C,EAAQu9B,QAAQ,KACxD3nC,KAAKqhD,iBAAmBA,IACzBrhD,KAAKqhD,eAAiB,QAY1B,OARIosD,IACF,GAAgBv2D,eAAem3F,aAAaruI,KAAKqhD,gBACjD,GAAgBnK,eAAeo3F,kBAAiB,IAM3ChkI,EAGF,uBACLtK,KAAK4uB,aCxeM,SAAyC3jB,GACtD,IAAI5K,EAEAkuI,EAAe,EAAGC,EAAe,EAAGC,EAAc,EACtD,MAAM9qG,EAAW/2B,EAAA,EAAU+2B,SAmB3B,OAlBIA,EAAS65C,gBAAgBj/D,OAAOhI,UAAYtL,IAG1C5K,EAFD4K,EAAO82B,SACL92B,EAAOmgC,YACD,WAEA,UAEDngC,EAAOsxB,cACR,WAEA,SAGNoH,EAAS/U,aAAazmB,MAAM9H,KAAOkuI,EAAe5qG,EAAS65C,gBAAgBkxD,gBAC3E/qG,EAAS/U,aAAa3V,MAAM5Y,KAAOmuI,EAAe7qG,EAAS65C,gBAAgBmxD,gBAC3EhrG,EAAS/U,aAAaihD,KAAKxvE,KAAOouI,EAAc9qG,EAAS65C,gBAAgBC,gBAGvE,CACLt1E,MAAOomI,EACPt1H,MAAOu1H,EACP3+D,KAAM4+D,GD8ccG,CAAgC5uI,KAAKiL,QAGpD,aAAak5F,GAClB,OAAOnkG,KAAKmzC,QAAQnzC,KAAKiL,OAAQk5F,GAG5B,iBAAiByJ,EAAmBU,EAAiB5K,EAAmB7L,GAC7E,GAAG73F,KAAKq2C,YAAa,OAErB,IAAIprC,EAASjL,KAAKiL,OAClBjL,KAAKq2C,aAAc,EAEnBr2C,KAAK8N,SAAQ,GAEb9N,KAAKmlG,OAAOhyD,QAAQloC,GACpBjL,KAAKmlG,OAAOmD,iBAAiBsF,EAAUU,EAAQ5K,GAC/C1jG,KAAK6wB,QAAQy3E,mBACbtoG,KAAKI,MAAMkoG,iBAAiBzQ,GAE5B,GAAgB3gD,eAAeV,sBAE/Bx2C,KAAKkiB,IAAI2sH,UAAU,QAAU5jI,EAAS,IAAMjL,KAAKK,MAEjDuM,EAAA,EAAU0F,cAAc,eAAgBrH,GACxCjL,KAAK8uI,gBAAiB,EAGjB,qBACL,OAAO9uI,KAAKixD,mBAAmB/jD,mBAAmBlN,KAAKiL,QAGlD,WAAWJ,GAChB,OAAO7K,KAAKixD,mBAAmBC,sBAAsBlxD,KAAKkN,qBAAsBrC,GAI3E,aAAaA,GAClB,OAAO7K,KAAKixD,mBAAmB2zC,iBAAiB5kG,KAAK8qD,WAAWjgD,IAG3D,aACL,OAAO7K,KAAKiL,SAAW2B,EAAA,EAAU+R,MAAQ3e,KAAKiL,SAAW,MAAmBjL,KAAKwwF,gBAAgBhW,WAAWx6E,KAAKiL,QAG5G,WAAWmE,GAChB,GAAIpP,KAAKiL,OAET,GAAGkd,EAAA,EAAWC,SACRpoB,KAAK2yF,OAGP3yF,KAAK2yF,OAAOr8C,SAASlnC,GAFrBpP,KAAK2yF,OAAS,IAAI,GAAW3yF,KAAKmlG,OAAQnlG,KAAMoP,OAI7C,CACL,IAAIgE,EAAM,GAAgBmB,OAAO,IAC7BnB,IACFA,EAAM,IAAI,GAAoB,KAGhCA,EAAIsB,KAAK1U,KAAKiL,OAAQjL,KAAKsP,SAAUtP,KAAK6wB,QAAQiyE,WAAY1zF,IAI3D,QAAQlH,GACb,OAAOlI,KAAKixD,mBAAmB6qC,cAAc97F,KAAKiL,OAAQjL,KAAKsP,SAAUpH,GAGpE,sBACL,OAAOlI,KAAKwwF,gBAAgBke,MAAM1uG,KAAKiL,UACpCjL,KAAKixD,mBAAmB4oB,cAAc75E,KAAKiL,UAC3CjL,KAAKixD,mBAAmBk5C,kBAAkBnqG,KAAKiL,QAAQnD,QAAQnG,OAG7D,0BACL,MAAO,CACL2N,SAAUtP,KAAKsP,SACf62G,aAAcnmH,KAAKI,MAAM+lH,aACzB7F,aAActgH,KAAKI,MAAMkgH,aACzBwC,WAAY9iH,KAAKI,MAAM0iH,WACvBiX,aAAc/5H,KAAKI,MAAM25H,eEjjBhB,MAAM,GAcnB,YAAoB/2B,GAAA,KAAAA,eAXZ,KAAA3nE,QAAiD,GAIjD,KAAA0zG,eAAgB,EAChB,KAAAC,mBAAoB,EAGpB,KAAAC,eAAyB,EAiTzB,KAAAC,gBAAmBnvI,IAIzB,GAFAC,KAAKgvI,mBAAoB,EAEtB,KAAoB,CAErB,GADAjvI,GAAK,OAAAiqB,EAAA,GAAYjqB,GACY,GAA1BC,KAAKivI,iBAIN,YADAjvI,KAAKmkC,OAFLnkC,KAAKmvI,eAAenvI,KAAKi8F,YAO7Bj8F,KAAKo9B,QAxTC,OACNp9B,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,iBAAkB,YAAa,QAE5Db,KAAKk0G,QAAUvzG,SAASC,cAAc,OACtCZ,KAAKk0G,QAAQh0G,UAAUW,IAAI,0BAE3B,MAAMuuI,EAASzuI,SAASC,cAAc,OAChCyuI,EAAS1uI,SAASC,cAAc,OACtCwuI,EAAOlvI,UAAUW,IAAI,wBACrBwuI,EAAOnvI,UAAUW,IAAI,wBAET,CAAC,OAAQ,SAAU,YAAa,gBAAiB,YAAa,UAAW,QACjF0J,QAAQutB,IACV,MAAMpU,EAAS,EAAWoU,EAAG,CAACrmB,UAAU,IACxC29H,EAAO/tI,OAAOrB,KAAKq7B,QAAQvD,GAAKpU,GAEvB,SAANoU,EACDpU,EAAOpiB,iBAAiB,YAAcvB,IACpC,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKgjG,aAAapyE,KAAKxwB,MAAMgwH,cAAct4F,GAC3C93B,KAAKsvI,oBAOP,YAAiB5rH,EAAS3jB,IACxB,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKqwH,iBACLrwH,KAAKsvI,sBAKXtvI,KAAKuvI,eAAiB,EAAW,OAAQ,CAAC99H,UAAU,IACpDzR,KAAKwvI,UAAY7uI,SAASC,cAAc,SACxC,YAAMZ,KAAKwvI,UAAW,qCAAiCnnI,EAAW,eAClErI,KAAKwvI,UAAUtvI,UAAUW,IAAI,eAC7Bb,KAAKwvI,UAAUluI,iBAAiB,UAAYvB,IAC1C,MAAM6sE,GAAS5sE,KAAKwvI,UAAU7qI,MAAMhD,UAAY,IAAkBm2D,SAAS93D,KAAKwvI,UAAU7qI,OAE7E,UAAV5E,EAAEqH,MACCwlE,EAQF5sE,KAAKyvI,UAAU1vI,IAPZC,KAAKwvI,UAAUtvI,UAAUuV,SAAS,WACnCzV,KAAKwvI,UAAUtvI,UAAUoE,OAAO,SAC3BtE,KAAKwvI,UAAUh/F,YAGtBxwC,KAAKwvI,UAAUtvI,UAAUW,IAAI,aAOnCb,KAAKwvI,UAAUluI,iBAAiB,QAAUvB,IACxC,MAAM6sE,EAAQ5sE,KAAK0vI,cAEnB1vI,KAAKwvI,UAAUtvI,UAAUC,OAAO,WAAYysE,GAC5C5sE,KAAKwvI,UAAUtvI,UAAUoE,OAAO,WAGlCtE,KAAKuvI,eAAejuI,iBAAiB,YAAcvB,IAEjD,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKoB,UAAUlB,UAAUoE,OAAO,WAEhCtE,KAAKmvI,iBACLnvI,KAAK2vI,qBACL3vI,KAAKsvI,oBAGPtvI,KAAK4vI,gBAAkB,EAAW,kCAAmC,CAACn+H,UAAU,IAChFzR,KAAK4vI,gBAAgBtuI,iBAAiB,YAAcvB,IAElDC,KAAKyvI,UAAU1vI,KAGjB,MAAM8vI,EAAWlvI,SAASC,cAAc,OACxCivI,EAAS3vI,UAAUW,IAAI,uCAEvB,MAAMivI,EAAanvI,SAASC,cAAc,QACpCmvI,EAAapvI,SAASC,cAAc,QACpCovI,EAAarvI,SAASC,cAAc,QAC1CkvI,EAAW5vI,UAAUW,IAAI,4BACzBkvI,EAAW7vI,UAAUW,IAAI,4BACzBmvI,EAAW9vI,UAAUW,IAAI,4BACzBuuI,EAAOnuI,aAAa6uI,EAAY9vI,KAAKq7B,QAAQ4B,MAC7C4yG,EAASxuI,OAAO2uI,EAAYhwI,KAAK4vI,iBACjCP,EAAOhuI,OAAOrB,KAAKuvI,eAAgBQ,EAAY/vI,KAAKwvI,UAAWK,GAG/D7vI,KAAKk0G,QAAQ7yG,OAAO+tI,EAAQC,GAC5BrvI,KAAKoB,UAAUC,OAAOrB,KAAKk0G,SAC3BvzG,SAASgC,KAAKtB,OAAOrB,KAAKoB,WAE1Bc,OAAOZ,iBAAiB,SAAU,KAChCtB,KAAKmkC,SAIF,iBACDnkC,KAAKoB,WAAcpB,KAAKoB,UAAUlB,UAAUuV,SAAS,eACvDzV,KAAKo9B,OAGP,MAAM1Z,EAAS1jB,KAAKq7B,QAAQ4B,KAC5Bj9B,KAAKoB,UAAUlB,UAAUW,IAAI,WAE7B,MAAMm1C,EAAYr1C,SAASwB,eAG3B,GAFAnC,KAAKi8F,WAAajmD,EAAUmnD,WAAW,GAEpCz5E,EAAOxjB,UAAUuV,SAAS,UAAW,CACtC,MACMtL,EADiBnK,KAAKi8F,WAAW6uB,eACT/pH,cAC9Bf,KAAKwvI,UAAU7qI,MAAQwF,EAAOuuD,UAE9B14D,KAAKwvI,UAAU7qI,MAAQ,GAGzB3E,KAAK2vI,oBAAmB,GAExB7/H,WAAW,KACT9P,KAAKwvI,UAAUvtI,SACd,KACHjC,KAAKwvI,UAAUtvI,UAAUC,OAAO,WAAYH,KAAK0vI,eAG3C,UAAU3vI,GAChB,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKmvI,iBACL,IAAI70H,EAAMta,KAAKwvI,UAAU7qI,MACtB2V,IAAQ,IAAkB21H,iBAAiB31H,KAC5CA,EAAM,WAAaA,GAErBta,KAAKgjG,aAAapyE,KAAKxwB,MAAMgwH,cAAc,OAAQ91G,GACnDxK,WAAW,KACT9P,KAAKmkC,QACJ,GAGG,cACN,OAAQnkC,KAAKwvI,UAAU7qI,MAAMhD,UAAY,IAAkBm2D,SAAS93D,KAAKwvI,UAAU7qI,OAG7E,eAAetC,EAAerC,KAAKi8F,YACzC,MAAMjmD,EAAY9zC,OAAOC,eACzB6zC,EAAUvzC,kBACVuzC,EAAUtzC,SAASL,GACnBrC,KAAKgjG,aAAapyE,KAAKxwB,MAAMy8F,aAAa56F,QAGrC,OAGFjC,KAAKgS,OAERhS,KAAKoB,UAAUlB,UAAUoE,OAAO,cAEhC3D,SAASkN,oBAAoB,UAAW7N,KAAKkvI,iBAC7ClvI,KAAKgvI,mBAAoB,EAEzBr8H,EAAA,EAAwB6B,aAAa,UAElCxU,KAAKkwI,aAAap/H,aAAa9Q,KAAKkwI,aACvClwI,KAAKkwI,YAAchuI,OAAO4N,WAAW,KACnC9P,KAAKkwI,iBAAc7nI,EACnBrI,KAAKoB,UAAUlB,UAAUW,IAAI,QAC7Bb,KAAKoB,UAAUlB,UAAUoE,OAAO,YAC/B,MAGE,wBACL,MAAM6rI,ECjNK,WACb,MAAMA,EAAgB,GAChBn6F,EAAY9zC,OAAOC,eACzB,IAAI,IAAIP,EAAI,EAAGA,EAAIo0C,EAAUknD,aAAct7F,EAAG,CAC5C,MAAMS,EAAQ2zC,EAAUmnD,WAAWv7F,GACnC,IAAI,eAACkpH,EAAc,aAAEC,GAAgB1oH,EAGrC,IAF6B,IAA1B0oH,EAAav3B,WAAgBu3B,EAAeA,EAAapyD,YAEtDmyD,GAAkBA,IAAmBC,GACzColB,EAAM5mI,KAAiC,IAA5BuhH,EAAet3B,SAAiBs3B,EAAiBA,EAAenyD,YAC3EmyD,EAAiBA,EAAe3pH,YAG/BgvI,EAAMA,EAAMxuI,OAAS,KAAOopH,GAC7BolB,EAAM5mI,KAAKwhH,GAKf,OAAOolB,EAAMvkI,OAAOs/G,KAAUA,GD8LdklB,GACR3rC,EAAU,IAAI,IAAI98F,IAAIwoI,EAAM1jI,IAAIy+G,GAAQA,EAAK3xE,cAG7C82F,EAAmC,IAAI1oI,IAY7C,OAXC88F,EAA0Bl6F,QAAQ2gH,IACjC,IAAI,MAAM7qH,KAAQ,KAAc,CAC9B,MAAM27H,EAAM,KAAa37H,GACT6qH,EAAKjL,QAAQ+b,EAAIzjH,MAAQ,yBAC1BvY,KAAKgjG,aAAapyE,KAAKxwB,MAAMy8F,cAC1CwzC,EAAexvI,IAAIb,KAAKq7B,QAAQh7B,OAM/B,IAAIgwI,GAGN,wBACL,MAAMC,EAAgBtwI,KAAKuwI,wBAE3B,IAAI,MAAM3uI,KAAK5B,KAAKq7B,QAAS,CAE3B,MAAM3X,EAAS1jB,KAAKq7B,QAAQz5B,GAC5B8hB,EAAOxjB,UAAUC,OAAO,SAAUmwI,EAAcrxG,SAASvb,KAIrD,mBAAmB8sH,GAAe,GACxC,MACMnuI,EADY1B,SAASwB,eACHg7F,WAAW,GAE7BszC,EAAW9vI,SAASgC,KAAK+hB,wBACzBgsH,EAAgBruI,EAAMqiB,wBACtBisH,EAAY3wI,KAAKgjG,aAAapyE,KAAKxwB,MAAMgzH,YAAY1uG,wBAE3D1kB,KAAKoB,UAAU+D,MAAMysB,SAAW++G,EAAUntI,MAAQ,KAElD,MAEMotI,EAFclzC,QAAer1F,EAAWrI,KAAKgjG,aAAapyE,KAAKxwB,MAAMy8F,cAAc,EAAO6zC,GAE/DjsH,KAAKiU,KAA8C,EAAhB+3G,EAAS/3G,IAIvEm4G,GAFe7wI,KAAKoB,UAAUlB,UAAUuV,SAAS,WAAazV,KAAKk0G,QAAQj7D,iBAAmBj5C,KAAKk0G,QAAQjoF,mBAElFvH,wBACzBgU,EAAMk4G,EAAeC,EAAUptI,OAAS,EAExCktC,EAAOggG,EAAUhrH,KACjBuoD,EAAQyiE,EAAUhrH,KAAOgrH,EAAUntI,MAASqB,KAAKC,IAAI6rI,EAAUntI,MAAOqtI,EAAUrtI,OACtF,IAAImiB,EACJ,GAAG6qH,EAAc,CACf,MAAMM,EAAgB9wI,KAAKoB,UAAUsjB,wBACrCiB,EAAO,OAAAL,GAAA,GAAMwrH,EAAcnrH,KAAMgrB,EAAMu9B,OAClC,CACL,MAAM9qD,EAAIstH,EAAc/qH,MAAQ+qH,EAAcltI,MAAQqtI,EAAUrtI,OAAS,EACzEmiB,EAAO,OAAAL,GAAA,GAAMlC,EAAGutB,EAAMu9B,GAOxBluE,KAAKoB,UAAU+D,MAAMogB,UAAY,eAAeI,QAAW+S,UAGtD,OAML,GALG14B,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGX6oG,KAED,YADA76G,KAAKmkC,OAQP,QAJwB97B,IAArBrI,KAAKkwI,aACNp/H,aAAa9Q,KAAKkwI,aAGjBlwI,KAAKoB,UAAUlB,UAAUuV,SAAS,cACnC,OAGFzV,KAAKk8H,wBAELl8H,KAAKoB,UAAUlB,UAAUoE,OAAO,WAChC,MAAMysI,EAAc/wI,KAAKoB,UAAUlB,UAAUuV,SAAS,QACnDs7H,IACD/wI,KAAKoB,UAAUlB,UAAUoE,OAAO,QAChCtE,KAAKoB,UAAUlB,UAAUW,IAAI,kBAG/Bb,KAAK2vI,qBAEFoB,IACI/wI,KAAKoB,UAAUovC,WACpBxwC,KAAKoB,UAAUlB,UAAUoE,OAAO,kBAGlCtE,KAAKoB,UAAUlB,UAAUW,IAAI,cAEzB,MACF8R,EAAA,EAAwBmB,SAAS,CAC/BzT,KAAM,SACN0T,MAAO,KACL/T,KAAKmkC,UAmCN,kBACFnkC,KAAKgvI,oBACRhvI,KAAKgvI,mBAAoB,EAIzBruI,SAASW,iBAAiB,UAAWtB,KAAKkvI,gBAAiB,CAACrwH,MAAM,KAG7D,kBACF,OAAuB,OACxBle,SAASkN,oBAAoB,UAAW7N,KAAKkvI,iBAC7CvuI,SAASW,iBAAiB,UAAYvB,IACpC,OAAAiqB,EAAA,GAAYjqB,GACZC,KAAKivI,eAAiB,EACtBjvI,KAAKgvI,mBAAoB,EACzBhvI,KAAKgxI,mBACJ,CAACnyH,MAAM,KAIP,kBACF7e,KAAK+uI,gBACR/uI,KAAK+uI,eAAgB,EACrBpuI,SAASW,iBAAiB,kBAAoBvB,IAG5C,GAAGY,SAASqB,gBAAkBhC,KAAKwvI,UACjC,OAGF,MAAM3yC,EAAe78F,KAAKgjG,aAAapyE,KAAKxwB,MAAMy8F,aAClD,GAAGl8F,SAASqB,gBAAkB66F,EAE5B,YADA78F,KAAKmkC,OAIP,MAAM6R,EAAYr1C,SAASwB,eAC3B,GAAG04G,GAAiB7kE,GAClBh2C,KAAKmkC,YAIP,GAAG,KACD,GAAG,KACDnkC,KAAKo9B,OACLp9B,KAAK2vI,yBACA,CACL,GAA2B,IAAxB3vI,KAAKivI,eAEN,YADAjvI,KAAKivI,eAAiB,GAIxBjvI,KAAKi8F,WAAajmD,EAAUmnD,WAAW,GACvCn9F,KAAKgxI,uBAOChxI,KAAKoB,WAAapB,KAAKoB,UAAUlB,UAAUuV,SAAS,cAC5DzV,KAAK2vI,qBACG9yC,EAAa5xE,QAAQ,WAC7BjrB,KAAKgxI,kBAELhxI,KAAKo9B,WE5Zb,SAAS6zG,GAAaC,EAAYC,EAAYC,EAAuBC,EAAsBC,EAAmBluH,EAAWE,GACvH,MAAO,CAAC4tH,EAAI,IAAKC,EAAI,IACbC,EAAe,IACfC,EAAc,IACdC,EAAW,IACXluH,EAAG,IAAKE,GAAI8H,KAAK,IAGZ,SAASmmH,GAAiBnuH,EAAWE,EAAW9f,EAAeC,EAAgB+tI,EAAYC,EAAY3Y,EAAY4Y,GAChI,MAAM1pF,EAAiB,GAwCvB,OArCAA,EAAKz+C,KAAK,KAAO6Z,EAAI5f,EAAQ,GAAK,IAAM8f,GAGxC0kC,EAAKz+C,KAAK,KAAO6Z,EAAI5f,EAAQiuI,IAE1BA,EAAK,GAENzpF,EAAKz+C,KAAK,IAAM0nI,GAAaQ,EAAIA,EAAI,EAAG,EAAG,EAAIruH,EAAI5f,EAAS8f,EAAImuH,IAIlEzpF,EAAKz+C,KAAK,KAAO+Z,EAAI7f,EAASq1H,IAE3BA,EAAK,GAEN9wE,EAAKz+C,KAAK,IAAM0nI,GAAanY,EAAIA,EAAI,EAAG,EAAG,EAAI11G,EAAI5f,EAAQs1H,EAAMx1G,EAAI7f,IAIvEukD,EAAKz+C,KAAK,KAAO6Z,EAAIsuH,IAElBA,EAAK,GAEN1pF,EAAKz+C,KAAK,IAAM0nI,GAAaS,EAAIA,EAAI,EAAG,EAAG,EAAItuH,EAAI,EAAKE,EAAI7f,EAASiuI,IAIvE1pF,EAAKz+C,KAAK,KAAO+Z,EAAIkuH,IAElBA,EAAK,GAENxpF,EAAKz+C,KAAK,IAAM0nI,GAAaO,EAAIA,EAAI,EAAG,EAAG,EAAIpuH,EAAIouH,EAAMluH,EAAI,IAI/D0kC,EAAKz+C,KAAK,KAEHy+C,EAAK58B,KAAK,KAGnB,KAAemmH,iBAAmBA,GCtDnB,MAAM,GAMnB,YAAY7wG,EAA+BhhC,GAmBzC,IAAIiyI,EAnBqC,KAAAjyI,UA+C3C,KAAAkyI,WAAc7xI,IACZC,KAAKoB,UAAUlB,UAAUW,IAAI,gBAI/B,KAAAgxI,YAAe9xI,IACbC,KAAKoB,UAAUlB,UAAUoE,OAAO,gBAIlC,KAAAwtI,OAAU/xI,IACRC,KAAKN,QAAQoyI,OAAO/xI,IAnDpBC,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,OAAQ,aAErCb,KAAK+xI,eAAiBpxI,SAASC,cAAc,OAC7CZ,KAAK+xI,eAAe7xI,UAAUW,IAAI,wBAElCb,KAAK+nB,IAAMpnB,SAAS4nB,gBAAgB,6BAA8B,OAClEvoB,KAAK+nB,IAAI7nB,UAAUW,IAAI,gBAEvBb,KAAKsnD,KAAO3mD,SAAS4nB,gBAAgB,6BAA8B,QACnEvoB,KAAKsnD,KAAKpnD,UAAUW,IAAI,qBAGrBnB,EAAQyR,OACTwgI,EAAWhxI,SAASC,cAAc,OAClC+wI,EAASzxI,UAAUW,IAAI,YAAa,SAAWnB,EAAQyR,OAGzD,MAAM6gI,EAAarxI,SAASC,cAAc,OAI1C,IAAIqxI,EAHJD,EAAW9xI,UAAUW,IAAI,eACzBmxI,EAAW3wI,OAAO,YAAK3B,EAAQ6R,OAAQ7R,EAAQwyI,aAG5CxyI,EAAQswB,WACTiiH,EAAetxI,SAASC,cAAc,OACtCqxI,EAAa/xI,UAAUW,IAAI,iBAC3BoxI,EAAa5wI,OAAO,YAAK3B,EAAQswB,YAGnChwB,KAAK+nB,IAAI1mB,OAAOrB,KAAKsnD,MACrBtnD,KAAK+xI,eAAe1wI,OAAOrB,KAAK+nB,KAEhC/nB,KAAKoB,UAAUC,UAAU,CAACrB,KAAK+xI,eAAgBJ,EAAUK,EAAYC,GAAcrmI,OAAOc,UAC1Fg0B,EAASr/B,OAAOrB,KAAKoB,WAErBpB,KAAKoB,UAAUE,iBAAiB,WAAYtB,KAAK4xI,YACjD5xI,KAAKoB,UAAUE,iBAAiB,YAAatB,KAAK6xI,aAClD7xI,KAAKoB,UAAUE,iBAAiB,OAAQtB,KAAK8xI,QAiB/C,iBACS9xI,KAAKN,QACZM,KAAKoB,UAAUkD,SACftE,KAAKoB,UAAUyM,oBAAoB,WAAY7N,KAAK4xI,YACpD5xI,KAAKoB,UAAUyM,oBAAoB,YAAa7N,KAAK6xI,aACrD7xI,KAAKoB,UAAUyM,oBAAoB,OAAQ7N,KAAK8xI,QAGlD,UACE,MAAMrtH,EAAOzkB,KAAK+xI,eAAertH,wBACjC1kB,KAAK+nB,IAAIS,eAAe,KAAM,sBAAuB,QACrDxoB,KAAK+nB,IAAIS,eAAe,KAAM,UAAW,OAAO/D,EAAKjhB,SAASihB,EAAKhhB,UACnEzD,KAAK+nB,IAAIS,eAAe,KAAM,QAAS,GAAG/D,EAAKjhB,OAC/CxD,KAAK+nB,IAAIS,eAAe,KAAM,SAAU,GAAG/D,EAAKhhB,QAEhD,MAKM89B,EAAIgwG,GADEr1F,IAFEz3B,EAAKjhB,MAFJ,GAGDihB,EAAKhhB,OAHJ,gBAMfzD,KAAKsnD,KAAK9+B,eAAe,KAAM,IAAK+Y,ICzFzB,SAAS4wG,GAAkB9mH,GACxCA,EAAS9gB,QAAQzI,GAAMA,EAAG5B,UAAUW,IAAI,kBAExC,eAAY8C,KAAK,KACf0nB,EAAS9gB,QAAQzI,GAAMA,EAAG5B,UAAUoE,OAAO,oB,0CCMhC,MAAM8tI,GASnB,YAAY/qB,GACVrnH,KAAKqyI,UAAY,GACjBryI,KAAKsyI,UAAY,EAEjBtyI,KAAKuyI,EAAIlrB,EACTrnH,KAAKk8C,OAAS,IAAI/vC,MAAMk7G,EAAI,GAE5BrnH,KAAKwyI,WAAa,IAAIrmI,MAAMk7G,EAAI,GAChCrnH,KAAKwpB,SAAW,IAAIrd,MAAMk7G,EAAI,GAC9BrnH,KAAKyyI,MAAQ,IAAItmI,MAAMk7G,EAAI,GAE3B,IAAI,IAAIzlH,EAAI,EAAGA,GAAKylH,EAAGzlH,IACrB5B,KAAK0yI,aAAa1yI,KAAKk8C,OAAQt6C,GAC/B5B,KAAK0yI,aAAa1yI,KAAKwyI,WAAY5wI,GACnC5B,KAAKwpB,SAAS5nB,GAAK,EAIf,aAAas6C,EAAgBt6C,GACnC,MAAM,UAACywI,EAAS,UAAEC,EAAS,MAAEG,GAASzyI,KAEhC2yI,EAASN,EAAYC,EAC3Bp2F,EAAOt6C,GAAK0wI,EAAYztI,KAAK23B,SAAWm2G,EACxCF,EAAM7wI,GAAK,KAAQ,KAAQiD,KAAK23B,SAG1B,mBACN,MAAM,OAAC0f,EAAM,WAAEs2F,EAAU,SAAEhpH,EAAQ,EAAE+oH,GAAKvyI,KAC1C,IAAI,IAAI4B,EAAI,EAAGA,EAAI2wI,EAAG3wI,IACpB5B,KAAK0yI,aAAax2F,EAAQt6C,GAC1B5B,KAAK0yI,aAAaF,EAAY5wI,GAC9B4nB,EAAS5nB,GAAK,EAIX,OAAOgxI,EAAmBC,GAC/B,MAAM,EAACN,EAAC,SAAE/oH,EAAQ,MAAEipH,EAAK,OAAEv2F,EAAM,WAAEs2F,GAAcxyI,KACjD,IAAI,IAAI4B,EAAI,EAAGA,GAAK2wI,EAAG3wI,IACrB4nB,EAAS5nB,IArDU,GAqDH6wI,EAAM7wI,GAAkBgxI,EAAYH,EAAM7wI,GAtDvC,IAsDwDixI,EACxErpH,EAAS5nB,IAAM,IAChB4nB,EAAS5nB,GAAK,EACds6C,EAAOt6C,GAAK4wI,EAAW5wI,GACvB5B,KAAK0yI,aAAaF,EAAY5wI,IAK7B,KAAK+jB,EAAc+S,EAAa4X,EAAe5qB,EAAgBxgB,EAA2B4tI,EAAgDC,EAAmBC,GAClK,GAAG9tI,EAAOyP,WAAY,CACpB,MAAMwsC,EAAMj8C,EAAOyP,WAAW,MAI9BwsC,EAAI8xF,YACJ9xF,EAAI+xF,OAAO5iG,EAAO5qB,GAClBy7B,EAAIgyF,OAAOxtH,EAAMD,GAEjB,MAAM,OAACw2B,EAAM,WAAEs2F,EAAU,EAAED,GAAKvyI,KAChC,IAAI,IAAI4B,EAAI,EAAGA,GAAK2wI,EAAG3wI,IACrB,GAAS,IAANA,EAAS,CACV,MAAM4nB,EAAWxpB,KAAKwpB,SAAS5nB,GAEzB0hB,GAAKoV,GADAwjB,EAAOt6C,IAAM,EAAM4nB,GAAYgpH,EAAW5wI,GAAK4nB,IACnCwpH,EAAmBD,GAAa,EAAMC,GAC7D7xF,EAAIgyF,OAAOxtH,EAAMrC,OACZ,CACL,MAAMkG,EAAWxpB,KAAKwpB,SAAS5nB,EAAI,GAC7BwxI,EAAKl3F,EAAOt6C,EAAI,IAAM,EAAM4nB,GAAYgpH,EAAW5wI,EAAI,GAAK4nB,EAC5D6pH,EAAerzI,KAAKwpB,SAAS5nB,GAE7B0xI,GAAMhjG,EAAQ3qB,GAAQ4sH,GAAK3wI,EAAI,GAC/B2xI,GAAMjjG,EAAQ3qB,GAAQ4sH,EAAI3wI,EAC1B4xI,EAAKF,GAAMC,EAAKD,GAAM,EAEtBG,GAAM/6G,EAAM06G,GAAMJ,EAAmBD,GAAa,EAAMC,GACxDU,GAAMh7G,GANDwjB,EAAOt6C,IAAM,EAAMyxI,GAAgBb,EAAW5wI,GAAKyxI,IAMtCL,EAAmBD,GAAa,EAAMC,GAC9D7xF,EAAIwyF,cAAcH,EAAIC,EAAID,EAAIE,EAAIH,EAAIG,GACnC9xI,IAAM2wI,GACPpxF,EAAIgyF,OAAO7iG,EAAO5qB,GAMxBotH,EAAM3xF,GACNA,EAAIrxB,OACJqxB,EAAIyyF,cClGH,MAAM,GAGX,YAAmBC,GAAA,KAAAA,UACjB7zI,KAAK8zI,eAAeD,GAGf,eAAeA,GACpB7zI,KAAK+zI,OAAS,CAAC5yF,EAAKx7B,EAAM+S,EAAK4X,EAAO5qB,KACpCy7B,EAAImqB,UAAY,GAAa0oE,oBAAoB7yF,EAAK0yF,EAASluH,EAAM+S,EAAK4X,EAAO5qB,IAKrF,2BAA2By7B,EAA+B9gD,EAAwB4zI,EAAYC,EAAYZ,EAAYG,GACpH,MAAM9jG,EAAWwR,EAAIgzF,qBAAqBF,EAAIC,EAAIZ,EAAIG,GAgBtD,OAfGpzI,IAAS,KAAiB+zI,gBAC3BzkG,EAAS0kG,aAAa,EAAG,WACzB1kG,EAAS0kG,aAAa,GAAI,WAC1B1kG,EAAS0kG,aAAa,EAAG,YACjBh0I,IAAS,KAAiBi0I,SAClC3kG,EAAS0kG,aAAa,EAAG,WACzB1kG,EAAS0kG,aAAa,EAAG,YACjBh0I,IAAS,KAAiBk0I,OAClC5kG,EAAS0kG,aAAa,EAAG,WACzB1kG,EAAS0kG,aAAa,EAAG,YACjBh0I,IAAS,KAAiBm0I,aAClC7kG,EAAS0kG,aAAa,EAAG,WACzB1kG,EAAS0kG,aAAa,EAAG,YAGpB1kG,EAGT,OAAOlsC,EAAgBD,EAAeixI,EAAY7B,KAKrC,MAAM,GAmCnB,cAmEQ,KAAA8B,8BAAiC30I,IACvCC,KAAK20I,UACL30I,KAAK40I,eAGC,KAAAC,aAAe,KAClB70I,KAAK80I,gBACNhkI,aAAa9Q,KAAK80I,eAClB90I,KAAK80I,cAAgB,MAGvB90I,KAAKipG,UAAW,EAChBjpG,KAAK+0I,eACL/0I,KAAK80I,cAAgB5yI,OAAO4N,WAAW,KACrC9P,KAAKipG,UAAW,EAChBjpG,KAAKg1I,cACJ,MAWE,KAAAC,YAAc,KACnBj1I,KAAKk1I,SAAU,EACfl1I,KAAKg1I,cAGA,KAAAG,WAAa,KAClBn1I,KAAKk1I,SAAU,GAGT,KAAAF,WAAa,KAChBh1I,KAAKo1I,KAERp1I,KAAKq1I,QAGC,KAAAA,KAAO,CAACtxB,GAAQ,KAEtB,GADA/jH,KAAKo1I,IAAM,MACPp1I,KAAKwzD,QACP,OAEF,MAAM,IAAC8hF,EAAG,KAAEC,EAAI,KAAEC,EAAI,MAAE5c,EAAK,KAAEjzG,EAAI,IAAE+S,EAAG,MAAE4X,EAAK,OAAE5qB,EAAM,aAAE+vH,EAAY,cAAEC,EAAa,QAAER,EAAO,SAAEjsC,EAAQ,OAAE/jG,GAAUlF,KACnH,IAAIk1I,IAAYjsC,GAAYjpG,KAAK21I,iBAAmB,EAClD,OAMF,IAAIlB,EADY/3F,KAAKC,MACD38C,KAAK41I,eACtBnB,EAAK,KACNA,EAAK,IAIJz0I,KAAK61I,qBAAuB71I,KAAK4yI,YAClC5yI,KAAK4yI,WAAa5yI,KAAK81I,qBAAuBrB,EAC3Cz0I,KAAK81I,qBAAuB,EAC1B91I,KAAK4yI,UAAY5yI,KAAK61I,qBACvB71I,KAAK4yI,UAAY5yI,KAAK61I,oBAGrB71I,KAAK4yI,UAAY5yI,KAAK61I,qBACvB71I,KAAK4yI,UAAY5yI,KAAK61I,qBAKzB71I,KAAK61I,qBAAuB71I,KAAK+1I,aAClC/1I,KAAK+1I,YAAc/1I,KAAKg2I,sBAAwBvB,EAC7Cz0I,KAAKg2I,sBAAwB,EAC3Bh2I,KAAK+1I,WAAa/1I,KAAK61I,qBACxB71I,KAAK+1I,WAAa/1I,KAAK61I,oBAGtB71I,KAAK+1I,WAAa/1I,KAAK61I,qBACxB71I,KAAK+1I,WAAa/1I,KAAK61I,qBAK1BH,IACD11I,KAAK21I,iBAAmBlB,EAAK,IAC1Bz0I,KAAK21I,gBAAkB,IACxB31I,KAAK21I,gBAAkB,EACvB31I,KAAK01I,cAAgB,OAIzB,MAAM,UAAC9C,EAAS,WAAEmD,EAAU,gBAAEJ,GAAmB31I,KAE3Ci2I,EAAO,EAAIF,EAAand,EACxBsd,EAAO,EAAIH,EAAand,EAElB1zH,EAAOyP,WAAW,MAC1BC,UAAU,EAAG,EAAG1P,EAAO1B,MAAO0B,EAAOzB,QAEzC6xI,EAAIhD,UAAY,EAChBgD,EAAIjD,WAAa,EAAI,EAAIO,GAAaha,EACtC2c,EAAKjD,UAAY,EACjBiD,EAAKlD,WAAa,EAAI,EAAIO,GAAaha,EACvC4c,EAAKlD,UAAY,EACjBkD,EAAKnD,WAAa,EAAI,EAAIO,GAAaha,EAEvC0c,EAAI9uG,OAAOosG,EAAW,IACtB2C,EAAK/uG,OAAOosG,EAAW,IACvB4C,EAAKhvG,OAAOosG,EAAW,IAEvB,IAAI,IAAIhxI,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACzB,GAAS,IAANA,IAAY8zI,EACb,SAGF,IAAInuE,EAAQ,EACRnuC,EAAsB,KACjB,IAANx3B,GACD2lE,EAAQ,EAAIouE,EACZv8G,EAAQs8G,IAGRnuE,EAAQmuE,EAAgBC,EAAkB,EAC1CF,EAAajvG,OAAO9gB,EAASgT,EAAK4X,EAAQ3qB,EAAM8uH,EAAI7B,GACpDx5G,EAAQq8G,GAIV,MAAMU,EAAUh1F,IACdA,EAAIi1F,YAAc,GAAM7uE,EACxBnuC,EAAM26G,OAAO5yF,EAAKx7B,EAAM+S,EAAK4X,EAAO5qB,IAEhCotH,EAAS3xF,IACbA,EAAIi1F,YAAoB,IAANx0I,EAAU,EAAI2lE,EAChCnuC,EAAM26G,OAAO5yF,EAAKx7B,EAAM+S,EAAK4X,EAAO5qB,IAGtC6vH,EAAKF,KAAK1vH,EAAM+S,EAAMu9G,EAAM3lG,EAAO5qB,EAAQxgB,EAAQixI,EAAQz9G,EAAK,GAChE88G,EAAKH,KAAK1vH,EAAM+S,EAAMw9G,EAAM5lG,EAAO5qB,EAAQxgB,EAAQixI,EAAQz9G,EAAK,GAChE48G,EAAID,KAAK1vH,EAAM+S,EAAK4X,EAAO5qB,EAAQxgB,EAAQ4tI,EAAOp6G,EAAK,GAGrDqrF,IACF/jH,KAAKo1I,IAAMpvH,sBAAsB,IAAMhmB,KAAKq1I,UAIzC,KAAAgB,gBAAkB,CAACxC,EAA2BxqF,KACnD,MAAM,aAACosF,EAAY,OAAEa,GAAUt2I,MAE5By1I,aAAY,EAAZA,EAAc5B,WAAYA,IAI7B7zI,KAAK01I,cAAgBrsF,EAAWosF,EAAe,KAC/Cz1I,KAAKy1I,aAAea,EAAO3iI,IAAIkgI,GAC/B7zI,KAAK21I,gBAAkB31I,KAAK01I,cAAgB,EAAM,IAlOlD11I,KAAKk1I,SAAU,EACfl1I,KAAKipG,UAAW,EAChBjpG,KAAK41I,eAAiBl5F,KAAKC,MAC3B38C,KAAK4yI,UAAY,EACjB5yI,KAAK+1I,WAAa,EAElB/1I,KAAKs2I,OAAS,IAAIhjI,IAAI,CACpB,CAAC,KAAiBghI,QAAS,IAAI,GAAa,KAAiBA,UAC7D,CAAC,KAAiBC,MAAO,IAAI,GAAa,KAAiBA,QAC3D,CAAC,KAAiBH,eAAgB,IAAI,GAAa,KAAiBA,iBACpE,CAAC,KAAiBI,WAAY,IAAI,GAAa,KAAiBA,eAElEx0I,KAAK01I,cAAgB,KACrB11I,KAAKy1I,aAAez1I,KAAKs2I,OAAO3iI,IAAI,KAAiB6gI,YACrDx0I,KAAK21I,gBAAkB,EAGlB,oBACF31I,KAAKwzD,UAIRxzD,KAAKwzD,SAAU,EAGftxD,OAAOZ,iBAAiB,SAAUtB,KAAK60I,cACvC70I,KAAKyY,MAAQvW,OAAOq0I,WAAW,sCAC/Bv2I,KAAKyY,MAAMnX,iBAAiB,SAAUtB,KAAK00I,+BAE3C10I,KAAK20I,UACL30I,KAAK40I,cAEL50I,KAAKs1I,IAAM,IAAIlD,GAAiB,GAChCpyI,KAAKu1I,KAAO,IAAInD,GAAiB,GACjCpyI,KAAKw1I,KAAO,IAAIpD,GAAiB,GACjCpyI,KAAKw2I,aAAax2I,KAAK4yI,WAEvB5yI,KAAKq1I,QAGA,uBACLr1I,KAAKwzD,SAAU,EAGftxD,OAAO2L,oBAAoB,SAAU7N,KAAK60I,cAC1C70I,KAAKyY,MAAMnX,iBAAiB,SAAUtB,KAAK00I,+BAE3C,MAAM,OAACxvI,GAAUlF,KACLkF,EAAOyP,WAAW,MAC1BC,UAAU,EAAG,EAAG1P,EAAO1B,MAAO0B,EAAOzB,QAGnC,UACNzD,KAAK44H,MAAQ12H,OAAOoE,iBACpBtG,KAAK04B,IAAM,GAAK14B,KAAK44H,MACrB54H,KAAKswC,OAAStwC,KAAKwzD,QAAUxzD,KAAKoB,UAAUqiC,YAAc,MAAQzjC,KAAK44H,MACvE54H,KAAK0lB,QAAU1lB,KAAKwzD,QAAUxzD,KAAKoB,UAAUmoG,aAAe,IAAMvpG,KAAK44H,MACvE54H,KAAK2lB,KAAO,EAAI3lB,KAAK44H,MACrB54H,KAAKy2I,gBAGC,gBACNz2I,KAAKkF,OAAO1B,MAAQxD,KAAKswC,MACzBtwC,KAAKkF,OAAOzB,OAASzD,KAAK0lB,OAsBpB,eACN1lB,KAAK44H,MAAQ12H,OAAOoE,iBACpBtG,KAAKswC,MAAQtwC,KAAKoB,UAAUqiC,YAAczjC,KAAK44H,MAE/C54H,KAAK40I,cACL50I,KAAKg1I,aA2IA,aAAarwI,GAClB,MAAM,UAACiuI,GAAa5yI,KACpBA,KAAK61I,mBAAqBlxI,EAC1B3E,KAAK81I,sBAAwBnxI,EAAQiuI,GAAa,IAClD5yI,KAAKg2I,uBAAyBrxI,EAAQiuI,GAAa,IAG7C,cACN5yI,KAAKy2I,gBAGA,OAAOzoI,GACZ,MAAM5M,EAAYpB,KAAKoB,UAAYT,SAASC,cAAc,OAC1DQ,EAAUlB,UAAUW,IAAImN,GAExB,MAAM9I,EAASlF,KAAKkF,OAASvE,SAASC,cAAc,UAKpD,OAJAsE,EAAOhF,UAAUW,IAAImN,EAAY,WAEjC5M,EAAUC,OAAO6D,GAEV9D,GCtSI,OADU,IAjClB,MAIL,cACEpB,KAAK8kF,MAAQ,GAEbl4E,EAAA,EAAUtL,iBAAiB,eAAgB,KACzCtB,KAAK02I,mBAAgBruI,EACrB,MAAMy8E,EAAQ9kF,KAAK8kF,MACnB9kF,KAAK8kF,MAAQ,GAEb,IAAI,IAAIljF,KAAKkjF,EACX9kF,KAAK22I,YAAY/0I,KAKhB,YAAYpB,GACjB,IAAImE,EAAQ3E,KAAK8kF,MAAMtkF,GACvB,OAAGmE,IAIC3E,KAAK02I,gBACP12I,KAAK02I,cAAgBx0I,OAAO00I,iBAAiBj2I,SAAS22C,kBAGxD3yC,EAAQ3E,KAAK02I,cAAcG,iBAAiB,KAAOr2I,GAAMqP,OAClD7P,KAAK8kF,MAAMtkF,GAAQmE,KCHvB,MAAM,GAKX,YAAmByE,EAAuB1J,GAAvB,KAAA0J,OACjB,OAAAN,EAAA,GAAW9I,KAAMN,GAGZ,KAAK08B,GACV,OAAOp8B,KAAKoJ,KAAK0tI,SAAS92I,KAAMo8B,IAM7B,MAAM,GAYX,YAAmBjrB,EAAmBzR,GAAnB,KAAAyR,OACjBnR,KAAKuD,UAAW,EAEhB,OAAAuF,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKssB,MAAQtsB,KAAKssB,MAAM7f,IAAI/M,GAAWM,KAAK+2I,WAAWr3I,IAGlD,O,MACL,IAAI0D,EAAcpD,KAAKoD,YACvB,GAAGA,EACD,OAAOA,EAGT,MAAM,UAAChC,EAAS,OAAE8D,EAAM,MAAE1B,EAAK,OAAEC,GAAUzD,KAAKmR,KA+BhD,OA9BA/N,EAAckmD,GAAA,EAAajmD,qBAAqB,CAC9CjC,YACA8D,SACA1B,QACAC,SACAwtB,MAAO,OACP3tB,MAAM,EACNC,SAAuB,QAAb,EAAAvD,KAAKuD,gBAAQ,SACvByzI,UAAWh3I,KAAKg3I,UAChBC,6BAA4C5uI,IAAnBrI,KAAKg3I,UAC9Bn6F,MAAO78C,KAAK68C,MACZq6F,aAAcl3I,KAAKk3I,cAClBl3I,KAAKQ,MAAMmD,KAAK81E,GACVnwB,GAAA,EAAajlD,kBAAkBo1E,IACrC91E,KAAK81E,IACNz5E,KAAKy5E,OAASA,EAEXz5E,KAAKm3I,iBACNn3I,KAAKm3I,iBACLn3I,KAAKm3I,oBAAiB9uI,GAGrBrI,KAAKo3I,gBACNp3I,KAAKo3I,gBACLp3I,KAAKo3I,mBAAgB/uI,KAIzBrI,KAAKoD,YAAcA,EACnBpD,KAAKmR,KAAKid,aAAa5T,IAAIxa,KAAKQ,KAAM4C,GAC/BA,EAGF,WAAW1D,GAChB,OAAO,IAAI,GAAoBM,KAAMN,GAGhC,QAAQwlB,GACb,OAAGA,aAAiB,GAA4BA,EACtB,iBAAZ,EAA6BllB,KAAKssB,MAAMjY,KAAK+0F,GAAQA,EAAK5oG,OAAS0kB,GACrEllB,KAAKssB,MAAMpH,GAGlB,SAASkkF,EAA2BhtE,GACzC,OAAOp8B,KAAKmR,KAAK2lI,SAAS92I,KAAMopG,EAAMhtE,IAI3B,MAAM,GAWnB,YAAY18B,GACV,OAAAoJ,EAAA,GAAW9I,KAAMN,GAEbM,KAAKoB,YAAWpB,KAAKoB,UAAYT,SAASC,cAAc,QAC5DZ,KAAKoB,UAAUlB,UAAUW,IAAI,gBAE7B,MAAM,MAAC2C,EAAK,OAAEC,GAAUzD,KACxBA,KAAKoB,UAAU+D,MAAM3B,MAAQA,EAAQ,KACrCxD,KAAKoB,UAAU+D,MAAM1B,OAASA,EAAS,KAEvC,MAAMyB,EAASlF,KAAKkF,OAASvE,SAASC,cAAc,UACpDsE,EAAOhF,UAAUW,IAAI,WACrBqE,EAAO1B,MAAQA,EACf0B,EAAOzB,OAASA,EAEhBzD,KAAKmJ,MAAQ,IAAImK,IACjBtT,KAAKouB,aAAe,IAAI9a,IAG1B,kBACE,OAAOjO,QAAQC,IAAI,IAAItF,KAAKouB,aAAayV,WAAWlgC,KAAKsmB,GAAA,GAGpD,QAAQzpB,GACb,OAAQA,GAA4B,IAApBR,KAAKmJ,MAAMjG,KAAgDlD,KAAKmJ,MAAMwK,IAAInT,GAAlDR,KAAKmJ,MAAM06B,SAASr7B,OAAO7D,MAG9D,IAAIjF,GACT,MAAM0J,EAAO,IAAI,GAAgBpJ,KAAMN,GAGvC,OAFAM,KAAKmJ,MAAMqR,IAAI9a,EAAQc,KAAM4I,GAEtBA,EAGF,SAASA,EAAuB8b,EAAkDkX,GACvF,IAAIhzB,EAAKqwE,OAKP,YAJArwE,EAAKguI,cAAgB,KACnBp3I,KAAK82I,SAAS1tI,EAAM8b,EAAOkX,KAM/B,MAAMgtE,EAAOhgG,EAAKiuI,QAAQnyH,GAC1B9b,EAAKqwE,OAAOq9D,SAAS,CACnB1qI,KAAMQ,EAAA,EAAU+2B,SAASC,oBAAsB5jC,KAAK+pH,cAAgB3gB,EAAKkuC,WAAaluC,EAAKmuC,SAC3F1gG,GAAIuyD,EAAKmuC,SACTn7G,aAaG,0BAA0Bz6B,EAAgB61I,GAC/C,OAAO,IAAIrrI,MAAMxK,GAAQmuB,KAAK,GAAGrjB,IAAI,CAACrB,EAAGpD,KACvC,MAAMsvI,EAAatvI,EAAMwvI,EACzB,MAAO,CAACF,aAAYC,SAAUD,EAAaE,EAAa,MC3LvD,MAAM,WAMF,GAQT,YAAY93I,GAOVC,MAAM,CACJ6D,MAAO9D,EAAQ8D,MACfC,OAAQ/D,EAAQ+D,SAGlB,OAAAqF,EAAA,GAAW9I,KAAMN,GAWZ,KAAK+3I,EAAiCC,GAC3C,GAAG13I,KAAKm+B,OACN,OAAOn+B,KAAKoD,YAGdpD,KAAKm+B,QAAS,EACdn+B,KAAKy3I,UAAYA,EACjBz3I,KAAK03I,WAAaA,EAElB,MAAMtuC,EAAOppG,KAAKq3I,QAAQI,GACpB56F,OAAuBx0C,IAAfqvI,GAA4B13I,KAAK23I,UAAY33I,KAAK23I,SAASD,GAEnEtuI,EAAOggG,EAAKhgG,KAClBA,EAAK4tI,UAAY5tC,EAAKmuC,SACtBnuI,EAAKyzC,MAAQA,EAEb,MAAM7Z,EAAW,IAAIhjC,KAAKmJ,MAAM06B,UAAUp3B,IAAIrD,GAAQA,EAAKK,QAC3D,OAAOpE,QAAQC,IAAI09B,GAAUr/B,KAAKsmB,GAAA,GAM7B,SAASwtH,EAAiCC,EAAoCE,GAC/E53I,KAAKm+B,QAAQn+B,KAAKyJ,KAAKguI,EAAWC,GAEtC,IAAIG,GAAmB,EAAOC,GAAoB,EAIlD,YAHiBzvI,IAAdovI,EAAyBI,EAAmB73I,KAAK+3I,aAAaN,EAAWC,EAAYE,QACjEvvI,IAAfqvI,IAA0BI,EAAoB93I,KAAKg4I,cAAcN,IAElEG,GAAoBC,EAGtB,aAAa1+G,EAA6Bs+G,EAAoCt7G,GACnF,MAAOq7G,UAAWQ,GAAaj4I,KAC/B,GAAGi4I,IAAc7+G,EACf,YAAsB/wB,IAAfqvI,GAA2B13I,KAAKg4I,cAAcN,QAGrCrvI,IAAfqvI,GACD13I,KAAKg4I,cAAcN,GAAY,GAGjC13I,KAAKy3I,UAAYr+G,EAKjB,OAHap5B,KAAKq3I,QAAQj+G,EAAO6+G,GAC5B7zI,KAAKg4B,IAEH,EAGF,cAAchD,EAA8B8+G,GAAiB,GAClE,MAAOR,WAAYO,GAAaj4I,KAChC,GAAGi4I,IAAc7+G,IAAUp5B,KAAK23I,SAC9B,OAAO,EAGT33I,KAAK03I,WAAat+G,EAElB,MAAMhwB,EAAOpJ,KAAKm4I,UACZt7F,EAAQ78C,KAAK23I,SAASv+G,EAAO6+G,GAC7BG,EAAS,KACbhvI,EAAKqwE,OAAO5M,SAAShwB,EAAOq7F,IAS9B,OANG9uI,EAAKqwE,OACN2+D,IAEAhvI,EAAK+tI,eAAiBiB,GAGjB,EAGF,UACLp4I,KAAKmJ,MAAMoB,QAAQnB,IACjBA,EAAKhG,YAAYO,KAAK,KACpByF,EAAKqwE,OAAOn1E,cCtHL,MAAM,WAAgC,GAGnD,cACE3E,MAAM,CACJ6D,MAAO,GACPC,OAAQ,GACR4zI,QAAS,CAACj+G,EAAO6+G,KACf,MAAM3B,EAAS+B,GACf,IAAIC,EACJ,OAAOl/G,GACL,KAAKk9G,EAAOiC,KACVD,EAAWL,IAAc3B,EAAO/B,MAAQ,gBAAkB,kBAC1D,MACF,KAAK+B,EAAO/B,MACV+D,EAAWL,IAAc3B,EAAOiC,KAAO,gBAAkB,OACzD,MACF,KAAKjC,EAAOhC,QACVgE,EAAW,SAIf,OAAOt4I,KAAKm4I,UAAUd,QAAQiB,MAKlCt4I,KAAKoB,UAAUlB,UAAUW,IAAImN,wCAoD7BhO,KAAKa,IAAI,CACPL,KAAM,cACN8rB,MApD0C,CAAC,CAC3CgrH,WAAY,EACZC,SAAU,GACV/2I,KAAM,iBACL,CACD82I,WAAY,GACZC,SAAU,GACV/2I,KAAM,UACL,CACD82I,WAAY,GACZC,SAAU,GACV/2I,KAAM,QACL,CACD82I,WAAY,GACZC,SAAU,IACV/2I,KAAM,iBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,mBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,sBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,sBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,qBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,6BACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,wBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,sBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,qB,cC5EG,MAAM,WAAsC,GAIzD,YAAoBg4I,GAClB74I,MAAM,CACJ6D,MAAO,GACPC,OAAQ,GACR4zI,QAAS,CAACj+G,EAAO6+G,KACf,MAAM3B,EAASmC,GAEf,IAAIvzH,EACJ,OAAOkU,GACL,KAAKk9G,EAAOiC,KACVrzH,EAAQ,EACR,MACF,KAAKoxH,EAAO/B,MACVrvH,EAAQ+yH,IAAc3B,EAAOiC,KAAO,EAAI,EACxC,MACF,KAAKjC,EAAOhC,QACVpvH,EAAQ,EAIZ,OAAOllB,KAAKm4I,UAAUd,QAAQnyH,IAEhCyyH,SAAUa,EAAU,CAACp/G,EAAO6+G,ICoC3B,SAA8B7+G,GACnC,MAAMk9G,EAASmC,GACf,IAAI57F,EAAqB67F,EACzB,OAAOt/G,GACL,KAAKk9G,EAAOiC,KACVG,EAAW,OACX,MACF,KAAKpC,EAAO/B,MACZ,KAAK+B,EAAOqC,aACZ,KAAKrC,EAAOlC,eACVsE,EAAWt/G,IAAUk9G,EAAO/B,MAAQ,YAAc,MAClD,MACF,KAAK+B,EAAOhC,QACVoE,EAAW,QAIf,MAAME,EAAgB,GAAiBjC,YAAY,MAAQ+B,EAAW,eAGtE,OAFA77F,EAAQoqB,GAAS2xE,GAEV/7F,EDvDMg8F,CAAqBz/G,QAC1B/wB,IAxBY,KAAAmwI,UA4BlBx4I,KAAKoB,UAAUlB,UAAUW,IAAImN,+CAE7B,MAAMse,EAAQ,GAAYwsH,mBAAmB,EAAG,IAChD94I,KAAKa,IAAI,CACPL,KAAM,kBACN8rB,UAIG,SAAS8M,GACd,OAAOz5B,MAAMy6B,SCSV,SAAiChB,GACtC,MAAMk9G,EAASmC,GACf,OAAOr/G,GACL,KAAKk9G,EAAOlC,eACZ,KAAKkC,EAAOqC,aACV,OAAOrC,EAAO/B,MAChB,QACE,OAAOn7G,GDhBa2/G,CAAwB3/G,GAAQA,IErC3C,MAAM,GAGnB,YAAoB4/G,GAAA,KAAAA,YAClBh5I,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,2CAGxB,SAASu4B,EAA2C0J,GACzD,MAAMwzG,EAASmC,GACTQ,EAAQj5I,KAAKg5I,UAAUptI,OAAOvL,KAAUyiC,EAAYziC,IAAOoM,IAAIpM,IACnE,MAAM64I,EAAgB,UAAkB,iBAAT74I,EAA0B,kBAAoB,sBACvEuB,EAAIjB,SAASC,cAAc,KAEjC,OADAgB,EAAE1B,UAAUW,IAAI,qCAAqB,sCAAuBR,EAAM64I,GAC3Dt3I,IAGT,IAAIu3I,EAAuBC,EAC3B,GAAGhgH,IAAUk9G,EAAOqC,aAClBQ,EAAW,YAAK,gCAChBC,EAAkB,gBACb,GAAGhgH,IAAUk9G,EAAOhC,QACzB6E,EAAW,YAAK,6BAChBC,EAAkB,mBACb,GAAGhgH,IAAUk9G,EAAOiC,KACzBY,EAAW,YAAK,+BAChBC,EAAkB,iBACb,IAAGt2G,EAAYhtB,QAAUmjI,EAAMt3I,OAEpC,YADA,OAAAmrB,EAAA,GAAa9sB,KAAKoB,UAAW,IAAkBmrB,cAAcuW,EAAYhtB,QAGzEqjI,EAAW,YAAK,8BAChBC,EAAkB,eAGpB,MAAMnsG,EAAOtsC,SAASC,cAAc,QACpCqsC,EAAK/sC,UAAUW,IArCD,gCAqCgBu4I,GAC9BnsG,EAAK5rC,UAAU43I,EAAOE,GAEtB,OAAA1oI,EAAA,GAAezQ,KAAKoB,UAAW6rC,IC7BpB,MAAM,WAAkC,GASrD,YAAoB6+F,GAClBnsI,MAAM,CACJosD,SAAWhxC,GAAYA,EAAQ+nB,YAAYtW,KAC3Cs/B,SAAW/wC,IACTA,EAAQ/D,IAAIuvB,OAAOjiC,SACnBtE,KAAKq5I,iBAAiBt+H,IAExBixC,SAAWjxC,IACT,MAAM,YAAC+nB,GAAe/nB,EAEhBqe,EAAQkgH,GAAkCx2G,GAEhD/nB,EAAQw+H,UAAUn/G,SAAShB,GAC3Bre,EAAQqxC,OAAOhyB,SAAShB,EAAO0J,IAEjCwoB,OAAQ,CAACvwC,EAAS/S,KAChBgjD,GAAuBjwC,EAAQ/D,IAAIuvB,OAAQvmC,KAAKoO,KAAMpG,IAExD4jD,gBAAkBD,IAChB,MAAM,IAAC30C,GAAO,GAAkBC,aAAa,CAC3CC,OAAQy0C,EAAK54C,GACb3R,WAAW,EACX+O,YAAY,EACZC,WAAYpQ,KAAKoQ,WACjBlC,WAAYlO,KAAKkO,WACjBmC,WAAW,EACX8G,cAAenX,KAAKmX,cACpBmX,cAAetuB,KAAKsuB,gBAItBtX,EAAIuvB,OAAOrmC,UAAUW,IADH,0BAGlB,MAAMiiC,EAAcgpG,EAASjpG,aAAalvB,IAAIg4C,EAAK54C,IAC7CymI,EAAaF,GAAkCx2G,GAE/Cy2G,EAAY,IAAI,IAA8B,GAC9CntF,EAAS,IAAI,GAAkC,CAAC,eAAgB,UAatE,OAXAmtF,EAAUn/G,SAASo/G,GACnBptF,EAAOhyB,SAASo/G,EAAY12G,GAE5B,OAAAryB,EAAA,GAAeuG,EAAII,gBAAiBg1C,EAAOhrD,WAC3C4V,EAAIuvB,OAAOllC,OAAOk4I,EAAUn4I,WAE3BuqD,EAA2B30C,IAAMA,EACjC20C,EAA2B7oB,YAAcA,EACzC6oB,EAA2B4tF,UAAYA,EACvC5tF,EAA2BS,OAASA,EAE9BT,GAETP,kBAAmB,OApDH,KAAA0gF,WALV,KAAA17H,WAAa,GACb,KAAA+G,eAAgB,EAChB,KAAAjJ,YAAa,EACb,KAAAo+C,sBAA4E,CAAkB60B,WAAY,IAyDlHnhF,KAAKoO,KAAO,GAAkBC,eAAerO,KAAKssD,uBAG7C,UACLtsD,KAAKqrB,SAAS9gB,QAASwQ,IACrB/a,KAAKq5I,iBAAiBt+H,KAIhB,iBAAiBA,GACzBA,EAAQw+H,UAAU56B,WCvFP,MAAM,WAAsB,IAYzC,cACEh/G,OAAM,GAqDD,KAAA85I,aAAe,CAACC,GAAiB,KACtC,GAAGA,EAKD,YAJI15I,KAAK25I,sBACP35I,KAAK25I,oBAAsBz3I,OAAO4N,WAAW9P,KAAKy5I,aAAc,OAMpE3oI,aAAa9Q,KAAK25I,qBAClB35I,KAAK25I,oBAAsB,EAE3B,MAAMC,EAAU55I,KAAK+a,QAAQ7a,UAAUuV,SAAS,iBAChD,IAA2B,IAAxBzV,KAAK65I,gBACN,GAAI75I,KAAK85I,kBAAmB95I,KAAK85I,oBAA+BF,GAAW55I,KAAK65I,eAC9E,YAEG,IAAID,EACT,OAGF55I,KAAKsS,cAAc,kBAAkB,GACrCtS,KAAK+a,QAAQ7a,UAAUoE,OAAO,kBAGzB,KAAAy1I,aAAe,CAACL,GAAiB,KACnC15I,KAAK25I,qBACN7oI,aAAa9Q,KAAK25I,qBAClB35I,KAAK25I,oBAAsB,GAClB35I,KAAK+a,QAAQ7a,UAAUuV,SAAS,mBAA4C,IAAxBzV,KAAK65I,iBAClE75I,KAAKsS,cAAc,kBAAkB,GACrCtS,KAAK+a,QAAQ7a,UAAUW,IAAI,kBAGzB64I,IAAkB15I,KAAK65I,iBAI3B75I,KAAK25I,oBAAsBz3I,OAAO4N,WAAW9P,KAAKy5I,aAAc,OAG3D,KAAAO,eAAkB58G,IACvB,MAAMw8G,EAAU55I,KAAK+a,QAAQ7a,UAAUuV,SAAS,iBAEhD,QAAYpN,IAAT+0B,EACEw8G,EAAS55I,KAAKy5I,eACZz5I,KAAK+5I,mBACL,IAAG38G,IAASw8G,EAAS,QACX,IAATx8G,EAAgBp9B,KAAKy5I,eACxBz5I,KAAK+5I,iBArGV/5I,KAAK25I,oBAAsB,EAGtB,MAAMj6I,GAOX,OAAAoJ,EAAA,GAAW9I,KAAMN,GAEjB,MAAM,eAACmS,EAAc,QAAEkJ,GAAW/a,KAE/B,KACD6R,EAAehR,IAAIka,EAAnBlJ,CAA4B,QAAU9R,IACjCC,KAAKi6I,sBAAwB,OAAAnvH,GAAA,GAAgB/qB,EAAE2a,OAAQ1a,KAAKi6I,uBAI/Dj6I,KAAKg6I,oBAaPnoI,EAAehR,IAAIka,EAAnBlJ,CAA4B,YAAa,KACvC7R,KAAK+5I,iBAGPloI,EAAehR,IAAIka,EAAnBlJ,CAA4B,aAAc,KACxC7R,KAAK+5I,cAAa,KAGpBloI,EAAehR,IAAIka,EAAnBlJ,CAA4B,aAAe9R,IACtCA,EAAEm6I,eAAiBl6I,KAAKm6I,wBAA0B,OAAArvH,GAAA,GAAgB/qB,EAAEm6I,cAAel6I,KAAKm6I,wBACzFn6I,KAAK+5I,cAAa,GAIpB/5I,KAAKy5I,kBAyDJ,aAAa7rG,GAClB5tC,KAAK65I,eAAiBjsG,EAEtB5tC,KAAK+a,QAAQ7a,UAAUC,OAAO,iBAA6B,IAAZytC,GAC/C5tC,KAAKg6I,eAAepsG,IC9HT,SAASwsG,GAAoBnhI,GAC1C,MAAM/T,EAASvE,SAASC,cAAc,UACtCsE,EAAOhF,UAAUW,IAAI,mBAErBqE,EAAO1B,MADM,GAEb0B,EAAOzB,OAFM,GAIb,MAAM09C,EAAMj8C,EAAOyP,WAAW,MAC9BwsC,EAAIv1C,OAAS,YACb,MAAMyuI,EAAc,KAClBl5F,EAAIM,UAAUxoC,EAAO,EAAG,EAAGA,EAAMypC,WAAYzpC,EAAMutG,YAAa,EAAG,EAAGthH,EAAO1B,MAAO0B,EAAOzB,SAU7F,OAPA,aAAQ,KACN42I,IACOn1I,EAAOwqB,cAGhB2qH,IAEOn1I,ECRM,MAAM,GAWnB,YAAoBsrF,EAA0Cs7C,EAAoCzlB,GAA9E,KAAA71B,kBAA0C,KAAAs7C,WAAoC,KAAAzlB,SAChGrmH,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,0CAE7Bb,KAAKslC,KAAO3kC,SAASC,cAAc,OACnCZ,KAAKslC,KAAKplC,UAAUW,IAAI,qCAExBb,KAAK2lB,KAAOhlB,SAASC,cAAc,OACnCZ,KAAK2lB,KAAKzlB,UAAUW,IAAI,0CAExBb,KAAKswC,MAAQ3vC,SAASC,cAAc,OACpCZ,KAAKswC,MAAMpwC,UAAUW,IAAI,2CAEzBb,KAAKslC,KAAKjkC,OAAOrB,KAAK2lB,KAAM3lB,KAAKswC,OAEjCtwC,KAAKoB,UAAUC,OAAOrB,KAAKslC,MAGtB,UAAU3gC,GACf,IAAIA,EAMF,YALG3E,KAAKuR,SACNvR,KAAKuR,OAAOjN,SACZtE,KAAKuR,YAASlJ,IAIX,GAAGrI,KAAKuR,OACb,OAIAvR,KAAKuR,OAAS5Q,SAASC,cAAc,OACrCZ,KAAKuR,OAAOrR,UAAUW,IAAI,uCAE1B,MAAMsQ,EAAOxQ,SAASC,cAAc,KACpCuQ,EAAKjR,UAAUW,IAAI,sBAAuB,aAC1Cb,KAAKuR,OAAOlQ,OAAO8P,GAEnBnR,KAAKoB,UAAUC,OAAOrB,KAAKuR,QAMxB,eAAeuxB,EAAmCziC,EAAqC4Y,GAC5F,IAAIsuB,EACDzE,EAAYvkB,OAAOo0B,MACpBpL,EAAmB,YAAK,wBACxBA,EAAiBrnC,UAAUW,IAAI,gBAE/Bb,KAAKggF,UAAY,IAAI,KAAU,CAC7B/0E,OAAQjL,KAAKwwF,gBAAgBnqD,UAAUvD,EAAYwD,QAGrDiB,EAAmBvnC,KAAKggF,UAAUjlE,SAGpC/a,KAAKs6I,8BAAgC,IAAI,IAA8B,GACvEt6I,KAAKu6I,2BAA6B,IAAI,GAAkC,CAACl6I,IAEzEL,KAAK2lB,KAAKtkB,OAAOkmC,EAAkBvnC,KAAKu6I,2BAA2Bn5I,WAEnEpB,KAAKswC,MAAMjvC,OAAOrB,KAAKs6I,8BAA8Bl5I,WAErD6X,EAAM/Y,UAAUW,IA9EF,+BA8EiB,cAE5BoY,EAAM2C,QACP3C,EAAM7U,OAGR,MAAMc,EAASk1I,GAAoBnhI,GACnC/T,EAAOhF,UAAUW,IAAI,qCAErBb,KAAKoB,UAAUJ,QAAQkE,EAAQ+T,GAE/BjZ,KAAKw6I,kBAAkB13G,GAGlB,kBAAkBA,GACvB,MAAM1J,EAAQkgH,GAAkCx2G,GAEhD9iC,KAAKs6I,8BAA8BlgH,SAAShB,GAC5Cp5B,KAAKu6I,2BAA2BngH,SAAShB,EAAO0J,GAG3C,UACL9iC,KAAKs6I,8BAA8B37B,WCnGxB,MAAM,WAA0C,GAU7D,YAAYj/G,GASVC,QACA,OAAAmJ,EAAA,GAAW9I,KAAMN,GAEjB,MACM0B,EAAYpB,KAAKoB,UAAYT,SAASC,cAAc,OAC1DZ,KAAKoB,UAAUlB,UAAUW,IAAImN,2CAE7BtO,EAAQghC,SAASr/B,OAAOD,GAExBpB,KAAKy6I,qBAAuB,IAAInnI,IAChCtT,KAAKi8D,WAAa,IAAI3oD,IAEtB,MAAM,eAACzB,GAAkB7R,KAEzB6R,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,yBAA0B,EAAE6oI,cAAa53G,kBAClE9iC,KAAK8rI,SAAS/4H,KAAO2nI,GACtB16I,KAAKw6I,kBAAkB13G,KAI3BjxB,EAAehR,IAAIb,KAAK8rI,SAAxBj6H,CAAkC,SAAWw0G,IAC3CrmH,KAAKy6I,qBAAqBlwI,QAASkC,IACjCA,EAAIlC,QAASwQ,IACX/a,KAAK26I,kBAAkB5/H,EAASsrG,SAKtC,YAAiBrmH,KAAKoB,UAAYrB,IAChC,MAAMqB,EAAY,OAAA0pB,GAAA,GAAgB/qB,EAAE2a,OAAQ,0CAC5C,IAAItZ,EACF,OAGF,MAAM2Z,EAAU/a,KAAKi8D,WAAWtoD,IAAIvS,GACjCpB,KAAK8rI,SAAS8O,eAAiB7/H,EAAQsrG,OAK1CrmH,KAAK8rI,SAAS+O,UAAU9/H,EAAQsrG,QAJ9BrmH,KAAK8rI,SAASgP,YAKf,CAACjpI,mBAEJ7R,KAAK+6I,YAAY/6I,KAAK8rI,UAEtB9rI,KAAKg7I,MAAM,CACTjgI,QAAS3Z,EACTyQ,eAAgBA,EAChBsoI,uBAAwB,uBAIpB,qBAAqBp/H,EAA2C6/H,GACtE,OAAO56I,KAAKi7I,eAAiBL,GAAgB7/H,EAAQsrG,SAAWu0B,EAAeA,GAAgB7/H,EAAQsrG,SAAWu0B,EAG5G,kBAAkB7/H,EAA2C6/H,GACnE,MAAMM,EAAgBl7I,KAAKm7I,qBAAqBpgI,EAAS6/H,GACzD7/H,EAAQ3Z,UAAUlB,UAAUC,OAAO,gBAAiB+6I,GAEpD,MAAME,EAAWrgI,EAAQsrG,SAAWu0B,EACpC7/H,EAAQsgI,UAAUD,GAGZ,kBAAkBt4G,GACxB,MAAM73B,EAASjL,KAAKwwF,gBAAgBnqD,UAAUvD,EAAYwD,MACpD83B,EAAyC,CAAC,QAAS,gBACnDk9E,EAAcl9E,EAAMouB,KAAKnsF,KAAUyiC,EAAYziC,IACrD,IAAIk7I,EAAsBv7I,KAAKy6I,qBAAqB9mI,IAAI1I,IACpDqwI,GAAgBC,KAIhBA,GACFv7I,KAAKy6I,qBAAqBjgI,IAAIvP,EAAQswI,EAAsB,IAAIjoI,KAGlE8qD,EAAM7zD,QAAQlK,IACZ,IAAI0a,EAAUwgI,EAAoB5nI,IAAItT,GACtC,MAAMm7I,EAAmB14G,EAAYziC,GACrC,KAAKm7I,KAAuBzgI,EAA5B,CAQA,GAAGygI,EAAkB,CACnB,MAAMlxI,EAAStK,KAAK8rI,SAAS2P,qCAAqC34G,EAAaziC,GAC/E,IAAIiK,EACF,OAGF,MAAM,MAAC2O,EAAK,OAAEotG,GAAU/7G,EAExByQ,EAAU,IAAI,GAAiC/a,KAAKwwF,gBAAiBxwF,KAAK8rI,SAAUzlB,GAEpFrmH,KAAKi8D,WAAWzhD,IAAIO,EAAQ3Z,UAAW2Z,GAEvC/a,KAAK26I,kBAAkB5/H,EAAS/a,KAAK8rI,SAAS8O,cAC9CW,EAAoB/gI,IAAIna,EAAM0a,GAC9BA,EAAQ2gI,eAAe54G,EAAaziC,EAAM4Y,GAE1CjZ,KAAKoB,UAAUJ,QAAQ+Z,EAAQ3Z,gBAE/Bm6I,EAAoBppI,OAAO9R,GAC3B0a,EAAQ3Z,UAAUkD,SAEdi3I,EAAoBr4I,OACtBlD,KAAKy6I,qBAAqBtoI,OAAOlH,GACjCjL,KAAKi8D,WAAW9pD,OAAO4I,EAAQ3Z,WAC/B2Z,EAAQ4jG,WAIZ3+G,KAAK27I,uBAnCA5gI,GACDA,EAAQy/H,kBAAkB13G,MAsC1B,kBACN,MAAMnhC,EAAS3B,KAAKoB,UAAUqN,kBAC9BzO,KAAKoB,UAAU8F,QAAQvF,OAAS,GAAKA,EACrC3B,KAAKoB,UAAU8F,QAAQorB,OAAS3wB,GAAU,EAAI,IAAkB,IAAXA,EAAe,IAAM,IAE1E3B,KAAKy/E,gBAAkBz/E,KAAKy/E,eAAe99E,GAGtC,YAAYmqI,GACjBA,EAASjpG,aAAat4B,QAASu4B,IAC7B9iC,KAAKw6I,kBAAkB13G,KAIpB,UACL9iC,KAAKi8D,WAAW1xD,QAASwQ,IACvBA,EAAQ4jG,aChJP,MAAM,GAYX,YAAYj/G,GA8GJ,KAAAk8I,mBAAqB,KAC3B,MAAMC,EAAQ,KAAaC,UAAU,IAAgB,GAClDD,GACDA,EAAM13G,OAGRv3B,EAAA,EAAU0F,cAAc,gBAAiB,CACvCrH,OAAQjL,KAAK+7I,gBAIT,KAAAC,uBAA0Bj+H,IAChC/d,KAAK2nI,qBAAqBsU,gBAAgBj8I,KAAK8rI,SAAS/4H,GAAI/S,KAAK8iC,YAAa,CAC5E/kB,WAnHF/d,KAAKq7B,QAAU,CAAC,CACdlqB,KAAM,mBACNmnB,KAAM,qBACNxd,OAAQ,IAAM9a,KAAKk8I,eAAiBl8I,KAAK8iC,YAAYvkB,OAAO49H,gBAC5Dz6F,QAAS,IAAM1hD,KAAKg8I,wBAAuB,IAC1C,CACD7qI,KAAM,gBACNmnB,KAAM,uBACNxd,OAAQ,IAAM9a,KAAKk8I,gBAAkBl8I,KAAK8iC,YAAYvkB,OAAO49H,gBAC7Dz6F,QAAS,IAAM1hD,KAAKg8I,wBAAuB,IAC1C,CACD7qI,KAAM,mBACNmnB,KAAM,sBACNxd,OAAQ,KAAO9a,KAAKk8I,gBAAkBl8I,KAAK8iC,YAAYvkB,OAAO69H,aAC9D16F,QAAS,IAAM1hD,KAAKg8I,wBAAuB,IAC1C,CACD7qI,KAAM,gBACNmnB,KAAM,wBACNxd,OAAQ,KAAO9a,KAAKk8I,eAAiBl8I,KAAK8iC,YAAYvkB,OAAO69H,aAC7D16F,QAAS,IAAM1hD,KAAKg8I,wBAAuB,IAC1C,CACD7qI,KAAM,aACNmnB,KAAM,wBACNxd,OAAQ,KAAM,EACd4mC,QAAS1hD,KAAK47I,oBACb,CACDzqI,KAAM,oBACNmnB,KAAM,uBACNxd,OAAQ,IAAM9a,KAAKugG,gBAAgBt+D,UAAUjiC,KAAKkW,OAAQ,aAC1DwrC,QAAS,KACPs7B,GAAkB,CAChB/xE,OAAQjL,KAAK+7I,aACbrqI,MAAO,IAAI,KAAU,CAACzG,OAAQjL,KAAK+7I,eAAehhI,QAClD8gB,mBAAoB77B,KAAKugG,gBAAgBhkE,YAAYv8B,KAAKkW,QAAU,uCAAyC,+BAC7G8lB,oBAAqB,CAAC,IAAI,KAAU,CAAC/wB,OAAQjL,KAAK+7I,eAAehhI,SACjE2I,OAAQ,CACN8V,QAAS,kCACTwO,UAAU,KAEXrkC,KAAK,KACN3D,KAAKugG,gBAAgB87C,aAAar8I,KAAKkW,OAAQlW,KAAK+7I,eACnD9xH,GAAA,MAIP,MAAM,eAACpY,GAAkBnS,EACzBM,KAAKugG,gBAAkB7gG,EAAQ6gG,gBAC/BvgG,KAAKwwF,gBAAkB9wF,EAAQ8wF,gBAC/BxwF,KAAK2nI,qBAAuBjoI,EAAQioI,qBACpC3nI,KAAK8rI,SAAWpsI,EAAQosI,SACxB9rI,KAAKkW,OAASlW,KAAK8rI,SAAS51H,OAE5BlW,KAAK+a,QAAU,GAAW/a,KAAKq7B,QAASxpB,GACxC7R,KAAK+a,QAAQ7a,UAAUW,IAAI,8BAA+B,SAE1D,aAA0BnB,EAAQuiH,iBAAmBliH,IACnD,MAAMmgC,EAAK,OAAApV,GAAA,GAAgB/qB,EAAE2a,OAAQ,0BACrC,IAAIwlB,EACF,OAGClgC,KAAK+a,QAAQha,gBAAkB2/B,GAChCA,EAASr/B,OAAOrB,KAAK+a,SAGvB,MAAM9P,EAASjL,KAAK+7I,aAAe77G,EAAGh5B,QAAQ+D,OAAOsgB,WACrDvrB,KAAK8iC,YAAc9iC,KAAK8rI,SAASwQ,uBAAuBrxI,GACrDjL,KAAK8iC,YAAYvkB,OAAOo0B,OAI3B3yC,KAAKk8I,cAAgBl8I,KAAKugG,gBAAgBt+D,UAAUjiC,KAAKkW,OAAQ,eAEjElW,KAAKq7B,QAAQ9wB,QAAQmZ,IACnBA,EAAO3I,QAAQ7a,UAAUC,OAAO,QAASujB,EAAO5I,OAAO7P,MAGzD,OAAA+e,EAAA,GAAYjqB,GACZ,aAAcA,EAAiB6jB,QAAW7jB,EAAiB6jB,QAAQ,GAAK7jB,EAAiBC,KAAK+a,QAAS,SACvG,aAAY/a,KAAK+a,WAChBlJ,GAEHA,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,yBAA0B,EAAE6oI,cAAa53G,kBACrE,GAAG9iC,KAAK8rI,SAAS/4H,KAAO2nI,EAAa,CACnC,MAAMzvI,EAASjL,KAAKwwF,gBAAgBnqD,UAAUvD,EAAYwD,MACvDtmC,KAAK+7I,eAAiB9wI,GACvB,kBAKN,IAAIy1B,EAAwB//B,SAASgC,KACrC,aAAsBhC,SAASgC,KAAM,KACnC,MAAM8+G,EAAS,eACf/gF,EAAW+gF,EAAU,KAAaq6B,UAAU,IAAqC,GAAGS,eAAgB57I,SAASgC,KAEzG8+G,GACF,gBAED5vG,IAqBQ,MAAM,GAWnB,YAAYnS,GAQV,OAAAoJ,EAAA,GAAW9I,KAAMN,GAEjB,MAEM6P,EAAa,IAAI,SAAWlH,GAClCkH,EAAWnO,UAAUlB,UAAUW,IAAImN,sCAEnC,MAAM5M,EAAYpB,KAAKoB,UAAYT,SAASC,cAAc,OAC1DQ,EAAUlB,UAAUW,IANF,2BAUlB,MAAMygF,EAAathF,KAAKshF,WAAa,IAAI,GAA0BthF,KAAK8rI,WAElE,SAACA,EAAQ,eAAEj6H,GAAkB7R,KACnCA,KAAK2tI,YAAc,IAAI,GAAgC,OAAD,wBACjDjuI,GAAO,CACVuiH,iBAAkB3gC,EAAWlzE,KAC7ByD,iBACAi6H,cAGF9rI,KAAKw8I,2BAA6B,IAAI,GAAkC,OAAD,wBAClE98I,GAAO,CACVghC,SAAUnxB,EAAWnO,UACrB65I,eAAe,KAGjB1rI,EAAWlO,OAAqBigF,EAAWlzE,MAC3ChN,EAAUC,OAAOkO,EAAWnO,WAE5B1B,EAAQghC,SAASr/B,OAAOD,GAExByQ,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,yBAA0B,EAAE6oI,cAAa53G,kBAClE9iC,KAAK8rI,SAAS/4H,KAAO2nI,GACtB16I,KAAKw6I,kBAAkB13G,KAIF,IAAI,GAAiB,CAC5CvzB,aACA6uB,WAAY,IACHp+B,KAAK2nI,qBAAqB8U,yBAAyBz8I,KAAK8rI,SAAS/4H,IAAIpP,KAAK,EAAEk/B,eAAclB,YAC/FkB,EAAat4B,QAAQu4B,IACnB9iC,KAAKw6I,kBAAkB13G,KAGlBnB,MAKb3hC,KAAK+6I,YAAYjP,GAGX,kBAAkBhpG,GACxB,MAAM73B,EAASjL,KAAKwwF,gBAAgBnqD,UAAUvD,EAAYwD,MACpD36B,EAAM3L,KAAKshF,WAAW31E,IAAIV,GAC7B63B,EAAYvkB,OAAOoH,KACjBha,GACD3L,KAAKshF,WAAWnvE,OAAOlH,GAMvBU,EAKJ3L,KAAKshF,WAAW96C,OAAOv7B,GAJrBjL,KAAKshF,WAAWzgF,IAAIoK,GAOjB,YAAY6gI,GAiBjBA,EAASjpG,aAAat4B,QAASu4B,IAC7B9iC,KAAKw6I,kBAAkB13G,KAIpB,UACL9iC,KAAKshF,WAAWq9B,UAChB3+G,KAAKw8I,2BAA2B79B,WCnRrB,MAAM,GAGnB,YAAoBj+E,GAAA,KAAAA,WAClB1gC,KAAK08I,gBAAkB,IAAI,IAAKziF,YAAY,CAC1C7yD,IAAK,gCAGPpH,KAAK08I,gBAAgB3hI,QAAQ7a,UAAUW,IAAI,0BAGtC,SACLb,KAAK08I,gBAAgB3hI,QAAQzW,SAGxB,OAAOwnI,GACZ,MAAM,MAAC1yG,GAAS0yG,EAEhB,IAAI1kI,EAAkB2K,EACnBqnB,IAAU,KAAiBo7G,WAC5BptI,EAAM,+BAENA,EAAM,2BACN2K,EAAO,CAAE+5H,EAAS1D,UAAkC7uE,qBAGtD,MAAM,gBAACmjF,GAAmB18I,KAC1B08I,EAAgB9+D,iBAAiB,CAC/Bx2E,MACA2K,SAGE/R,KAAK08I,gBAAgB3hI,QAAQha,eAC/Bf,KAAK0gC,SAASr/B,OAAOrB,KAAK08I,gBAAgB3hI,UChCjC,MAAM,GAGnB,YAAoB2lB,GAAA,KAAAA,WAClB1gC,KAAKggF,UAAY,IAAI,KAAU,CAAC/0E,OAAQ,IAGnC,OAAO6gI,GACZ,MAAM,UAAC9rD,EAAS,SAAEt/C,GAAY1gC,KACxBooI,EAAY0D,EAAS1D,UACrBn9H,EAAS6gI,EAAS51H,OAAOqV,UAAS,GACrC68G,EAAU12H,MACX,OAAAob,EAAA,GAAa4T,EAAU,IAAkBnU,cAAc67G,EAAU12H,SAE9DsuE,EAAU/0E,SAAWA,IACtB+0E,EAAU/0E,OAASA,EACnB+0E,EAAUx5C,UAGTw5C,EAAUjlE,QAAQha,gBAAkB2/B,GACrCA,EAASr/B,OAAO2+E,EAAUjlE,WC9BnB,UAFwB,qBAA+B,OAATzD,gBAAS,IAATA,eAAS,EAATA,UAAWqlI,eAAgB,KCWzE,SAASn7D,GAAWxzE,EAAmB6D,EAAgCnS,GAQpF,MAAMk9I,EAAa5uI,EAAY,UACzB6uI,EAAYl8I,SAASC,cAAc,OACzCi8I,EAAU38I,UAAUW,IAAI+7I,EAAY,cAAe,eAEhDl9I,EAAQyR,MACT0rI,EAAU38I,UAAUW,IAAI,SAAWnB,EAAQyR,MAGzCzR,EAAQ+R,UACV,OAAAymB,GAAA,GAAO2kH,GAGNn9I,EAAQsoC,UACT60G,EAAU38I,UAAUW,IAAI+7I,EAAa,QAGpCl9I,EAAQo9I,WACTD,EAAU38I,UAAUW,IAAI+7I,EAAa,UAGpCl9I,EAAQ08B,UACT,YAAiBygH,EAAWn9I,EAAQ08B,SAAU,CAACvqB,mBAGjD,IAAIrE,EAAMqvI,EACV,GAAGn9I,EAAQ44B,KAAM,CACf,MAAMtH,EAAMrwB,SAASC,cAAc,OACnCowB,EAAI9wB,UAAUW,IAAI+7I,EAAa,aAAc,yBAE7C,MAAM3+F,EAAkC,iBAAlBv+C,EAAY,KAAiB,YAAKA,EAAQ44B,MAAQ54B,EAAQ44B,KAChF2lB,EAAO/9C,UAAUW,IAAI+7I,EAAa,QAAS,oBAE3C5rH,EAAI3vB,OAAOw7I,EAAW5+F,GAEtBzwC,EAAMwjB,EAGR,OAAOxjB,ECxBM,MAAM,WAAuB,IAgB1C,YAAY9N,GACVC,OAAM,GAYA,KAAAkpI,SAAW,KACjB7oI,KAAK+8I,gBACL/8I,KAAKg9I,cACLh9I,KAAKqmD,eAdL,OAAAv9C,EAAA,GAAW9I,KAAMN,GAEjBM,KAAK04B,IAAM14B,KAAK2lB,KAAO3lB,KAAKwD,MAAQxD,KAAKyD,OAAS,EAClDzD,KAAK+a,QAAQ7a,UAAUW,IA/BT,mBAiCdb,KAAKi9I,oBACLj9I,KAAKk9I,kBAEL/0H,EAAA,EAAW7mB,iBAAiB,SAAUtB,KAAK6oI,UAStC,kBACL7oI,KAAK+a,QAAQ7a,UAAUoE,OA9CT,mBAgDXtE,KAAKm9I,UACNn9I,KAAKm9I,SAAS5yI,QAAQq/E,IACpBA,EAAQtlF,WAKP,UACL6jB,EAAA,EAAWta,oBAAoB,SAAU7N,KAAK6oI,UAC9C7oI,KAAK4wC,aAAavqB,kBAGZ,oBAENrmB,KAAKm9I,SADuB,CAAC,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,MAC7C1wI,IAAI+4C,IACxB,MAAMx0B,EAAMrwB,SAASC,cAAc,OAInC,OAHAowB,EAAI9pB,QAAQs+C,KAAOA,EACnBx0B,EAAI9wB,UAAUW,IAhEW,iCAgEiBu8I,uCAAoC53F,GAC9ExlD,KAAK+a,QAAQ1Z,OAAO2vB,GACbA,IAIH,kBACN,IAAIqsH,EAAkBC,EAAmBC,EAAoBC,EAAqBC,EAClF,MAAM7sG,EAAe5wC,KAAK4wC,aAAe,IAAI,GAAa,CACxD71B,QAAS/a,KAAK+a,QACd+zB,QAAS,CAACJ,EAAOC,EAAO5uC,KAKtB,GAJA2uC,IAAU,EACVC,IAAU,EAGP8uG,EAAc,CACf,GAAGA,EAAax+G,SAAS,MAAQw+G,EAAax+G,SAAS,KAAM,CAC3D,MAAMy+G,EAAcD,EAAax+G,SAAS,MAAQyP,EAAQ,GAAK+uG,EAAax+G,SAAS,MAAQyP,EAAQ,EAC/FivG,EAAa94I,KAAK+B,IAAI8nC,IAAUgvG,EAAc,GAAK,GAEnDE,EAAcH,EAAax+G,SAAS,KAAOgC,GAAA,EAAWz9B,MAAQ85I,EAAYC,EAAaD,EAC7Ft9I,KAAKwD,MAAQqB,KAAKC,IAAI84I,EAAaL,EAAaI,GAGlD,GAAGF,EAAax+G,SAAS,MAAQw+G,EAAax+G,SAAS,KAAM,CAC3D,MAAMy+G,EAAcD,EAAax+G,SAAS,MAAQ0P,EAAQ,GAAK8uG,EAAax+G,SAAS,MAAQ0P,EAAQ,EAC/FgvG,EAAa94I,KAAK+B,IAAI+nC,IAAU+uG,EAAc,GAAK,GAEnDE,EAAcH,EAAax+G,SAAS,KAAOgC,GAAA,EAAWx9B,OAAS45I,EAAWG,EAAcH,EAC9Fr9I,KAAKyD,OAASoB,KAAKC,IAAI84I,EAAaJ,EAAcG,GAGpD39I,KAAK+8I,gBAEFU,EAAax+G,SAAS,OACvBj/B,KAAK2lB,KAAO9gB,KAAKC,IAAIw4I,EAAYC,EAAav9I,KAAK6xB,SAAUyrH,EAAY5uG,IAGxE+uG,EAAax+G,SAAS,OACvBj/B,KAAK04B,IAAM7zB,KAAKC,IAAIu4I,EAAWG,EAAcx9I,KAAK04C,UAAW2kG,EAAW1uG,SAG1E3uC,KAAK04B,IAAM2kH,EAAW1uG,EACtB3uC,KAAK2lB,KAAO23H,EAAY5uG,EAG1B1uC,KAAKg9I,cACLh9I,KAAKqmD,eAEP9X,kBAAoBxuC,IAClB,MAAM2a,EAAS3a,EAAE2a,OACjB,GAAG1a,KAAKuuC,oBAAsBvuC,KAAKuuC,kBAAkBxuC,GACnD,OAAO,EAGT,MAAM+0I,EAAgB,OAAAhqH,GAAA,GAAgBpQ,EAvHf,kCAgIvB,OARGo6H,GACD2I,EAAe3I,EAAc5tI,QAAQs+C,KACrC5U,EAAaitG,UAAU,MAEvBJ,OAAep1I,EACfuoC,EAAaitG,UAAU,cAGlB,GAETjvG,aAAc,KACZyuG,EAAWr9I,KAAK04B,IAChB4kH,EAAYt9I,KAAK2lB,KACjB43H,EAAav9I,KAAKwD,MAClBg6I,EAAcx9I,KAAKyD,UAKlB,sBACLzD,KAAK04B,IAAOuI,GAAA,EAAWx9B,OAAS,EAAMzD,KAAKyD,OAAS,EACpDzD,KAAK2lB,KAAQsb,GAAA,EAAWz9B,MAAQ,EAAMxD,KAAKwD,MAAQ,EACnDxD,KAAKqmD,cAGC,gBACNrmD,KAAKwD,MAAQ,OAAA8hB,GAAA,GAAMtlB,KAAKwD,MAAOxD,KAAK6xB,SAAUoP,GAAA,EAAWz9B,OACzDxD,KAAKyD,OAAS,OAAA6hB,GAAA,GAAMtlB,KAAKyD,OAAQzD,KAAK04C,UAAWzX,GAAA,EAAWx9B,QAGtD,cACNzD,KAAK04B,IAAM,OAAApT,GAAA,GAAMtlB,KAAK04B,IAAK,EAAGuI,GAAA,EAAWx9B,OAASzD,KAAKyD,QACvDzD,KAAK2lB,KAAO,OAAAL,GAAA,GAAMtlB,KAAK2lB,KAAM,EAAGsb,GAAA,EAAWz9B,MAAQxD,KAAKwD,OAGlD,cACNxD,KAAK+a,QAAQ5V,MAAMuzB,IAAM14B,KAAK04B,IAAM,KACpC14B,KAAK+a,QAAQ5V,MAAMwgB,KAAO3lB,KAAK2lB,KAAO,KACtC3lB,KAAK+a,QAAQ5V,MAAMmrC,MAAQ,OAC3BtwC,KAAK+a,QAAQ5V,MAAMugB,OAAS,OAC5B1lB,KAAK+a,QAAQ5V,MAAM3B,MAAQxD,KAAKwD,MAAQ,KACxCxD,KAAK+a,QAAQ5V,MAAM1B,OAASzD,KAAKyD,OAAS,KAE1CzD,KAAKsS,cAAc,UAGrB,YACE,OAAOtS,KAAK4nE,OAGd,aACE,OAAO5nE,KAAK6nE,QAGd,UAAkBljE,GAChB3E,KAAK4nE,OAASjjE,EAGhB,WAAmBA,GACjB3E,KAAK6nE,QAAUljE,EAGjB,YACE,MAAM,IAAC+zB,EAAG,KAAE/S,EAAI,MAAEniB,EAAK,OAAEC,GAAUzD,KACnC,MAAO,CACL04B,MACA/S,OACAniB,QACAC,UAIJ,UAAiB21B,GACf,MAAM,IAACV,EAAG,KAAE/S,EAAI,MAAEniB,EAAK,OAAEC,GAAU21B,EACnCp5B,KAAK04B,IAAMA,EACX14B,KAAK2lB,KAAOA,EACZ3lB,KAAKwD,MAAQA,EACbxD,KAAKyD,OAASA,EACdzD,KAAK6oI,Y,OZvLG4P,GAyDAJ,G,spBanFG,MAAM,GAOnB,YAAY34I,GANZ,oBAYE,OAAAoJ,EAAA,GAAW9I,KAAMN,GAEjBM,KAAK89I,eAAe,MAEpB99I,KAAK6R,eAAehR,IAAIsnB,EAAA,EAAxBnoB,CAAoC,eAAgB,CAACoM,EAAMyqC,KACtDA,IAAO,IAAWE,QAAU3qC,IAAS,IAAW2qC,QACjD/2C,KAAK89I,eAAe,QAKnB,UACL,MAAMC,EAAU/9I,KAAK+9I,QAClBA,GACDA,EAAQp/B,UAIZ,cACE,OAAO,GAAA3+G,KAAI,QAGb,YACE,OAAOA,KAAK+9I,QAAU/9I,KAAK+9I,QAAQ3kH,MAAQp5B,KAAK01I,cAGlD,UAAiBt8G,GACfp5B,KAAK01I,cAAgBt8G,EAGf,cAAc7X,GACpB,IAAI,QAACw8H,GAAW/9I,KAChB,GAAGuhB,EAAS,CACV,GAAGw8H,EACD,OAGFA,EAAU,GAAA/9I,KAAI,GAAY,IAAI,GAAeA,KAAKg+I,gBAAe,KAEjED,EAAQ3kH,MAAQp5B,KAAK01I,mBACSrtI,IAA3BrI,KAAK01I,cAAch9G,KACpBqlH,EAAQE,sBAGPj+I,KAAK6oI,UACN7oI,KAAK6R,eAAehR,IAAIk9I,EAAxB/9I,CAAiC,SAAUA,KAAK6oI,cAE7C,CACL,IAAIkV,EACF,OAGF/9I,KAAK01I,cAAgBqI,EAAQ3kH,MAC7B2kH,EAAQG,kBACRH,EAAQp/B,UACR,GAAA3+G,KAAI,QAAYqI,EAAS,OC1EhB,SAAS81I,GAAgBnwI,EAAmBqd,EAAyB+1C,GAKlF,OAJA/1C,EAAS9gB,QAASwQ,IAChBA,EAAQ7a,UAAUC,OAAO6N,EAAWozD,KAG/B,IAAM+8E,GAAgBnwI,EAAWqd,GAAW+1C,GdqC9C,SAASk4E,GAAkCx2G,GAChD,MAAMwzG,EAASmC,GACf,OAAG31G,EAAYvkB,OAAO69H,aACb9F,EAAOqC,kBAC4BtwI,IAAlCy6B,EAAYs7G,kBACb9H,EAAOiC,KACNz1G,EAAYvkB,OAAOR,MACpB+kB,EAAYvkB,OAAO49H,gBAAkB7F,EAAO/B,MAAQ+B,EAAOlC,eAE3DkC,EAAOhC,Q,eAnBlB,SAAYmE,GACV,yBACA,qBACA,mCACA,uCACA,mBALF,CAAYA,QAAkC,KAyD9C,SAAYJ,GACV,mBACA,qBACA,yBAHF,CAAYA,QAAkC,KAiB9C,IAAI3C,GAA8B,CAChClyI,MAAO,IACPC,OAAQ,KAKK,MAAM,WAAuB,KAsB1C,YAAY/D,GAKVC,MAAM,wBAAoB0I,EAAW,CACnC1F,MAAM,EACN07I,gBAAgB,EAChBr6G,UAAU,IA6LN,KAAAs6G,kBAAoB,KAC1B,aAAkBt+I,KAAKoB,YAGjB,KAAAm9I,iBAAoBnhH,IAC1Bp9B,KAAKoB,UAAUlB,UAAUC,OAAO,gBAAiBi9B,GACjDp9B,KAAKw+I,iBAAiBt+I,UAAUC,OAAO,gBAAiBi9B,IAGlD,KAAAU,iBAAmBqgH,GAAgBz3I,KAAK,KAAM,gBAE9C,KAAA+3I,aAAe,KACrB,MAAMt+I,EAASH,KAAK89B,iBAAiB,CAAC99B,KAAK0+I,WAAW,GACtD1+I,KAAK8rI,SAAS6S,qBAAqBh3G,QAAQ,KACzCxnC,OAII,KAAAy+I,cAAgB,KACtB,MAAMz+I,EAASH,KAAK89B,iBAAiB,CAAC99B,KAAK6+I,YAAY,GACvD7+I,KAAK8rI,SAASgT,sBAAsBn3G,QAAQ,KAC1CxnC,OAII,KAAAsgI,YAAc,KACpB,MAAM39F,EAAc9iC,KAAK8rI,SAAShpG,YAC9BA,EAAYvkB,OAAO49H,gBAKrBn8I,KAAK8rI,SAASiT,mBAJuB12I,IAAlCy6B,EAAYs7G,mBACbp+I,KAAK8rI,SAASkT,iBAAgB,IAO5B,KAAAC,aAAe,KACrB,MAAMC,EAAUC,IACdn/I,KAAK8rI,SAASoT,OAAOC,IAGpBn/I,KAAKugG,gBAAgBt+D,UAAUjiC,KAAK8rI,SAAS51H,OAAQ,eACtD,IAAI,GAAU,uBAAwB,CACpC2hB,aAAc,sBACdgE,mBAAoB,qBACpBI,WAAY,CAAC,CACX3D,KAAM,wBAER+C,QAAS,CAAC,CACR7B,QAAS,mBACT4C,SAAWH,IACTijH,IAASjjH,EAAW/4B,OAEtB8kC,UAAU,MAEX5K,OAEH8hH,GAAO,IAQH,KAAAE,mBAAqB,KAC3Bp/I,KAAKq/I,kBACL,MAAM59B,EAAS,gBAET,cAAC69B,EAAa,kBAAEC,GAAqBv/I,KAErCw/I,EAAgBx/I,KAAKoB,UAAUlB,UAAUuV,SAAS,kBACxDzV,KAAKoB,UAAUlB,UAAUC,OAAO,iBAAkBshH,GAClD69B,GAAiBA,EAAcp/I,UAAUC,OAAO,OAAQshH,GACxD89B,GAAqBA,EAAkBr/I,UAAUC,OAAO,QAASshH,GACjEzhH,KAAKy7G,SAASv7G,UAAUC,OAAO,OAAQshH,GAEpCA,IAAW+9B,IACZh9F,EAAA,EAAqBq3C,gBAAgB4nB,GAErC70G,EAAA,EAAU6yI,cAAch+B,EAAS,eAAYp5G,KAIzC,KAAAg3I,gBAAkB,K,MACxB,MAAM59B,EAAS,eACTs8B,EAA2B,QAAjB,EAAA/9I,KAAK0/I,oBAAY,eAAE3B,QAC7B4B,GAASl+B,MAAas8B,GAAWA,EAAQv6I,OAAS,SAAWxD,KAAK4/I,YAOlEC,EAAS7/I,KAAKoB,UAAUlB,UAAUuV,SAAS,iBACjD,IAAI4lB,EACDskH,IAAUE,IACXxkH,EAAUlvB,MAAMC,KAAKpM,KAAKw+I,iBAAiBjuH,UAC3C8K,EAAQ9wB,QAAQwQ,IACdA,EAAQ5V,MAAM4tD,QAAU,MAGrB/yD,KAAKw+I,iBAAiBhuG,YAG7BxwC,KAAKoB,UAAUlB,UAAUC,OAAO,gBAAiBw/I,GACjD3/I,KAAK8/I,UAAU5/I,UAAUC,OAAO,OAAQw/I,GACxC3/I,KAAK+/I,cAAc7/I,UAAUC,OAAO,QAASw/I,GAE1CtkH,GAECA,EAAQ9wB,QAAQwQ,IACdA,EAAQ5V,MAAM4tD,QAAU,MAMxB,KAAAitF,kBAAoB,KAC1BhgJ,KAAKoB,UAAUlB,UAAUC,OAAO,0BAjThC,OAAA2I,EAAA,GAAW9I,KAAMN,GAEjBM,KAAK4/I,YAAc,EACnB5/I,KAAKoB,UAAUlB,UAAUW,IAtCX,aAsC0B,SAExC,MAAMirI,EAAW9rI,KAAK8rI,SAAW9rI,KAAK2nI,qBAAqBS,WACrD,eAACv2H,GAAkB7R,KAEzB,IAAI,KAAiB,CACnB,MAAMs/I,EAAgBt/I,KAAKs/I,cAAgB,EAAW,cAChDW,EAAiBjgJ,KAAKigJ,eAAiB,EAAW,6BAClDV,EAAoBv/I,KAAKu/I,kBAAoB,EAAW,eAE9D,YAAiBD,EAAet/I,KAAKs+I,kBAAmB,CAACzsI,mBACzD,YAAiBouI,EAAgBjgJ,KAAKs+I,kBAAmB,CAACzsI,mBAE1D,YAAiB0tI,EAAmB,KAClC,gBACC,CAAC1tI,mBAEJ,aAAsB7R,KAAKoB,UAAWpB,KAAKo/I,mBAAoBvtI,GAG/C7R,KAAK8/I,UAAY,EAAW,WAA9C,MACMC,EAAgB//I,KAAK+/I,cAAgB,EAAW,kCAEtD,YAAiBA,EAAe//I,KAAKggJ,kBAAmB,CAACnuI,mBAEzD,MAAMquI,EAAav/I,SAASC,cAAc,OAC1Cs/I,EAAWhgJ,UAAUW,IAAI,0BAEzBb,KAAK0R,MAAMxR,UAAUW,IAAI,2BAEzB,MAAMmvB,EAAWrvB,SAASC,cAAc,OACxCovB,EAAS9vB,UAAUW,IAAI,8BAEvBq/I,EAAW7+I,OAAOrB,KAAK0R,MAAOse,GAE9BhwB,KAAKuR,OAAOrR,UAAUW,IAAI,qBAC1Bb,KAAKuR,OAAOlQ,UAAU,CAACrB,KAAKu/I,kBAAmBW,EAA6BlgJ,KAAKs/I,cAAeS,GAAen0I,OAAOc,UAEtH,MAAMyzI,EAAYngJ,KAAKuR,OAAOrQ,WAAU,GAClCk/I,EAAgBF,EAAWh/I,WAAU,GACrCm/I,EAAiBrgJ,KAAK0R,MAAMxQ,WAAU,GAE5Ck/I,EAAc/+I,OAAOg/I,GAErB,MAAMC,EAAgB,EAAW,cACjCH,EAAU9+I,UAAU,CAACi/I,EAAeF,EAAepgJ,KAAKigJ,gBAAgBr0I,OAAOc,UAE/E,YAAiB4zI,EAAetgJ,KAAKggJ,kBAAmB,CAACnuI,mBAEzD7R,KAAK2C,KAAK3B,QAAQm/I,GAElB,MAAMI,EAAmB,IAAI,SAAWl4I,GACxCk4I,EAAiBn/I,UAAUlB,UAAUW,IAAI,kCACzCb,KAAKoB,UAAUC,OAAOk/I,EAAiBn/I,WAEvCpB,KAAKwgJ,eAAiB,IAAI,GAAsBxgJ,KAAK0R,OACrD1R,KAAKygJ,qBAAuB,IAAI,GAA4BzwH,GAC5DhwB,KAAK0gJ,+BAAiC,IAAI,GAA4BL,GACtErgJ,KAAK2gJ,mBAEL3gJ,KAAKw8I,2BAA6B,IAAI,GAAkC,OAAD,QACrE97G,SAAU6/G,EAAiBn/I,UAC3B0qI,WACAj6H,iBACAopI,eAAe,EACfx7D,eAAiB99E,IACf3B,KAAK4/I,YAAcj+I,EACnB3B,KAAKq/I,oBAEJ3/I,IAELM,KAAK4gJ,sBAAwB,IAAI,GAA6B,OAAD,QAC3DlgH,SAAU1gC,KAAK2C,KACfmpI,WACAj6H,kBACGnS,IAGLM,KAAK0/I,aAAe,IAAI,GAAa,CACnC7tI,iBACAmsI,eAAgB,CACdnsH,SAAU,IACV6mB,UAAW,IACX39B,QAAS/a,KAAK+a,QACdwzB,kBAAoBxuC,IAClB,MAAM2a,EAAS3a,EAAE2a,OACjB,QAAG,OAAAoQ,GAAA,GAAgBpQ,EAAQ,aACzB,OAAAoQ,GAAA,GAAgBpQ,EAAQ,sBACxB,OAAAoQ,GAAA,GAAgBpQ,EAAQ,aACxB,OAAAoQ,GAAA,GAAgBpQ,EAAQ,4CACxB,kBAONmuH,SAAU,IAAM7oI,KAAKq/I,kBACrB3J,mBAGF7jI,EAAehR,IAAIirI,EAAnBj6H,CAA6B,QAAS,KACpC7R,KAAK6gJ,mBAGPhvI,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,oBAAsBu2H,I,OAClC,QAAb,EAAApoI,KAAK8rI,gBAAQ,eAAE/4H,MAAOq1H,EAAUr1H,IACjC/S,KAAK6gJ,mBAIThvI,EAAehR,IAAIirI,EAAnBj6H,CAA6B,SAAU,KACrC7R,KAAK8gJ,iBAGPjvI,EAAehR,IAAIb,KAAKw8I,2BAAxB3qI,CAAoD,iBAAkB7R,KAAKu+I,kBAE3Ev+I,KAAKsB,iBAAiB,QAAS,KAC7B,MAAM,aAACo+I,GAAgB1/I,KACvB01I,GAAgBgK,EAAatmH,MAE7Bp5B,KAAKw8I,2BAA2B79B,UAChC3+G,KAAK4gJ,sBAAsBjiC,UAC3B3+G,KAAK+gJ,wBAAwBpiC,UAE7B+gC,EAAa/gC,YAGf3+G,KAAKggJ,oBACLhgJ,KAAKo/I,qBAELp/I,KAAK6gJ,iBAGC,mBACN,MAAMxlH,EAAUr7B,KAAKw+I,iBAAmB79I,SAASC,cAAc,OAC/Dy6B,EAAQn7B,UAAUW,IAAI,sBAEtB,MAAMmgJ,EAAcx/D,GAAW96E,KAAK,KAhLtB,aAgLuC1G,KAAK6R,gBAEpD6sI,EAAW1+I,KAAK0+I,SAAWsC,EAAY,CAE3C5kH,SAAUp8B,KAAKy+I,aACfttI,KAAM,uBAGF0tI,EAAY7+I,KAAK6+I,UAAYmC,EAAY,CAE7C5kH,SAAUp8B,KAAK4+I,cACfztI,KAAM,uBAGR0tI,EAAU3+I,UAAUC,OAAO,QAAS,IAEpC,MAAMwpI,EAAUqX,EAAY,CAC1BvvI,UAAU,EACV2qB,SAAU,OAAAosB,GAAA,GAASxoD,KAAKygI,YAAa,KAAK,KAE5CkJ,EAAQzpI,UAAUW,IAAI,gCAEtB,MAAMogJ,EAAiBjhJ,KAAK+gJ,wBAA0B,IAAI,GAC1DpX,EAAQtoI,OAAO4/I,EAAe7/I,WAE9B,MAAM0mI,EAAUkZ,EAAY,CAE1B7vI,KAAM,oBAGR22H,EAAQ5nI,UAAUW,IAAI,gBACtBinI,EAAQ5nI,UAAUC,OAAO,QAAS,IAElC,MAAM+gJ,EAAWF,EAAY,CAE3Bh5G,UAAU,EACV5L,SAAUp8B,KAAKi/I,aACf9tI,KAAM,UAGRkqB,EAAQh6B,OAAOq9I,EAAUG,EAAWlV,EAAS7B,EAASoZ,GAEtDlhJ,KAAKoB,UAAUC,OAAOg6B,GAgEjB,eACL,OAAOr7B,KAAKoB,UA4DN,eACNpB,KAAKoB,UAAUlB,UAAUC,OAAO,eAAgBH,KAAK8rI,SAAS8O,cAGxD,iBACN,GAAG56I,KAAK8rI,SAAS1yG,QAAU,KAAiB+nH,OAM1C,OALGnhJ,KAAKoB,UAAUlB,UAAUuV,SAAS,mBACnC,oBAGFzV,KAAKmkC,OAIP,MAAM,YAACrB,EAAW,UAAEslG,GAAapoI,KAAK8rI,SACtC,IAAIhpG,EACF,OAGF9iC,KAAK+U,WACL/U,KAAKohJ,iBACLphJ,KAAK8gJ,eAEL,MAAMO,EA9XH,SAA2CjZ,EAAgCtlG,GAChF,MAAMwzG,EAAS+B,GACf,OAAIv1G,EAAYvkB,OAAO49H,gBAEbr5G,EAAYvkB,OAAOR,MACpBu4H,EAAO/B,MAEP+B,EAAOhC,QAJPgC,EAAOiC,KA2XgB+I,CAAkClZ,EAAkBtlG,GAClF9iC,KAAKoB,UAAU8F,QAAQq6I,SAAWF,IAA0BhJ,GAAmCE,KAAO,OAAU8I,IAA0BhJ,GAAmC9D,MAAQ,QAAU,UAC/Lv0I,KAAK+gJ,wBAAwB3mH,SAASinH,GAGhC,WACNrhJ,KAAKwgJ,eAAeh6G,OAAOxmC,KAAK8rI,UAG1B,iBACN9rI,KAAKygJ,qBAAqBj6G,OAAOxmC,KAAK8rI,UACtC9rI,KAAK0gJ,+BAA+Bl6G,OAAOxmC,KAAK8rI,W,Iexe/C0V,G,WAAL,SAAKA,GACH,6BACA,+BACA,yCACA,yBACA,+BACA,yBACA,uBAPF,CAAKA,QAAU,KAUA,UCLA,MAAM,GAKnB,YAAoB9gH,GAAA,KAAAA,WAClB1gC,KAAKoB,UAAYT,SAASC,cAAc,OACxCZ,KAAKoB,UAAUlB,UAAUW,IAAI,oBAGxB,cACgBwH,IAAlBrI,KAAKyhJ,WACNxkG,cAAcj9C,KAAKyhJ,UACnBzhJ,KAAKyhJ,cAAWp5I,GAGlBrI,KAAKoB,UAAUkD,SACftE,KAAKo5B,WAAQ/wB,EAGR,OAAOyjI,GACZ,MAAM,gBAAC4V,GAAmB5V,EAE1B,GAAG9rI,KAAKo5B,QAAUsoH,EAChB,OAKF,IAAI3mI,EACJ,GAHA/a,KAAKo5B,MAAQsoH,EAGVA,IAAoB,GAAWC,UAAW,CAC3C5mI,EAAUpa,SAASC,cAAc,QACjCma,EAAQ7a,UAAUW,IAAI,6BAEtB,MAAMytF,EAAU,KACdvzE,EAAQ6S,UAAYtL,GAASwpH,EAASryH,UAAU,IAGlDzZ,KAAKyhJ,SAAWv/I,OAAO6wC,YAAYu7C,EAAS,KAC5CA,QACK,CACL,IAAIz0D,EACJ,OAAO6nH,GACL,KAAK,GAAWE,QACd/nH,EAAciyG,EAASjgH,WAAa,qBAAuB,qBAC3D,MACF,KAAK,GAAWg2H,WACdhoH,EAAc,wBACd,MACF,KAAK,GAAWioH,gBACdjoH,EAAc,qBACd,MACF,KAAK,GAAWsnH,OACdtnH,OAAuCxxB,IAAzByjI,EAASiW,YAA4B,mBAAqB,oBACxE,MACF,QACEloH,EAAc,wBAIlB9e,EAAU,YAAK8e,QACMxxB,IAAlBrI,KAAKyhJ,WACNxkG,cAAcj9C,KAAKyhJ,UACnBzhJ,KAAKyhJ,cAAWp5I,GAIpBrI,KAAKoB,UAAUlB,UAAUC,OAAO,eAAgBuhJ,IAAoB,GAAWC,WAC/E,OAAAlxI,EAAA,GAAezQ,KAAKoB,UAAW2Z,GAE3B/a,KAAKoB,UAAUL,eACjBf,KAAK0gC,SAASr/B,OAAOrB,KAAKoB,YC1EjB,MAAM,WAAoC,GAOvD,YAAYo3I,EAAmBzuB,GAC7BpqH,MAAM,CACJ6D,MAAO,GACPC,OAAQ,GACR4zI,QAAUj+G,GACDp5B,KAAKm4I,UAAUd,QAAQj+G,EAAQ,SAAW,QAEnDu+G,SAAUa,EAAWp/G,GACZA,EAAQ,CAAC,IAAK,IAAK,KAAO,CAAC,IAAK,IAAK,UAC1C/wB,EACJ0hH,kBAGF/pH,KAAKa,IAAI,CACPL,KAAM,aACN8rB,MAAO,CAAC,CACNgrH,WAAY,EACZC,SAAU,GACV/2I,KAAM,iBACL,CACD82I,WAAY,GACZC,SAAU,GACV/2I,KAAM,UACL,CACD82I,WAAY,GACZC,SAAU,GACV/2I,KAAM,QACL,CACD82I,WAAY,GACZC,SAAU,IACV/2I,KAAM,iBACL,CACD82I,WAAY,IACZC,SAAU,IACV/2I,KAAM,uBCbd,MAKMwhJ,GAA2B,CAC/Bx+I,MAJgB,IAKhBC,OAJiB,KAOnB,IAAI,GAAa,iBAAqBu+I,IAEvB,MAAM,WAAkB,KAsCrC,YAAYtiJ,GAMVC,MAAM,kBAAc0I,EAAW,CAC7Bg2I,gBAAgB,EAChBr6G,UAAU,IAmNN,KAAAs6G,kBAAoB,KAC1B,aAAkBt+I,KAAKoB,YAGjB,KAAAg+I,mBAAqB,KAC3B,MAAM39B,EAAS,gBAET,cAAC69B,EAAa,kBAAEC,GAAqBv/I,KAErCw/I,EAAgBx/I,KAAKoB,UAAUlB,UAAUuV,SAAS,kBACxDzV,KAAKoB,UAAUlB,UAAUC,OAAO,iBAAkBshH,GAClD69B,GAAiBA,EAAcp/I,UAAUC,OAAO,OAAQshH,GACxD89B,GAAqBA,EAAkBr/I,UAAUC,OAAO,QAASshH,GACjEzhH,KAAKy7G,SAASv7G,UAAUC,OAAO,OAAQshH,GAEpCA,IAAW+9B,IACZh9F,EAAA,EAAqBq3C,gBAAgB4nB,GAErC70G,EAAA,EAAU6yI,cAAch+B,EAAS,eAAYp5G,GAE7CrI,KAAKiiJ,0BApOP,OAAAn5I,EAAA,GAAW9I,KAAMN,GAEjBM,KAAKkiJ,gBAAkB,GAEvB,MAAM,UAAC9gJ,EAAS,eAAEyQ,EAAc,SAAEi6H,GAAY9rI,KAC9CoB,EAAUlB,UAAUW,IAlEN,OAkEqB,SAEnC,MAAMs4C,EAAkBx4C,SAASC,cAAc,OAC/Cu4C,EAAgBj5C,UAAUW,IAAI,eAE9B,MAAMoK,EAASjL,KAAKiL,OAASjL,KAAK8rI,SAASqW,mBAAmB52H,WACxDyjB,EAAS,IAAI,GACnBA,EAAO9uC,UAAUW,IAAI,eACrBmuC,EAAOnY,kBAAkB,CACvB8oH,OAAO,EACP10I,OAAQA,IAEVkuC,EAAgB93C,OAAO2tC,GAEvB,MAAMt9B,EAAQ,IAAI,KAAU,CAC1BzG,WACC8P,QAEHrJ,EAAMxR,UAAUW,IAAI,cAEpB,MAAMmvB,EAAWrvB,SAASC,cAAc,OACxCovB,EAAS9vB,UAAUW,IAAI,iBAEHb,KAAK87B,YAAc,IAAI,GAAuB9L,GAAlE,MAEMoyH,EAAiBpiJ,KAAKoiJ,eAAiBzhJ,SAASC,cAAc,OACpEwhJ,EAAeliJ,UAAUW,IAAI,eAE7BO,EAAUC,OAAO83C,EAAiBznC,EAAOse,GAErC,KAWFhwB,KAAKuR,OAAOlQ,OAAO+gJ,IAVnBpiJ,KAAKs/I,cAAgB,EAAW,cAChCt/I,KAAKu/I,kBAAoB,EAAW,oBACpC,YAAiBv/I,KAAKs/I,cAAet/I,KAAKs+I,kBAAmB,CAACzsI,mBAC9D,YAAiB7R,KAAKu/I,kBAAmB,IAAM,eAAoB,CAAC1tI,mBACpE,aAAsB7R,KAAKoB,UAAWpB,KAAKo/I,mBAAoBvtI,GAC/D7R,KAAKuR,OAAOvQ,QAAQhB,KAAKu/I,mBACzBv/I,KAAKuR,OAAOlQ,OAAOrB,KAAKs/I,eAExBl+I,EAAUC,OAAO+gJ,IAKnBpiJ,KAAKqiJ,YAAc1hJ,SAASC,cAAc,OAC1CZ,KAAKqiJ,YAAYniJ,UAAUW,IAAI,qBAE/Bb,KAAKsiJ,gBAAkB3hJ,SAASC,cAAc,OAC9CZ,KAAKsiJ,gBAAgBpiJ,UAAUW,IAAI,oBACnC,MAAM0hJ,EAAY,YAAK,0BAA2B,CAAC,IAAI,KAAU,CAACt3I,SAAQyvD,eAAe,EAAMtqC,aAAc,KAAKrV,UAClHwnI,EAAUriJ,UAAUW,IAAI,yBACxB,MAAM04I,EAAY,IAAI,IAA4B,GAAO,GACzDA,EAAUn/G,UAAS,GAAO,GAC1Bp6B,KAAKsiJ,gBAAgBjhJ,OACnBk4I,EAAUn4I,UACVmhJ,GAGFviJ,KAAKqiJ,YAAYhhJ,OAAOrB,KAAKsiJ,iBAC7BtiJ,KAAKoB,UAAUC,OAAOrB,KAAKqiJ,aAE3BriJ,KAAKwhF,WAAaA,GAAW96E,KAAK,KA/HpB,OA+HqC1G,KAAK6R,gBACxD7R,KAAKwiJ,wBACLxiJ,KAAKyiJ,yBAEL5wI,EAAehR,IAAIirI,EAAnBj6H,CAA6B,QAAS,KACpC7R,KAAK6gJ,mBAGPhvI,EAAehR,IAAIirI,EAAnBj6H,CAA6B,aAAc,KACzC7R,KAAK6gJ,mBAGP7gJ,KAAK0/I,aAAe,IAAI,GAAa,CACnC7tI,iBACAmsI,eAAgB,CACdnsH,SA5IU,IA6IV6mB,UA5IW,IA6IX39B,QAAS/a,KAAK+a,QACdwzB,kBAAoBxuC,IAClB,MAAM2a,EAAS3a,EAAE2a,OACjB,QAAG,OAAAoQ,GAAA,GAAgBpQ,EAAQ,gBACzB,OAAAoQ,GAAA,GAAgBpQ,EAAQ,aACxB,kBAQNg7H,cAAgB11I,KAAK8rI,SAAS4W,iBAAoB1iJ,KAAK8rI,SAASjgH,WAA+B,GAAlB,OAAD,UAAKm2H,MAGnF,MAAMW,EAAiB3iJ,KAAK0/I,aAAa3B,QACtC4E,GACD3iJ,KAAK6R,eAAehR,IAAI8hJ,EAAxB3iJ,CAAwC,SAAU,KAChDA,KAAKiiJ,0BAIT,MAAMW,EAAgB5iJ,KAAK4iJ,cAAgB,IAAI,GAC/CA,EAAc5H,MAAM,CAClBjgI,QAAS/a,KAAKoB,UACdyQ,eAAgB7R,KAAK6R,eACrBsoI,uBAAwB,iBAE1ByI,EAAc7I,cAAa,GAE3B/5I,KAAKsB,iBAAiB,QAAS,KAC7B,MAAM,aAACo+I,GAAgB1/I,KACvB,GAAgB0/I,EAAatmH,MAE7Bp5B,KAAKihJ,eAAetiC,UAEpB+gC,EAAa/gC,YAGf3+G,KAAK6gJ,iBAGA,kBACL,OAAO7gJ,KAAK8rI,SAGN,wBACN,MAAMzwG,EAAUr7B,KAAK6iJ,gBAAkBliJ,SAASC,cAAc,OAC9Dy6B,EAAQn7B,UAAUW,IAAI,eAAwB,YAE9C,MAAMi9B,EAAmBqgH,GAAgBz3I,KAAK,KAAM,gBAE9Cg4I,EAAW1+I,KAAK0+I,SAAW1+I,KAAKwhF,WAAW,CAC/ClpD,KAAM,cACNnnB,KAAM,qBACNirB,SAAU,KACR,MAAMj8B,EAAS29B,EAAiB,CAAC4gH,EAAUG,IAAY,GACvD7+I,KAAK8rI,SAAS6S,qBAAqBh3G,QAAQxnC,MAIzC0+I,EAAY7+I,KAAK6+I,UAAY7+I,KAAKwhF,WAAW,CACjDlpD,KAAM,cACNnnB,KAAM,qBACNirB,SAAU,KACR,MAAMj8B,EAAS29B,EAAiB,CAAC4gH,EAAUG,IAAY,GACvD7+I,KAAK8rI,SAASgT,sBAAsBn3G,QAAQxnC,MAI5C,KACF0+I,EAAU3+I,UAAUW,IAAI,QACxBb,KAAKoB,UAAUlB,UAAUW,IAAI,cAG/Bb,KAAK8iJ,gBAAkB,IAAI,IAAK7oF,YAAY,CAC1C7yD,IAAK,cAEP,MAAMuiI,EAAU3pI,KAAK2pI,QAAU3pI,KAAKwhF,WAAW,CAC7ClpD,KAAMt4B,KAAK8iJ,gBAAgB/nI,QAC3BqhB,SAAU,KACRp8B,KAAK8rI,SAASiT,iBAIZkC,EAAiBjhJ,KAAKihJ,eAAiB,IAAI,IAA4B,GAAM,GACnFtX,EAAQ19G,kBAAkB5qB,OAAO4/I,EAAe7/I,WAKhDi6B,EAAQh6B,OAAOq9I,EAAUG,EAAWlV,GACpC3pI,KAAKoB,UAAUC,OAAOg6B,GAGhB,yBACN,MAAMA,EAAUr7B,KAAK+iJ,iBAAmBpiJ,SAASC,cAAc,OAC/Dy6B,EAAQn7B,UAAUW,IAAI,eAAwB,aAE9Cb,KAAKgjJ,mBAAqB,IAAI,IAAK/oF,YAAY,CAC7C7yD,IAAK,iBAEP,MAAM67I,EAAajjJ,KAAKijJ,WAAajjJ,KAAKwhF,WAAW,CACnDlpD,KAAMt4B,KAAKgjJ,mBAAmBjoI,QAC9B5J,KAAM,iBACNirB,SAAU,KACRp8B,KAAK8rI,SAASoT,OAAO,iCAEvBl3G,UAAU,IAGNk7G,EAAYljJ,KAAKkjJ,UAAYljJ,KAAKwhF,WAAW,CACjDlpD,KAAM,cACNnnB,KAAM,eACNirB,SAAU,KACRp8B,KAAK8rI,SAASqX,cAEhBrG,WAAW,IAGbzhH,EAAQh6B,OAAO4hJ,EAAYC,GAC3BljJ,KAAKoB,UAAUC,OAAOg6B,GA2BhB,qBAAqBpiB,GAC3B,MACM7X,EAAYT,SAASC,cAAc,OACzCQ,EAAUlB,UAAUW,IAAI+7I,wBAExB3jI,EAAM/Y,UAAUW,IAJG,cAKhBoY,EAAM2C,QACP3C,EAAM7U,OAGR,YAAiBhD,EAAW,KAC1B,IAAIA,EAAUlB,UAAUuV,SAAS,SAC/B,OAGF,MAAM28F,EAAMz0F,OAAOkmB,OAAO7jC,KAAKkiJ,iBAAiB7tI,KAAKjT,IAAcA,EAAUlB,UAAUuV,SAAS,UAChG28F,EAAIlyG,UAAUW,IAAI,SAClBuxG,EAAIjtG,MAAM2X,QAAU1b,EAAU+D,MAAM2X,QACpC1b,EAAUlB,UAAUoE,OAAO,SAC3BlD,EAAU+D,MAAM2X,QAAU,GAE1B9c,KAAKiiJ,0BAGP,MAAM/8I,EAASk1I,GAAoBnhI,GAKnC,OAJA/T,EAAOhF,UAAUW,IAAI+7I,mBAErBx7I,EAAUC,OAAO6D,EAAQ+T,GAElB7X,EAGD,iBACN,MAAM,SAAC0qI,GAAY9rI,MACb,gBAAC0hJ,GAAmB5V,EAC1B,GAAG4V,IAAoB,GAAWP,OAQhC,OAPGnhJ,KAAKoB,UAAUlB,UAAUuV,SAAS,mBACnC,eAGFzV,KAAK0+I,SAASx+I,UAAUW,IAAI,iBAE5Bb,KAAKmkC,OAIP,MAAMi/G,GAAqBtX,EAASjgH,YAAc61H,IAAoB,GAAWE,QACjF5hJ,KAAKgjJ,mBAAmBplE,iBAAiB,CACvCx2E,IAAKs6I,IAAoB,GAAWE,QAAU,eAAiB,aAEjE5hJ,KAAKkjJ,UAAUhjJ,UAAUC,OAAO,WAAYijJ,GAC5CpjJ,KAAKkjJ,UAAUhjJ,UAAUC,OAAO,WAAYijJ,GAC5CpjJ,KAAKoB,UAAUlB,UAAUC,OAAO,kBAAmBijJ,GAEnD,MAAMt3G,EAAUggG,EAAShgG,QACnB0V,EAAU,KACdxhD,KAAK2pI,QAAQ19G,kBAAkB/rB,UAAUC,OAAO,SAAU2rC,IAGtD2tC,EAASz5E,KAAKihJ,eAAe9I,UAAU1+D,OAC7Cz5E,KAAKihJ,eAAe7mH,UAAU0R,GAAUA,EAAS0V,GAC7Ci4B,GACFj4B,IAGFxhD,KAAK8iJ,gBAAgBllE,iBAAiB,CACpCx2E,IAAK0kC,EAAU,aAAe,cAGhC,MAAMu3G,EAAiBvX,EAASuX,eAChCrjJ,KAAK0+I,SAASzyH,kBAAkB/rB,UAAUC,OAAO,SAAUkjJ,GAE3D,MAAMC,EAAkBxX,EAASwX,gBACjCtjJ,KAAK6+I,UAAU5yH,kBAAkB/rB,UAAUC,OAAO,SAAUmjJ,GAE5D,MAAMC,EAAczX,EAAS0X,cAAc,UAE3C,aAAcxjJ,KAAKsiJ,gBAAiB,gBAAgBiB,aAAW,EAAXA,EAAaxlI,OAAO,KAExE,MAAMk+C,EAAaj8D,KAAKkiJ,gBAClBuB,EAAgB,OAAH,UAAOxnF,GAC1B,CAAC,QAAkB,UAAmB1xD,QAAQlK,IAC5C,MAAMqjJ,EAAa5X,EAAS0X,cAAcnjJ,GACpC4Y,EAAQ6yH,EAAS6X,gBAAgBtjJ,GAEjCujJ,KAAc3qI,GAASA,EAAMypC,YAAczpC,EAAMutG,cACpDvtG,GAAU2qI,GAAa3qI,EAAM/R,QAAQ28I,aACtC5qI,EAAM/R,QAAQ28I,WAAa,IAE3B,aAAY5qI,GAAOtV,KAAK,YACfsV,EAAM/R,QAAQ28I,WACrB7jJ,KAAK6gJ,oBAMT,MAAM7lD,IAAa/hF,GAAS2qI,MAAeF,GAAyC,WAA1BA,EAAWI,YAA0D,WAA/BJ,EAAWK,iBAC3G,IAAIC,EAAiB/nF,EAAW57D,GAE7B26F,GAAY/hF,IAAU+qI,IACvBA,EAAiB/nF,EAAW57D,GAAQL,KAAKikJ,qBAAqBhrI,GAC9DjZ,KAAKoB,UAAUC,OAAO2iJ,KAGpBhpD,GAAYgpD,IACdA,EAAe1/I,gBACR23D,EAAW57D,MAItB,CACE,MAAMD,EAAQ67D,EAAW77D,MACnB8jJ,EAASjoF,EAAWioF,OACvBvmI,OAAOg1C,KAAK8wF,GAAe9hJ,SAAWgc,OAAOg1C,KAAKsJ,GAAYt6D,QAAUvB,GACzEA,EAAMF,UAAUC,OAAO,UAAW+jJ,GAGjCA,IAAW9jJ,GACZ8jJ,EAAOhkJ,UAAUoE,OAAO,SAI5BtE,KAAKiiJ,wBAELjiJ,KAAKoB,UAAUlB,UAAUC,OAAO,YAAawd,OAAOg1C,KAAKsJ,GAAYt6D,SAEjE3B,KAAKoiJ,eAAe3xH,aAAeixH,EAAkB,GAAWI,iBAClEz8I,QAAQ6E,QAAQ4hI,EAASqY,wBAAwBxgJ,KAAK8uF,IACpDzyF,KAAKoiJ,eAAe/gJ,OAAO,IAAkBkrB,cAAckmE,EAAOrnE,KAAK,QAI3EprB,KAAKohJ,iBAGC,wBACNzjI,OAAOkmB,OAAO7jC,KAAKkiJ,iBAAiB33I,QAAQnJ,IAE1C,GADgBA,EAAUlB,UAAUuV,SAAS,SACjC,CACV,MAAMwD,EAAQ7X,EAAUqS,cAAc,SAChC2wI,EAAapkJ,KAAK0/I,aAAatmH,MAC/BirH,EAAe,IACfC,EAAgB,IAEhBC,EAAatrI,EAAMutG,YAAcvtG,EAAMypC,WACvC8hG,EAAWD,EAAaD,EAAgBD,EAExCI,EAAkB,EAAI,GAAK,eAAiB,MAAUF,EAAaH,EAAW3gJ,OAAS2gJ,EAAW5gJ,OAClGkhJ,EAAaH,EAAatrI,EAAMypC,WAAazpC,EAAMutG,YAAc,EACjEm+B,EAAcJ,EAAa,EAAItrI,EAAMutG,YAAcvtG,EAAMypC,WAC/DthD,EAAU+D,MAAM3B,MAAQihJ,EAAkBC,EAAa,KACvDtjJ,EAAU+D,MAAM1B,OAASghJ,EAAkBE,EAAc,KACzDvjJ,EAAU+D,MAAMysB,SAAW4yH,EAAWE,EAAa,KACnDtjJ,EAAU+D,MAAM4sB,UAAYyyH,EAAWG,EAAc,UAErDvjJ,EAAU+D,MAAM2X,QAAU,KAKxB,iBACN9c,KAAK87B,YAAY0K,OAAOxmC,KAAK8rI,W,wBCjelB,SAAS8Y,GAAmBC,GACzC,MAAMv/G,EAAO,OAAAw/G,GAAA,GAAsBD,EAAKA,EAAIpsI,MAAM,IAE5CuvC,EAAuC,CAC3C,QAAS,eACT+8F,aAAc,CAACz/G,EAAK0/G,aACpBC,MAAO3/G,EAAK2/G,MACZC,IAAK5/G,EAAK4/G,IACVhsI,WAAO7Q,EACP4Q,WAAO5Q,EACP88I,gBAAY98I,GAGR+8I,EAAiB38D,GAAmB,GAAKA,EAE/C,IAAI,MAAMvzE,KAAW2vI,EAAIpsI,MAAO,CAC9B,MAAMwI,EAAY/L,EAAQ+L,UAC1B,GAAiB,gBAAdA,IAAgC/L,EAAQmwI,UACzC,SAGF,MAAMC,EAAuBt9F,EAAmB,UAAd/mC,GAAyB+mC,EAAY,MAAI,aAAe/mC,GAAa,GACjGqkB,EAAO,OAAAw/G,GAAA,GAAsBD,EAAK3vI,GACxCowI,EAAMC,KAAOH,EAAc9/G,EAAK+gF,QAE7B/gF,EAAKkgH,eACNF,EAAMG,WAAangH,EAAKkgH,aAAa/4I,IAAIi5I,IAAe,CAAEC,UAAWD,EAAYC,UAAWC,MAAOF,EAAYG,QAAQp5I,IAAI24I,OAG7H,MAAMU,EAAgDR,EAAMQ,cAAgB,GAC5E5wI,EAAQiL,WAAWxM,IAAI,UAAUpJ,QAAS2V,IACxC4lI,EAAcv8I,KAAK,CACjBwJ,IAAKmN,EAAU9Y,IACf2Q,IAAKmI,EAAUvb,UAInB,MAAMohJ,EAAiE,IAAIzyI,IAErE0yI,EAAkBjzI,IACtB,IAAIkzI,EAAcF,EAAgBpyI,IAAIZ,GAOtC,OANIkzI,GACFF,EAAgBvrI,IAAIzH,EAAIkzI,EAAc,CACpClzI,OAIGkzI,GAGT/wI,EAAQiL,WAAWxM,IAAI,UAAUpJ,QAAS2V,IACxC,MAAMnN,GAAMmN,EAAU9Y,IAChB6+I,EAAcD,EAAejzI,GAC7B+sD,EAAW5/C,EAAUvb,MAAM0+C,MAAM,MAChC7iD,EAAM0lJ,EAAW3rE,GAAYza,EACpCmmF,EAAYzlJ,KAAOA,EACnBylJ,EAAYC,WAAaA,EACzBD,EAAY1rE,SAAWA,GAAYA,EAAW,IAGhDrlE,EAAQiL,WAAWxM,IAAI,WAAWpJ,QAAS2V,IACzC,MAAMnN,GAAMmN,EAAU9Y,IACF4+I,EAAejzI,GACvBozI,cAAgBjmI,EAAUwpE,MAAMj9E,IAAK+oB,IAC/C,MAAMsqC,EAAWtqC,EAAK6tB,MAAM,MACrBhjD,EAAM+lJ,GAAWtmF,EACxB,MAAO,CACLz/D,OACA+lJ,QAASA,GAAW,QAK1BlxI,EAAQiL,WAAWxM,IAAI,QAAQpJ,QAAS2V,IACtC,MAAMnN,GAAMmN,EAAU9Y,IAEhBi/I,EADcL,EAAejzI,GAC4CszI,WAAa,GACtFvmF,EAAW5/C,EAAUvb,MAAM0+C,MAAM,KACvC,IAAI,MAAM9gC,KAAOu9C,EAAU,CACzB,MAAO14D,EAAKzC,GAAS4d,EAAI8gC,MAAM,KAC/BgjG,EAAWj/I,GAAOzC,KAItB2gJ,EAAMgB,aAAen6I,MAAMC,KAAK25I,EAAgBliH,UAOlD,OAAOmkB,E,qTC1FM,MAAM,WAA+B,KAGlD,YAAYtoD,GAGVC,MAAMD,GAGQ,oB,0CACd,MAAM,WAAC6mJ,EAAU,KAAEC,GAAQxmJ,KAE3B,IAAIumJ,EAAWE,mBAAqBF,EAAWG,oBAAsBF,EAAK36H,WACxE,OAGF,IAAI86H,EACJ,GAAGH,EAAKI,cAAe,CACrBJ,EAAKI,eAAgB,EAErB,MAAMvuG,EAASsuG,QAAwBJ,EAAWM,eAElD7mJ,KAAKkiB,IAAI,cAAem2B,EAAOh4C,KAAMg4C,EAAOwsG,WACtC0B,EAAWO,oBAAoBzuG,GAErCr4C,KAAKkiB,IAAI,6BACJ,CACL,MAAM6kI,EAAQJ,QAAwBJ,EAAWS,cAEjDhnJ,KAAKkiB,IAAI,cAAe6kI,EAAMlC,WACxB0B,EAAWO,oBAAoBC,GAErCP,EAAKS,WAAY,EAEjBjnJ,KAAKkiB,IAAI,yBAGX,MAAMglI,EAAetC,GAAmB,aAAS+B,EAAgB9B,MACjE2B,EAAKW,sBAAsBD,O,yDC/ChB,OAFmB,oBAAb,QAA4B,WAAYhlJ,OAASA,OAAOklJ,OAAOC,OAAS10G,KAAKy0G,OAAOC,OCI1F,SAASC,GAAO9nI,GAC7B,OAAO,GAAO+nI,OAAO,UCLR,SAA6B/nI,GAC1C,OAAGA,aAAiB8H,WACX9H,EACmB,iBAAZ,GACP,IAAIgoI,aAAcC,OAAOjoI,GAG3B,IAAI8H,WAAW9H,GDFUkoI,CAAoBloI,IAAQ7b,KAAK4I,GAExD,IAAI+a,WAAW/a,I,2SEUX,MAAM,GAKnB,YAAoBsf,EAA6B87H,GAA7B,KAAA97H,aAA6B,KAAA87H,SAC/C3nJ,KAAKK,KAAO,YACZL,KAAKw7D,QAAU,EACfx7D,KAAK4nJ,OAAS,IAAIt0I,IAGZ,aAAagZ,GACnB,OAAOg7H,GAAO,OAAAO,GAAA,MAAiBv7H,IAGnB,gBAAgB5E,G,0CAC5B,MAAMpd,EAAS,CACbkxD,QAAS,EACTh8C,MAAO,IAAI8H,WAAW,GAAKI,EAAO/lB,SAG9ByhB,GAAKpjB,KAAK6rB,WAAa,EAAI,IAAoB,cAAd7rB,KAAKK,KAAuB,IAAM,GACnE+G,EAAMpH,KAAK2nJ,OAEXG,QAAoB9nJ,KAAK+nJ,aAAa,CAAC3gJ,EAAI4gJ,SAAS5kI,EAAI,GAAIA,EAAI,GAAK,IAAKsE,IAC1EugI,EAAS39I,EAAOkV,MACtB,IAAI,IAAI5d,EAAI,EAAGA,EAAI,KAAMA,EACvBqmJ,EAAOrmJ,GAAKkmJ,EAAYlmJ,EAAI,GAG9B,MAAMsmJ,QAAiBloJ,KAAKmoJ,gBAAgB/gJ,EAAK6gJ,EAAQ7kI,GAEnD5D,QAAcxf,KAAKooJ,cAAc1gI,EAAQA,EAAO/lB,OAAQumJ,GAAU,GAIxE,OAFA59I,EAAOkV,MAAQ,IAAI8H,WAAW,IAAIhd,EAAOkV,MAAMwoI,SAAS,EAAG,OAAQxoI,IAE5DlV,KAGF,iBAAiBod,GACtB,MAAM2gI,IAAQroJ,KAAKw7D,QACbvzD,EAAM,IAAIqgJ,YAAY,GACf,IAAI7gI,SAASxf,GACrBsgJ,UAAU,EAAGF,IAAQ,GAAG,GAE7B,MAAM/9I,EAAS,IAAIgd,WAAW,IAAI,IAAIA,WAAWrf,MAASyf,IAE1D,OAAO1nB,KAAKwoJ,gBAAgBl+I,GAGhB,gBAAgBlD,EAAiB6gJ,EAAoB7kI,G,0CACjE,MAAOqlI,EAASC,SAAiBrjJ,QAAQC,IAAI,CAC3CtF,KAAK+nJ,aAAa,CAChBE,EAAOD,SAAS,EAAG,IACnB5gJ,EAAI4gJ,SAAS5kI,EAAGA,EAAI,MAGtBpjB,KAAK+nJ,aAAa,CAChB3gJ,EAAI4gJ,SAAS,GAAK5kI,EAAG,GAAKA,EAAI,IAC9B6kI,EAAOD,SAAS,EAAG,QAIvB,MAAO,CACL5gJ,IAAK,IAAIkgB,WAAW,IACfmhI,EAAQT,SAAS,EAAG,MACpBU,EAAQV,SAAS,EAAG,OACpBS,EAAQT,SAAS,GAAI,MAE1BW,GAAI,IAAIrhI,WAAW,IACdohI,EAAQV,SAAS,EAAG,MACpBS,EAAQT,SAAS,EAAG,OACpBU,EAAQV,SAAS,GAAI,UAKhB,cAAcY,EAA2BC,EAAkBX,EAA6CY,GAAU,G,0CAC9H,MAAMC,QAAkB,GAAOC,UAC7B,MACAd,EAAS9gJ,IACT,CAAC5G,KAAM,YACP,EACA,CAACsoJ,EAAU,UAAY,YAGnBphI,QAA4B,GAAOohI,EAAU,UAAY,WAAW,CACtEtoJ,KAAM,UACNg7D,QAAS0sF,EAASS,GAClBhnJ,OAA6B,EAArBumJ,EAASS,GAAGhnJ,QAEtBonJ,EACAH,GAGF,OAAO,IAAIthI,WAAWI,MAGhB,qBAAqBpb,EAAeC,EAAejE,GACzD,IAAI2gJ,GAAe,EACnB,IAAI,IAAIrnJ,EAAI,EAAGA,EAAI0G,IAAS1G,EACvB0K,EAAE1K,KAAO2K,EAAE3K,KACZqnJ,GAAe,GAInB,OAAQA,EAGG,iBAAiBvhI,G,0CAC5B,GAAGA,EAAO/lB,OAAS,IAAM+lB,EAAO/lB,OAhHL,UAiHzB,OAGF,MAAM,WAACkqB,EAAU,KAAExrB,GAAQL,KAErBojB,GAAKyI,EAAa,EAAI,IAAe,cAATxrB,EAAuB,IAAM,GACzD+G,EAAMpH,KAAK2nJ,OAEXM,EAASvgI,EAAOsgI,SAAS,EAAG,IAC5BY,EAAgBlhI,EAAOsgI,SAAS,IAChCkB,EAAoBxhI,EAAO/lB,OAAS,GAEpCumJ,QAAiBloJ,KAAKmoJ,gBAAgB/gJ,EAAK6gJ,EAAQ7kI,GAEnD+lI,QAAyBnpJ,KAAKooJ,cAAcQ,EAAeM,EAAmBhB,GAAU,GAExFJ,QAAoB9nJ,KAAK+nJ,aAAa,CAC1C3gJ,EAAI4gJ,SAAS,GAAK5kI,EAAG,GAAKA,EAAI,IAC9B+lI,IAGF,GAAGnpJ,KAAKopJ,qBAAqBtB,EAAYE,SAAS,GAAIC,EAAQ,IAC5D,OAGF,MACMI,EADW,IAAI5gI,SAAS0hI,EAAiBzhI,QAC1B2hI,UAAU,GAC/B,OAAGrpJ,KAAK4nJ,OAAOj8I,IAAI08I,QAAnB,GAGAroJ,KAAK4nJ,OAAOptI,IAAI6tI,EAAKA,GAEdc,EAAiBxjJ,MAAM,Q,cClJnB,MAAM,GACnB,qBAAqB2/B,GACnB,MAAM,aAACy/G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEhsI,EAAK,MAAED,GAASqsB,EACjDpsB,EAAM7Y,KAAO,QACb4Y,EAAM5Y,KAAO,QACb,MAAMoY,EAAQ,CAACS,EAAOD,GAEhBqwI,EAAgB,IAAI,KAC1BA,EAAczoJ,IACZ,MACA,2BACA,MACA,SAGCkkJ,GACDA,EAAax6I,QAAS6Y,IACpB,MAAM,KAAC60C,EAAI,YAAE+sF,EAAW,MAAEhK,GAAS53H,EACnCkmI,EAAczoJ,IACZ,iBAAiBo3D,KAAQ+sF,IACzB,WAAWhK,KAIdiK,GAASC,GACVoE,EAAczoJ,IACZ,eAAeokJ,EACf,aAAaC,GAIjBoE,EAAczoJ,IACZ,uBACA,uBACA,0BAEF,MAAM0oJ,EAAa,SAAW9wI,EAAMhM,IAAI2W,GAAKA,EAAEmiI,MAAMn6H,KAAK,KAC1D,IAAI,IAAIxpB,EAAI,EAAGA,EAAI6W,EAAM9W,OAAQC,IAAK,CACpC,MAAM+vC,EAAIl5B,EAAM7W,IACV,KAACvB,EAAI,KAAEklJ,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAiBn0G,EAC9D,OAAOtxC,GACL,IAAK,QACHipJ,EAAczoJ,IACZ,mCAAmCylJ,EAAa75I,IAAK2W,GAAWA,EAAErQ,IAAIqY,KAAK,KAC3E,mBACA,0BACA,wBACA,SAASxpB,EACT,aACA4nJ,GAAU1D,IAETP,GACD+D,EAAczoJ,IAAI,UAAU0oJ,UAAmBhE,KAEjD+D,EAAczoJ,IACZ,aACA4oJ,GAAgBnD,GAChBoD,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,IAGlC,MAGF,IAAK,QACHD,EAAczoJ,IACZ,mCAAmCylJ,EAAa75I,IAAK2W,GAAWA,EAAErQ,IAAIqY,KAAK,KAC3E,mBACA,0BACA,wBACA,SAASxpB,EACT,aACA4nJ,GAAU1D,IAETP,GACD+D,EAAczoJ,IAAI,UAAU0oJ,UAAmBhE,KAEjD+D,EAAczoJ,IACZ,aACA,eACA4oJ,GAAgBnD,GAChBoD,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,KAOxC,OADAD,EAAczoJ,IAAI8oJ,GAAe,IAC1BL,EAAcM,WAGvB,sBAAsBtkH,GACpB,MAAM,aAACy/G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEhsI,EAAK,MAAED,GAASqsB,EACjDpsB,EAAM7Y,KAAO,QACb4Y,EAAM5Y,KAAO,QACb,MAAMoY,EAAQ,CAACS,EAAOD,GAEhBqwI,EAAgB,IAAI,KAC1BA,EAAczoJ,IACZ,MACA,2BACA,MACA,SAGCkkJ,GACDA,EAAax6I,QAAS6Y,IACpB,MAAM,KAAC60C,EAAI,YAAE+sF,EAAW,MAAEhK,GAAS53H,EACnCkmI,EAAczoJ,IACZ,iBAAiBo3D,KAAQ+sF,IACzB,WAAWhK,KAIdiK,GAASC,GACVoE,EAAczoJ,IACZ,eAAeokJ,EACf,aAAaC,GAIjBoE,EAAczoJ,IACZ,uBACA,uBACA,0BAEF,MAAM0oJ,EAAa,SAAW9wI,EAAMhM,IAAI2W,GAAKA,EAAEmiI,MAAMn6H,KAAK,KAC1D,IAAI,IAAIxpB,EAAI,EAAGA,EAAI6W,EAAM9W,OAAQC,IAAK,CACpC,MAAM+vC,EAAIl5B,EAAM7W,IACV,KAACvB,EAAI,KAAEklJ,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAiBn0G,EAC9D,OAAOtxC,GACL,IAAK,QACHipJ,EAAczoJ,IACZ,mCAAmCylJ,EAAa75I,IAAK2W,GAAWA,EAAErQ,IAAIqY,KAAK,KAC3E,mBACA,0BACA,wBACA,SAASxpB,EACT,aACA4nJ,GAAU1D,IAETP,GACD+D,EAAczoJ,IAAI,UAAU0oJ,UAAmBhE,KAEjD+D,EAAczoJ,IACZ,aACA4oJ,GAAgBnD,GAChBoD,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,IAElC,MAGF,IAAK,QACHD,EAAczoJ,IACZ,mCAAmCylJ,EAAa75I,IAAK2W,GAAWA,EAAErQ,IAAIqY,KAAK,KAC3E,mBACA,0BACA,wBACA,SAASxpB,EACT,aACA4nJ,GAAU1D,IAETP,GACD+D,EAAczoJ,IAAI,UAAU0oJ,UAAmBhE,KAGjD+D,EAAczoJ,IACZ,aACA,eACA4oJ,GAAgBnD,GAChBoD,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,KAOxC,OADAD,EAAczoJ,IAAI8oJ,GAAe,IAC1BL,EAAcM,YCrLlB,MAAM,GACT,qBAAqBtkH,GACjB,MAAM,aAAEy/G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEhsI,EAAK,MAAED,GAAUqsB,EACnDpsB,EAAM7Y,KAAO,QACb4Y,EAAM5Y,KAAO,QACb,MAAMoY,EAAQ,CAACS,EAAOD,GAEtB,IAAI4rI,EAAM,0CAINE,GACAA,EAAax6I,QAAQ6Y,IACjB,MAAM,KAAE60C,EAAI,YAAE+sF,EAAW,MAAEhK,GAAU53H,EACrCyhI,GAAO,mBACP5sF,KAAQ+sF,cACdhK,MAGEiK,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM0E,EAAa,SAAW9wI,EAAMhM,IAAI2W,GAAKA,EAAEmiI,MAAMn6H,KAAK,KAC1D,IAAK,IAAIxpB,EAAI,EAAGA,EAAI6W,EAAM9W,OAAQC,IAAK,CACnC,MAAM+vC,EAAIl5B,EAAM7W,IACV,KAAEvB,EAAI,KAAEklJ,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAkBn0G,EAChE,OAAQtxC,GACJ,IAAK,QACDwkJ,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iCAEvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACjBjB,GAAO,eAEPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,GAEvC,MAEJ,IAAK,QACD1E,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iCAEvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACjBjB,GAAO,6BAGPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,IAUnD,OAJA1E,GAAO8E,GAAe,GACtB9E,GAAO,KAGAA,EAGX,sBAAsBv/G,GAClB,MAAM,aAAEy/G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEhsI,EAAK,MAAED,GAAUqsB,EACnDpsB,EAAM7Y,KAAO,QACb4Y,EAAM5Y,KAAO,QACb,MAAMoY,EAAQ,CAACS,EAAOD,GAEtB,IAAI4rI,EAAM,0CAINE,GACAA,EAAax6I,QAAQ6Y,IACjB,MAAM,KAAE60C,EAAI,YAAE+sF,EAAW,MAAEhK,GAAU53H,EACrCyhI,GAAO,mBACP5sF,KAAQ+sF,cACdhK,MAGEiK,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM0E,EAAa,SAAW9wI,EAAMhM,IAAI2W,GAAKA,EAAEmiI,MAAMn6H,KAAK,KAC1D,IAAK,IAAIxpB,EAAI,EAAGA,EAAI6W,EAAM9W,OAAQC,IAAK,CACnC,MAAM+vC,EAAIl5B,EAAM7W,IACV,KAAEvB,EAAI,IAAEwK,EAAG,KAAE06I,EAAI,WAAEE,EAAU,aAAEa,EAAY,IAAEuD,EAAG,cAAE/D,GAAkBn0G,EAC1E,OAAQtxC,GACJ,IAAK,QACDwkJ,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iCAEvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACjBjB,GAAO,eAEPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,GAEvC,MAEJ,IAAK,QACD1E,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iCAEvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACjBjB,GAAO,6BAGPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,IASnD,OAJA1E,GAAO8E,GAAe,GACtB9E,GAAO,KAGAA,GC3IR,MAAM,GACT,qBAAqBv/G,GACjB,MAAM,aAAEy/G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEhsI,EAAK,MAAED,GAAUqsB,EACnDpsB,EAAM7Y,KAAO,QACb4Y,EAAM5Y,KAAO,QACb,MAAMoY,EAAQ,CAACS,EAAOD,GAEtB,IAAKR,EAAM9W,OACP,MAAO,oEAQX,IAAIkjJ,EAAM,4CAINE,GACAA,EAAax6I,QAAQ6Y,IACjB,MAAM,KAAE60C,EAAI,YAAE+sF,EAAW,MAAEhK,GAAU53H,EACrCyhI,GAAO,mBACP5sF,KAAQ+sF,cACdhK,MAGEiK,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM0E,EAAa,SAAW9wI,EAAMhM,IAAI2W,GAAKA,EAAEmiI,MAAMn6H,KAAK,KAC1D,IAAK,IAAIxpB,EAAI,EAAGA,EAAI6W,EAAM9W,OAAQC,IAAK,CACnC,MAAM+vC,EAAIl5B,EAAM7W,IACV,KAAEvB,EAAI,KAAEklJ,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAkBn0G,EAChE,OAAQtxC,GACJ,IAAK,QACDwkJ,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iFAIvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACbP,IACAV,GAAO,YACtB0E,UAAmBhE,KAERV,GAAO,eAEPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,GAEvC,MAEJ,IAAK,QACD1E,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iFAIvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACbP,IACAV,GAAO,YACtB0E,UAAmBhE,KAERV,GAAO,6BAGPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,IASnD,OAJA1E,GAAO8E,GAAe,GACtB9E,GAAO,KAGAA,EAGX,sBAAsBv/G,GAClB,MAAM,aAAEy/G,EAAY,MAAEE,EAAK,IAAEC,EAAG,MAAEhsI,EAAK,MAAED,GAAUqsB,EACnDpsB,EAAM7Y,KAAO,QACb4Y,EAAM5Y,KAAO,QACb,MAAMoY,EAAQ,CAACS,EAAOD,GAEtB,IAAKR,EAAM9W,OACP,MAAO,oEAQX,IAAIkjJ,EAAM,4CAINE,GACAA,EAAax6I,QAAQ6Y,IACjB,MAAM,KAAE60C,EAAI,YAAE+sF,EAAW,MAAEhK,GAAU53H,EACrCyhI,GAAO,mBACP5sF,KAAQ+sF,cACdhK,MAGEiK,GAASC,IACTL,GAAO,iBACLI,gBACFC,KAGJL,GAAO,uEAIP,MAAM0E,EAAa,SAAW9wI,EAAMhM,IAAI2W,GAAKA,EAAEmiI,MAAMn6H,KAAK,KAC1D,IAAK,IAAIxpB,EAAI,EAAGA,EAAI6W,EAAM9W,OAAQC,IAAK,CACnC,MAAM+vC,EAAIl5B,EAAM7W,IACV,KAAEvB,EAAI,KAAEklJ,EAAI,WAAEE,EAAU,aAAEa,EAAY,cAAER,GAAkBn0G,EAChE,OAAQtxC,GACJ,IAAK,QACDwkJ,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iFAIvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACbP,IACAV,GAAO,YACtB0E,UAAmBhE,KAERV,GAAO,eAEPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,GAEvC,MAEJ,IAAK,QACD1E,GAAO,iCACGyB,EAAa75I,IAAI2W,GAAKA,EAAErQ,IAAIqY,KAAK,iFAIvDxpB,gBAEYijJ,GAAO2E,GAAU1D,GACbP,IACAV,GAAO,YACtB0E,UAAmBhE,KAERV,GAAO,6BAGPA,GAAO4E,GAAgBnD,GACvBzB,GAAO6E,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,IASnD,OAJA1E,GAAO8E,GAAe,GACtB9E,GAAO,KAGAA,GCqDR,SAASiF,KACd,OAAOxyI,UAAUgB,UAAUkrC,cAAcr+B,QAAQ,YAAc,EAGjE,SAAS4kI,KACP,OAAOzyI,UAAUgB,UAAUkrC,cAAcr+B,QAAQ,WAAa,IAA8D,IAAzD7N,UAAUgB,UAAUkrC,cAAcr+B,QAAQ,UAGxG,SAASqkI,GAAUQ,GACxB,IAAInF,EAAM,GAEV,IAAK,IAAIoF,EAAI,EAAGA,EAAID,EAAOroJ,OAAQsoJ,IAAK,CACtC,MAAM3mG,EAAM0mG,EAAOC,IACb,GAAEl3I,EAAE,IAAEgF,GAAQurC,EAEpB/yC,QAAQ2R,IAAI,eAAgBnP,EAAIgF,GAChC8sI,EAAIt7I,KAAK,YAAYwJ,KAAMgF,KAG7B,OAAO8sI,EAAIz5H,KAAK,MAGX,SAASq+H,GAAgBrrF,GAC9B,IAAIymF,EAAM,GACVt0I,QAAQ2R,IAAI,wBAAyBk8C,GACrC,IAAK,IAAIx8D,EAAI,EAAGA,EAAIw8D,EAAMz8D,OAAQC,IAAK,CACrC,MAAMvB,EAAO+9D,EAAMx8D,IACb,GAAEmR,EAAE,KAAEvS,EAAI,UAAE0lJ,EAAS,SAAE3rE,EAAQ,cAAE4rE,EAAa,WAAEE,GAAehmJ,EAQrE,GAPAwkJ,EAAIt7I,KAAK,YAAYwJ,KAAMvS,KAAQ0lJ,IAAY3rE,EAAW,IAAMA,EAAW,MACvE4rE,GACFA,EAAc57I,QAAQ6Y,IACpB,MAAM,KAAE/iB,EAAI,QAAE+lJ,GAAYhjI,EAC1ByhI,EAAIt7I,KAAK,aAAawJ,KAAM,CAAC1S,EAAM+lJ,GAASh7H,KAAK,UAGjDi7H,EAAY,CACd,MAAM6D,EAAO,GACbvsI,OAAOwsI,oBAAoB9D,GAAY97I,QAAQ6/I,IAC7CF,EAAK3gJ,KAAK,GAAG6gJ,KAAS/D,EAAW+D,QAGnCvF,EAAIt7I,KAAK,UAAUwJ,KAAMm3I,EAAK9+H,KAAK,SAIvC,OAAOy5H,EAAIz5H,KAAK,MAGX,SAASs+H,GAAQrpJ,EAAMklJ,EAAME,EAAY8D,GAC9C,IAAI1E,EAAM,GAyBV,OAvBIY,GAAcA,EAAW9jJ,OAAS,EACpC8jJ,EAAWl7I,QAAQ8/I,IACbA,GAAaA,EAAUzE,MAAMjkJ,OAAS,IACxCkjJ,EAAIt7I,KAAK,gBAAgB8gJ,EAAU1E,aAAa0E,EAAUzE,MAAMx6H,KAAK,QACrEi/H,EAAUzE,MAAMr7I,QAAQg7I,IACtBV,EAAIt7I,KACF,UAAUg8I,iBAAoBA,IAC9B,UAAUA,UAAagE,KAAclpJ,IAAOklJ,IAC5C,UAAUA,aAAgBllJ,IAAOklJ,IACjC,UAAUA,WAAcllJ,IAAOklJ,UAK9BA,GACTV,EAAIt7I,KACF,UAAUg8I,iBAAoBA,IAC9B,UAAUA,UAAagE,KAAclpJ,IAAOklJ,IAC5C,UAAUA,aAAgBllJ,IAAOklJ,IACjC,UAAUA,WAAcllJ,IAAOklJ,KAI5BV,EAAIz5H,KAAK,MAGX,SAASu+H,GAAe9+I,GAC7B,MAAO,kJAQF,MAAM,GACX,yBAAyBy6B,GACvB,IAAKA,EAAM,OAAO,KAElB,MAAM,UAAEglH,EAAS,cAAEC,EAAa,OAAEC,EAAM,WAAEC,EAAU,UAAEC,EAAS,SAAEC,EAAQ,SAAEC,EAAQ,QAAE50I,EAAO,KAAE3V,EAAI,WAAEwqJ,EAAU,WAAEC,EAAU,QAAEC,EAAO,UAAEC,EAAS,YAAEC,EAAW,SAAEvwH,GAAa4K,EAExK,GAAIglH,EACF,MAAO,CACLY,UAAWZ,EACXC,gBACAC,UAIN,KAAM,eAiCR,qBAAqBllH,GACnB,OAAIwkH,KACK,GAAqBqB,cAAc7lH,GACjCykH,KACF,GAAoBoB,cAAc7lH,GAGpC,GAAoB6lH,cAAc7lH,GAG3C,sBAAsBA,GACpB,OAAIwkH,KACK,GAAqBsB,eAAe9lH,GAClCykH,KACF,GAAoBqB,eAAe9lH,GAGrC,GAAoB8lH,eAAe9lH,I,qTCvW/B,MAAM,WAAqB,KAsDxC,YAAY5lC,GAQVC,QAEAK,KAAKkiB,IAAM,OAAAkzC,EAAA,GAAO,QAEdp1D,KAAK2qJ,WACP3qJ,KAAK2qJ,SCtFF,CACLv/I,EAAG,oBACHmT,OAAQ,CACN8sI,SAAS,EACTC,eAAe,GAEjBC,UAAW,GACXC,UAAW,GACXC,iBAAkB,CAAC,WDiFnB,OAAA3iJ,EAAA,GAAW9I,KAAMN,GAEjBM,KAAK0rJ,UAAYhvG,KAAKC,MACtB38C,KAAK4mJ,eAAgB,EACrB5mJ,KAAKinJ,WAAY,EACjBjnJ,KAAK2rJ,aAAe,GACpB3rJ,KAAK4rJ,WAAa,GAElB5rJ,KAAKsB,iBAAiB,QAAU83B,IAC9Bp5B,KAAKkiB,IAAI,QAAS,GAAWkX,IAE1BA,IAAU,GAAW+nH,QACtBnhJ,KAAK8N,YAIT,MAAM+9I,EAAgB7rJ,KAAK6rJ,cAAgB,IAAI,KAAc,MAC7DA,EAAc9nJ,UAAY,WAC1B8nJ,EAAcztF,MAAM70D,KAAK,cACrBvJ,KAAK6rB,aACPggI,EAAc5mB,QAAS,EACvB4mB,EAAcC,0BAA2B,GAG3C,IAAIpI,EAA6B,CAC/B,QAAS,aACTrjJ,KAAM,QACN0rJ,YAAY,EACZhuI,OAAO,EACPgmI,gBAAiB,WACjBiI,cAAe,EACflI,WAAY,YAGd,MAAMnxG,EAAO3yC,KACb0jJ,EAAa,IAAIuI,MAAMvI,EAAY,CACjClpI,IAAK,SAASE,EAAQtT,EAAKzC,GAKzB,OAHA+V,EAAOtT,GAAOzC,EACdguC,EAAKu5G,cAAcxI,GACnB/wG,EAAKw5G,kBACE,KAIXnsJ,KAAKosJ,YAAc,CACjBhsJ,MAAOsjJ,GAGT1jJ,KAAKmsJ,eAAiB,OAAAnyH,GAAA,GAASh6B,KAAKqsJ,gBAAgB3lJ,KAAK1G,MAAO,GAAG,GAAO,GAG5E,sBACE,MAAM,iBAACssJ,EAAgB,mBAAEC,GAAsBvsJ,KAC/C,QAAwBqI,IAArBikJ,EACD,OAAOA,EACF,GAAIC,EAEJ,CACL,MAAM,mBAACC,GAAsBD,EAAmBhG,WAChD,MAA0B,WAAvBiG,EACM,GAAWrL,OACa,cAAvBqL,GAAwC,MAAoC,cAAvBA,EAGtD,GAAW7K,UAFX,GAAWnN,WANpB,OAAO,GAAWA,WAatB,gBACE,MAAMkN,EAAkB1hJ,KAAK0hJ,gBAE7B,IAAIx8H,EAAgB,MADN,GAAWi8H,OAASO,EAAkB,GAGpD,OADAx8H,GAAS,cAAiBw8H,IAAoB,GAAWE,SAAW5hJ,KAAK6rB,WAAa,EAAI7rB,KAAK0rJ,WACxFxmI,EAGF,gBAAgB7kB,GACrB,GAAY,UAATA,EAAkB,OAAOL,KAAKqrB,SAAS1X,IAAI,QACzC,CACH,MAAM+vI,EAAa1jJ,KAAKwjJ,cAAc,UACtC,IAAIE,EACF,OAGF,MAAMrjJ,EAAiD,WAA1BqjJ,EAAWI,WAA0B,QAA0C,WAA/BJ,EAAWK,gBAA+B,kBAAe17I,EACtI,IAAIhI,EACF,OAGF,MAAM+wC,EAAQpxC,KAAK87B,YAAY2wH,UAAWr7G,GAAUA,EAAM/wC,OAASA,GACnE,IAAI+wC,EACF,OAGF,OAAOpxC,KAAKqrB,SAAS1X,IAAI,GAAKy9B,EAAMs7G,UAAUrmC,SAIrC,6B,0CACX,IACErmH,KAAK2sJ,mBAAoB,EACzB3sJ,KAAK4sJ,kBAAmB,EACxB5sJ,KAAK6rJ,cAAcztF,MAAQ,CAAC,QAAS,oBAC/Bp+D,KAAK6sJ,gBACX,MAAMv8I,GACNtQ,KAAKkiB,IAAI1R,MAAM,2BAA4BF,OAIlC,sB,0CAKX,OAJGtQ,KAAKqjJ,uBACArjJ,KAAK8sJ,oBAGV9sJ,KAAKsjJ,gBACCtjJ,KAAK8sJ,mBAEL9sJ,KAAK+sJ,gCAIH,4B,0CACX,IACE/sJ,KAAK2sJ,mBAAoB,EACzB3sJ,KAAK4sJ,kBAAmB,EACxB5sJ,KAAK6rJ,cAAcztF,MAAQ,CAAC,QAAS,eAC/Bp+D,KAAKgtJ,oBAAmB,GAAO,GAAM,GAC3C,MAAM18I,GACNtQ,KAAKkiB,IAAI1R,MAAM,0BAA2BF,OAIjC,mB,0CACX,MAAMozI,EAAa1jJ,KAAKwjJ,cAAc,SACtCE,EAAWI,WAAaJ,EAAWK,gBAAkB,WAErD,MAAM,cAAC8H,EAAa,YAAE/vH,GAAe97B,KAC/BitJ,EAAQpB,EAAcqB,YAAYC,iBAAiB,GACtDF,IACD,OAAAG,GAAA,GAAUH,GACVpB,EAAcwB,mBAAmBvxH,OAIxB,qB,0CAKX,OAJG97B,KAAKsjJ,wBACAtjJ,KAAK8sJ,oBAGV9sJ,KAAKqjJ,eACCrjJ,KAAK8sJ,mBAEL9sJ,KAAKstJ,+BAIT,cAAcjtJ,GACnB,OAAOL,KAAKosJ,YAAY/rJ,GAGnB,cAAcqjJ,GACnB1jJ,KAAKosJ,YAAY1I,EAAWrjJ,MAAQqjJ,EACpC1jJ,KAAKsS,cAAc,aAAcoxI,GAG5B,mBAAmBrjJ,GACxB,IAEE,OADsBV,MAAM0jJ,mBACArjJ,KAAK2sJ,mBAA8B,eAATtsJ,GAA2BL,KAAK4sJ,kBAA6B,UAATvsJ,GAI1G,MAAMiQ,GACN,OAAO,GAIX,qBACE,OAAOtQ,KAAKutJ,mBAAmB,SAGjC,sBACE,OAAOvtJ,KAAKutJ,mBAAmB,cAGjC,cACE,MAAMC,EAAaxtJ,KAAK6rJ,cAAcqB,YAAYO,iBAAiB,GACnE,QAAQD,aAAU,EAAVA,EAAYjsI,SAGtB,gBACE,MAAM,gBAACmgI,GAAmB1hJ,KAC1B,OAAO0hJ,IAAoB,GAAWgM,SAAWhM,IAAoB,GAAWP,OAGlF,kB,MACE,OAA8B,QAAvB,EAAAnhJ,KAAKusJ,0BAAkB,eAAEzwH,YAG3B,iBAAiBjrB,EAAiByjG,GACvCt0G,KAAK2tJ,qBACL3tJ,KAAK4tJ,cAAgB,KAAI99I,WAAW,KAClC9P,KAAK4tJ,mBAAgBvlJ,EACrBrI,KAAKk/I,OAAO5qC,IACXzjG,GAGE,0BACqBxI,IAAvBrI,KAAK4tJ,gBACN98I,aAAa9Q,KAAK4tJ,eAClB5tJ,KAAK4tJ,mBAAgBvlJ,GAIlB,aAAawlJ,GAClB7tJ,KAAKwmJ,KAAOqH,EAEZ,MAAM,GAAC96I,GAAM86I,EACb,GAAG7tJ,KAAK+S,KAAOA,EAAI,CACjB,MAAMkjD,EAASj2D,KAAK+S,GACpB/S,KAAK+S,GAAKA,EACV/S,KAAKsS,cAAc,KAAMS,EAAIkjD,IAIpB,a,gDACX,MAAM63F,EAAsF,QAAzE,SAAMzoJ,QAAQC,IAAItF,KAAKm7F,wBAAwB,wBAAwB,UAAE,SAC5F,GAAGn7F,KAAK+tJ,YAAcD,EACpB,OAIF9tJ,KAAKguJ,wBAAwB,GAAWlM,iBAExC,MAAM0E,EAAOxmJ,KAAKwmJ,KAClBxmJ,KAAKgtJ,oBAAmB,IAAQxG,EAAKjoI,OAAOtF,OAAO,GAEnD,MAAMg1I,EAAWzH,EAAKyH,SACtBjuJ,KAAKkuJ,gBAAgBC,aAAaxqJ,KAAKyqJ,IACrCpuJ,KAAKouJ,GAAK,CACRH,WACA1hJ,EAAG6hJ,EAAG9hJ,EACN+hJ,IAAKD,EAAGE,IACRC,SAAUH,EAAGH,SACblyH,EAAGqyH,EAAGryH,GAGD/7B,KAAKiiG,WAAWrnE,UAAU,mBAAoB,CACnD0L,KAAMtmC,KAAKkuJ,gBAAgBM,aAAaxuJ,KAAK+S,IAC7C43I,SAAU3qJ,KAAK2qJ,SACf0D,IAAKruJ,KAAKouJ,GAAGC,QAEd1qJ,KAAK8qJ,IACNzuJ,KAAKkuJ,gBAAgBQ,mBAAmBD,KACvC/9I,MAAMJ,IACPtQ,KAAKkiB,IAAI1R,MAAM,oBAAqBF,GAKpCtQ,KAAKk/I,OAAO,qCAIT,WACLl/I,KAAKkiB,IAAI,YAETliB,KAAKmkJ,uBAELnkJ,KAAKguJ,0BAEL,MAAM,WAACniI,EAAU,cAAE8iI,EAAa,cAAE9C,GAAiB7rJ,KAE7C4uJ,EE7WK,SAA6BpI,GAC1C,MAAMqI,EAA6B,GAqCnC,OApCArI,EAAKsI,YAAYvkJ,QAASg8I,IACxB,OAAOA,EAAWn7I,GAIhB,IAAK,wBAAyB,CAC5B,MAAM,GAACi4D,EAAE,KAAE0rF,EAAI,KAAEC,EAAI,SAAEt0H,EAAQ,SAAEu0H,GAAY1I,EACvC2I,EAAiB,GACpB3I,EAAWhoI,OAAO4wI,MAChB9rF,GACD6rF,EAAK3lJ,KAAK,QAAQ85D,KAAM2rF,KAEvBD,GACDG,EAAK3lJ,KAAK,SAASwlJ,MAASC,MAEtBzI,EAAWhoI,OAAO6wI,OACvB/rF,GACD6rF,EAAK3lJ,KAAK,QAAQ85D,KAAM2rF,KAEvBD,GACDG,EAAK3lJ,KAAK,SAASwlJ,MAASC,MAI7BE,EAAKvtJ,OAAS,GACfktJ,EAAWtlJ,KAAK,CACd2lJ,OACAx0H,WACA20H,WAAYJ,IAGhB,UAKC,CACLJ,aACAS,mBAAoB9I,EAAKjoI,OAAOgxI,YAAc,MAAQ,SFqUhCC,CAAoBxvJ,KAAKwmJ,MAE/C,GADAxmJ,KAAKkiB,IAAI,yBAA0B0sI,IAC/BA,EAAe,OAEnB,MAAMrC,EAAqBvsJ,KAAKusJ,mBAAqB,IAAI,GAAuB,CAC9E/F,KAAMxmJ,KACN6rJ,gBACA3pI,IAAKliB,KAAKkiB,IAAIutI,WAAW,gBAGrBlJ,EAAagG,EAAmBmD,qBAAqBd,GAC3DrI,EAAWjlJ,iBAAiB,2BAA4B,KACtD,MAAM83B,EAAQp5B,KAAK0hJ,qBACKr5I,IAArBrI,KAAK+hJ,aAA6B3oH,IAAU,GAAWuoH,YACxD3hJ,KAAK+hJ,YAAcrlG,KAAKC,OAG1B38C,KAAKsS,cAAc,QAAS8mB,KAE9BmtH,EAAWjlJ,iBAAiB,oBAAqB,KAC/CirJ,EAAmBoD,cAErBpJ,EAAWjlJ,iBAAiB,eAAiB6hB,IAC3C,MAAM,UAAC+nI,GAAa/nI,EACpBojI,EAAWrkI,IAAI,iBAAkBgpI,IAC9BA,aAAS,EAATA,EAAWA,YACZlrJ,KAAK4vJ,iBAAiB1E,KAG1B3E,EAAWjlJ,iBAAiB,QAAU6hB,IACpC,MAAM,MAAC8pI,GAAS9pI,EAChBojI,EAAWrkI,IAAI,UAAW+qI,GAC1BjtJ,KAAK6vJ,QAAQ1sI,KAGKopI,EAAmBuD,oBAEvC9vJ,KAAK+vJ,UAAY,IAAI,GAAalkI,EAAY8iI,GAC9C3uJ,KAAKgwJ,UAAY,IAAI,IAAcnkI,EAAY8iI,GAE/C3uJ,KAAKkiB,IAAI,cAAeliB,MAErB6rB,GACD0gI,EAAmB0D,2BAGrBjwJ,KAAKkwJ,oBAELlwJ,KAAKmwJ,sBAGC,yBACN,MAAMC,EAAmBpwJ,KAAK87B,YAAYu0H,YAAY,eACtDD,EAAiBlsJ,aAAa,YAC9BksJ,EAAiBE,UAAYF,EAAiB1D,UAAY0D,EAGpD,oBACN,GAAGpwJ,KAAKusJ,mBAAmBgE,YACzB,OAGF,MAAM11H,EAAU76B,KAAKusJ,mBAAmB2D,kBAAkB,CACxDn9I,GAAI,EACJy9I,YAAY,IAEd31H,EAAQv5B,iBAAiB,UAAYvB,IACnCC,KAAKywJ,qBAAqB1nG,KAAK2nG,MAAM3wJ,EAAEioD,SAEzCntB,EAAQv5B,iBAAiB,OAAQ,KAC/BtB,KAAKmsJ,mBAID,qBAAqBnkG,GAC3B,OAAOA,EAAK,UACV,IAAK,aACHA,EAAK3nD,KAAO,SACZL,KAAKkiB,IAAI,yBAA0B8lC,GACnChoD,KAAKksJ,cAAclkG,GACnB,MAGF,QACEhoD,KAAKkiB,IAAI1R,MAAM,6BAA8Bw3C,IAK3C,kBACN,MAAM,mBAACukG,GAAsBvsJ,KAC7B,IAAIusJ,EAAoB,OAExB,MAAM7I,EAAa,OAAH,UAAO1jJ,KAAKwjJ,cAAc,iBAEnCE,EAAWrjJ,KAClBL,KAAKkiB,IAAI,iBAAkBwhI,GAE3B6I,EAAmBoE,oBAAoBjN,GAG5B,sBAAsB17F,G,0CAKjC,MAAM9vC,EAAO6wC,KAAKC,UAAUhB,GACtB//C,GAAM,IAAIu/I,aAAcC,OAAOvvI,IAC/B,MAACsH,SAAexf,KAAK+vJ,UAAUa,iBAAiB3oJ,GAEtDjI,KAAKkiB,IAAI,wBAAyBliB,KAAK+S,GAAImF,SACrClY,KAAKiiG,WAAWrnE,UAAU,0BAA2B,CACzD0L,KAAMtmC,KAAKkuJ,gBAAgBM,aAAaxuJ,KAAK+S,IAC7Ci1C,KAAMxoC,OAIH,iBAAiBqxI,GACtB7wJ,KAAKkiB,IAAI,mBAAoB2uI,GAC7B,MAAM,UAAC3F,EAAS,cAAEX,GAAiBsG,EACnC,GAAqB,IAAlBtG,EACD,OAGF,MAAMuG,ED1eH,SAA2B5F,GAChC,IAAIA,IAAcA,EAAU9kC,WAAW,cACrC,OAGF,MAAMkkC,EAAYY,EAClBA,EAAYA,EAAU5/B,OAAO,aAAa3pH,QAE1C,MAAO8oJ,EAAYC,EAAWC,EAAUC,EAAUvnF,EAAI2rF,KAASj4E,GAASm0E,EAAU7nG,MAAM,KAClFvrB,EAAI,CACRwyH,YACAG,aACAC,YACAC,WACAC,WACA50I,QAAS,CAAEqtD,KAAI2rF,SAGjB,IAAI,IAAIptJ,EAAI,EAAGA,EAAIm1E,EAAMp1E,OAAQC,GAAK,EACpC,OAAOm1E,EAAMn1E,IACX,IAAK,MACHk2B,EAAEz3B,KAAO02E,EAAMn1E,EAAI,GACnB,MAEF,IAAK,QACCk2B,EAAE+yH,aACJ/yH,EAAE+yH,WAAa,IAGjB/yH,EAAE+yH,WAAWxnF,GAAK0T,EAAMn1E,EAAI,GAC5B,MAEF,IAAK,QACCk2B,EAAE+yH,aACJ/yH,EAAE+yH,WAAa,IAGjB/yH,EAAE+yH,WAAWmE,KAAOj4E,EAAMn1E,EAAI,GAC9B,MAEF,IAAK,aACHk2B,EAAEgzH,WAAa/zE,EAAMn1E,EAAI,GACzB,MAEF,IAAK,UACHk2B,EAAEizH,QAAUh0E,EAAMn1E,EAAI,GACtB,MAEF,IAAK,aACHk2B,EAAEkzH,UAAYj0E,EAAMn1E,EAAI,GACxB,MAEF,IAAK,eACHk2B,EAAEmzH,YAAcl0E,EAAMn1E,EAAI,GAC1B,MAEF,IAAK,QACHk2B,EAAE4C,SAAWq8C,EAAMn1E,EAAI,GAM7B,OAAOk2B,EC2aUi5H,CAAkB7F,GAMjClrJ,KAAKmnJ,sBAAsB,CACzB,QAAS,aACTyE,WAAY,CAACkF,KAIJ,c,0CACX,MAAM,gBAAC5C,EAAe,WAAEjsD,EAAU,SAAE0oD,EAAQ,GAAE53I,EAAE,KAAEyzI,GAAQxmJ,KACpDouJ,EAAKpuJ,KAAKouJ,GAGhBpuJ,KAAKguJ,wBAAwB,GAAWlM,iBACxC,MAAM,IAAC16I,EAAG,gBAAE4pJ,SAAyB9C,EAAgB+C,WAAYzK,EAAqC6H,IAAKD,EAAG9hJ,EAAG8hJ,EAAGryH,GAE9G0yH,QAAuBxsD,EAAWrnE,UAAU,oBAAqB,CACrE0L,KAAM4nH,EAAgBM,aAAaz7I,GACnC43I,SAAUA,EACV2D,IAAKF,EAAGE,IACR0C,gBAAiBA,IAGnBhxJ,KAAK2uJ,cAAgBvnJ,EACrB8mJ,EAAgBQ,mBAAmBD,GACnCzuJ,KAAKkxJ,cAGA,uBACL,OAAGlxJ,KAAKmxJ,kBAA0BnxJ,KAAKmxJ,kBACpCnxJ,KAAKoxJ,4BAAoCpxJ,KAAKoxJ,4BAC1CpxJ,KAAKoxJ,4BAA8BpxJ,KAAKiiG,WAAWovD,aAAa,yBAA0BrxJ,KAAK2uJ,cAAe3uJ,KAAKouJ,GAAGE,KAAK3qJ,KAAK2tJ,IACrItxJ,KAAKoxJ,iCAA8B/oJ,EAC5BrI,KAAKmxJ,kBAAoBG,EAAW7kJ,IAAI6kJ,GAAc,aAAoBA,MAI7E,sBACNtxJ,KAAKusJ,mBAAmBV,cAAc5mB,QAAS,EAC/CjlI,KAAKusJ,mBAAmB0D,2BAGZ,a,0CACZjwJ,KAAKusJ,mBAAmB0D,2BAExB,MAAM1J,EAAavmJ,KAAKusJ,mBAAmBhG,WAE3C,IAAIluG,QAAekuG,EAAWM,eAE9B7mJ,KAAKkiB,IAAI,cAAem2B,EAAOh4C,KAAMg4C,EAAOwsG,WACtC0B,EAAWO,oBAAoBzuG,GAErCkuG,EAAWgL,kBAAkB3lJ,OAAO4lJ,GAAyC,aAA1BA,EAAYztJ,WAA0BwG,QAAQinJ,IAC/F,MAAMpgH,EAAQpxC,KAAKusJ,mBAAmBzwH,YAAY21H,cAAcD,EAAY3mJ,KAC5EumC,EAAMogH,YAAcpgH,EAAMs7G,UAAU8E,YAAcA,EAClDA,EAAYztJ,UAAY,aAG1B,MAEM+3B,EAAc97B,KAAK87B,YACzB,IAAI41H,EAAS51H,EAAYqV,QAAQ1kC,IAAI2kC,GAASA,EAAMvmC,KACpD,MAAM8mJ,EAA4C,CAChDtxJ,KAA4B,QAC5BwkJ,IAAK/oH,EAAY81H,YAAY,CAC3BF,SACAvgH,QAASrV,EAAYqV,QAAQvlC,OAAOwlC,GAASsgH,EAAOzyH,SAASmS,EAAMvmC,MAEnEgnJ,UAAU,WAIRtL,EAAWuL,qBAAqBH,GAEtCt5G,QAAekuG,EAAWM,qBAEpBN,EAAWO,oBAAoBzuG,GAErC,MAAM6uG,EAAetC,GAAmB,aAASvsG,EAAOwsG,MACxD7kJ,KAAKkiB,IAAI,yBACTliB,KAAKmnJ,sBAAsBD,GAE3BlnJ,KAAK+xJ,yBAGA,wBAAwB34H,GAC7Bp5B,KAAKssJ,iBAAmBlzH,EACxBp5B,KAAKsS,cAAc,QAAStS,KAAK0hJ,iBAGnC,eACE,YAA4Br5I,IAArBrI,KAAK+hJ,aAA6BrlG,KAAKC,MAAQ38C,KAAK+hJ,aAAe,IAAO,EAAI,EAG7E,cAAciQ,GACtBryJ,MAAMsyJ,cAAcD,GAEpB,MAAME,EAAaF,EAAO7E,iBAAiB,GAC3C,GAAG+E,EAAY,CACb,MAAM94H,EAAQp5B,KAAKwjJ,cAAc,SAG7BxjJ,KAAK2sJ,mBAAsB3sJ,KAAK4sJ,mBAClC5sJ,KAAK4sJ,kBAAmB,GAGvB5sJ,KAAKqjJ,eACNjqH,EAAM0qH,WAAa,SACX9jJ,KAAKsjJ,kBACblqH,EAAM2qH,gBAAkB,UAG1BmO,EAAW5wJ,iBAAiB,QAAS,KACnCtB,KAAK8sJ,oBACJ,CAACjuI,MAAM,IAGTmzI,EAAOvE,iBAAiB9rJ,QACzB3B,KAAKmyJ,gBAID,gBACN,MAAMrmH,EAAU9rC,KAAK8rC,QACrB9rC,KAAKsS,cAAc,QAASw5B,GAEd9rC,KAAKwjJ,cAAc,SAC3BzlI,MAAQ+tB,EAGT,cACL,OAAO9rC,KAAKoyJ,oBAAmB,GAAMzuJ,KAAK,KACxC3D,KAAKqyJ,WACLryJ,KAAKmyJ,kBAII,OAAOG,EAA6CC,G,0CAC/D,IAAGvyJ,KAAK+tJ,YAIR/tJ,KAAKsyJ,cAAgBA,EACrBtyJ,KAAKkiB,IAAI,SAAUowI,GACnBtyJ,KAAKguJ,wBAAwB,GAAW7M,QAErCnhJ,KAAKusJ,oBACNvsJ,KAAKusJ,mBAAmBiG,0BAAyB,GAGhDF,IAAkBC,GAAuB,CAC1C,IAAIE,GAAW,EACf,IAAI,MAAMpyJ,KAAQL,KAAKosJ,YAAa,CAClC,MAAM1I,EAAa1jJ,KAAKosJ,YAAY/rJ,GACpCoyJ,EAAqC,WAA1B/O,EAAWI,YAA0D,WAA/BJ,EAAWK,iBAAgC0O,QAGxFzyJ,KAAKkuJ,gBAAgBwE,YAAY1yJ,KAAK+S,GAAI/S,KAAKyZ,SAAU64I,EAAeG,OAI1E,aAAaE,GACnB,MAAMrM,EAA4CqM,EAAOrM,aAAa75I,IAAIw5I,GACjE,OAAP,wBACKA,GAAW,CACd,WAAYA,EAAYE,iBAS5B,MAL0B,CACxB,cAAewM,EAAO7M,cACtB,gBAAiBQ,GAMb,qBAAqBt+F,GAC3BhoD,KAAK87B,YAAY82H,QAAQ,CACvBC,UAAW,CACT3N,IAAKl9F,EAAKk9F,IACVD,MAAOj9F,EAAKi9F,MACZF,aAAc/8F,EAAK+8F,aACnB,YAAY,GAEd7rI,MAAOlZ,KAAK8yJ,aAAa9qG,EAAK9uC,OAC9BD,MAAO+uC,EAAK/uC,MAAQjZ,KAAK8yJ,aAAa9qG,EAAK/uC,YAAuB5Q,EAClE88I,WAAYn9F,EAAKm9F,WAAanlJ,KAAK8yJ,aAAa9qG,EAAKm9F,iBAA4B98I,IAI7E,aAAa6+I,GACflnJ,KAAK6rB,YACP,CAACq7H,EAAajuI,MAAOiuI,EAAa/B,YAAYv5I,OAAOc,SAASnC,QAAQ+6I,IACpE,MAAMgB,EAAehB,EAAMgB,aACrBt+I,EAAMs+I,EAAalrI,UAAU6qI,GAAoC,QAArBA,EAAYzlJ,MACxDuyJ,EAAiBzM,EAAat+I,GAC9BgrJ,EAAS1M,EAAalrI,UAAU6qI,IAAc,MAAC,QAAuB,QAAtB,EAAAA,EAAYI,kBAAU,eAAE4M,OAAQF,EAAehgJ,KACrGuyI,EAAMgB,aAAe,CAACA,EAAat+I,GAAMs+I,EAAa0M,MAK/C,uBAAuBhrG,G,0CAClChoD,KAAKkiB,IAAI,yBAA0BliB,KAAMgoD,GAEzC,MAAM,WAACu+F,EAAU,YAAEzqH,GAAe97B,KAAKusJ,mBAEvC,OAAOvkG,EAAK,UACV,IAAK,eAAgB,CACnBhoD,KAAKkiB,IAAI,qBAAsB8lC,GAE/BhoD,KAAKkzJ,aAAalrG,GAClBhoD,KAAKmzJ,qBAAqBnrG,GAE1B,MAAMorG,EAAqB3N,GAClBA,EAAWh5I,IAAI49I,IACb,CACLj/I,EAAG,uCACHu6I,UAAW0E,EAAU1E,UACrBE,QAASwE,EAAUzE,MAAMn5I,IAAI45G,IAAWA,MAKhC,CACZ,aAAa,SAAUr+D,EAAK9uC,MAAMqsI,MAClCv9F,EAAK/uC,MAAQ,aAAa,QAASm6I,EAAkBprG,EAAK/uC,MAAMwsI,kBAAep9I,EAC/E2/C,EAAKm9F,WAAa,aAAa,aAAciO,EAAkBprG,EAAKm9F,WAAWM,kBAAep9I,GAC9FuD,OAAOc,SAEHnC,QAAQg7I,IACZ,IAAIn0G,EAAQtV,EAAYu3H,iBAAiB9N,EAAKl/B,QAC9C,GAAGj1E,EACD,OAGF,MAAMkiH,EAAgBx3H,EAAYy3H,sBAAsBhO,EAAKllJ,MAAM,GACnE+wC,EAAQ,IAAI,KAAgBkiH,EAAczoJ,IAAK06I,EAAKllJ,MACpD+wC,EAAMltC,aAAa,YACnBovJ,EAAc5G,UAAYt7G,EAE1BtV,EAAY03H,eAAepiH,EAAOm0G,EAAKC,cAAgBD,EAAKl/B,UAG9DrmH,KAAKyzJ,yBAEL,MAAM5B,EAAW7xJ,KAAKinJ,UACtBjnJ,KAAKinJ,WAAY,EAEjB,IAAIyK,EAAS51H,EAAYqV,QAAQ1kC,IAAI2kC,GAASA,EAAMvmC,KACpD,MAAM8mJ,EAA4C,CAChDtxJ,KAAMwxJ,EAAW,SAAW,QAC5BhN,IAAK/oH,EAAY81H,YAAY,CAC3BF,SACAvgH,QAASrV,EAAYqV,QAAQvlC,OAAOwlC,GAASsgH,EAAOzyH,SAASmS,EAAMvmC,MAEnEgnJ,UAAWA,KAIf7xJ,KAAKkiB,IAAI,eAAgByvI,EAAe9M,WAElC0B,EAAWuL,qBAAqBH,SAEhC3xJ,KAAK0zJ,yBAEP7B,UACI7xJ,KAAK2zJ,cAGb,MAGF,IAAK,aACH,IAAI,MAAMzI,KAAaljG,EAAK4jG,WAAY,CACtC,MAAM55I,EAA4B,GAAc4hJ,kBAAkB1I,GAClEl5I,EAAKu4I,cAAgB,EACrB,MAAMsG,EAAe,IAAIgD,gBAAgB7hJ,GACzChS,KAAK4rJ,WAAWriJ,KAAKsnJ,SAGjB7wJ,KAAK0zJ,yBACX,MAGF,QACE1zJ,KAAKkiB,IAAI1R,MAAM,8BAA+Bw3C,OAKvC,yB,0CACX,MAAM,mBAACukG,GAAsBvsJ,KAC7B,IAAIusJ,EACF,OAGF,MAAM,WAAChG,GAAcgG,EACrB,GAAGhG,EAAWG,kBAAmB,CAC/B,MAAM1jH,EAA4BhjC,KAAK4rJ,WAAWn/I,IAAIy+I,GAAalrJ,KAAK8zJ,gBAAgBvN,EAAY2E,IACpGlrJ,KAAK4rJ,WAAWjqJ,OAAS,QAEnB0D,QAAQC,IAAI09B,QAElBhjC,KAAKkiB,IAAI,4BAIC,gBAAgBqkI,EAA+B2E,G,0CAC3DlrJ,KAAKkiB,IAAI,oBAAqBgpI,GAC9B,UAEQ3E,EAAWuN,gBAAgB5I,GACjClrJ,KAAKkiB,IAAI,kBAAmBgpI,GAC5B,MAAMnrJ,GACNC,KAAKkiB,IAAI1R,MAAM,oBAAqB06I,EAAWnrJ,OAIrC,sB,0CACZ,MAAM,UAACgwJ,GAAa/vJ,KACpB,IAAI+vJ,EAEF,YADA/vJ,KAAKkiB,IAAI3E,KAAK,0DAKhB,IADevd,KAAK2rJ,aAAahqJ,OAE/B,OAGF,MAAMk+F,EAAQ7/F,KAAK2rJ,aAAahmJ,QAChC3F,KAAK2rJ,aAAahqJ,OAAS,EAE3B,IAAI,MAAMqmD,KAAQ63C,EAAO,CACvB,MAAMk0D,QAAsBhE,EAAUiE,iBAAiBhsG,GACvD,IAAI+rG,EACF,SAKF,MAAMxxI,GAAM,IAAI0xI,aAAcp8B,OAAOk8B,GACrC,IACE,MAAMG,EAAmCnrG,KAAK2nG,MAAMnuI,GACpDviB,KAAKkiB,IAAI,sCAAuCgyI,GAChDl0J,KAAKm0J,uBAAuBD,GAC5B,MAAM5jJ,GACNtQ,KAAKkiB,IAAI1R,MAAM,uBAAwB+R,GACvCviB,KAAKk/I,OAAO,oCACZtyI,EAAA,EAAU0F,cAAc,oBAAqBtS,KAAKmiJ,yBAKjD,+BAA+B37G,GACpCxmC,KAAK2rJ,aAAapiJ,KAAKi9B,EAAOwhB,MAC9BhoD,KAAKmwJ,uBGjzBM,MAAM,GAenB,YACUxoB,EACAn3C,EACA+P,EACA6zD,EACAlG,GAJA,KAAAvmB,uBACA,KAAAn3C,kBACA,KAAA+P,kBACA,KAAA6zD,oBACA,KAAAlG,kBAyCF,KAAAmG,QAAU,KAChBr0J,KAAK6gJ,eAAe7gJ,KAAK8rI,WAxCzB,MAAMj6H,EAAiB7R,KAAK6R,eAAiB,IAAI,IAEjDA,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,gBAAiB,EAAEi6H,eAC3C9rI,KAAK8rI,UACP9rI,KAAK6gJ,eAAe/U,KAIxBj6H,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,iBAAmBi6H,IAC5C9rI,KAAK8rI,WAAaA,GACnB9rI,KAAK6gJ,eAAe/U,KAIxBj6H,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,sBAAwBi6H,IACpD9rI,KAAK6gJ,eAAe/U,KAGtBj6H,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,oBAAsBu2H,IAClD,MAAM0D,EAAW9rI,KAAK2nI,qBAAqBS,WACxC0D,aAAQ,EAARA,EAAU/4H,MAAOq1H,EAAUr1H,IAC5B/S,KAAK6gJ,eAAe/U,KAIxBj6H,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,uBAAwB,EAAEyiJ,aAAYj0J,WAClE,MAAM,MAACk0J,GAASv0J,KAChB,IAAIs0J,EAAW3yJ,SAAW4yJ,EAAiC,OAE3D,IAAI9vJ,EAAM,EACV,IAAI,IAAI7C,EAAI,EAAGA,EAAI0yJ,EAAW3yJ,SAAUC,EAAG,CACzC,MAAM,KAACvB,EAAI,MAAEsE,GAAS2vJ,EAAW1yJ,GACjC6C,EAAME,EAAQF,EAAME,EAAQF,EAG9B8vJ,EAAM/d,aAAa/xI,KAQf,uBACFzE,KAAK8rI,WACT9rI,KAAK6zD,OAAOpjC,YAAc,GAEvBzwB,KAAKw0J,qBACNx0J,KAAKw0J,mBAAmBlyG,SACxBtiD,KAAKw0J,wBAAqBnsJ,GAG5BrI,KAAK8rI,cAAWzjI,EAChBrI,KAAKy0J,uBAAuBriJ,aAGtB,eAAe05H,GAClB9rI,KAAKsqB,YACNtqB,KAAKsqB,YACLtqB,KAAKsqB,eAAYjiB,GAGnB,MAAMqsJ,EAAqB10J,KAAK8rI,WAAaA,EAC1C4oB,IACD10J,KAAK20J,uBAEL30J,KAAK8rI,SAAWA,EAChB9rI,KAAKy0J,uBAAyB,IAAI,IAElCz0J,KAAKy0J,uBAAuB5zJ,IAAIirI,EAAhC9rI,CAA+D,QAASA,KAAKq0J,SAE1EvoB,aAAoB,KACrB9rI,KAAKw0J,mBAAqBx0J,KAAKygJ,sBAE/BzgJ,KAAKw0J,mBAAqBx0J,KAAK40J,gBAC/B50J,KAAKy0J,uBAAuB5zJ,IAAIirI,EAAhC9rI,CAA0C,QAASA,KAAKq0J,UAG1Dr0J,KAAKoB,UAAUlB,UAAUC,OAAO,YAAa2rI,aAAoB,QAGnE,MAAMhgG,EAAU9rC,KAAK8rI,SAAShgG,QAC9B,IAAI1S,EAAQ0yG,aAAoB,KAAoBA,EAAS1yG,MAtHjE,SAAsCA,EAAmB0S,GACvD,OAAO1S,GACL,KAAK,GAAWs0H,QAChB,KAAK,GAAWvM,OACd,OAAO,KAAiBA,OAC1B,KAAK,GAAWQ,UACd,OAAO71G,EAAU,KAAiByoG,MAAQ,KAAiBD,QAC7D,QACE,OAAO,KAAiBE,YA8G2CqgB,CAA6B/oB,EAAS4V,gBAAiB51G,GAE5H,MAAM,MAACyoH,GAASv0J,KAEhBu0J,EAAMO,oBAEN,MAAM/6G,EAAW3gB,IAAU,KAAiB+nH,SACvCxgJ,SAASgC,KAAKzC,UAAUuV,SAAS,eAAiBi/I,GAAuB36G,KACzEA,GACDw6G,EAAM/d,aAAa,GAGrB,aAAc71I,SAASgC,KAAM,cAAeo3C,EAAU,IAAKA,EAAW,KACpEw6G,EAAMQ,uBAEN/0J,KAAK20J,6BACJtsJ,IAGF0xC,IAIHw6G,EAAMle,gBAAgBj9G,GAAO,GAe7Bp5B,KAAK+U,SAAS+2H,GACd9rI,KAAKohJ,eAAetV,GACpB9rI,KAAKg1J,4BAA4B56H,UAAU0R,IAGrC,eAAeggG,GACrB,OAAO9rI,KAAKw0J,mBAAmBhuH,OAAOslG,GAGhC,SAASA,GACf,GAAGA,aAAoB,KACrB,OAAO9rI,KAAKwgJ,eAAeh6G,OAAOslG,GAElC,OAAAr7H,EAAA,GAAezQ,KAAK6zD,OAAQ,IAAI,KAAU,CAAC5oD,OAAQ6gI,EAASqW,mBAAmB52H,aAAaxQ,SAIxF,YACN,MAAM,eAAClJ,GAAkB7R,KACnBoB,EAAYpB,KAAKoB,UAAYT,SAASC,cAAc,OAC1DQ,EAAUlB,UAAUW,IAAI,iBAAkB,yBAE1C,MAAM8kB,EAAOhlB,SAASC,cAAc,OACpC+kB,EAAKzlB,UAAUW,IAAI,oBAEnB,MAAMm0J,EAA8Bh1J,KAAKg1J,4BAA8B,IAAI,GAErEn5E,EAAO,IACbA,EAAKx6E,OAAO2zJ,EAA4B5zJ,WACxCukB,EAAKtkB,OAAOw6E,GAEZ,MAAMo5E,EAAqB,OAAAzsG,GAAA,GAAS,KAClCxoD,KAAK8rI,SAASiT,eACb,KAAK,GAER,YAAiBljE,EAAO97E,IACtB,OAAAiqB,EAAA,GAAYjqB,GACZk1J,KACC,CAACpjJ,mBAEJ,MAAMgiD,EAAS7zD,KAAK6zD,OAASlzD,SAASC,cAAc,OACpDizD,EAAO3zD,UAAUW,IAAI,sBAErBb,KAAKwgJ,eAAiB,IAAI,GAAsB3sF,GAChD7zD,KAAKygJ,qBAAuB,IAAI,GAA4B96H,GAE5D3lB,KAAK40J,gBAAkB,IAAI,GAAuBjvI,GAElD,MAAM2qB,EAAQ3vC,SAASC,cAAc,OACrC0vC,EAAMpwC,UAAUW,IAAI,qBAEpB,MAAMmmB,EAAM,EAAW,kBACvBspB,EAAMjvC,OAAO2lB,GAEb,YAAiBA,EAAMjnB,IACrB,OAAAiqB,EAAA,GAAYjqB,GAEZ,MAAM,SAAC+rI,GAAY9rI,KACf8rI,IAIDA,aAAoB,KACrBA,EAASoT,SAETpT,EAASoT,OAAO,kCAEjB,CAACrtI,mBAEJ,YAAiBzQ,EAAW,KAC1B,GAAGpB,KAAK8rI,oBAAoB,KAAmB,CAC7C,GAAG,KAAagQ,UAAU,IAAgBn6I,OACxC,OAGF,IAAI,GAAe,CACjBgmI,qBAAsB3nI,KAAK2nI,qBAC3Bn3C,gBAAiBxwF,KAAKwwF,gBACtB+P,gBAAiBvgG,KAAKugG,kBACrBnjE,YACE,GAAGp9B,KAAK8rI,oBAAoB,GAAc,CAE/C,GADe,KAAagQ,UAAU,IAC5BznI,KAAKwnI,GAASA,EAAMqZ,oBAAsBl1J,KAAK8rI,UACvD,OAGF,IAAI,GAAU,CACZoiB,gBAAiBluJ,KAAKkuJ,gBACtBkG,kBAAmBp0J,KAAKo0J,kBACxB5jE,gBAAiBxwF,KAAKwwF,gBACtBs7C,SAAU9rI,KAAK8rI,WACd1uG,SAEJ,CAACvrB,mBAEJzQ,EAAUC,OAAOskB,EAAMkuC,EAAQvjB,GAE/B,MAAMikH,EAAQv0J,KAAKu0J,MAAQ,IAAI,GACzBY,EAAiBZ,EAAMr1G,OAAO,qBACpC99C,EAAUJ,QAAQm0J,GAElBx0J,SAASg2C,eAAe,iBAAiB31C,QAAQI,GACjDmzJ,EAAMO,qB,kVC2EV,MAAM,GAAkB,IArUjB,MAQL,cACE90J,KAAKkiB,IAAM,OAAAkzC,EAAA,GAAO,SAElBp1D,KAAKkhC,OAAS,EACdlhC,KAAKo1J,MAAQ,IAAI9hJ,IACjBtT,KAAKq1J,UAAY,IAAI/hJ,IACrBtT,KAAKs1J,gBAAkB,GAEnB,KAIJ1oJ,EAAA,EAAUwwD,2BAA2B,CACnCm4F,gBAAuB/uH,GAAW,mC,MAChC,MAAMggH,EAAOxmJ,KAAKw1J,SAAShvH,EAAOivH,YAElC,IAAI3pB,EAAW9rI,KAAKq1J,UAAU1hJ,IAAI6yI,EAAKzzI,IAEvC,OAAOyzI,EAAKp7I,GACV,IAAK,qBACA0gI,GACDA,EAASoT,OAAkB,QAAX,EAAAsH,EAAKlyC,cAAM,eAAElpG,GAAG,GAGlC,MAGF,IAAK,oBACA0gI,GAODA,EAAS4pB,cAGX,MAGF,IAAK,qBACC5pB,IAMFA,EAAW9rI,KAAK21J,mBAAmB,CACjC9pI,YAAY,EACZs2H,mBAAoBqE,EAAKoP,WAG3B9pB,EAASkiB,wBAAwB,GAAWpM,SAC5C9V,EAAS+pB,aAAarP,GACtB1a,EAASgqB,iBAnEM,KAmEiC,iCAGlD,MAGF,IAAK,YAAa,CAChB,IAAIhqB,GAAYA,EAAS6iB,cACvB,MAGF,MAAML,EAAMxiB,EAASsiB,GAAGE,IAAM9H,EAAKuP,SAC7B3H,EAAKtiB,EAASsiB,GACdH,QAAiB,KAAWoD,aAAa,SAAU/C,GACzD,IAAI,OAAA/sJ,GAAA,GAAS6sJ,EAAGH,SAAUA,GAAW,CACnCjuJ,KAAKkiB,IAAI1R,MAAM,qBAAsB49I,EAAGH,SAAUA,GAClD,MAGF,MAAM,IAAC7mJ,EAAG,gBAAE4pJ,SAAyBhxJ,KAAKixJ,WAAW3C,EAAKF,EAAG7hJ,EAAG6hJ,EAAGryH,GACnE,GAAGyqH,EAAKwK,kBAAoBA,EAAiB,CAC3ChxJ,KAAKkiB,IAAI1R,MAAM,4BAA6Bg2I,EAAKwK,gBAAiBA,GAClE,MAGFllB,EAAS6iB,cAAgBvnJ,EACzB0kI,EAASolB,WAET,WAKN8E,6BAA+BxvH,IAC7B,MAAMslG,EAAW9rI,KAAKq1J,UAAU1hJ,IAAI6yB,EAAOyvH,gBACxCnqB,aAAQ,EAARA,EAAU/4H,MAAOyzB,EAAOyvH,eAI3BnqB,EAASoqB,+BAA+B1vH,MAI5CxmC,KAAKm2J,WAAa,IAAI,KAAqC,CACzD,gBACA,mBACA,eACA,oBACA,oBACA,qBAIJ,kBACE,OAAOn2J,KAAKs1J,gBAAgB,GAGvB,gBAAgBv+I,GACrB,IAAI,MAAOq/I,EAAQtqB,KAAa9rI,KAAKq1J,UACnC,GAAGvpB,EAASqW,qBAAuBprI,EACjC,OAAO+0H,EAKA,WAAWuiB,EAAiB/hJ,EAAeyvB,G,0CACtD,OAAO,KAAWs1H,aAAa,iBAAkBhD,EAAK/hJ,EAAGyvB,MAGpD,SAASyqH,GACd,MAAM6P,EAAyB,uBAAX7P,EAAKp7I,EACnBkrJ,EAAUt2J,KAAKo1J,MAAMzhJ,IAAI6yI,EAAKzzI,IAepC,OAdGujJ,GAED,OAAAC,GAAA,GAAkBD,EAAS9P,GAGxB6P,GACDr2J,KAAKo1J,MAAMjjJ,OAAOq0I,EAAKzzI,IAGzByzI,EAAO8P,GACED,GACTr2J,KAAKo1J,MAAM56I,IAAIgsI,EAAKzzI,GAAIyzI,GAGnBA,EAGF,QAAQ4P,GACb,OAAOp2J,KAAKo1J,MAAMzhJ,IAAIyiJ,GAGjB,aAAarjJ,GAClB,MAAMyzI,EAAOxmJ,KAAKw2J,QAAQzjJ,GAC1B,MAAO,CACL3H,EAAG,iBACH2H,GAAIyzI,EAAKzzI,GACT+8D,YAAa02E,EAAK12E,aAId,mBAAmBpwE,GAKzB,MAAM8mJ,EAAO,IAAI,GAAa,OAAD,QAC3B0H,gBAAiBluJ,KACjBiiG,WAAA,KACApkC,qBAAA,GACGn+D,IA2DL,OAxDA8mJ,EAAKllJ,iBAAiB,QAAU83B,IAC9B,MAAMq9H,EAAcz2J,KAAKy2J,YACtBr9H,IAAU,GAAW+nH,QACtBnhJ,KAAKq1J,UAAUljJ,OAAOq0I,EAAKzzI,IAC3B,OAAAkB,EAAA,GAAiBjU,KAAKs1J,gBAAiB9O,IAEvC,OAAAv6F,GAAA,GAA2BjsD,KAAKs1J,gBAAiB9O,EAAM,aAGtDptH,IAAU,GAAW0oH,kBACtB0E,EAAK9D,iBAAkB,GAGzB,MAAMgU,OAAoCruJ,IAArBm+I,EAAKzE,YACvB3oH,IAAU,GAAW0oH,iBAAoB1oH,IAAU,GAAWo7G,YAAckiB,EAC7ElQ,EAAKsP,iBApMgB,KAoMuB,oCAE5CtP,EAAKmH,qBAGJ8I,IAAgBjQ,GAASiQ,IACvBr9H,IAAU,GAAW+nH,OAClBqF,EAAK36H,YAAe26H,EAAK9D,gBAEnB8D,EAAK9D,kBAAoBgU,EACjC12J,KAAKm2J,WAAWQ,UAAU,mBAE1B32J,KAAKm2J,WAAWQ,UAAiC,+BAAvBnQ,EAAK8L,cAAiD,gBAAkB,gBAJlGtyJ,KAAKm2J,WAAWS,YAMVx9H,IAAU,GAAWwoH,QAC7B5hJ,KAAKm2J,WAAWQ,UAAUnQ,EAAK36H,WAAa,oBAAsB,qBAAqB,GAC/EuN,IAAU,GAAW0oH,gBAC7B9hJ,KAAKm2J,WAAWU,qBAAqB,oBAC7Bz9H,IAAU,GAAWo7G,WAC1BgS,EAAK/sI,UACNzZ,KAAKm2J,WAAWQ,UAAU,uBAAuB,GAGnD32J,KAAKm2J,WAAWS,eAKtBpQ,EAAKllJ,iBAAiB,KAAM,CAACyR,EAAIkjD,UACjB5tD,IAAX4tD,GACDj2D,KAAKq1J,UAAUljJ,OAAO8jD,GAGxB,MAAM6gG,IAAe92J,KAAKy2J,YAC1Bz2J,KAAKq1J,UAAU76I,IAAIzH,EAAIyzI,QAETn+I,IAAX4tD,GACDrpD,EAAA,EAAU0F,cAAc,gBAAiB,CAACw5H,SAAU0a,EAAMsQ,WAAYA,MAInEtQ,EAGF,mBAAmBiI,GAExB,OADA,IAAgBhxF,aAAagxF,EAAe/wF,OACrC19D,KAAKw1J,SAAS/G,EAAegH,YAG/B,aACL,OAAO,KAAW76H,UAAU,uBAAwB,CAClDy2D,QAAS,EACT0lE,cAAe,MACdpzJ,KAAWqzJ,GAAa,mCACzB,OAAO,KAAW3F,aAAa,cAAe2F,OAI3C,kBAAkBjgJ,EAAgBkgJ,GACvCj3J,KAAKkiB,IAAI,uBAAwBnL,EAAQkgJ,GAEzC,MAAMC,EAAW,UAAkB1uB,kBAAkBzxH,GACrD,IAAImgJ,EAAU,OAEd,MAAM,sBAACxuB,GAAyBwuB,EAAS34I,OAEnCioI,EAAOxmJ,KAAK21J,mBAAmB,CACnC9pI,YAAY,EACZs2H,mBAAoBprI,IAGtByvI,EAAKwG,oBAAmB,KAASiK,IAAWvuB,IAAwB,GAEpE8d,EAAKwH,wBAAwB,GAAWnM,YACxC2E,EAAKqP,aAAa,CAChBzqJ,EAAG,mBACH0kE,YAAa,GACb8lF,SAAU,KACVppI,KAAM,OAAAg7G,GAAA,IAAM,GACZz0H,KAAM/S,KAAKkhC,OACXi2H,eAAgBpgJ,EAChB4zI,SAAUnE,EAAKmE,SACfpsI,OAAQ,CACNtF,MAAOg+I,QAAW5uJ,KAKtBrI,KAAKmuJ,aAAaxqJ,KAAKyqJ,IACrB5H,EAAK4H,GAAKA,EAEH,KAAWxzH,UAAU,oBAAqB,CAC/CgM,QAAS,IAAgBm5B,aAAahpD,GACtC4zI,SAAUnE,EAAKmE,SACf1xI,MAAOg+I,GAAWvuB,EAClB1mC,UAAW,aAAe,IAC1BisD,SAAUzH,EAAK4H,GAAGH,aAEnBtqJ,KAAK2G,IACN,MAAMujJ,EAAY7tJ,KAAK0uJ,mBAAmBpkJ,GAC1Ck8I,EAAKwH,wBAAwB,GAAWpM,SACxC4E,EAAKqP,aAAahI,GAClBrH,EAAKsP,iBA1SkB,KA0SqB,kCAIxC,4BAA4BnL,GAClC,MACMyM,EHvUD,CACLhsJ,EAAG,oBACHmT,OAAQ,CACN8sI,SAAS,EACTC,eAAe,GAEjBC,UAAW,GACXC,UAAW,GACXC,iBAAkB,CAAC,UG+TEA,iBAAiB,GACtC,OAAQd,EAASc,iBAAiBp3I,KAAKg9E,GAC9B,OAAAgmE,GAAA,GAAeD,EAAW/lE,GAAW,GAInC,YAAY+kE,EAAgB38I,EAAkB66F,EAAqCr7F,G,0CAC9F,IAAIjZ,KAAKw2J,QAAQJ,GACf,OAGF,MAAMn0E,QAAgB,KAAWrnD,UAAU,oBAAqB,CAC9D3hB,QACAqtB,KAAMtmC,KAAKwuJ,aAAa4H,GACxB38I,WACA66F,OAAQ,CACNlpG,EAAGkpG,GAELgjD,cAAe,MAGjBz5F,GAAA,EAAkBghC,qBAAqB5c,QAK3C,OAAmB,KAAeisE,gBAAkB,IACrC,U,iTC7QR,MAAMh9H,GAAuB,OAC9BqmI,GAAmB,KAAqB,aAAe,YAw4D7D,MAAM,GAAe,IAp3Dd,MAiCL,cAhCO,KAAAC,SAAW72J,SAASg2C,eAAe,iBAGnC,KAAA8gH,SAAU,EACV,KAAAC,qBAAuB,EAIvB,KAAAr2G,eAAgC,KAEhC,KAAAi6C,OAAS,EAET,KAAA19B,MAAgB,GAoxBf,KAAA+5F,aAAe,KACrB,MAAM1/F,EAAOxgD,SAASwgD,KAChB6H,EAAW7H,EAAK5U,MAAM,KAEtBrlC,EAAShe,KAAK43J,eAAe3/F,EAAM6H,GAIzC,GAFA9/D,KAAKkiB,IAAI,aAAc+1C,EAAM6H,EAAS,GAAI9hD,GAEvCA,EAAO65I,OAAV,CACEllJ,EAAA,EAAwBmlJ,eACxB,MAAM,QAACC,GAAW,IAAkBC,QAAQh6I,EAAO65I,QACnD,GAAGE,EAAS,CACV,MAAMzrJ,EAAI3L,SAASC,cAAc,KACjC0L,EAAEosD,KAAO16C,EAAO65I,OACf31J,OAAe61J,GAASzrJ,SAK7B,OAAOwzD,EAAS,IACd,IAAK,OAAQ,CACX,MAAM/jC,EAAY/d,EAAO+d,EACzB,IAAIk8H,OAAyB5vJ,IAAhB2V,EAAOk6I,KAAqB,IAAsBxgD,mBAAmB15F,EAAOk6I,WAAQ7vJ,EAEjG,OAAO0zB,EAAE,IACP,IAAK,IACH/7B,KAAKm4J,aAAa,CAChBC,SAAUr8H,EACV2nE,UAAWu0D,IAEb,MAGF,QACEj4J,KAAKutD,aAAa,CAChBtiD,OAAQgtJ,EAASl8H,EAAExQ,UAAS,GAAQwQ,EAAExQ,WACtCm4E,UAAWu0D,QA2Sf,KAAAI,YAAc,KACpB13J,SAAS22C,gBAAgBnyC,MAAMqB,YAAY,uBAAwBoG,EAAA,EAAU+2B,SAAS6wC,iBAAmB,MAEzG7zE,SAASgC,KAAKzC,UAAUC,OAAO,qBAAsByM,EAAA,EAAU+2B,SAASC,mBACxEjjC,SAASgC,KAAKzC,UAAUC,OAAO,qBAAqB,GACpDQ,SAASgC,KAAKzC,UAAUC,OAAO,oBAAqByM,EAAA,EAAU+2B,SAASC,mBAEvE5jC,KAAKs4J,wBAA0B,OAAAt+H,GAAA,GAAS,KACtC,MAAMmrE,EAASnlG,KAAK4wB,KAAKu0E,OACtBA,EAAOC,eACRD,EAAOC,cAAc4gC,gBAAgB,GAGvC,KAAWx3B,WAAWxuG,KAAK4wB,KAAKC,QAAQvC,cAAc00B,UACrDp2C,EAAA,EAAU+2B,SAASC,kBAAoB,IAAM,GAAG,GAAO,GAE1D0lB,GAAA,EAAaivG,QAAQ3rJ,EAAA,EAAU+2B,SAASyyD,SAAS9yF,MACjDk/C,EAAA,EAAqBq3C,iBAAgB,GAErC,IAAI,MAAMjpE,KAAQ5wB,KAAK49D,MACrBhtC,EAAKw9G,uBAGP,IAAKoqB,cAAc5rJ,EAAA,EAAU+2B,SAAS80H,YAEtCz4J,KAAK04J,4BAA4B14J,KAAK4wB,OA6LhC,KAAA+nI,gBAAkB,CAAC54J,EAA+B64J,KACxD,MAAMC,EAAgBn0C,KACtB,GAAI1kH,KAAK84J,WAAcD,EAAvB,CAKA,GAAG94J,aAAag5J,UAAW,CACzB,MAAMC,EAASj5J,EAAEk5J,aAAa76F,OAEd46F,EAAOvjJ,SAAWujJ,EAAOvjJ,SAAS,SAAWujJ,EAAO7zI,QAAQ,UAAY,IAEtF,OAAA6E,EAAA,GAAYjqB,GAIhB,aAAkBA,GAAG4D,KAAMghH,IACzB,GAAGA,EAAMhjH,OAAQ,CACf,GAAGk3J,EAED,YADAA,EAAcK,SAASv0C,GAIzB,MAAM3oB,EAAYh8F,KAAK4wB,KAAKxwB,MAC5B47F,EAAU4oB,eAAiBg0C,IAAe,EAA2BjtJ,IAAIg5G,EAAM,GAAGtkH,MAAQ,QAAU,YACpG,IAAI,GAAcL,KAAK4wB,KAAM+zF,EAAO3oB,EAAU4oB,qBA7zClD/mD,GAAA,EAAkBlvC,OAAO,IAAK2jE,uBAC9B,KAAwBrrE,QAExBjnB,KAAKkiB,IAAM,OAAAkzC,EAAA,GAAO,KAAM,IAASy3E,IAAM,IAASC,KAAO,IAASC,MAAQ,IAAS39G,OAEjFpvB,KAAKm5J,mBAAqB,GAC1B,IAAWx1H,SAASktC,OAAOtmE,QAAQqkE,IACjC,GAAGA,EAAMD,WAAWG,KAAM,CACxB,MAAMx0D,EAAM,cAAgBs0D,EAAMD,WAAWG,KAAO,QAAU,KAAa,KAAO,IAClF9uE,KAAKm5J,mBAAmBvqF,EAAMD,WAAWG,MAAQzpE,QAAQ6E,QAAQoQ,MAIrEta,KAAKiS,UAAU,GAEf/P,OAAOZ,iBAAiB,OAAQ,KAC9BkhD,EAAA,EAAqBq3C,iBAAgB,GAErC75F,KAAKy3J,QAAU7qJ,EAAA,EAAUo9F,KAAKovD,QAAS,EACvCp5J,KAAKq5J,eACLp8G,cAAcj9C,KAAK03J,sBACnB9qJ,EAAA,EAAU0F,cAAc,OAAQ1F,EAAA,EAAUo9F,KAAKovD,QAE/Cl3J,OAAOZ,iBAAiB,QAAS,KAC/BtB,KAAKy3J,QAAU7qJ,EAAA,EAAUo9F,KAAKovD,QAAS,EACvCp5J,KAAKq5J,eACLr5J,KAAK03J,qBAAuBx1J,OAAO6wC,YAAY,IAAM/yC,KAAKq5J,eAAgB,KAG1E72G,EAAA,EAAqBq3C,iBAAgB,GAErCjtF,EAAA,EAAU0F,cAAc,OAAQ1F,EAAA,EAAUo9F,KAAKovD,SAC9C,CAACv6I,MAAM,MAIZ3c,OAAOZ,iBAAiBi2J,GAAkB,KACxCv3J,KAAK03J,qBAAuBx1J,OAAO6wC,YAAY,IAAM/yC,KAAKq5J,eAAgB,KAC1Er5J,KAAKq5J,eAELr5J,KAAKy3J,QAAU7qJ,EAAA,EAAUo9F,KAAKovD,QAAS,EACvCxsJ,EAAA,EAAU0F,cAAc,OAAQ1F,EAAA,EAAUo9F,KAAKovD,SAC9C,CAACv6I,MAAM,EAAMqF,SAAS,IAEzBlkB,KAAKs+B,eAAiB39B,SAASC,cAAc,OAC7CZ,KAAKs+B,eAAep+B,UAAUW,IAAI,kBAAmB,kBACrDb,KAAKs+B,eAAep3B,QAAQrD,UAAY,aAExC7D,KAAKsmD,wBAA0B3lD,SAASC,cAAc,OACtDZ,KAAKsmD,wBAAwBpmD,UAAUW,IAAI,6BAC3Cb,KAAKs5J,8BAA8BnxI,EAAA,EAAW6hH,cAE9ChqI,KAAKw3J,SAASn2J,OAAOrB,KAAKs+B,gBAE1Bt+B,KAAKu5J,gBACLv5J,KAAKw5J,eAAex5J,KAAK4wB,KAAKxvB,WAE9BuR,EAAA,EAAwBglJ,aAAe33J,KAAK23J,aAG5C33J,KAAKq4J,cACLzrJ,EAAA,EAAUtL,iBAAiB,mBAAoBtB,KAAKq4J,aAEpD,OAAAjhG,GAAA,GAAuB,KACrB5U,EAAA,EAAqB0wB,wBAAwB,QAC7C1wB,EAAA,EAAqBq3C,iBAAgB,IACpC,KACDr3C,EAAA,EAAqB0wB,wBAAwB,IAC7C1wB,EAAA,EAAqBq3C,iBAAgB,KAGpC,MAAc3gE,EAAA,EAAgBugI,aAAuE,IAAzD,OAAApC,GAAA,GAAen+H,EAAA,EAAgBugI,WAAY,SACxFz5J,KAAK05J,qBAAsBzhJ,GACuB,kBAAzCA,EAAS0hJ,QAAQhmJ,IAAI,iBAC3BhQ,KAAK,KACN3D,KAAKgvE,sBAGPhvE,KAAKgvE,oBAIP7mD,EAAA,EAAW7mB,iBAAiB,eAAgB,CAAC8K,EAAMyqC,KAC9Cl2C,SAASgC,KAAKzC,UAAUuV,StHzLW,yBsH0LjC9U,SAASgC,KAAKzC,UAAUuV,S/LlOU,0B+LmOrC,GAAgBuhC,eAAc,GAGhCh3C,KAAKs5J,8BAA8BziH,KAGrC1uB,EAAA,EAAW7mB,iBAAiB,SAAU,KAEpC,MAAMmjB,EAAOzkB,KAAKs+B,eAAe5Z,wBACjC,GAA8Bk1I,gBAAgBn1I,EAAKjhB,MAAOihB,EAAKhhB,QAAQE,KAAK,UAU9EiJ,EAAA,EAAUtL,iBAAiB,gBAAkBvB,IAC3C,IAAI,OAACkL,EAAM,SAAEqE,EAAQ,IAAEzE,EAAG,WAAEgtF,GAAc93F,EACvCuP,IAAUA,EAAW,IAAsBooG,kBAAkBpoG,IAC7DzE,IAAKA,EAAM,IAAsB6sG,kBAAkB7sG,IAEtD7K,KAAKutD,aAAa,CAChBtiD,SACAy4F,UAAW74F,EACXxK,KAAMiP,EAAW,kBAAejH,EAChCiH,WACAuoF,iBAIJjrF,EAAA,EAAUtL,iBAAiB,gBAAkBsvB,IAC3C5wB,KAAK65J,iBAAiBjpI,KAGxBhkB,EAAA,EAAUtL,iBAAiB,eAAgB,KACzCtB,KAAKgvE,sBAGPpiE,EAAA,EAAUtL,iBAAiB,mBAAqBw4J,IAC9C95J,KAAK+5J,0BAA0BD,KAGjCltJ,EAAA,EAAUtL,iBAAiB,eAAgB,EAAE2J,SAAQ+uJ,c,MACnD,MAAMppI,EAAO5wB,KAAK4wB,KAClB,IACGA,GACDA,EAAK3lB,SAAWA,GAChB2B,EAAA,EAAUqtJ,gBACR9xI,EAAA,EAAW6hH,eAAiB,IAAWjzF,QACxB,IAAf/2C,KAAKs7F,MAGP,OAGF,MAAM4+D,EAASF,EAAQ3lJ,KAAK6lJ,GAA8B,gCAApBA,EAAOhyJ,OAAOkD,GACpD,GAAyB,iCAAR,QAAd,EAAA8uJ,aAAM,EAANA,EAAQhyJ,cAAM,eAAEkD,GAAqC,CACtD,MAAMlD,EAASgyJ,EAAOhyJ,OAChBqgD,EAAS33B,EAAKC,QAAQA,QAAQ,IAAsB6mF,kBAAkBwiD,EAAOhyJ,OAAOygD,SAC1F,GAAGJ,GAAUA,EAAOroD,UAAUuV,SAAS,cAAgB8yC,EAAOroD,UAAUuV,SAAS,YAAcioF,GAAen1C,EAAQ33B,EAAKC,QAAQthB,WAAWnO,WAAY,CACxJ,MAAMohG,EAA8Bj6C,EAAO90C,cAAc,qFAEXs1C,KAAK2nG,MAAMxoJ,EAAO4gD,YAAYd,MACvE17C,EAAE/B,QAAQ+B,IACbwD,WAAW,KACT,YAAmB0yF,IACZ,IAANl2F,EAAEgI,KAGP,IAAmBo0C,UAAUz9C,EAAQ,CACnCG,EAAG,kCACHy9C,SAAU3gD,EAAO2gD,eAMzBj8C,EAAA,EAAUtL,iBAAiB,uBAAwB,KACjD,MAAMu6I,EAAQ,IAAI,KAAa,kCAA8BxzI,EAAW,CAACizB,iBAAiB,IACpFxD,EAAIn3B,SAASC,cAAc,OACjCk3B,EAAE53B,UAAUW,IAAI,kCACfg7I,EAAcz6I,UAAUgsB,YAAY0K,GAErC,MAAMvmB,EAAS5Q,SAASC,cAAc,OACtC2Q,EAAOrR,UAAUW,IAAI,UACrB0Q,EAAOlQ,OAAO,YAAK,sBAEnB,MAAM2uB,EAAWrvB,SAASC,cAAc,OACxCovB,EAAS9vB,UAAUW,IAAI,YACvBmvB,EAAS3uB,OAAO,YAAK,yBAErBy2B,EAAEz2B,OAAOkQ,EAAQye,GAEjBrvB,SAASgC,KAAKzC,UAAUW,IAAI,eAE5Bg7I,EAAMv6I,iBAAiB,QAAS,KAC9BX,SAASgC,KAAKzC,UAAUW,IAAI,yBAE5Bs5J,GAAA,EAAeC,mBAEftqJ,WAAW,KACTnP,SAASgC,KAAKzC,UAAUoE,OAAO,cAAe,0BAC7C,OAGLu3I,EAAMz+G,SAIRxwB,EAAA,EAAUtL,iBAAiB,gBAAiB,EAAEu1C,SAC5C72C,KAAK04J,4BAA4B7hH,KAGnCjqC,EAAA,EAAUtL,iBAAiB,uBAAyBklC,IAClDw2C,GAAkB,CAChBt5D,OAAQ,CAAC8V,QAAS,KAAM0oC,UAAU,GAClCpmC,YAAa,IAAkB+X,aAAarN,EAAOz+B,aAIvD6pF,GAAA,EAAaj+E,IAAI,iBAAiBhQ,KAAMm0B,IACtC85D,GAAA,EAAayoE,WAAW,gBAAiBviI,GAAK,OAG7C,IAAqB,MACtB93B,KAAKs6J,WAAa,IAAI,GAAW,KAAsB,IAAiB,IAAiB,IAAmB,KAG3G,KACD1tJ,EAAA,EAAUtL,iBAAiB,gBAAiB,EAAEwqI,eAK5C,MAAM+P,EAAQ,IAAI,GAAU,CAC1BqS,gBAAA,GACAkG,kBAAA,IACA5jE,gBAAA,IACAs7C,aAGFA,EAASxqI,iBAAiB,qBAAsB,IACvCtB,KAAKu6J,mBAAmBzuB,EAASqW,mBAAmB52H,gBAAYljB,EAAWyjI,GACjFnoI,KAAK,KACJiJ,EAAA,EAAU0F,cAAc,iBAAkBw5H,IACnC,IAERp7H,MAAM,KAAM,IAGfmrI,EAAMv6I,iBAAiB,QAAS,KAC9B,MAAMm1J,EAAc,GAAgBA,YACjCA,GAAeA,IAAgB3qB,IAAaA,EAAS4W,iBACtD5W,EAASoT,OAAO,+BAEjB,CAACrgI,MAAM,IAEVg9H,EAAMz+G,SAGRxwB,EAAA,EAAUtL,iBAAiB,oBAAsByV,IAC/C6iB,GAAS,CACPC,YAAa,uBACbC,kBAAmB,CACjB,IAAI,KAAU,CAAC7uB,OAAQ8L,EAAOwU,aAAaxQ,cAQnDo/I,GAAA,EAAeC,mBAEf,MAAMI,EAAgB,KACpBC,GAAA,QAAqBD,eAAc,IAGrCznH,YAAYynH,EAAe,MAC3BA,IAEAx6J,KAAK06J,kBAAsB,CACzBl6J,KAAM,kBACN47B,SAAU,CAACpe,EAAQjD,KACjB,MAAM29C,EAAO39C,EAAQ29C,KAEfpsD,EAAIyO,EAAQ7Z,WAAU,GAC5BoL,EAAE0B,UAAY,aACd1B,EAAEshB,UAAY8qC,EACdpsD,EAAEq+B,gBAAgB,WAElB,IAAI,GAAU,mBAAoB,CAChC9S,aAAc,eACdgE,mBAAoB,gBACpBG,oBAAqB,CAAC1vB,GACtB+uB,QAAS,CAAC,CACR7B,QAAS,OACT4C,SAAU,KACR9vB,EAAE6zB,aAGL/C,UAIPp9B,KAAK06J,kBAA+D,CAClEl6J,KAAM,iBACN47B,SAAU,EAAEu+H,gBACV,MAAM,QAACtuC,EAAO,IAAEjoD,GAAOu2F,EAOvB,IAAmB9hE,SAAS74F,KAAK4wB,KAAK3lB,OAAQ,IAAMohH,GAAWjoD,EAAM,IAAMA,EAAM,QAMrFpkE,KAAK06J,kBAAkD,CACrDl6J,KAAM,kBACN47B,SAAU,EAAEu+H,gBACV,MAAM,QAACC,GAAWD,EACdC,GAIJ56J,KAAK4wB,KAAK2zD,WAAW,IAAMq2E,EAAU,QAIzC56J,KAAK06J,kBAA6D,CAChEl6J,KAAM,cACN47B,SAAU,EAAEy+H,qBACV,MAAM59H,EAAqB,CACzB7xB,EAAGszF,GAAmBo8D,YACtBtgJ,IAAKqgJ,EAAe,IAGtB76J,KAAKg4G,oBAAoB/6E,MAK7Bj9B,KAAK06J,kBAA0D,CAC7Dl6J,KAAM,WACN47B,SAAU,EAAEy+H,qBACV,MAAM59H,EAAqB,CACzB7xB,EAAGszF,GAAmBoZ,UACtBC,OAAQ8iD,EAAe,IAAMpiG,mBAAmBoiG,EAAe,IAAIl1J,MAAM,IAG3E3F,KAAKg4G,oBAAoB/6E,MAI1B,IACDj9B,KAAK06J,kBAEF,CACDl6J,KAAM,YACNmqJ,SAAU,KACVvuH,SAAU,EAAEu+H,gBACV,MAAM19H,EAAOj9B,KAAK+6J,SAASr8D,GAAmBs8D,WAAYL,GAC1D36J,KAAKg4G,oBAAoB/6E,MAK/Bj9B,KAAK06J,kBAQF,CACDl6J,KAAM,KACN47B,SAAU,EAAOy+H,iBAAgBF,eAAe,mCAC9C,IAAI19H,EAEFA,EADC,IAAkBg+H,qBAAqB5zJ,KAAKwzJ,EAAe,IACrD,CACLzvJ,EAAGszF,GAAmBw8D,kBACtB/uH,MAAO0uH,EAAe,GAAGl1J,MAAM,IAEH,MAAtBk1J,EAAe,GAChB,CACLzvJ,EAAGszF,GAAmBy8D,aACtBtgI,QAASggI,EAAe,GACxB3C,KAAM2C,EAAe,GACrBO,OAAQ,WAAYT,GAAaA,EAAUS,OAC3CC,QAASV,EAAUU,SAGd,CACLjwJ,EAAGszF,GAAmB48D,QACtBC,OAAQV,EAAe,GACvB3C,KAAM2C,EAAe,GACrBQ,QAASV,EAAUU,QACnBp0I,MAAO,UAAW0zI,EAAYA,EAAU1zI,WAAQ5e,GAIpDrI,KAAKg4G,oBAAoB/6E,QAI7Bj9B,KAAK06J,kBAsBF,CACDl6J,KAAM,UACNmqJ,SAAU,KACVvuH,SAAU,EAAEu+H,gBACV,IAAI19H,EACD09H,EAAUxuH,MACXlP,EAAOj9B,KAAK+6J,SAASr8D,GAAmBw8D,kBAAmBP,GAC9B,qBAArBA,EAAUY,SAGlBt+H,EAAOj9B,KAAK+6J,SAASr8D,GAAmB48D,QAASX,IAGnD36J,KAAKg4G,oBAAoB/6E,MAI7Bj9B,KAAK06J,kBAOF,CACDl6J,KAAM,cACNmqJ,SAAU,KACVvuH,SAAU,EAAEu+H,gBACV,MAAM19H,EAAOj9B,KAAK+6J,SAASr8D,GAAmBy8D,aAAcR,GAC5D36J,KAAKg4G,oBAAoB/6E,MAI7Bj9B,KAAK06J,kBAIF,CACDl6J,KAAM,cACNmqJ,SAAU,KACVvuH,SAAU,EAAEu+H,gBACV,MAAM19H,EAAOj9B,KAAK+6J,SAASr8D,GAAmBo8D,YAAaH,GAC3D36J,KAAKg4G,oBAAoB/6E,MAI7B,CAAC,WAAqB,QAAiB1yB,QAAQ/J,IAC7CR,KAAK06J,kBAIF,CACDl6J,OACAmqJ,SAAU,KACVvuH,SAAU,EAAEu+H,gBACV,MAAM19H,EAAOj9B,KAAK+6J,SAASr8D,GAAmBoZ,UAAW6iD,GACzD36J,KAAKg4G,oBAAoB/6E,QAK/Bj9B,KAAK23J,eACL33J,KAAKw7J,wBA3eP,WACE,OAAO5uJ,EAAA,EAAU+R,KAGnB,WACE,OAAO3e,KAAK49D,MAAM59D,KAAK49D,MAAMj8D,OAAS,GAyehC,qBAAqBy6B,GAC3B,OAAOjiB,GAAA,EAAmB+2D,aAAauqF,iBAAkB32E,IACvD,MAAM42E,EAAOC,YAAYh/G,MACzB,OAAOmoC,EAAMnyB,OAAOhvD,KAAMi4J,IACxB,MAAM54H,EAAW44H,EAASnvJ,IAAKovJ,GACtB/2E,EAAMvsE,MAAMsjJ,GAASl4J,KAAMsU,GACzBmkB,EAASnkB,KAIpB,OAAO5S,QAAQC,IAAI09B,GAAUr/B,KAAMkgC,IACjCA,EAAOp3B,IAAI,CAACqvJ,EAAO9zJ,KACjB,IAAI8zJ,EACF,OAGF,MAAMD,EAAUD,EAAS5zJ,GACzB,OAAO88E,EAAM3yE,OAAO0pJ,KAGfx2J,QAAQC,IAAIu+B,EAAOj4B,OAAOc,cAElC/I,KAAK,KACN3D,KAAKkiB,IAAI,gBAAiBy5I,YAAYh/G,MAAQ++G,OAK5C,4BAA4BK,GAClC/7J,KAAK49D,MAAMrzD,QAAQqmB,IACdA,EAAKm7C,kBACNn7C,EAAKm7C,iBAAiBF,cAAcj/D,EAAA,EAAU+2B,SAASC,mBAAqBhT,IAASmrI,KAKnF,8BAA8BC,GACpC,MAAMt7H,EAAWs7H,IAAW,IAAWjlH,OAAS/2C,KAAKw3J,SAAW72J,SAASgC,KACtE3C,KAAKsmD,wBAAwBvlD,gBAAkB2/B,GAChDA,EAASr/B,OAAOrB,KAAKsmD,yBAIjB,wBACN,MAAM21G,EAAc,IAAIt0J,IAAI,CAAC,SAAU,WAAY,OAAQ,YAqF3DhH,SAASgC,KAAKrB,iBAAiB,UApFZvB,I,MACjB,MAAMqH,EAAMrH,EAAEqH,IACd,GAAGwF,EAAA,EAAUsvJ,iBAAmBD,EAAYtwJ,IAAIvE,GAAM,OAEtD,MAAMsT,EAAS3a,EAAE2a,OAMXkW,EAAO5wB,KAAK4wB,KAElB,GAAc,SAAX7wB,EAAEkH,OAAoBlH,EAAEwH,UAAWxH,EAAEuH,SAA+B,UAAnBoT,EAAO43B,QAA3D,CAEO,IAAGvyC,EAAEo8J,QAAmB,YAAR/0J,GAA6B,cAARA,GAkBrC,GAAW,YAARA,EAAmB,CAC3B,GAAIwpB,EAAKxwB,MAAMmxH,YAAa3gG,EAAKxwB,MAAMkiH,eA0BrC,OA1BqD,CACrD,MACM38G,EADiB,IAAmBwkG,kBAAkBv5E,EAAK3lB,OAAQ2lB,EAAKthB,UACjDxH,QAAQnC,MACrC,GAAGA,EAAMg8B,MAAM,KAAS0sE,SAAW1oG,EAAMhE,OAAQ,CAC/C,IAAIy6J,EACJ,IAAI,MAAMvxJ,KAAOlF,EAAO,CACtB,MAAMoC,EAAU6oB,EAAKk6B,WAAWjgD,GAGhC,IAFa7K,KAAK2e,OAASiS,EAAK3lB,OAASlD,EAAQkI,SAAWjQ,KAAK2e,KAAO5W,EAAQwW,OAAO6I,MAGlF,IAAmBm5F,eAAe3vF,EAAKk6B,WAAWjgD,GAAM,QAAS,CAClEuxJ,EAAUvxJ,EACV,OAQHuxJ,IACDxrI,EAAKxwB,MAAMm/G,mBAAmB68C,GAC9B,OAAApyI,EAAA,GAAYjqB,WAMb,GAAW,cAARqH,EACR,WAhDgE,CAChE,MAAMkzE,EAAS,IAAmBhD,eAAeC,iBAAiB3qE,EAAA,EAAU6tE,UAAU,GACtF,IAAI4hF,EACJ,GAAIzvJ,EAAA,EAAU3B,OAIP,CACL,MAAMjD,EAAMsyE,EAAOl/D,UAAUlE,GAAUA,EAAOjM,SAAW2B,EAAA,EAAU3B,QACnE,IAAY,IAATjD,EAAY,CAEbq0J,EAAa/hF,EADa,YAARlzE,EAAoBY,EAAM,EAAIA,EAAM,QAN7C,cAARZ,IACDi1J,EAAa/hF,EAAO,IAUrB+hF,GACDr8J,KAAKmzC,QAAQ,CAACloC,OAAQoxJ,EAAWpxJ,SAmCrC,IACa,QAAX,EAAA2lB,aAAI,EAAJA,EAAMxwB,aAAK,eAAEy8F,eACb98F,EAAE2a,SAAWkW,EAAKxwB,MAAMy8F,cACL,UAAnBniF,EAAO43B,UACN53B,EAAOwlG,aAAa,qBACpB,QACC/3F,EAAA,EAAWC,UAA2B,IAAfpoB,KAAKs7F,SAC7B1qE,EAAKolB,UAAUC,cACfrlB,EAAKxwB,MAAM4yD,UACZ,CACApiC,EAAKxwB,MAAMy8F,aAAa56F,QACxB,OAAAJ,GAAA,GAAgB+uB,EAAKxwB,MAAMy8F,cAG3B,MAAMy/D,EAAW,IAAIC,cAAcx8J,EAAEM,KAAMN,GAC3C6wB,EAAKxwB,MAAMy8F,aAAavqF,cAAcgqJ,OAOpC,SAAuCj8J,EAASs6J,GACtD,OAAO,eACLvvJ,EAAG/K,GACAs6J,GAIM,oBAAoB19H,G,0CAC/B,OAAOA,aAAI,EAAJA,EAAM7xB,GACX,KAAKszF,GAAmB48D,QAAS,CAC/B,MAAMrD,EAASh7H,EAAKi7H,KAAO,IAAsBxgD,mBAAmBz6E,EAAKi7H,WAAQ7vJ,EAC3Em0J,EAAYv/H,EAAKo+H,QAAU,IAAsB3jD,mBAAmBz6E,EAAKo+H,cAAWhzJ,EAE1FrI,KAAKm4J,aAAa,CAChBC,SAAUn7H,EAAKs+H,OACf73D,UAAWu0D,EACXuE,YACA3kE,WAAY56D,EAAKhW,QAEnB,MAGF,KAAKy3E,GAAmBy8D,aAAc,CACpC,MAAMjlJ,EAAS+mB,EAAKpC,QAAQE,WACtB9vB,EAASiL,EAAOqV,UAAS,GAG/B,GADa,IAAgBsR,QAAQ3mB,GAC7B0pB,QACN,UACQ,IAAgB68H,eAAevmJ,GACrC,MAAM5F,GAEN,MADAspB,GAAS,CAACC,YAAa,iBACjBvpB,EAIV,MAAM2nJ,EAAS,IAAsBvgD,mBAAmBz6E,EAAKi7H,MACvD5oJ,EAAW2tB,EAAKm+H,OAAS,IAAsB1jD,mBAAmBz6E,EAAKm+H,aAAU/yJ,EAEpFiH,EAAUtP,KAAK4jG,WAAW34F,EAAQgtJ,EAAQ3oJ,GACxCtP,KAAKutD,aAAa,CACrBtiD,SACAy4F,UAAWu0D,EACX3oJ,aAEF,MAGF,KAAKovF,GAAmBo8D,YACtB,IAAI,GAAc,CAAC/nJ,GAAIkqB,EAAKziB,MAAM4iB,OAClC,MAGF,KAAKshE,GAAmBoZ,UACtB,KAAWl9E,UAAU,2BAA4B,CAC/Cq9B,KAAMh7B,EAAK86E,SACVp0G,KAAKg7F,IACFA,EAAyC/tE,MAC3C,IAAgB8rI,YAAa/9D,EAAyC/tE,MAAM,GAK1D,sBAAjB+tE,EAAWvzF,GACK,mBAAjBuzF,EAAWvzF,EAOb,IAAI,GAAoB6xB,EAAK86E,OAAQpZ,GAAYvhE,OAN/Cp9B,KAAKutD,aAAa,CAChBtiD,OAAQ0zF,EAAW/tE,KAAK7d,GAAGwY,UAAS,MAMtCjb,IACc,wBAAbA,EAAIjQ,MACLs5B,GAAM,YAAK,oBAGf,MAGF,KAAK+kE,GAAmBs8D,WACnB,IACDh7J,KAAK4oI,cAAc3rG,EAAKq0E,QAAQ/lF,UAAS,GAAO0R,EAAKlqB,IAGvD,MAGF,KAAK2rF,GAAmBw8D,kBACtB,IAAgByB,aAAa1/H,EAAKkP,OAAOxoC,KAAK4nC,IAC5CvrC,KAAKutD,aAAa,CAChBtiD,OAAQsgC,EAAKx4B,GAAGwY,UAAS,OAE1B7a,MAAMJ,IACS,uBAAbA,EAAIjQ,MACLu5B,GAAS,CAACC,YAAa,6BAI3B,MAGF,QACE75B,KAAKkiB,IAAI3E,KAAK,+BAAgC0f,OAM7C,QAAQ3iB,GACb,MAAOA,IAAKsiJ,EAAU,QAAE7E,GAAW,IAAkBC,QAAQ19I,GACvDhO,EAAI3L,SAASC,cAAc,KACjC0L,EAAEosD,KAAOkkG,EAER16J,OAAe61J,GAASzrJ,GAGnB,kBAA0E5M,GAQ/EwC,QAAgBxC,EAAQirJ,SAAWjrJ,EAAQirJ,SAAW,IAAM,IAAMjrJ,EAAQc,MAASua,IAClF,OAAAiP,EAAA,GAAY,MAEZ,MAAM0uC,EAAO39C,EAAQ29C,KACrB,IAAImiG,EACAF,EAEAj7J,EAAQm9J,mBAAkBhC,EAAiB,IAAItxG,IAAIxuC,EAAQ29C,MAAMokG,SAASz5G,MAAM,KAAK19C,MAAM,IAC3FjG,EAAQq9J,cAAapC,EAAY36J,KAAK43J,eAAel/F,IAEzD,MAAM3oD,EAAMrQ,EAAQ08B,SAAS,CAACy+H,iBAAgBF,aAAsB5/I,GACpE,YAAe1S,IAAR0H,GAAoBA,GAIvB,eAAegI,EAAa+nD,EAAW/nD,EAAIsrC,MAAM,MACvD,MAAMrlC,EAAc,GACpB,OAAI8hD,EAAS,IACbA,EAAS,GAAGzc,MAAM,KAAK94C,QAAQnB,IAC7B4U,EAAO5U,EAAKi6C,MAAM,KAAK,IAAMoV,mBAAmBrvD,EAAKi6C,MAAM,KAAK,MAG3DrlC,GALiBA,EAwDnB,aAAate,GAOlB,MAAM,SAAC04J,EAAQ,UAAE10D,EAAS,SAAEp0F,EAAQ,UAAEktJ,EAAS,WAAE3kE,GAAcn4F,EAC/D,OAAO,IAAgBs6F,gBAAgBo+D,GAAUz0J,KAAK2iC,IACpD,MAAMvE,EAAoB,SAAXuE,EAAKl7B,EACdH,EAASq7B,EAAKvzB,GAAGwY,UAAUwW,GAEjC,OAAGzyB,EACMtP,KAAK4jG,WAAW34F,EAAQy4F,EAAWp0F,GAClCktJ,EACDx8J,KAAKg9J,YAAY/xJ,EAAQy4F,EAAW84D,GAGtCx8J,KAAKutD,aAAa,CACvBtiD,SACAy4F,YACA7L,WAAYA,KAEZvnF,IACc,0BAAbA,EAAIjQ,KACLu5B,GAAS,CAACC,YAAa,oBACF,qBAAbvpB,EAAIjQ,MACZu5B,GAAS,CAACC,YAAa,6BAQtB,WAAW5uB,EAAgBy4F,EAAmBp0F,GACnD,OAAO,IAAmBqhF,kBAAkB1lF,EAAQqE,GAAU3L,KAAK,KACjE,MAAMoE,EAAmB,IAAmB0Y,iBAAiBxV,EAAQqE,GAOrE,MANiB,iBAAdvH,EAAQqD,EACTs4F,OAAYr7F,EAEZ,IAAmB40J,kCAAkCl1J,GAGhD/H,KAAKutD,aAAa,CACvBtiD,SACAy4F,YACAp0F,WACAjP,KAAM,iBAQL,YAAY4K,EAAgB+/F,EAAewxD,GAChD,OAAO,IAAmB14D,qBAAqB74F,EAAQ+/F,GAAOrnG,KAAKoE,GAC1D/H,KAAK4jG,WAAW77F,EAAQkD,OAAQuxJ,EAAWz0J,EAAQ8C,MAIjD,SAASkM,EAAgB1W,G,0CAEpC,GADa,GAAgB68J,gBAAgBnmJ,GAE3C,cAGqB,UAAkBu/D,WAAWv/D,IACxCwH,OAAO4+I,oBACjBngF,GAAkB,CAChBnhD,mBAAoB,2BACpBG,oBAAqB,CAAC,IAAI,KAAU,CAAC/wB,OAAQ8L,EAAOwU,aAAaxQ,SACjE2I,OAAQ,CACN8V,QAAS,KACT0oC,UAAU,YAOVliE,KAAKu6J,mBAAmBxjJ,EAAOwU,YAErC,GAAgB6xI,kBAAkBrmJ,EAAiB,UAAT1W,OAGpC,mBAAmBkrB,EAAkB8xI,EAAqCC,GAChF,OAAG,KAAqBl1B,WAAa,KAAqBA,YAAci1B,EAAwBr9J,KAAKu9J,6BAA6BhyI,GAC1H,GAAgBkrI,aAAe,GAAgBA,cAAgB6G,EAAmBt9J,KAAKw9J,wBAAwBjyI,GAC3GlmB,QAAQ6E,UAGR,wBAAwBqhB,G,0CACpC,MAAMkrI,EAAc,GAAgBA,YACjCA,UACKz5E,GAAkB,CACtBnlD,aAAc,mCACdgE,mBAAoBtQ,EAASwW,SAAW,wCAA0C,yCAClF/F,oBAAqB,CACnB,IAAI,KAAU,CAAC/wB,OAAQwrJ,EAAYtU,mBAAmB52H,UAAS,KAASxQ,QACxE,IAAI,KAAU,CAAC9P,OAAQsgB,IAAWxQ,SAEpC2I,OAAQ,CACN8V,QAAS,QAITi9H,EAAY1I,kBACR0I,EAAYvX,OAAO,yCAKjB,6BAA6B3zH,G,0CACzC,MAAM48G,EAAmB,KAAqBC,UAC3CD,UACKnrD,GAAkB,CACtBnlD,aAAc,oCACdgE,mBAAoBtQ,EAASwW,SAAW,yCAA2C,0CACnF/F,oBAAqB,CACnB,IAAI,KAAU,CAAC/wB,OAAQk9H,EAAiBjyH,OAAOqV,UAAS,KAAQxQ,QAChE,IAAI,KAAU,CAAC9P,OAAQsgB,IAAWxQ,SAEpC2I,OAAQ,CACN8V,QAAS,QAIV,KAAqB4uG,YAAcD,UAC9BA,EAAiB+W,cAKhB,cAAcj0I,EAAgByvI,G,0CACzC,MAAMxkI,EAASjL,EAAO8vB,WAChBkH,EAAY,IAAgBA,UAAU/rB,EAAQ,eAiBpD,GAAGwkI,EAAa,CAEd,GAAmB,8BADK,KAAqB+iB,iBAAiB/iB,IACjDtvI,EAA4B,CACvC,IAAI62B,EAKF,YAJArI,GAAS,CACPC,YAAa,+BAMXmjD,GAAkB,CACtBnhD,mBAAoB,0BACpBnY,OAAQ,CACN8V,QAAS,uCAMXx5B,KAAKu6J,mBAAmBtvJ,GApCjB,MAAW,mCACtB,MAAM8xB,QAAiB,UAAkBqL,YAAYlyB,GACrD,IAAIswI,EACJ,GAAIzpH,EAASypH,KAOXA,EAAO,KAAqBkX,cAAc3gI,EAASypH,KAAMtwI,OAPxC,CACjB,IAAI+rB,EACF,OAGFukH,QAAa,KAAqBmX,gBAAgBznJ,GAKpD,KAAqB0yH,cAAc1yH,EAAQswI,EAAKzzI,IAAI,GAAM,OAyB5DvK,MAGK,qBAAqBo1J,GAAiB,GAC3C,MAAMhvF,EAAQhiE,EAAA,EAAUuiE,WAExB,GAAGP,EAAMD,WAAWG,KAAM,CACxB,MAAM8B,EAAe,IAAgBitF,WAAWl6H,SAASktC,OAAOx8D,KAAKC,GAAKA,EAAE9T,OAASouE,EAAMpuE,MAKzF,OAAOR,KAAK89J,cAAclvF,EAAMD,WAAWG,MAAMnrE,KAAM2W,GAC9Cta,KAAK+9J,cAAczjJ,EAAKsjJ,GAC9B,KACDhvF,EAAMD,WAAa,OAAA7tD,GAAA,GAAK8vD,EAAajC,YAC9B3uE,KAAKg+J,sBAAqB,KAKvC,OAAOh+J,KAAK+9J,cAAc,GAAIH,GAGxB,cAAc9uF,GACpB,OAAG9uE,KAAKm5J,mBAAmBrqF,GAAc9uE,KAAKm5J,mBAAmBrqF,GAC1D9uE,KAAKm5J,mBAAmBrqF,GAAQ30D,GAAA,EAAmB+2D,aAAa+sF,QAAQ,eAAiBnvF,GAAMnrE,KAAKikD,GAClG2B,IAAIC,gBAAgB5B,IAIxB,cAActtC,EAAasjJ,GAAiB,GACjD59J,KAAKk+J,kBAAoB5jJ,EACzB,MAAM0oB,EAAWhjC,KAAK49D,MAAMnxD,IAAImkB,GAAQA,EAAKmtI,cAAczjJ,IAC3D,OAAO0oB,EAASA,EAASrhC,OAAS,GAAGgC,KAAK,KACrCi6J,GACDhxJ,EAAA,EAAU0F,cAAc,uBAKvB,iBAAiBse,GACtB,IAAK,CAAC,OAAQ,cAA6BqO,SAASrO,EAAKvwB,QAAUuwB,EAAK3lB,OACtE,OAMA,MAAMkzJ,EAAcvtI,EAAKC,QACnBzpB,EAAMwpB,EAAK3lB,QAAU2lB,EAAKthB,SAAW,IAAMshB,EAAKthB,SAAW,IAC3D8uJ,EAAgBxsE,GAAA,EAAaysE,aAAa,iBAChD,GAAKF,EAAY5uJ,WAAWk2F,oBAAsB,IAAM04D,EAAY5uJ,WAAWxG,UAAU2c,SAAWy4I,EAAYzoD,2BAavG0oD,EAAch3J,GAErBpH,KAAKkiB,IAAI,6BAf0H,CACnIi8I,EAAYn2D,eAAc,GAC1B,MAAMtvE,EAAMylI,EAAY5uJ,WAAWwgC,UAE7BpX,EAAW,CACf1sB,KAAM,OAAAuwD,GAAA,GAAqB2hG,EAAYttI,QAAS,QAAQjlB,OAAOf,IAAQszJ,EAAYx9D,YAAYh1F,IAAId,IACnG6tB,OAGF0lI,EAAch3J,GAAOuxB,EAErB34B,KAAKkiB,IAAI,uBAAwByW,GAOnCi5D,GAAA,EAAap3E,IAAI,CAAC4jJ,kBAAgB,GAI/B,qBAAqBxtI,GAC1B,IAAK,CAAC,OAAQ,cAA6BqO,SAASrO,EAAKvwB,QAAUuwB,EAAK3lB,OACtE,OAGF,MAAM7D,EAAMwpB,EAAK3lB,QAAU2lB,EAAKthB,SAAW,IAAMshB,EAAKthB,SAAW,IAC3Dw1E,EAAQ8M,GAAA,EAAaysE,aAAa,iBACxC,OAAOv5E,GAASA,EAAM19E,GAGjB,0BACL,IAAIkgE,EACJ,MAAMsH,EAAQhiE,EAAA,EAAUuiE,WACrBP,EAAMD,WAAWhH,oBAClBL,EAAOsH,EAAMD,WAAWhH,mBACxBhnE,SAAS22C,gBAAgBnyC,MAAMqB,YAAY,gCAAiC8gE,IAE5E3mE,SAAS22C,gBAAgBnyC,MAAMogF,eAAe,kCAG5C,MAAsBje,IACxB16D,EAAA,EAAU0xJ,WpJrkCT,SAAyBh3F,GAC9B,OAAOD,GAAiBC,GAAM3hE,MAAM,GAAI,GoJokCb44J,CAAgBj3F,IAIpC,kBAAkBwH,EAAe0vF,EAAwBZ,GAS9D,OARA59J,KAAKy+J,0BAEL7xJ,EAAA,EAAU8xJ,WAEPF,IACDx+J,KAAKm5J,mBAAmBrqF,GAAQzpE,QAAQ6E,QAAQs0J,IAG3Cx+J,KAAKg+J,0BAAwC31J,IAAnBu1J,IAAiC9uF,EAAO8uF,GAiCnE,eAAexqJ,EAAkBJ,GACvC,GAAGhT,KAAK2+J,UAAYvrJ,EAApB,CAQA,IAJe,IAAZJ,GAAqBhT,KAAK2+J,SAC3BxsB,GAAkB,CAAC/+H,EAAKpT,KAAK2+J,SAAS/yJ,OAAOc,UAG5C1M,KAAK2+J,QAAS,CACf3+J,KAAK2+J,QAAQz+J,UAAUoE,OAAO,UAC9BtE,KAAKs4J,0BAGF1rJ,EAAA,EAAU+2B,SAASC,oBAAiC,IAAZ5wB,GACzC,aAA4B,OAAA/O,GAAA,GAAM,KAAY,KAGhD,MAAM26J,EAAU,OAAAzzG,GAAA,GAAWnrD,KAAK2+J,SACpB,OAAAxzG,GAAA,GAAW/3C,GACdwrJ,GACPjsJ,EAAA,EAAwBmB,SAAS,CAC/BzT,KAAM,OACN0T,MAAQC,IACNhU,KAAKmzC,QAAQ,GAAIn/B,GACjB,OAAAw9C,GAAA,QAMRp+C,EAAIlT,UAAUW,IAAI,UAClBb,KAAK2+J,QAAUvrJ,GAGT,OACNzS,SAASW,iBAAiB,QAAStB,KAAK24J,iBAAiB,GAErD,MACF34J,KAAK6+J,6BAIL7+J,KAAKmwH,cAAgB,IAAI,GAAcnwH,MACvCA,KAAKmwH,cAAc2uC,kBAIf,6BACN,MAAMC,EAA2B,GAC3BC,EAAgC,GACtC,IAAIxrG,GAAU,EACd,MAAMrzD,EAAS,CAAMJ,EAAck/J,IAAmB,mCACpD,GAAGA,IAAUzrG,EAAS,OAEtB,MAAMwlG,EAASj5J,EAAEk5J,aAAa76F,MAExB8gG,EAAUlG,EAAOvjJ,SAAWujJ,EAAOvjJ,SAAS,SAAWujJ,EAAO7zI,QAAQ,UAAY,EAElF0zI,EAAgBn0C,KACtB,IAAIw6C,IAAal/J,KAAK84J,YAAcD,EAElC,YADAr9F,EAAU,GAIZ,MAAM2jG,EAAkBtG,EAAgBuG,EAAsBC,EACxDC,EAASzG,EAAgBmG,EAAaD,EAE5C,GAAGE,IAAUK,EAAO39J,OAAQ,CAC1B,MAAMy8D,QAAwB,aAAkBr+D,GAAG,GAC7CgkH,EAAQm7C,IAAY9gG,EAAMz8D,OAE1B49J,EAAanhG,EAAMxyD,OAAO0I,GAAK,EAA2B3I,IAAI2I,IAAI3S,OAGxE3B,KAAKkiB,IAAI,aAAck8C,GAEpBy6F,GACDA,EAAc2G,YAAYL,IAEvB/gG,EAAMz8D,QAAUoiH,IACjBu7C,EAAO/1J,KAAK,IAAI,GAAgB41J,EAAiB,CAC/C5tJ,OAAQ,4BACR2gI,WAAY,CAAC9zE,EAAMz8D,QACnBmwI,OAAS/xI,IACPI,EAAOJ,GAAG,GACV,GAAamiB,IAAI,OAAQniB,GACzB,GAAa44J,gBAAgB54J,EAAG,mBAKnCq+D,EAAMz8D,QAAUoiH,IACjBu7C,EAAO/1J,KAAK,IAAI,GAAgB41J,EAAiB,CAC/ChuJ,KAAM,YACNI,OAAQ,iBACRye,SAAU,uBACV8hH,OAAS/xI,IACPI,EAAOJ,GAAG,GACV,GAAamiB,IAAI,OAAQniB,GACzB,GAAa44J,gBAAgB54J,EAAG,iBAMnCw/J,GAAcx7C,IACfu7C,EAAO/1J,KAAK,IAAI,GAAgB41J,EAAiB,CAC/ChuJ,KAAM,YACNI,OAAQ,iBACRye,SAAU,qBACV8hH,OAAS/xI,IACPI,EAAOJ,GAAG,GACV,GAAamiB,IAAI,OAAQniB,GACzB,GAAa44J,gBAAgB54J,EAAG,aAKtCC,KAAK4wB,KAAKxvB,UAAUC,OAAO89J,IAM/B,aAAcA,EAAiB,aAAcF,EAAO,IAAK,KACnDA,IACFK,EAAO/0J,QAAQk1J,IACbA,EAAK9gD,YAGP2gD,EAAO39J,OAAS,KAIjBs9J,EACDK,EAAO/0J,QAAQk1J,IACbA,EAAKC,YAGPlkG,EAAU,EAGZ76D,SAASgC,KAAKzC,UAAUC,OAAO,cAAe8+J,GAC9CzrG,EAAUyrG,KAOZ,IAAIzjG,EAAU,EACd76D,SAASgC,KAAKrB,iBAAiB,YAAcvB,IAC3Cy7D,MAGF76D,SAASgC,KAAKrB,iBAAiB,WAAavB,IAE1CI,EAAOJ,GAAG,GACV,OAAAiqB,EAAA,GAAYjqB,KAGdY,SAASgC,KAAKrB,iBAAiB,YAAcvB,IAG3Cy7D,IACe,IAAZA,GAEDr7D,EAAOJ,GAAG,KAId,MAAMs/J,EAAiB1+J,SAASC,cAAc,OAC9Cy+J,EAAen/J,UAAUW,IAAI,mBAE7B,MAAMu+J,EAAsBC,EAAen+J,WAAU,GAG/C,UACN,MAAM0vB,EAAO5wB,KAAK4wB,KAElB,UADeA,aAAI,EAAJA,EAAM3lB,SACD2B,EAAA,EAAUsvJ,kBAAoBtrI,EAAK62E,QAAQ,eAiC1D,UAAU10F,EAAYC,IACZ,IAAZA,GACDm/H,GAAkB,CAAC,GAAe3+H,UAAWxT,KAAKw3J,SAAU,GAAgBhkJ,YAG9E7S,SAASgC,KAAKzC,UAAUC,OtH76CgB,uBsH66C4B,IAAP4S,GAE7D,MAAMgiD,EAAY/0D,KAAKs7F,MAEvBt7F,KAAKkiB,IAAI,YAAanP,EAAIgiD,GAE1B,IAAIrd,EAAiC9qC,EAAA,EAAU+2B,SAASC,kBAAoB,eAAcv+B,QAAQ6E,UAClG,IAAkB,IAAf6qD,GAAoBA,IAAchiD,GAAMnG,EAAA,EAAU+2B,SAASC,oBAAiC,IAAZ5wB,EAAmB,CACpG,MAAM2sJ,EAAqD,KAAnCx3I,EAAA,EAAWC,SAAW,IAAM,KACpDsvB,EAAmB,OAAAzzC,GAAA,GAAM07J,GACzB,aAA4BjoH,EAAkBioH,GAgChD,OAvBA3/J,KAAKs7F,MAAQvoF,EACb,OAAAy+C,GAAA,KACGrpC,EAAA,EAAWC,UAA0B,IAAd2sC,GAAmBhiD,EAAK,GAChDpS,SAASgC,KAAKzC,UAAUoE,O/L3+Ce,0B+L8+CvB,IAAfywD,GAAoBhiD,EAAKgiD,IACvBhiD,EAAK,IAAMJ,EAAA,EAAwBC,eAAe,QACnDD,EAAA,EAAwBmB,SAAS,CAC/BzT,KAAM,KACN0T,MAAQC,IAENhU,KAAKmzC,QAAQ,GAAIn/B,MAMzBpH,EAAA,EAAU0F,cAAc,gBAAiBS,GAKlC2kC,EAGF,eACL,OAAI13C,KAAK2e,MAET,IAAgBihJ,cAAc5/J,KAAK2e,KAAM3e,KAAKy3J,SACvC,KAAWv1D,gBAAgB,uBAAwB,CAACu1D,QAASz3J,KAAKy3J,WAHnDpyJ,QAAQ6E,UAMxB,gBACN,MAAM0mB,EAAO,IAAI,GAAK5wB,KACpB,IACA,IACA,GACA,IACA,IACA,IACA,UACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA4xF,GAAA,EACA,KACA,GACA,IACA,KACA,MASF,OANG5xF,KAAK49D,MAAMj8D,QACZivB,EAAKmtI,cAAc/9J,KAAKk+J,mBAAmB,GAG7Cl+J,KAAK49D,MAAMr0D,KAAKqnB,GAETA,EAGD,YAAYivI,EAAmBC,GAAa,EAAM9sJ,EAAmB+sJ,GAC3E,GAAGF,GAAa7/J,KAAK49D,MAAMj8D,OAAQ,OAEnC,MAAMq+J,EAAWhgK,KAAK4wB,KACnB5wB,KAAK49D,MAAMj8D,OAAS,GAAKm+J,GAC1BlzJ,EAAA,EAAU0F,cAAc,gBAAiBtS,KAAK4wB,MAG5CmvI,IACFA,EAAU//J,KAAK49D,MAAMx1D,OAAOy3J,EAAW7/J,KAAK49D,MAAMj8D,OAASk+J,IAG7DjzJ,EAAA,EAAU0F,cAAc,gBAAiB,CAAClG,KAAM4zJ,EAAUnpH,GAAI72C,KAAK4wB,OAGnE,IAAI,IAAIhvB,EAAI,EAAGA,EAAIm+J,EAAQp+J,OAAS,IAAKC,EACvC+Q,EAAA,EAAwB6B,aAAa,QAAQ,GAY/C,GARGurJ,EAAQp+J,OAAS,GAClBo+J,EAAQp6J,MAAM,GAAI,GAAG4E,QAAQqmB,IAC3BA,EAAKxvB,UAAUkD,WAInBtE,KAAKw5J,eAAex5J,KAAK4wB,KAAKxvB,UAAW4R,GAEtC8sJ,EAAY,CACblzJ,EAAA,EAAU0F,cAAc,eAAgBtS,KAAK4wB,KAAK3lB,QAElD,MAAMkjI,EAAY,GAAgB55H,OAAO,IACtC45H,GACDA,EAAUvwG,QAGE,GAAgBsZ,eAAe/D,QAAQnzC,KAAK4wB,KAAK3lB,OAAQjL,KAAK4wB,KAAKthB,YAE/E,GAAgB4nC,eAAeo3F,kBAAiB,GAChD,GAAgBp3F,eAAeV,uBAQnCupH,EAAQx1J,QAAQqmB,IACdA,EAAKqvI,kBAGPnwJ,WAAW,KAETiwJ,EAAQx1J,QAAQqmB,IACdA,EAAK+tF,aAEN,KAGE,QAAQj/G,EAA8B,GAAIsT,G,MAC5ChT,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGA,QAAd,EAAAtS,EAAQuL,cAAM,QAAdvL,EAAQuL,OAAW,MAEnB,MAAM,OAACA,EAAM,UAAEy4F,GAAahkG,EAEtBkxB,EAAO5wB,KAAK4wB,KACZsvI,EAAYlgK,KAAK49D,MAAMz4C,QAAQyL,GAErC,GAAI3lB,GAQG,GAAGi1J,EAAY,GAAKtvI,EAAK3lB,QAAU2lB,EAAK3lB,SAAWA,EAAQ,CAO9D,MAAM80J,EAAU//J,KAAK49D,MAAMx1D,OAAO,EAAGpI,KAAK49D,MAAMj8D,OAAS,GACzD,GAAG3B,KAAK4wB,KAAK3lB,SAAWA,EAEtB,YADAjL,KAAKmgK,YAAY,GAAG,GAAM,EAAMJ,GAE3B,CACL,MAAMvyJ,EAAMxN,KAAKmzC,QAAQzzC,GAEzB,OADAM,KAAKmgK,YAAY,GAAG,GAAO,EAAOJ,GAC3BvyJ,QAtBD,CACV,GAAG0yJ,EAAY,EAEb,YADAlgK,KAAKmgK,YAAYD,OAAW73J,EAAW2K,GAElC,GAAGmV,EAAA,EAAW6hH,eAAiB,IAAWlzF,OAE/C,YADA92C,KAAKiS,YAAYjS,KAAKs7F,MAAOtoF,GA2BjC,GAAG/H,IAAW2lB,EAAK3lB,QAAUkd,EAAA,EAAW6hH,cAAgB,IAAWlzF,QAAUn2C,SAASgC,KAAKzC,UAAUuV,StH1mD7D,wBsH4mDtC,OADAzV,KAAKiS,UAAU,EAAGe,IACX,EAGT,GAAG/H,GAAUkd,EAAA,EAAW6hH,eAAiB,IAAWjzF,OAAQ,CAC1D,MAAMzsC,EAASsmB,EAAKuiB,QAAQloC,EAAQy4F,EAAWhkG,EAAQm4F,YAGjDztF,GAAUE,aAAM,EAANA,EAAQ0V,QAAS1V,EAAOF,QAAU/E,QAAQ6E,UACvDe,GACD5F,QAAQC,IAAI,CACV8E,EACAwmB,EAAK88G,uBACJ/pI,KAAK,KAENmM,WAAW,KACTA,WAAW,KACT9P,KAAKw5J,eAAex5J,KAAK4wB,KAAKxvB,YAC7B,GACHpB,KAAKiS,UAAU,EAAGe,IACjB,KAKT,OAAI/H,OAAJ,GACEjL,KAAKiS,UAAU,EAAGe,IACX,GAIJ,aAAatT,G,MAClB,MAAM,OAACuL,GAAUvL,EACjB,GAAGuL,IAAW,OAAiBA,EAC7B,OAGF,MAAM5K,EAAmB,QAAf,EAAGX,EAAQW,YAAI,QAAZX,EAAQW,KAAS,OAGxB+/J,EAAgBpgK,KAAK49D,MAAMxiD,UAAUwV,GAAQA,EAAK3lB,SAAWA,GAAU2lB,EAAKvwB,OAASA,GAC3F,IAAsB,IAAnB+/J,EAED,OADApgK,KAAKmgK,YAAYC,EAAgB,GAC1BpgK,KAAKmzC,QAAQzzC,GAGtB,MAAM2gK,EAAUrgK,KAAK4wB,KACrB,IAAIA,EAAOyvI,EAiBX,OAhBGA,EAAQxlE,SACTjqE,EAAO5wB,KAAKu5J,iBAGXl5J,IACDuwB,EAAK0vI,QAAQjgK,GAEVX,EAAQ4P,WACTshB,EAAKthB,SAAW5P,EAAQ4P,WAI5B1C,EAAA,EAAU0F,cAAc,gBAAiB,CAAClG,KAAMi0J,EAASxpH,GAAIjmB,IAItD5wB,KAAKmzC,QAAQzzC,GAGf,cAAcuL,GACnBjL,KAAKutD,aAAa,CAChBtiD,SACA5K,KAAM,cAIF,iBAAiB6H,GACvB,MAAMpG,EAAKnB,SAASC,cAAc,QAClC,IAAIk3B,EAAI,cAGR,OAFAh2B,EAAG5B,UAAUW,IAAIi3B,GACjBh2B,EAAGoF,QAAQgB,OAASA,EAAOkD,EACpBlD,EAAOkD,GACZ,IAAK,0BAEH0sB,GAAK,QACL,IAAI,IAAIl2B,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM2+J,EAAM5/J,SAASC,cAAc,QACnC2/J,EAAIvyJ,UAAY8pB,EAAI,OACpBh2B,EAAGT,OAAOk/J,GAEZ,MAGF,IAAK,+BACL,IAAK,kCACL,IAAK,+BACL,IAAK,+BACL,IAAK,+BACHzoI,GAAK,UAIL,MAGF,IAAK,+BACL,IAAK,+BACL,IAAK,+BACHA,GAAK,UACL,MAGF,IAAK,kCACL,IAAK,iCACHA,GAAK,oBACL,IAAI,IAAIl2B,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM4+J,EAAM7/J,SAASC,cAAc,OACnC4/J,EAAIxyJ,UAAY8pB,EAAI,OACpBh2B,EAAGT,OAAOm/J,IAQhB,OAFA1+J,EAAG5B,UAAUW,IAAIi3B,GAEVh2B,EAGF,cAAcmJ,EAAgB7J,GACnC,IAAI,IAAgBstG,MAAMzjG,GAAS,CACjC,MAAM+uJ,EAAU,UAAkByG,eAAex1J,GACjD,IAAI+uJ,IAAYA,EAAQr4J,OACtB,OAGF,MAAMu4J,EAASF,EAAQ,GAEjB0G,EAEF,CACF5iF,QAAS,CACP,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,qCAClC,gCAAmC,yCAErCltD,KAAM,CACJ,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,qCAClC,gCAAmC,yCAErC+vI,MAAO,CACL,wBAA2B,uCAC3B,6BAAgC,wCAChC,gCAAmC,wCACnC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,0BAA6B,wCAC7B,+BAAkC,8CAIhCC,EAAO31J,EAAO82B,SAAW2+H,EAAa5iF,QAAWk8E,EAAQr4J,OAAS,EAAI++J,EAAaC,MAAQD,EAAa9vI,KAC9G,IAAI1oB,EAASgyJ,EAAOhyJ,OAEpB,GAAG8xJ,EAAQr4J,OAAS,EAAG,CACrB,MAAMma,EAAS,GACfk+I,EAAQzvJ,QAAQ2vJ,IACd,MAAM75J,EAAO65J,EAAOhyJ,OAAOkD,OACZ/C,IAAZyT,EAAEzb,KAAqByb,EAAEzb,GAAQ,KAClCyb,EAAEzb,KAGHsd,OAAOg1C,KAAK72C,GAAGna,OAAS,IACzBuG,EAAS,CACPkD,EAAG,4BAKT,MAAMyuB,EAAc+mI,EAAK14J,EAAOkD,GAChC,IAAIyuB,EACF,OAGEz4B,IACFA,EAAYT,SAASC,cAAc,SACzBV,UAAUW,IAAI,SAAU,yBAGpCO,EAAUlB,UAAUC,OAAO,mBAAiC,mCAAb+H,EAAOkD,GAAuD,oCAAblD,EAAOkD,GAEvG,IAUI2G,EAVA8uJ,EAAgBz/J,EAAU6qB,kBAkB9B,GAjBI40I,EAICA,EAAc35J,QAAQgB,SAAWA,EAAOkD,GACzCy1J,EAAczzI,YAAYptB,KAAK8gK,iBAAiB54J,KAJlD24J,EAAgB7gK,KAAK8gK,iBAAiB54J,GACtC9G,EAAUJ,QAAQ6/J,IAQjB51J,EAAOm4B,cACRrxB,EAAO,CACL,IAAI,KAAU,CAAC9G,OAAQivJ,EAAOnjJ,OAAOwU,UAAS,GAAQmvC,eAAe,IAAO3/C,QAC5Ei/I,EAAQr4J,OAAS,IAIL,oCAAbuG,EAAOkD,EAAyC,CAC9C2G,EACDA,EAAK1I,MAEL0I,EAAO,GAGT,MAAMk7B,EAAO,OAAA8zH,GAAA,GAAW,IAAkBx0I,cAAcrkB,EAAO2gD,WAC/D92C,EAAKxI,KAAK0jC,GAGZ,MAAM+zH,EAAqB,YAAKnnI,EAAa9nB,GAK7C,OAJAivJ,EAAmB9gK,UAAUW,IAAI,2BAE9BO,EAAUqN,kBAAoB,EAAGrN,EAAU63C,iBAAiB7rB,YAAY4zI,GACtE5/J,EAAUC,OAAO2/J,GACf5/J,GAIE,cAAc6J,EAAgBg2J,G,gDACzC,IAAIjxI,EACJ,GAAI/kB,EAAJ,CAEA,GAAGA,EAAOm4B,YAAa,CACrB,IAAI6J,EAAOjtC,KAAKkhK,cAAcj2J,GAC9B,GAAGgiC,EACD,OAAOA,EAGT,MAAM/2B,EAASjL,EAAO8vB,WAChBquG,QAAiB,UAAkBhhG,YAAYlyB,GACrDlW,KAAK4wB,KAAK1O,IAAI,gBAAiBknH,GAE/B,MAAM7vE,EAAqB6vE,EAAS7vE,oBAAuB6vE,EAASvmG,cAAgBumG,EAASvmG,aAAaA,cAAgBumG,EAASvmG,aAAaA,aAAalhC,QAAW,EAItK,GAFAquB,EAAW,UAAkBqT,qBAAqBntB,GAE/CqjD,EAAqB,EACtB,OAAOvpC,EAGT,MAAMmxI,QAAgB,UAAkBC,WAAWlrJ,GACnD,GAAGirJ,EAAU,EAAG,CACd,MAAMl0H,EAAOtsC,SAASC,cAAc,QAEpCqsC,EAAK5rC,UAAU,YAAK,CAAC2uB,EAAU,YAAK,cAAe,CAAC,OAAAgvE,GAAA,GAAuBmiE,OAAa,IACxFnxI,EAAWid,EAGb,OAAOjd,EAEJ,CACL,MAAMub,EAAO,IAAgBC,QAAQvgC,GAErC,GAAG2B,EAAA,EAAU+R,OAAS1T,IAAWg2J,EAC/B,OACK,GAAG11H,EAAM,CAGd,GAFAvb,EAAW,IAAgB3Y,oBAAoBk0B,EAAKx4B,KAEhD,IAAgB27F,MAAMzjG,GAAS,CACjC,IAAIgiC,EAAOjtC,KAAKkhK,cAAcj2J,GAO9B,GANIgiC,GAA2B,sBAAR,QAAX,EAAA1B,EAAK6gB,cAAM,eAAEhhD,KACvB6hC,EAAOtsC,SAASC,cAAc,QAC9BqsC,EAAK/sC,UAAUW,IAAI,UACnBosC,EAAK5rC,OAAO2uB,IAGXid,EACD,OAAOA,EAIX,OAAOjd,QAKN,cAAc/kB,EAAgB8P,EAAsBo3B,EAAoBkvH,EAAwB7wI,EAA2BywI,GAC7H9uH,IACDp3B,EAAQvM,UAAY6yJ,EAAgB,IAAM,IAI5C,MAAMC,EAAkBvmJ,EAAQtH,cAAc,0BAC3C6tJ,GAAmBthK,KAAKkhK,cAAcj2J,EAAQq2J,IAIjDthK,KAAKuhK,cAAct2J,EAAQg2J,GAAYt9J,KAAMqsB,IACvCQ,KAIJ,OAAA/f,EAAA,GAAesK,EAASiV,IAAaqxI,EAAgB,IAAM,OAIxD,yBAAyBlyI,GAC9B,IAAmBu5B,UAAU1oD,KAAK4wB,KAAK3lB,OAAQ,CAACG,EAAG+jB,EAAS,0BAA4B,qCAK5F,OAAmB,KAAe6zE,aAAe,IAClC,UCx9DA,MAAM,WAAoB,GAoBvC,aAAY,MAAC/pF,EAAK,KAAE7U,GAAO,EAAK,WAAEwhB,GAAa,EAAK,SAAEnM,EAAQ,yBAAE+nJ,EAAwB,MAAEC,EAAK,WAAEC,IAuC/F,GA9BA/hK,QAEAK,KAAKiZ,MAAQA,EACbjZ,KAAKk0G,QAAUvzG,SAASC,cAAc,OACtCZ,KAAKk0G,QAAQh0G,UAAUW,IAAI,gBAE3Bb,KAAKwhK,yBAA2BA,EAChCxhK,KAAKyhK,MAAQA,EACbzhK,KAAK0hK,WAAaA,EAElB1hK,KAAK6R,eAAiB,IAAI,IAE1B7R,KAAKg7I,MAAM,CACTjgI,QAAS/a,KAAKk0G,QACdriG,eAAgB7R,KAAK6R,eACrBioI,gBAAiB,MACP95I,KAAKiZ,MAAM2C,QAAY5b,KAAK2hK,oBAAuB3hK,KAAK2hK,mBAAmBzhK,UAAUuV,SAAS,cAExG0kI,uBAAwB,uBACxBF,qBAAsB,mBAGxBhhI,EAAMsgC,WAAWt4C,aAAajB,KAAKk0G,QAASj7F,GAC5CjZ,KAAKk0G,QAAQt7E,YAAY3f,GAEzBjZ,KAAK4hK,KAAO,UAEZ5hK,KAAK6hK,YAAYpoJ,GACjBzZ,KAAK8hK,mBAEY,YAAd9hK,KAAK4hK,KAAoB,CAC1B,MAAMr7C,EAAWvmH,KAAKk0G,QAAQzgG,cAAc,qCAC5CzT,KAAKwpB,SAAW,IAAI,GAAkBvQ,EAAO2M,GAC7C2gG,EAASvlH,QAAQhB,KAAKwpB,SAASpoB,WAGjC,GAAGgD,EAA4B,CACb6U,EAAM7U,OACdsM,MAAOJ,IACG,oBAAbA,EAAI9P,OACLyY,EAAM8E,OAAQ,EACd9E,EAAM1V,UAAW,EACjB0V,EAAM7U,UAEPujC,QAAQ,KACT3nC,KAAKk0G,QAAQh0G,UAAUC,OAAO,cAAeH,KAAKiZ,MAAM2C,WAMtD,YAAYmmJ,GAClB,MAAM,QAAC7tD,EAAO,MAAEj7F,EAAK,KAAE2oJ,EAAI,eAAE/vJ,GAAkB7R,KAE/Ck0G,EAAQh0G,UAAUW,IAAI+gK,GAEtB,MAAM94I,EAAO9oB,KAAKgiK,gBAElB,IAAIC,EAEJ,GAHA/tD,EAAQ/qF,mBAAmB,YAAaL,GAG5B,YAAT84I,EAAoB,CACrB5hK,KAAK2hK,mBAAqB3hK,KAAKk0G,QAAQzgG,cAAc,kBACrDzT,KAAKkiK,UAAYliK,KAAKk0G,QAAQzgG,cAAc,QAE5C,MAAMtT,EAAS+zG,EAAQxgG,iBAAiB,WAClCyuJ,EAAmBjuD,EAAQzgG,cAAc,eACzC2uJ,EAAcluD,EAAQzgG,cAAc,iBAC1CwuJ,EAAe/tD,EAAQzgG,cAAc,kBACrCwuJ,EAAazzJ,UAAY8T,GAA0B,EAAjBrJ,EAAMQ,UAExC,MAAM4nH,EAAiB,IAAI,GAAexvH,GAEpCwwJ,EAAenuD,EAAQzgG,cAAc,kBAU3C,GATA4tH,EAAehuD,IAAInzE,UAAUoE,OAAO,YACpC+9J,EAAaphK,aAAaogI,EAAehuD,IAAK+uF,EAAYrhK,eAE1DoL,MAAMC,KAAKjM,GAAQoK,QAASmZ,IAC1B7R,EAAehR,IAAI6iB,EAAnB7R,CAA2B,QAAS,KAClC7R,KAAK6tB,iBAIN7tB,KAAKkiK,UAAW,CACjBrwJ,EAAehR,IAAIb,KAAKkiK,UAAxBrwJ,CAAmC,QAAS,KAC1C7R,KAAKiZ,MAAMqpJ,4BAGb,MAAMb,EAAS9mJ,IACb3a,KAAKk0G,QAAQ/uG,MAAMi8G,WAAazmG,EAAM,SAAU,GAC7C3a,KAAKyhK,OACNzhK,KAAKyhK,MAAM9mJ,IAIT4nJ,EAAe,GACfC,EAAe,OAAAxoI,GAAA,GAASynI,EAAOc,GAAc,GAAO,GAE1D1wJ,EAAehR,IAAIoY,EAAnBpH,CAA0B,wBAAyB,KACjD2wJ,GAAa,GAEb3wJ,EAAehR,IAAIoY,EAAnBpH,CAA0B,wBAAyB,KACjD,MAMM4wJ,EAAW5wJ,EAAehR,IAAIoY,EAAnBpH,CAA0B,QAN3B,KACdf,aAAaD,GACV7Q,KAAK0hK,YACN1hK,KAAK0hK,cAGoD,CAAC7iJ,MAAM,IAC9DhO,EAAUf,WAAW,KACzB+B,EAAevN,OAAOm+J,IACrBF,IACF,CAAC1jJ,MAAM,MAGZhN,EAAehR,IAAIoY,EAAnBpH,CAA0B,wBAAyB,KACjD2wJ,GAAa,KAIb,OACF3wJ,EAAehR,IAAIoY,EAAnBpH,CAA0B,QAAS,KACjC7R,KAAK6tB,eAGPhc,EAAehR,IAAIF,SAAnBkR,CAA6B,UAAY9R,IACvC,GAAG6M,EAAA,EAAUqtJ,eAAiB,GAAKt5J,SAASwe,0BAA4BlG,EACtE,OAGF,MAAM,IAAC7R,EAAG,KAAEH,GAAQlH,EAEpB,IAAI0sD,GAAO,EACX,GAAY,SAATxlD,EACDjH,KAAK0iK,wBACA,GAAY,SAATz7J,EACR,GAA2B8W,OAAS,GAA2BA,WAC1D,GAAY,UAAT9W,EACRjH,KAAK6tB,kBACA,IAAG9tB,EAAEo8J,QAAoB,UAATl1J,GAA6B,UAATA,GAQjCitG,EAAQh0G,UAAUuV,SAAS,qBAAgC,cAARrO,GAA+B,eAARA,EAIlFqlD,GAAO,EAHI,cAARrlD,EAAqB,GAA2B+R,aAAa,CAACjR,OAAQ,iBACpE,GAA2BsR,YAAY,CAACtR,OAAQ,oBAVO,CAC5D,MAAMrH,EAAe,UAAToG,EAAmB,GAAK,EAC9BsT,EAAe,GAA2BA,aAE1CooJ,EADM,GAAYC,eAAez9I,QAAQ5K,GACzB1Z,EACnB8hK,GAAW,GAAKA,EAAU,GAAYC,eAAejhK,SACtD,GAA2B4Y,aAAe,GAAYqoJ,eAAeD,IASzE,OAAGl2G,GACD,OAAAziC,EAAA,GAAYjqB,IACL,QAFT,KAOJ8R,EAAehR,IAAIoY,EAAnBpH,CAA0B,WAAY,KAChC,MACF7R,KAAK0iK,qBAIT7wJ,EAAehR,IAAIshK,EAAnBtwJ,CAAqC,QAAS,KAC5C7R,KAAK0iK,qBAGP,aAAsBxuD,EAASl0G,KAAK6iK,aAAan8J,KAAK1G,KAAMmiK,GAAmBtwJ,GAE/EA,EAAehR,IAAIoY,EAAnBpH,CAA0B,aAAc,KACtCuwJ,EAAY5zJ,UAAY8T,GAA6B,EAApBrJ,EAAMK,eAGzCzH,EAAehR,IAAIoY,EAAnBpH,CAA0B,OAAQ,KAChCqiG,EAAQh0G,UAAUW,IAAI,UAElB,MACFgR,EAAehR,IAAIoY,EAAnBpH,CAA0B,OAAQ,KAChC7R,KAAKy5I,cAAa,MAGrB,CAAC56H,MAAM,IAEVhN,EAAehR,IAAIoY,EAAnBpH,CAA0B,QAAS,KACjC7R,KAAK+5I,cAAa,KAGpBloI,EAAehR,IAAI+L,EAAA,EAAnBiF,CAA8B,wBAAyB,KACrD7R,KAAK8iK,wBAITjxJ,EAAehR,IAAIoY,EAAnBpH,CAA0B,OAAQ,KAChCqiG,EAAQh0G,UAAUW,IAAI,gBAGxBgR,EAAehR,IAAIoY,EAAnBpH,CAA0B,QAAS,KACjCqiG,EAAQh0G,UAAUoE,OAAO,gBAGxB2U,EAAMQ,UAAYsoJ,EACnBE,EAAazzJ,UAAY8T,GAASzd,KAAKE,MAAMkU,EAAMQ,UAAYsoJ,IAE/D,aAAY9oJ,GAAOtV,KAAK,KACtBs+J,EAAazzJ,UAAY8T,GAASzd,KAAKE,MAAMkU,EAAMQ,aAK/C,aACRzZ,KAAKiZ,MAAMjZ,KAAKiZ,MAAM2C,OAAS,OAAS,WAGlC,gBACN,MAAMgmJ,EAAO5hK,KAAK4hK,KAClB,GAAY,YAATA,EACD,MAAO,0BACUA,iFACHA,gEACAA,mJAGkBA,oVAQAA,gGACvB,MAAajhK,SAASoiK,wBAA0B,2BAA2BnB,gEAAqE,2CACzHA,uHAO1B,mBACR,MAAMvmI,EAA4C,GAAYunI,eAAen2J,IAAI,CAACu2J,EAAMh7J,KAC/E,CAELklD,YAAa81G,EAAO,IACpBthH,QAAS,KACP,GAA2BnnC,aAAeyoJ,MAI1C/lG,EAAU,GAAW5hC,GAC3B4hC,EAAQ/8D,UAAUW,IAAI,YACtBg8D,GACE78D,KAAK2hK,mBACL3hK,KAAKwhK,yBAA2B,KAC9BxhK,KAAKwhK,0BAAyB,SAC5Bn5J,OACJA,EACArI,KAAKwhK,yBAA2B,KAC9BxhK,KAAKwhK,0BAAyB,SAC5Bn5J,GAENrI,KAAK2hK,mBAAmBtgK,OAAO47D,GAE/Bj9D,KAAK8iK,sBAGG,sBACR,MAAMnB,EAAqB3hK,KAAK2hK,mBAChC,GAAYsB,qBAAqB14J,QAASyD,IACxCA,EAAY,SAAWA,EACvB2zJ,EAAmBzhK,UAAUoE,OAAO0J,KAGtC,IAAIhG,EAAM,GAAY46J,eAAez9I,QAAQ,GAA2B5K,eAC5D,IAATvS,IAAYA,EAAM,GAAY46J,eAAez9I,QAAQ,IAExDw8I,EAAmBzhK,UAAUW,IAAI,SAAW,GAAYoiK,qBAAqBj7J,IAGrE,mBACR,MAAMyxE,EAASz5E,KAAKk0G,QAGpB,GAAG,KAAiB,CAClB,MAAMj7F,EAAQjZ,KAAKiZ,MAGnB,OAFAA,EAAMiqJ,6BACNjqJ,EAAMkqJ,kBAIJ,eAyBF,eAdA,aAAkB1pF,GAkBZ,aAAa0oF,GACrB,MAAM1gD,EAAS,eACfzhH,KAAKk0G,QAAQh0G,UAAUC,OAAO,mBAAoBshH,GAC9CA,GAKF0gD,EAAiBjiK,UAAUoE,OAAO,oBAClC69J,EAAiBjiK,UAAUW,IAAI,qBAC/BshK,EAAiB5hK,aAAa,QAAS,sBANvC4hK,EAAiBjiK,UAAUoE,OAAO,qBAClC69J,EAAiBjiK,UAAUW,IAAI,oBAC/BshK,EAAiB5hK,aAAa,QAAS,gBAQpC,UACLZ,MAAMmO,UACN9N,KAAK6R,eAAeO,YACpBpS,KAAKwpB,SAASnD,kBACdrmB,KAAKwhK,yBAA2BxhK,KAAKyhK,WAAQp5J,GAhXhC,GAAAu6J,eAAiB,CAAC,GAAK,EAAG,IAAK,GAC/B,GAAAK,qBAAuB,CAAC,cAAe,cAAe,cAAe,e,2SCoCvE,MAAM,WAIV,IAiET,YACYjoJ,EACVooJ,GAEAzjK,OAAM,GAHI,KAAAqb,aA5DF,KAAAqoJ,OAA6E,GAC7E,KAAA1xJ,QAAgG,GAChG,KAAA0pB,QAAwH,GAIxH,KAAA6F,OAAS,EACT,KAAA9W,UAAkC,KAClC,KAAAk5I,oBAA4C,KAO5C,KAAAC,aAAc,EAId,KAAAC,OAAS7iK,SAASg2C,eAAe,cAejC,KAAA8sH,aAKN,GAGM,KAAAC,gBAAkB,EAClB,KAAAC,gBAAkB,EAClB,KAAAC,WAAa,EACb,KAAAC,WAAa,EAuRb,KAAAC,aAAe,CAACn/J,EAAQ3E,KAAKyjK,aAAaM,cAAcp/J,SAxVzC,IA0VpBA,IACD3E,KAAK4jK,WAAa,EAClB5jK,KAAK6jK,WAAa,GAGpB7jK,KAAKgkK,gBAAgB7+J,MAAMogB,UAAY,UAAU5gB,YAAgBA,MAAU3E,KAAK4jK,eAAe5jK,KAAK6jK,cAEpG7jK,KAAKyjK,aAAaQ,OAAO/jK,UAAUC,OAAO,WAhWvB,KAgWmCwE,GACtD3E,KAAKyjK,aAAaS,MAAMhkK,UAAUC,OAAO,WAhWtB,IAgWkCwE,GAErD3E,KAAKmkK,WApWkB,IAoWPx/J,IAmFlB,KAAA+8C,QAAW3hD,IACT,GAAGC,KAAKokK,yBAA0B,OAElC,MAAM1pJ,EAAS3a,EAAE2a,OACjB,GAAsB,MAAnBA,EAAO43B,QAAiB,OAG3B,GAFA,OAAAtoB,EAAA,GAAYjqB,GAET,KAYD,OAXGC,KAAKqkK,0BACNvzJ,aAAa9Q,KAAKqkK,2BAElBrkK,KAAKskK,SAASpkK,UAAUW,IAAI,4BAG9Bb,KAAKqkK,0BAA4BniK,OAAO4N,WAAW,KACjD9P,KAAKskK,SAASpkK,UAAUoE,OAAO,uBAC/BtE,KAAKqkK,0BAA4B,GAChC,MAKL,MAAME,EAAYvkK,KAAKukK,YACvB,IAAIC,EAAqB,KACzB,MAAMtzD,EAAa,CAAC,eAAgB,uBAAwB,sBAAuB,uBAAwB,kBACxGqzD,GACDrzD,EAAW3nG,KAAK,uBAGlB2nG,EAAW78F,KAAKyH,IACd,IAEE,GADA0oJ,EAAQ,OAAA15I,GAAA,GAAgBpQ,EAAQoB,GAC7B0oJ,EAAO,OAAO,EACjB,MAAMl0J,GAAM,OAAO,KAGiBk0J,IAAWD,GAAiC,QAAnB7pJ,EAAO43B,SAAwC,UAAnB53B,EAAO43B,UAClGtyC,KAAK49B,SAID,KAAAknF,UAAa/kH,IAEnB,GAAG6M,EAAA,EAAUqtJ,eAAiB,EAC5B,OAGF,MAAM7yJ,EAAMrH,EAAEqH,IAEd,IAAIqlD,GAAO,EACA,eAARrlD,EACDpH,KAAKq7B,QAAQ7yB,KAAK23B,QACF,cAAR/4B,EACRpH,KAAKq7B,QAAQta,KAAKof,QACF,MAAR/4B,GAAuB,MAARA,EACpBpH,KAAKykK,aACNzkK,KAAK0kK,WAAmB,MAARt9J,GAGlBqlD,GAAO,GAGN1sD,EAAEwH,SAAWxH,EAAEuH,WAChBtH,KAAKykK,aAAc,GAGlBh4G,GACD,OAAAziC,EAAA,GAAYjqB,IAIR,KAAA4kK,QAAW5kK,IACd6M,EAAA,EAAUqtJ,eAAiB,GAIzBl6J,EAAEwH,SAAWxH,EAAEuH,UAClBtH,KAAKykK,aAAc,EAEhBzkK,KAAKukK,aACNvkK,KAAK8jK,iBAKH,KAAA37F,QAAWpoE,IACjB,KAAG6M,EAAA,EAAUqtJ,eAAiB,GAAM,OAAAnvI,GAAA,GAAgB/qB,EAAE2a,OAAQ,0BAA4B1a,KAAKykK,eAI/F,OAAAz6I,EAAA,GAAYjqB,GAETC,KAAKykK,aAAa,CACnB,MAAMG,EAAc7kK,EAAEuoE,OAAS,EAE/BtoE,KAAK0kK,aAAaE,KAjcpB5kK,KAAKkiB,IAAM,OAAAkzC,EAAA,GAAO,OAClBp1D,KAAKoqB,UAAY,IAAI,KACrBpqB,KAAKsjK,oBAAsB,IAAI,KAAqB,CAClDj5I,YAAY,EACZzE,YAAY,IAEd5lB,KAAKoqB,UAAUE,YACftqB,KAAKsjK,oBAAoBh5I,YACzBtqB,KAAKsuB,cAAgB,IAAI,IAEzBtuB,KAAKskK,SAAW3jK,SAASC,cAAc,OACvCZ,KAAKskK,SAASpkK,UAAUW,IAAIgkK,sBAE5B7kK,KAAK8kK,YAAcnkK,SAASC,cAAc,OAC1CZ,KAAK8kK,YAAY5kK,UAAUW,IAAI,YAE/B,MAAMkkK,EAAUpkK,SAASC,cAAc,OACvCmkK,EAAQ7kK,UAAUW,IA9FgB,gBAgGlC,MAAMskG,EAASnlG,KAAKmlG,OAASxkG,SAASC,cAAc,OACpDukG,EAAOjlG,UAAUW,IAAIgkK,sBAAoCA,uBAEzD,MAAMG,EAAarkK,SAASC,cAAc,OAC1CokK,EAAW9kK,UAAUW,IAAIgkK,4BAEzB7kK,KAAKq7B,QAAQ,gBAAkB,EAAW,QAAS,CAAC4pI,YAAY,IAGhEjlK,KAAKqjK,OAAOjiK,UAAYT,SAASC,cAAc,OAC/CZ,KAAKqjK,OAAOjiK,UAAUlB,UAAUW,IAAIgkK,sBAAoC,aACxE,MAAMK,EAAcvkK,SAASC,cAAc,OAE3CZ,KAAKqjK,OAAO9nI,SAAW,IAAI,GAC3Bv7B,KAAKqjK,OAAO9nI,SAASr7B,UAAUW,IAAIgkK,uBAAqC,aAExE7kK,KAAKqjK,OAAO/0J,OAAS3N,SAASC,cAAc,OAC5CZ,KAAKqjK,OAAO/0J,OAAOpO,UAAUW,IAAIgkK,qBAEjC7kK,KAAKqjK,OAAO72I,KAAO7rB,SAASC,cAAc,OAC1CZ,KAAKqjK,OAAO72I,KAAKtsB,UAAUW,IAAIgkK,qBAE/BK,EAAY7jK,OAAOrB,KAAKqjK,OAAO/0J,OAAQtO,KAAKqjK,OAAO72I,MAEnDxsB,KAAKqjK,OAAOjiK,UAAUC,OAAOrB,KAAKqjK,OAAO9nI,SAAU2pI,GAGnD,MAAMlmF,EAAar+E,SAASC,cAAc,OAC1Co+E,EAAW9+E,UAAUW,IAAIgkK,wBAEzBzB,EAAW17J,OAAO,CAAC,WAAY,OAAQ,UAAU6C,QAAQ/J,IACvD,MAAMkjB,EAAS,EAAWljB,EAAM,CAACiR,UAAU,IAC3CzR,KAAKq7B,QAAQ76B,GAAQkjB,EACrBs7D,EAAW39E,OAAOqiB,KAGpB1jB,KAAKq7B,QAAQ8pI,KAAKjlK,UAAUW,IAAI,WAGhCb,KAAKyjK,aAAariK,UAAYT,SAASC,cAAc,OACrDZ,KAAKyjK,aAAariK,UAAUlB,UAAUW,IAAI,kBAE1Cb,KAAKyjK,aAAaQ,OAAS,EAAW,UAAW,CAACxyJ,UAAU,IAC5D,YAAiBzR,KAAKyjK,aAAaQ,OAAQ,IAAMjkK,KAAK0kK,YAAW,IACjE1kK,KAAKyjK,aAAaS,MAAQ,EAAW,SAAU,CAACzyJ,UAAU,IAC1D,YAAiBzR,KAAKyjK,aAAaS,MAAO,IAAMlkK,KAAK0kK,YAAW,IAEhE1kK,KAAKyjK,aAAaM,cAAgB,IAAI,GAAc,CAClDh/I,KAzJY,GA0JZjgB,IAxJiB,GAyJjBL,IAxJiB,EAyJjB4f,gBAAgB,GA3JK,GA6JvBrkB,KAAKyjK,aAAaM,cAAcv9I,eAChCxmB,KAAKyjK,aAAaM,cAAct9I,YAAY,CAC1C5B,QAAS7kB,KAAK8jK,aACdtgJ,UAAW,IAAMxjB,KAAK8jK,iBAGxB9jK,KAAKyjK,aAAariK,UAAUC,OAAOrB,KAAKyjK,aAAaQ,OAAQjkK,KAAKyjK,aAAaM,cAAc3iK,UAAWpB,KAAKyjK,aAAaS,OAE1HlkK,KAAKskK,SAASjjK,OAAOrB,KAAKyjK,aAAariK,WAGvCpB,KAAK2R,QAAQ4nB,KAAO54B,SAASC,cAAc,OAC3CZ,KAAK2R,QAAQ4nB,KAAKr5B,UAAUW,IAAIgkK,wBAEhC7kK,KAAK2R,QAAQvQ,UAAYT,SAASC,cAAc,OAChDZ,KAAK2R,QAAQvQ,UAAUlB,UAAUW,IAAIgkK,0BAErC7kK,KAAK2R,QAAQ8G,MAAQ9X,SAASC,cAAc,OAC5CZ,KAAK2R,QAAQ8G,MAAMvY,UAAUW,IAAIgkK,sBAEjC7kK,KAAK2R,QAAQvQ,UAAUC,OAAOrB,KAAK2R,QAAQ8G,OAE3CzY,KAAK2R,QAAQ4nB,KAAKl4B,OAAOrB,KAAK2R,QAAQvQ,WACtC2jK,EAAQ1jK,OAAOrB,KAAK2R,QAAQ4nB,MAC5Bv5B,KAAK8kK,YAAYzjK,OAAO0jK,GAGxBC,EAAW3jK,OAAOrB,KAAKq7B,QAAQ,gBAAiBr7B,KAAKqjK,OAAOjiK,WAC5D+jG,EAAO9jG,OAAO2jK,EAAYhmF,GAE1Bh/E,KAAKq7B,QAAQta,KAAOpgB,SAASC,cAAc,OAC3CZ,KAAKq7B,QAAQta,KAAK/S,UAAY,mDAC9BhO,KAAKq7B,QAAQta,KAAKvS,UAAY,4DAE9BxO,KAAKq7B,QAAQ7yB,KAAO7H,SAASC,cAAc,OAC3CZ,KAAKq7B,QAAQ7yB,KAAKwF,UAAY,oDAC9BhO,KAAKq7B,QAAQ7yB,KAAKgG,UAAY,4DAE9BxO,KAAKgkK,gBAAkBrjK,SAASC,cAAc,OAC9CZ,KAAKgkK,gBAAgB9jK,UAAUW,IAAIgkK,uBAEnC7kK,KAAKskK,SAASjjK,OAAOrB,KAAK8kK,YAAa9kK,KAAKq7B,QAAQta,KAAM/gB,KAAKq7B,QAAQ7yB,KAAMxI,KAAKmlG,OAAQnlG,KAAKgkK,iBAI/FhkK,KAAKgb,WAAWtQ,aAAe,KAC7B1K,KAAKq7B,QAAQta,KAAK7gB,UAAUC,OAAO,QAASH,KAAKgb,WAAWzS,SAAS5G,QACrE3B,KAAKq7B,QAAQ7yB,KAAKtI,UAAUC,OAAO,QAASH,KAAKgb,WAAWxS,KAAK7G,SAGnE3B,KAAKolK,cAxIP,aACE,OAAOplK,KAAKgb,WAAWhS,QAGzB,WAAWrE,GACT3E,KAAKgb,WAAWhS,QAAUrE,EAsIlB,eAgCR,GA/BA,YAAiB3E,KAAKq7B,QAAQ9L,SAAUvvB,KAAKqlK,iBAC7C,CAACrlK,KAAKq7B,QAAQuC,MAAO59B,KAAKq7B,QAAQ,gBAAiBr7B,KAAKsjK,oBAAoBl5I,WAAW7f,QAAQzI,IAC7F,YAAiBA,EAAI9B,KAAK49B,MAAMl3B,KAAK1G,SAGtC,CAAC,EAAE,EAAGA,KAAKq7B,QAAQta,MAAO,CAAC,EAAG/gB,KAAKq7B,QAAQ7yB,OAAmC+B,QAAQ,EAAE+6J,EAAY5hJ,MAEnGA,EAAOpiB,iBAAiB,QAAUvB,IAChC,OAAAiqB,EAAA,GAAYjqB,GACTC,KAAKulK,iBAERvlK,KAAKgb,WAAWnR,GAAGy7J,OAIvB,YAAiBtlK,KAAKq7B,QAAQ8pI,KAAM,KAC/BnlK,KAAKukK,YAAavkK,KAAKmkK,YAAW,GAEnCnkK,KAAK0kK,YAAW,KAMpB1kK,KAAKskK,SAAShjK,iBAAiB,QAAStB,KAAK0hD,SAE7C1hD,KAAKgb,WAAWtR,OAAS,CAACN,EAAMa,KAC3BA,EAAOjK,KAAK0nF,YAAYt+E,GACtBpJ,KAAKonF,YAAYh+E,IAGrB,KAAoB,CACA,IAAI,GAAa,CACpC2R,QAAS/a,KAAKskK,SACdx1H,QAAS,CAACJ,EAAOC,KACf,GAAG,eACD,OAKF,GADiB9pC,KAAK+B,IAAI8nC,GAASzN,GAAA,EAAWz9B,MAChC,IAAMkrC,EAAQ,IAS1B,OANGA,EAAQ,EACT1uC,KAAKq7B,QAAQta,KAAKof,QAElBngC,KAAKq7B,QAAQ7yB,KAAK23B,SAGb,EAIT,OADkBt7B,KAAK+B,IAAI+nC,GAAS1N,GAAA,EAAWx9B,OAChC,IAAMkrC,EAAQ,OAC3B3uC,KAAK49B,SACE,IAKX2Q,kBAAoBi3H,GAEyB,UAAvCA,EAAI9qJ,OAAuB43B,UAAuB,OAAAxnB,GAAA,GAAgB06I,EAAI9qJ,OAAQ,2BAUhF,WAAW68B,GACnB,MAAMs9C,EAAY70F,KAAKukK,YAKvB,IAJGvkK,KAAKyjK,aAAaM,cAAc5/I,WAAankB,KAAKykK,eACnDltH,GAAS,GAGRs9C,IAAct9C,EAAQ,YAEXlvC,IAAXkvC,IACDA,GAAUs9C,GAGZ70F,KAAKq7B,QAAQ8pI,KAAKjlK,UAAUC,OAAO,WAAYo3C,GAC/Cv3C,KAAKyjK,aAAariK,UAAUlB,UAAUC,OAAO,aAAco3C,GAC3D,MAAMkuH,EAAYluH,EAASv3C,KAAKyjK,aAAaM,cAAcp/J,MAAQ,EAQnE,GAPA3E,KAAK8jK,aAAa2B,GAClBzlK,KAAKyjK,aAAaM,cAAc/+I,YAAYygJ,GAEzCzlK,KAAK0lK,aACN1lK,KAAK0lK,YAAYC,cAAapuH,QAAiBlvC,GAG9CkvC,EAAQ,CACT,GAAIv3C,KAAK4lK,iBAuBP5lK,KAAK4lK,iBAAiBp/I,mBAvBG,CACzB,IAAIkqB,EAAmBm1H,EACvB,MAAMlmH,GAAc,EACpB3/C,KAAK4lK,iBAAmB,IAAI,GAAa,CACvC7qJ,QAAS/a,KAAKgkK,gBACdp1H,aAAc,KACZ8B,EAAYm1H,EAAY,EACxB7lK,KAAKgkK,gBAAgB9jK,UAAUW,IAAI,kBAErCiuC,QAAS,CAACJ,EAAOC,MACdD,EAAOC,GAAS,CAACD,EAAQiR,EAAYhR,EAAQgR,GAC9C3/C,KAAK4jK,YAAcl1H,EAAQgC,EAC3B1wC,KAAK6jK,YAAcl1H,EAAQk3H,GAC1Bn1H,EAAWm1H,GAAa,CAACn3H,EAAOC,GAEjC3uC,KAAK8jK,gBAEP11H,QAAS,KACPpuC,KAAKgkK,gBAAgB9jK,UAAUoE,OAAO,kBAExCupC,OAAQ,SAMZ7tC,KAAKyjK,aAAaM,cAAc/+I,YAAYygJ,QACnCluH,GACTv3C,KAAK4lK,iBAAiBv/I,kBAIhB,WAAWxlB,GACnBb,KAAKyjK,aAAaM,cAAc+B,YArVlB,IAqV2CjlK,EAAM,GAAK,IACpEb,KAAK8jK,eAkBG,YACR,OAAO9jK,KAAKyjK,aAAariK,UAAUlB,UAAUuV,SAAS,cAG9C,iBAAiB4lB,GACzB,MAAM0qI,EAAgB,GAAiB,CAACd,YAAY,GAAO,cAAe5pI,GAC1Er7B,KAAKmlG,OAAO9jG,OAAO0kK,GAGd,MAAMhmK,G,MAKX,GAJGA,GACD,OAAAiqB,EAAA,GAAYjqB,GAGXC,KAAKokK,yBAA0B,OAAO/+J,QAAQgqB,SAE9CrvB,KAAK0kF,gBACN/xE,EAAA,EAAwB+2G,WAAW1pH,KAAK0kF,gBAG1C1kF,KAAKsuB,cAAc3f,QAEnB,MAAMvE,EAAUpK,KAAKgmK,iBAA4B,QAAX,EAAAhmK,KAAK0a,cAAM,eAAEK,SAAS,GAAMpX,KAAK,EAAE+/B,oBAAoBA,GAyB7F,OAvBA1jC,KAAKgb,WAAWzN,QACfvN,KAAKgb,WAAqClN,SAAY9N,KAAKgb,WAAqClN,UACjG9N,KAAKulK,gBAAkB,KACvBvlK,KAAKkhC,QAAU,EACXh/B,OAAe+jK,iBAAmBjmK,OACnCkC,OAAe+jK,oBAAiB59J,GASnCrI,KAAKkmK,wBAELlmK,KAAK4lK,sBAAmBv9J,EAExB+B,EAAQu9B,QAAQ,KACd3nC,KAAKskK,SAAShgK,SACdtE,KAAKmmK,eAAc,KAGd/7J,EAGC,cAAcotC,GACtB5qC,EAAA,EAAUsvJ,gBAAkB1kH,EAC5BgL,EAAA,EAAqBq3C,gBAAgBriD,GAG7B,sBAAsBA,GAC3BA,EAAQx3C,KAAKomK,qBACXpmK,KAAKkmK,wBAGF,wBACLlmK,KAAK4lK,kBACN5lK,KAAK4lK,iBAAiBv/I,kBAGxBnkB,OAAO2L,oBAAoB,UAAW7N,KAAK8kH,WAC3C5iH,OAAO2L,oBAAoB,QAAS7N,KAAK2kK,SACzCziK,OAAO2L,oBAAoB,QAAS7N,KAAKmoE,QAAS,CAAC14C,SAAS,IAGpD,qBACLzvB,KAAKukK,aACNvkK,KAAK4lK,iBAAiBp/I,eAGxBtkB,OAAOZ,iBAAiB,UAAWtB,KAAK8kH,WACxC5iH,OAAOZ,iBAAiB,QAAStB,KAAK2kK,SAClC,MAAoBziK,OAAOZ,iBAAiB,QAAStB,KAAKmoE,QAAS,CAACjkD,SAAS,EAAOuL,SAAS,IAsGnF,iBAAiB/U,EAAqB2rJ,GAAU,EAAOC,EAAY,G,0CACjFtmK,KAAKsS,cAAc,kBAEnB,MAAMkyJ,EAAQxkK,KAAK2R,QAAQ6yJ,MAEvB6B,IACF7B,EAAMh2J,UAAY,IAIpB,MAAMi3J,EAAYzlK,KAAKukK,aAAe8B,EAAyBrmK,KAAKyjK,aAAaM,cAAcp/J,MApiBxE,EAqiBe3E,KAAKumK,sBAAsB/B,GAEjE,MAAMgC,EAA0B,IAAdF,EAEZvvD,EAAQnqG,EAAA,EAAU+2B,SAASC,kBAAqB4iI,EAAY,IAAM,IAAO,EAY/E,IAAIC,EAEAhiJ,EACD/J,IACEA,aAAkB,IAAiBA,EAAOxa,UAAUuV,SAAS,cAC9DgxJ,EAAa/rJ,EACb+J,EAAO/J,EAAOgK,yBACNhK,aAAkBgsJ,iBAAmBhsJ,EAAO3Z,yBAAyB4lK,yBAC7EF,EAAa,OAAA37I,GAAA,GAAgBpQ,EAAQ,cACrC+J,EAAOgiJ,EAAW/hJ,yBACVhK,EAAOxa,UAAUuV,SAAS,4BAClCgxJ,EAAa,OAAA37I,GAAA,GAAgBpQ,EAAQ,6BACrC+J,EAAOgiJ,EAAW/hJ,wBAGf2hJ,GAAW3rJ,EAAOgK,wBAAwBiB,OAASlB,EAAKkB,OACzDjL,EAAS+rJ,EAAahiJ,OAAOpc,KAK/BqS,IACFA,EAAS1a,KAAK2R,QAAQ8G,OAGpBgM,IACFgiJ,EAAa/rJ,EAAO3Z,cACpB0jB,EAAO/J,EAAOgK,yBAGhB,IAAIkiJ,GAAc,EAClB,GAAGlsJ,IAAW1a,KAAK2R,QAAQ8G,QAAUiC,EAAOxa,UAAUuV,SAAS,0BAA2B,CACxF,MACMkjG,EAAcjb,GAAe+oE,EADX,OAAA37I,GAAA,GAAgB27I,EAAY,eACY,IAE7DJ,GAAa1tD,GAAiD,IAAlCA,EAAYxa,SAAS55E,UAAsD,IAApCo0F,EAAYxa,SAASC,YAIjFua,GAAkD,IAAlCA,EAAYxa,SAAS55E,UAAsD,IAApCo0F,EAAYxa,SAASC,aACpFwoE,GAAc,IAHdH,GADA/rJ,EAAS1a,KAAK2R,QAAQ8G,OACF1X,cACpB0jB,EAAO/J,EAAOgK,yBAMlB,MAAMosH,EAAgB9wI,KAAK2R,QAAQ8G,MAAMiM,wBAEzC,IACIiB,EACA+S,EA6BAupB,EA/BA18B,EAAY,GAgChB,GA5BGihJ,GACD7gJ,EAAqB,IAAd2gJ,EAAkBrlI,GAAA,EAAWz9B,OAASstI,EAActtI,MAC3Dk1B,EAAMo4G,EAAcp4G,MAEpB/S,EAAOlB,EAAKkB,KACZ+S,EAAMjU,EAAKiU,KAWbnT,GAAa,eAAeI,OAAU+S,UAYnChe,aAAkBmsJ,kBAAoBnsJ,aAAkBosJ,kBAAuC,QAAnBpsJ,EAAO43B,QAAmB,CACvG,GAAGkyH,EAAMv4I,mBAAqBu4I,EAAMv4I,kBAAkB/rB,UAAUuV,SAAS,yBAA0B,CACjGwsC,EAAWuiH,EAAMv4I,kBAEjB,MAAMwtD,EAASx3B,EAASxuC,cAAc,iBACtC,GAAGgmE,EAAQ,CACT,MAAMxgE,EAAQwgE,EAAOxtD,kBACrBg2B,EAAS5gD,OAAO4X,GAChBwgE,EAAOn1E,SAGL29C,EAAS98C,MAAM2X,UACjB0nJ,EAAMtkK,UAAUoE,OAAO,UACvBtE,KAAK+mK,cAAc9kH,EAAU6uF,EAAersH,GACvC+/I,EAAMh0H,WACXg0H,EAAMtkK,UAAUW,IAAI,gBAGtBohD,EAAWthD,SAASC,cAAc,OAClCqhD,EAAS/hD,UAAUW,IAAI,yBACvB2jK,EAAMxjK,QAAQihD,GAGhBA,EAAS98C,MAAM2X,QAAU,UAAU2H,EAAKjhB,oBAAoBihB,EAAKhhB,gCAAgCqtI,EAActtI,MAAQihB,EAAKjhB,UAAUstI,EAAcrtI,OAASghB,EAAKhhB,cAGpK+gK,EAAMr/J,MAAM3B,MAAQstI,EAActtI,MAAQ,KAC1CghK,EAAMr/J,MAAM1B,OAASqtI,EAAcrtI,OAAS,KAI5C,MAAMujK,EAASviJ,EAAKjhB,MAAQstI,EAActtI,MACpCyjK,EAASxiJ,EAAKhhB,OAASqtI,EAAcrtI,OACvC+iK,IACFjhJ,GAAa,WAAWyhJ,KAAUC,SAGpC,IAAIxuC,EAAev2H,OAAO00I,iBAAiB6vB,GAAY5vB,iBAAiB,iBACxE,MAAMqwB,ECrtBK,SAA2B3kJ,GACxC,IAAIu9C,EAAWv9C,EAAI8gC,MAAM,KACzB,GAAuB,IAApByc,EAASn+D,OAAc,CACpBm+D,EAAS,KAAIA,EAAS,GAAK,OAC/B,IAAI,IAAIl+D,EAAIk+D,EAASn+D,OAAQC,EAAI,IAAKA,EACpCk+D,EAASl+D,GAAKk+D,EAASl+D,EAAI,IAAMk+D,EAAS,IAAM,MAIpD,OAAOA,ED4sBcqnG,CAAkB1uC,GAOrC,GANAA,EAAeyuC,EAAWz6J,IAAIsZ,GAAMrD,SAASqD,GAAKihJ,EAAU,MAAM57I,KAAK,KACnEo7I,IACFhC,EAAMr/J,MAAMszH,aAAeA,GAI1B4tC,GAAyB,IAAdZ,EAAiB,CAG7B,MAAM2B,EAAanmI,GAAA,EAAWz9B,MAAQ,EAAIihB,EAAKjhB,MAAQ,EACjD6jK,EAAYpmI,GAAA,EAAWx9B,OAAS,EAAIghB,EAAKhhB,OAAS,EAClDkiB,EAAOlB,EAAKkB,KAAOyhJ,EACnB1uI,EAAMjU,EAAKiU,IAAM2uI,EACvBrnK,KAAKgkK,gBAAgB7+J,MAAMogB,UAAY,UAAUyhJ,YAAiBC,MAAWthJ,MAAS+S,UAEtF8rI,EAAMr/J,MAAMogB,UAAYA,EAS1B,IAAI+hC,EANJs/G,IAAgBpC,EAAMr/J,MAAM4tD,QAAU,KAOtC,MAAM9S,EAAQvlC,EAAOxa,UAAUuV,SAAS,UAElCqJ,EAAW9e,KAAKokK,yBAA2B,eAC3C52J,EAAM,CAACk2B,eAAgB5kB,GAEvBjO,EAAUf,WAAW,KACrBgP,EAASyjC,aAAgBzjC,EAASwoJ,YACpCxoJ,EAAS5U,WAEV,KAYH,GAVA4U,EAAS6oB,QAAQ,KACf3nC,KAAKsS,cAAc,iBAEhBtS,KAAKokK,2BAA6BtlJ,IACnC9e,KAAKokK,yBAA2B,MAGlCtzJ,aAAaD,KAGXw1J,EA4JF,OAlCG3rJ,aAAkB6sJ,gBACnBjgH,EAAOk9G,EAAM/wJ,cAAc,QAExB6zC,GACDtnD,KAAKwnK,aAAalgH,EAAMwpF,EAAek2B,EAAQjwD,GAAO,EAAO92D,EAAOw4E,IAIrE/9G,EAAOxa,UAAUuV,SAAS,uBAC3B+uJ,EAAMtkK,UAAUW,IAAI,UAGtBb,KAAKynK,mBAAkB,GAIvB33J,WAAW,KACT00J,EAAMr/J,MAAMszH,aAAeA,EAExB+rC,EAAMv4I,oBACNu4I,EAAMv4I,kBAAkC9mB,MAAMszH,aAAeA,IAE/D1hB,EAAQ,GAEXjnG,WAAW,KACT00J,EAAMh2J,UAAY,GAClBg2J,EAAMtkK,UAAUoE,OAAO,SAAU,SAAU,UAC3CkgK,EAAMr/J,MAAM2X,QAAU,iBAEtBgC,EAAS5U,WACR6sG,GAEHytD,EAAMtkK,UAAUoE,OAAO,WAEhBkJ,EA5JI,CACX,IAAIk6J,EACArtJ,EAEJ,GAAGK,aAAkBosJ,iBAAkB,CACrC,MAAMz7I,EAAWlf,MAAMC,KAAKsO,EAAO3Z,cAAc2S,iBAAiB,QAC/D2X,EAAS1pB,SACV+Y,EAAS2Q,EAAShiB,OAItB,GAAsB,QAAnBqR,EAAO43B,SAAwC,mBAAnB53B,EAAO43B,QAA8B,CAClE,MACMoS,EADSv4C,MAAMC,KAAKsO,EAAOhH,iBAAiB,QAC7BrK,MAClBq7C,IACDgjH,EAAe,IAAIv4H,MACnB90B,EAAMqqC,EAAMrqC,IACZmqJ,EAAMnjK,OAAOqmK,SAKV,GAAGhtJ,aAAkBmsJ,iBAC1Ba,EAAe,IAAIv4H,MACnB90B,EAAMK,EAAOL,SACR,GAAGK,aAAkBosJ,iBAC1BY,EAAe9nH,KACf8nH,EAAartJ,IAAMK,EAAOL,SACrB,GAAGK,aAAkB6sJ,cAAe,CACzC,MAAMI,EAASjtJ,EAAOxT,QAAQygK,OACxBC,EAAYD,EAAS,OAErB,MAACnkK,EAAK,OAAEC,GAAUqtI,EAElB+2B,EAASlnK,SAAS4nB,gBAAgB,6BAA8B,OACtEs/I,EAAOr/I,eAAe,KAAM,QAAS,GAAKhlB,GAC1CqkK,EAAOr/I,eAAe,KAAM,SAAU,GAAK/kB,GAG3CokK,EAAOr/I,eAAe,KAAM,UAAW,OAAOhlB,KAASC,KACvDokK,EAAOr/I,eAAe,KAAM,sBAAuB,iBAEnDq/I,EAAO1+I,mBAAmB,YAAazO,EAAOuR,kBAAkB67I,UAAUpiK,QAAQiiK,EAAQC,IAC1FC,EAAO1+I,mBAAmB,YAAazO,EAAOu+B,iBAAiB6uH,UAAUpiK,QAAQiiK,EAAQC,IAGzF,MAAMzkC,EAAO0kC,EAAO57I,kBACdmhB,EAAM+1F,EAAKl3G,kBAAkBA,kBACnC,GAAGmhB,aAAe26H,cAAe,CAC/B,IAmBIxmI,EAnBAhc,EAAY6nB,EAAIyU,eAAe,KAAM,aACzCt8B,EAAYA,EAAU7f,QAAQ,kDAAmD,CAAC6S,EAAO6K,EAAGE,EAAG0kJ,EAAIC,IAU1F,aAPL7kJ,EADO,KADTA,GAAKA,GAEC5f,EAAS,EAAIwjK,EAEb,EAAIA,MAGNvjK,aAEmCukK,EAAKhB,OAAYiB,EAAKhB,MAE/D75H,EAAI5kB,eAAe,KAAM,YAAajD,GAGtC+hC,EAAO67E,EAAKl3G,kBAAkBgtB,iBAI9B,MAAM6/E,EAAuCL,EAAap1E,MAAM,KAAK52C,IAAIq4B,GAAKpiB,SAASoiB,IAC7EvD,EAAP0e,EAAWsxF,GAAiB,EAAG,EAAG/tI,EAAQ,EAAIwjK,EAAQvjK,KAAWq1H,GAC3DyY,GAAiB,EAAIy1B,EAAQ,EAAGxjK,EAAQ,EAAIwjK,EAAQvjK,KAAWq1H,GACxExxE,EAAK9+B,eAAe,KAAM,IAAK+Y,GAGjC,MAAMqgB,EAAgBimH,EAAO5uH,iBAC7B2I,EAAcp5B,eAAe,KAAM,QAAS,GAAKsoH,EAActtI,OAC/Do+C,EAAcp5B,eAAe,KAAM,SAAU,GAAKsoH,EAAcrtI,QAEhE+gK,EAAMxjK,QAAQ6mK,GAGb5lH,IACDA,EAAS98C,MAAMszH,aAAeA,EAE3BivC,GACDzlH,EAAS5gD,OAAOqmK,IAIpBA,EAAelD,EAAM/wJ,cAAc,cAChCi0J,aAAwBb,mBACzBa,EAAaxnK,UAAUW,IAAI,aACvBohD,IACFylH,EAAaviK,MAAM3B,MAAQstI,EAActtI,MAAQ,KACjDkkK,EAAaviK,MAAM1B,OAASqtI,EAAcrtI,OAAS,MAGlD4W,UACK,OAAA4oC,GAAA,GAA0BykH,EAAcrtJ,KAYlDmqJ,EAAMr/J,MAAMC,QAAU,GAEtB,aAAQ,KACNo/J,EAAMtkK,UAAUW,IAAI2lK,EAAY,SAAW,YAyG/C,OA5DAhC,EAAMtkK,UAAUW,IAAI,iBAKd,eAON2jK,EAAMr/J,MAAMogB,UAAY,eAAeurH,EAAcnrH,UAAUmrH,EAAcp4G,0BAE7EkuI,IAAgBpC,EAAMr/J,MAAM4tD,QAAU,IAEnC9Q,GACDjiD,KAAK+mK,cAAc9kH,EAAU6uF,EAAersH,GAK9C3U,WAAW,KACT00J,EAAMr/J,MAAMszH,aAAe,GAExB+rC,EAAMv4I,oBACNu4I,EAAMv4I,kBAAkC9mB,MAAMszH,aAAe,KAE/D,GAEH+rC,EAAMt9J,QAAQ2J,QAAU,GAAKf,WAAW,KACtC00J,EAAMtkK,UAAUoE,OAAO,SAAU,WAE9B29C,IACEuiH,EAAM/wJ,cAAc,SACrB+wJ,EAAMtkK,UAAUoE,OAAO,UACvB29C,EAAS98C,MAAM2X,QAAU,GACpB0nJ,EAAMh0H,YAOfg0H,EAAMtkK,UAAUW,IAAI,SAAU,iBAM9B2jK,EAAMtkK,UAAUW,IAAI,iBACb2jK,EAAMt9J,QAAQ2J,QAErBiO,EAAS5U,WACR6sG,GAEAzvD,GACDtnD,KAAKwnK,aAAalgH,EAAMwpF,EAAek2B,EAAQjwD,GAAO,EAAM92D,EAAOw4E,GAG9DjrH,KAGC,kBAAkBgqC,GACvBA,EACDx3C,KAAKskK,SAASpkK,UAAUW,IAAI,WAE5Bb,KAAKskK,SAASpkK,UAAUW,IAAI,aAC5BiP,WAAW,KACT9P,KAAKskK,SAASpkK,UAAUoE,OAAO,WAC9B,IAIG,cAAc29C,EAA0B6uF,EAAwBrsH,GAQxE,MAAM0yB,EAAa25F,EAActtI,MAAQstI,EAAcrtI,OAEvD,IAAI,MAACD,EAAK,OAAEC,GAAUghB,EAIjB0yB,EAAa,EACd3zC,EAAQC,EAAS0zC,EAEjB1zC,EAASD,EAAQ2zC,EAKnB8K,EAAS98C,MAAM2X,QAAU,UAAUtZ,gBAAoBC,2BAAgCqtI,EAActtI,MAAQA,MAAUstI,EAAcrtI,OAASA,SAIxI,aAAa6jD,EAAsB7iC,EAAeuiJ,EAAgBjwD,EAAemxD,EAAkBjoH,EAAgBw4E,GAC3H,MAAMxxG,EAAQy1B,KAAKC,OACb,MAACn5C,EAAK,OAAEC,GAAUghB,EACxBsyF,GAAgB,EAEhB,MAAM+hB,EAAKL,EAAap1E,MAAM,KAAK52C,IAAIq4B,GAAKpiB,SAASoiB,IAE/C/f,EAAO,KACX,MAAM0Q,EAAOinB,KAAKC,MAAQ11B,EAE1B,IAAIuC,EAAWutF,EAAQthF,EAAOshF,EAAQ,EACnCvtF,EAAW,IAAGA,EAAW,GACzB0+I,IAAS1+I,EAAW,EAAIA,GAE3B,MAAM2+I,EAAwCrvC,EAAGrsH,IAAIq4B,GAAKA,EAAItb,GAE9D,IAAI+X,EACMA,EAAP0e,EAAWsxF,GAAiB,EAAG,EAAG/tI,EAAS,EAAIwjK,EAASx9I,EAAW/lB,KAAW0kK,GACxE52B,GAAiB,EAAIy1B,EAASx9I,EAAU,EAAGhmB,EAA4CC,KAAW0kK,GAC3G7gH,EAAK9+B,eAAe,KAAM,IAAK+Y,GAE5B9L,EAAOshF,GAAO,aAAQhyF,IAI3BA,IAGQ,sBAAsBy/I,GAC9B,GAAGA,EAAMtkK,UAAUuV,SAAS,UAAW,CAErC,MAAMgP,EAAOzkB,KAAK2R,QAAQ8G,MAAMiM,wBAChC8/I,EAAMr/J,MAAMogB,UAAY,eAAed,EAAKkB,UAAUlB,EAAKiU,WAC3D8rI,EAAMtkK,UAAUoE,OAAO,UAClBkgK,EAAMh0H,WACXg0H,EAAMtkK,UAAUoE,OAAO,kBAIjB,aAAakgK,EAAoB4D,GAAS,GAClD,MAAMC,EAAUpnI,GAAA,EAAWz9B,MAE3BxD,KAAKumK,sBAAsB/B,GAG3BA,EAAMtkK,UAAUW,IAAI,UAEjB2jK,EAAMt9J,QAAQ2J,SACfC,cAAc0zJ,EAAMt9J,QAAQ2J,SAG9B,MAAM4T,EAAO+/I,EAAM9/I,wBAEb4jJ,EAAe9D,EAAMr/J,MAAMogB,UAAU7f,QAAQ,sBAAuB,CAAC6S,EAAOgwJ,KAChF,MAAMnlJ,EAAIglJ,GAAU3jJ,EAAKjhB,MAAQ6kK,EAGjC,OAAO9vJ,EAAM7S,QAAQ6iK,EAAInlJ,EAAI,QAI/BohJ,EAAMr/J,MAAMogB,UAAY+iJ,EAExBx4J,WAAW,KACT00J,EAAMlgK,UACL,KAGK,cACR,MAAMkkK,EAAW7nK,SAASC,cAAc,OAIxC,GAHA4nK,EAAStoK,UAAUW,IAAI,sBACvB2nK,EAASrjK,MAAMC,QAAU,OAEtBpF,KAAK2R,QAAQ6yJ,MAAO,CACJxkK,KAAK2R,QAAQ6yJ,MACrBzjK,cAAcM,OAAOmnK,QAE9BxoK,KAAKgkK,gBAAgB3iK,OAAOmnK,GAG9B,OAAOxoK,KAAK2R,QAAQ6yJ,MAAQgE,EAGpB,kBAAkB9tJ,EAAqBJ,EAAag4B,GAE1D,MAAMxwC,EAAK4Y,EAAO43B,QAAQkR,gBAAkBlR,EAAU53B,EAASA,EAAOjH,cAAc6+B,GACpF,GAAGxwC,IAAO,OAAAgpB,GAAA,GAAgBpQ,EAAQ,YAAa,CAC7C,GAAG,OAAAoQ,GAAA,GAAgBpQ,EAAQ,cAAe,CAExC,MAAM0P,EAAY1P,EAAO3Z,cAAcA,cAAc0S,cAAc,wBACnE,GAAG2W,EAAW,CACZ,GAAe,UAAZkoB,EAMD,YALGloB,EAAUlqB,UAAUuV,SAAS,WAC9B2U,EAAU+V,SAOd/V,EAAU9lB,UAId,OAAA2+C,GAAA,GAAmBnhD,EAAIwY,GAGpBxY,EAAG5B,UAAUuV,SAAS,cAAgB3T,EAAGf,cAAcb,UAAUuV,SAAS,6BAC3E3T,EAAG5B,UAAUoE,OAAO,cAQlB,cAAc2L,EAAyB2rD,GAC/C,OAAAnrD,EAAA,GAAezQ,KAAKqjK,OAAO72I,KAAM,aAAmBovC,IAEpD,MAAMl8B,EAAWzvB,EAAOyvB,WACxB,IAAIhuB,EACDguB,EACDhuB,EAAQ,IAAI,KAAU,CACpBzG,OAAQgF,EACRiH,QAAQ,EACRwjD,eAAe,EACf96D,WAAW,IACVmb,SAEHrJ,EAAQ/Q,SAASC,cAAc,QAC/B8Q,EAAMrQ,OAAO,IAAkBkrB,cAActc,IAC7CyB,EAAMxR,UAAUW,IAAI,eAGtB,OAAA4P,EAAA,GAAezQ,KAAKqjK,OAAO/0J,OAAQoD,GAEnC,IAAI+2J,EAAYzoK,KAAKqjK,OAAO9nI,SAC5Bv7B,KAAKqjK,OAAO9nI,SAAYktI,EAAUvnK,YACjClB,KAAKqjK,OAAO9nI,SAA2B1E,kBAAkB,CAExD5rB,OAAQgF,GAAU,KAClB+vE,UAAWtgD,OAAWr3B,EAAY,GAAK4H,IAGzCw4J,EAAU1nK,cAAc2nK,aAAa1oK,KAAKqjK,OAAO9nI,SAAUktI,GAG7C,WACdhwJ,EACAmjD,EACA3rD,EACAq2J,EACA5rJ,EACAjS,GAAU,EACVynC,EAA4B,GAC5BC,EAA4B,GAC5BpoC,G,0CAGA,GAAG/H,KAAKulK,gBAAiB,OAAOvlK,KAAKulK,gBAMrCvlK,KAAK2oK,cAAc14J,EAAQ2rD,GAE3B,MAAMgtG,EAAyB,aAAZnwJ,EAAMrN,EACnB6rJ,EAAU2R,GAAcnwJ,EAAMsoC,YAAe,CAAC,QAAS,OAAgC9hB,SAASxmB,EAAMpY,OAA+C,IAAtCoY,EAAMsoC,UAAU57B,QAAQ,WAE1InlB,KAAKujK,cAGNvjK,KAAKujK,aAAc,EACnBvjK,KAAKgb,WAAWM,WAAW40B,EAAaC,EAAa1nC,GACpDvG,OAAe+jK,eAAiBjmK,MAShCA,KAAKgb,WAAWxS,KAAK7G,OAAS,IAC/BmO,WAAW,KACT9P,KAAKgb,WAAWvR,MAAK,IACpB,GAMLzJ,KAAKq7B,QAAQta,KAAK7gB,UAAUC,OAAO,QAASH,KAAKgb,WAAWzS,SAAS5G,QACrE3B,KAAKq7B,QAAQ7yB,KAAKtI,UAAUC,OAAO,QAASH,KAAKgb,WAAWxS,KAAK7G,QAEjE,MAAMP,EAAYpB,KAAK2R,QAAQ8G,MACzBowJ,GAAwBnuJ,GAAUA,IAAWtZ,EAChDynK,IAAsBnuJ,EAAStZ,GAElCpB,KAAK0a,OAAS,CAACK,QAASL,GACxB,MAAMwmB,IAAWlhC,KAAKkhC,OAEnB9/B,EAAU6qB,oBACX7qB,EAAUoN,UAAY,IAKQ,IAAd83J,GAEhBtmK,KAAK8oK,aAAa9oK,KAAK2R,QAAQ6yJ,MAAqB,IAAd8B,GACtCtmK,KAAKolK,gBAELplK,KAAKmmK,eAAc,GACnBnmK,KAAKomK,qBAEDpmK,KAAKskK,SAASvjK,gBAChBf,KAAKwjK,OAAOviK,aAAajB,KAAKskK,SAAU3jK,SAASg2C,eAAe,iBAC3D32C,KAAKskK,SAAS9zH,YAGrBxwC,KAAKynK,mBAAkB,GAEnB,OACFznK,KAAK0kF,eAAiB,CACpBrkF,KAAM,QACN0T,MAAQC,IACN,GAAGhU,KAAKokK,yBACN,OAAO,EAGTpkK,KAAK49B,UAITjrB,EAAA,EAAwBmB,SAAS9T,KAAK0kF,kBAM1C,MAAM8/E,EAAQxkK,KAAK2R,QAAQ6yJ,MAErB5yI,EAAWqP,GAAA,EAAWz9B,MAG5B,IAAIulK,EAAU,EACd,MAAMC,EAAU/nI,GAAA,EAAWx9B,OACxBulK,EAAU,MAAY7gJ,EAAA,EAAWC,WAClC2gJ,EAAU,KAEZ,MAAMh3I,EAAYi3I,EAAU,IAAMD,EAClC,IAAIE,EAA6B5jK,QAAQ6E,UACzC,MAAMhH,EAAO,IAAiBqhD,kBAAkB9rC,EAAOrX,EAAWwwB,EAAUG,GAAW5J,EAAA,EAAWC,cAAyB/f,KAAcugK,GAAcnwJ,EAAMsG,GAAKtG,EAAMiH,IAAIolC,UAC5K,GAAG+jH,EAAsB,CACvB,MAAM3uJ,EAAeC,GAAA,EAAmBC,gBAAgB3B,EAAOvV,EAAK7C,MACpE,IAAIquB,EACJ,GAAGxU,EAAaioC,WACdzzB,EAAM,IAAIygB,MACVzgB,EAAIrU,IAAMH,EAAaI,QAClB,CACL,MAAMwnC,EAAW,IAAiBiD,yBAAyBtsC,EAAOyB,GAAc,GAC7E4nC,IACDmnH,EAAennH,EAAS1+C,YACxBsrB,EAAMozB,EAAS4C,OAIhBh2B,IACDA,EAAIxuB,UAAUW,IAAI,aAClBO,EAAUC,OAAOqtB,IASrB,MAAM1U,KAAgC4uJ,IAAcnwJ,EAAMuB,mBACpDoQ,EAAYpQ,EAAoBha,KAAKsjK,oBAAsBtjK,KAAKoqB,UAEtE,IAAIm7I,EACJ,GAAGtO,EAAS,CAKV,MAAMiS,EAAgBnhK,GAA0B,QAAf0Q,EAAMpY,KACjC4Y,EAED2mC,GAAY,CAACjlC,IAAKuuJ,IAEjB1uJ,EAAM,IAAMxa,KAAKgmK,iBAAiBtrJ,GAAQ,EAAO4rJ,GAAW3iK,KAAK,EAAE+/B,qBAKvE,MAAM1S,EAAMwzI,EAAMv4I,mBAAqBu4I,EAAMv4I,kBAAkB/rB,UAAUuV,SAAS,yBAA2B+uJ,EAAMv4I,kBAAoBu4I,EAGjI2E,EAAa3E,EAAM/wJ,cAAc,SACpC01J,GACDA,EAAW7kK,SAKb2U,EAAM1Y,aAAa,cAAe,QAGlC0Y,EAAM3X,iBAAiB,aAAc,KAChCtB,KAAKkhC,SAAWA,GACjBjoB,EAAMhV,UAIVgV,EAAM3X,iBAAiB,QAAS,KACN,IAArB2X,EAAMzI,MAAMvJ,MACbjH,KAAKkiB,IAAI1R,MAAM,SAAWyI,EAAMzI,MAAMvJ,KAAO,cAAgBgS,EAAMzI,MAAMzI,SAGxEqiB,GACDA,EAAUk4B,UAEX,CAACzjC,MAAM,IAEV7e,KAAKsB,iBAAiB,gBAAiB,KACrC2X,EAAMoB,IAAM,GACZpB,EAAMxP,QACL,CAACoV,MAAM,IAEP,OAGD5F,EAAM1V,UAAW,GAGD,QAAfkV,EAAMpY,MACP4Y,EAAM8E,OAAQ,EACd9E,EAAM1V,UAAW,EACjB0V,EAAM3V,MAAO,GACLmV,EAAMgB,SAAW,KACzBR,EAAM3V,MAAO,GAIb0tB,EAAI3vB,OAAO4X,GAGb,MAAMmwJ,EAAiB,IAAI/jK,QAAS6E,IAClC+O,EAAM3X,iBAAiB,UAAW4I,EAAS,CAAC2U,MAAM,MAG9CwqJ,EAAe,KACD,QAAf5wJ,EAAMpY,OACP4Y,EAAM/R,QAAQoiK,KAAO,UACrBrwJ,EAAM/R,QAAQqiK,QAAU,IAExBlkK,QAAQC,IAAI,CAAC8jK,EAAgB1lI,IAAiB//B,KAAK,KACjD,GAAG3D,KAAKkhC,SAAWA,EACjB,QAKalhC,KAAK0lK,YAAc,IAAI,GAAY,CAChDzsJ,QACA7U,MAHW,EAIXwhB,WAAY5L,EACZwnJ,yBAA2B9sJ,IACzB1U,KAAKskK,SAASpkK,UAAUC,OAAO,iBAAkBuU,IAEnD+sJ,MAAQ9mJ,IACN,MAAM6uJ,EAAoBtnK,OAAe+jK,eACzC,IAAItrJ,GAAO6uJ,GAAoBA,IAAqBxpK,KAGlD,OAFAA,KAAKypK,wBAAqBphK,OAC1BrI,KAAK49B,QAIO59B,KAAKgkK,gBAAgB/qH,iBAC7B/4C,UAAUC,OAAO,SAAUwa,GACjC3a,KAAKynK,mBAAmB9sJ,GACxB3a,KAAKmmK,eAAexrJ,GACpB3a,KAAK0pK,uBAAuB/uJ,GAEzB3a,KAAK0kF,iBACH/pE,EAAKhI,EAAA,EAAwB+2G,WAAW1pH,KAAK0kF,gBAC3C/xE,EAAA,EAAwBmB,SAAS9T,KAAK0kF,iBAG1CwkF,IACEvuJ,GAGD3a,KAAKypK,oBAAmB,GACxBzpK,KAAKypK,wBAAqBphK,EAE1B,GAA2BshK,oBAAoB1wJ,IAE/CjZ,KAAKypK,mBAAqB,GAA2B13C,eAAe94G,EAAOlR,KAIjF25J,WAAY,KAIV1hK,KAAK49B,YAGFt8B,iBAAiB,iBAAmB87B,IACzCp9B,KAAKskK,SAASpkK,UAAUC,OAAO,qBAAsBi9B,KAGvDp9B,KAAKsB,iBAAiB,iBAAkB,KACtCtB,KAAKskK,SAASpkK,UAAUoE,OAAO,sBAC/BtE,KAAK0lK,YAAY53J,UACjB9N,KAAK0lK,iBAAcr9J,GAClB,CAACwW,MAAM,IAEP7e,KAAKukK,aACNvkK,KAAK0lK,YAAYC,cAAa,OAQtC,GAAG3rJ,EAAmB,CACpB0pB,EAAe//B,KAAK,KACfsV,EAAMuU,WAAavU,EAAM2wJ,kBAC1Bx/I,EAAUuE,OAAO61I,GAAO,KAQ5B,MAAMqF,EAAgB,KACpB5wJ,EAAM3X,iBAAiB,UAAW,KAEhC8oB,EAAUk4B,SACVrpC,EAAMlY,cAAcb,UAAUoE,OAAO,iBACpC,CAACua,MAAM,KAGZ5F,EAAM3X,iBAAiB,UAAW,KAChC,MAAM48B,EAAUjlB,EAAM6wJ,eAAiB7wJ,EAAM8wJ,gBACvCC,EAAiB/wJ,EAAMuU,WAAavU,EAAM2wJ,iBAG7C1rI,GAAW8rI,IACZH,IAEAz/I,EAAUuE,OAAO61I,GAAO,GAGxBvrJ,EAAMlY,cAAcb,UAAUW,IAAI,mBAInCb,KAAKskK,SAASpkK,UAAUuV,SAAS,gBAClCwD,EAAM3X,iBAAiB,cAAgBvB,IACrC,OAAAiqB,EAAA,GAAYjqB,KAIhB8pK,IAwDA7pK,KAAKsuB,cAAchlB,QAAQ,CAACG,KApDf,KAKX,MAAMyQ,EAAeC,GAAA,EAAmBC,gBAAgB3B,GAClDrO,EAAwB4P,EAAoB3U,QAAQ6E,UAAY,IAAe+U,YAAYxG,GA2CjG,OAzCIuB,GACF0pB,EAAe//B,KAAK,KACduW,EAAaI,KACf8P,EAAUuE,OAAO61I,GAAO,EAAMp6J,KAKpC/E,QAAQC,IAAI,CAAC8E,EAASs5B,IAAiB//B,KAAK,KAC1C,GAAG3D,KAAKkhC,SAAWA,EAEjB,YADAlhC,KAAKkiB,IAAI3E,KAAK,8BAIhB,MAAMjD,EAAMJ,EAAaI,IACtBI,aAAkB6sJ,cAEjBv2I,EAAI/E,kBAAkBgtB,iBAAiB53C,OAAO4X,GAGhD,OAAAgqC,GAAA,GAAmBhqC,EAAOqB,GAKzB4uJ,IACDlpK,KAAKypK,mBAAqB,GAA2B13C,eAAe94G,EAAOlR,GAE3E/H,KAAKsB,iBAAiB,iBAAkB,KACnCtB,KAAKypK,qBACNzpK,KAAKypK,qBACLzpK,KAAKypK,wBAAqBphK,IAE3B,CAACwW,MAAM,KAGZ7e,KAAKiqK,kBAAkBvvJ,EAAQJ,EAAK,SAEpC+uJ,MAGKj/J,OAObm7J,EAAkB0D,EAAatlK,KAAK6W,OAC/B,CACL,MAAMA,EAAM,IAAMxa,KAAKgmK,iBAAiBtrJ,GAAQ,EAAO4rJ,GAAW3iK,KAAK,EAAE+/B,qBAsEvE1jC,KAAKsuB,cAAchlB,QAAQ,CAACG,KAjEf,KACX,MAAMyQ,EAAeC,GAAA,EAAmBC,gBAAgB3B,EAAOvV,EAAK7C,MAC9D6pK,EAAqBtB,EAAa,IAAe3pJ,YAAYxG,GAAS,IAAiBkH,aAAalH,EAAOvV,GA4DjH,OA1DAwgC,EAAe//B,KAAK,KACduW,EAAaI,KACfta,KAAKoqB,UAAU+/I,cAAcD,KAKjC7kK,QAAQC,IAAI,CAACo+B,EAAgBwmI,IAAqBvmK,KAAK,K,MACrD,GAAG3D,KAAKkhC,SAAWA,EAEjB,YADAlhC,KAAKkiB,IAAI3E,KAAK,8BAMhB,MAAMjD,EAAMJ,EAAaI,IACzB,GAAGI,aAAkB6sJ,eAInB,GAHAvnK,KAAKiqK,kBAAkBvvJ,EAAQJ,EAAK,OACpCta,KAAKiqK,kBAAkBzF,EAAOlqJ,EAAK,OAEhC6N,EAAA,EAAWC,SAAU,CACtB,MAAM2F,EAAOy2I,EAAM9wJ,iBAAiB,OACjCqa,GAAQA,EAAKpsB,QACdosB,EAAKxjB,QAAQmkB,IACXA,EAAIxuB,UAAUoE,OAAO,oBAItB,CACL,MAAM0sB,EAAMwzI,EAAMv4I,mBAAqBu4I,EAAMv4I,kBAAkB/rB,UAAUuV,SAAS,yBAA2B+uJ,EAAMv4I,kBAAoBu4I,EACjI4F,EAA+C,SAAd,QAArB,EAAAp5I,EAAI/E,yBAAiB,eAAEqmB,SAAoBthB,EAAI/E,kBAAwC,KACzG,IAAIm+I,GAAaA,EAAU/vJ,MAAQC,EAAM,CACvC,IAAIoqC,EAAQ,IAAIvV,MAChBuV,EAAMxkD,UAAUW,IAAI,aAIpB,OAAAoiD,GAAA,GAAmByB,EAAOpqC,EAAK,KAC7Bta,KAAKiqK,kBAAkBvvJ,EAAQJ,EAAK,OAEjC8vJ,GACD,aAAQ,KACNA,EAAU9lK,WAId0sB,EAAI3vB,OAAOqjD,SAMhBh0C,MAAMJ,IACPtQ,KAAKkiB,IAAI1R,MAAMF,GACftQ,KAAKoqB,UAAUuE,OAAO61I,GACtBxkK,KAAKoqB,UAAU24B,cAGVmnH,OAMX3E,EAAkB0D,EAAatlK,KAAK6W,GAGtC,OAAOxa,KAAKulK,gBAAkBA,EAAgB70J,MAAM,KAClD1Q,KAAKokK,yBAA2B,OAC/Bz8H,QAAQ,KACT3nC,KAAKulK,gBAAkB,W,2SEllDd,MAAM,WAAuB,GAU1C,cA4BE,IAAI8E,EA3BJ1qK,MAAM,IAAI,EAAiB,CACzB8K,YAAcrB,IACZ,MAAMkhK,EAAqD,gCAArCtqK,KAAK8K,cAAcK,YAAYC,GAC/C,IAACP,EAAG,OAAEI,GAAU7B,EAChBqP,EAA8B,IAAmBgG,oBAAoBrV,GAE3E,GAAIqP,KAED6xJ,GAAkB,GAAe9lE,mCAAmC/rF,IAIvE,MAAO,CAACsC,QAAS,KAAqBlQ,MAAKI,aAE3C,CAAC,SAAU,YA4GjB,KAAAm8E,YAAe1sE,IACb1a,KAAKi3D,UAAUj3D,KAAKygB,iBAAiB/F,EAAOzP,OAAQyP,EAAO7P,KAAM6P,EAAOK,SAAU,IAGpF,KAAA2sE,YAAehtE,IACb1a,KAAKi3D,UAAUj3D,KAAKygB,iBAAiB/F,EAAOzP,OAAQyP,EAAO7P,KAAM6P,EAAOK,QAAS,IAGnF,KAAA45C,cAAgB,KACd,MAAMj6C,EAAS1a,KAAK0a,OACpB,IAAI,GAAoBA,EAAOzP,OAAQ,CAACyP,EAAO7P,KAAM,OAAQ,KAC3D7K,KAAK0a,OAAS,CAACK,QAAS/a,KAAK2R,QAAQ8G,OACrCzY,KAAK49B,WAIT,KAAA42B,eAAiB,KACf,MAAM95C,EAAS1a,KAAK0a,OACjBA,EAAO7P,KAER,IAAI,GAAa,CACf,CAAC6P,EAAOzP,QAAS,CAACyP,EAAO7P,MACxB,IACM7K,KAAK49B,UAKlB,KAAA2sI,cAAiBxqK,IACf,MAAM,IAAC8K,EAAG,OAAEI,GAAUjL,KAAK0a,OAC3B,GAAG7P,GAAOA,IAAQ4mC,OAAOC,iBAAkB,CACzC,MAAMpiC,EAAWtP,KAAK8K,cAAcwE,SAC9BvH,EAAU/H,KAAKygB,iBAAiBxV,EAAQJ,GAC9C7K,KAAK49B,MAAM79B,GAEV4D,KAAK,KACJ,GAAGwkB,EAAA,EAAWC,SAAU,CACtB,MAAMhV,EAAM,GAAgBmB,OAAO,IAChCnB,GACDA,EAAIwqB,QAIR,GAAa2vB,aAAa,CACxBtiD,OAAQlD,EAAQkD,OAChBy4F,UAAW74F,EACXxK,KAAMiP,EAAW,kBAAejH,EAChCiH,iBAMR,KAAA+1J,gBAAkB,KAChB,MAAM,OAACp6J,EAAM,IAAEJ,GAAO7K,KAAK0a,OACrB3S,EAAU/H,KAAKygB,iBAAiBxV,EAAQJ,GAC9C,GAAG9C,EAAQ0Q,MAAMtQ,MACf,IAAiBqiK,cAAcziK,EAAQ0Q,MAAMtQ,MAAO,GAAayoB,KAAKC,QAAQvC,cAAc00B,aACvF,CACL,IAAIriD,EAAuB,KAEDA,EAAvBoH,EAAQ0Q,MAAMkY,QAAoB5oB,EAAQ0Q,MAAMkY,QAAQhwB,SAC3CoH,EAAQ0Q,MAAM9X,SAE3BA,GAED,IAAewjD,YAAYxjD,EAAU,GAAaiwB,KAAKC,QAAQvC,cAAc00B,WA5KjFhjD,KAAKgb,WAAWnP,UAAY,KAC1B7L,KAAK49B,SAOP59B,KAAK2R,QAAQ0rB,QAAU18B,SAASC,cAAc,OAC9CZ,KAAK2R,QAAQ0rB,QAAQn9B,UAAUW,IAAIgkK,wBAGnC,MAAM4F,EAAoB,KACrBJ,GACDv5J,aAAau5J,GAGfA,EAAiBnoK,OAAO4N,WAAW,KACjCu6J,OAAiBhiK,EACjBrI,KAAK2R,QAAQ0rB,QAAQn9B,UAAUoE,OAAO,eACrC,MAELtE,KAAK2R,QAAQ0rB,QAAQ/7B,iBAAiB,aAAc,KAC9C6mB,EAAA,EAAWC,WAEfpoB,KAAK2R,QAAQ0rB,QAAQn9B,UAAUW,IAAI,cAEhCwpK,IACDv5J,aAAau5J,GACbA,OAAiBhiK,GAGnB1H,SAASW,iBAAiB,WAAYmpK,EAAmB,CAAC5rJ,MAAM,OAGxC,IAAI,IAAW7e,KAAK2R,QAAQ0rB,SACpCmX,mBAAqBi2H,EAGvCzqK,KAAKskK,SAASjjK,OAAOrB,KAAK2R,QAAQ0rB,SAElC,YAAiBr9B,KAAKq7B,QAAQlpB,OAAQnS,KAAK20D,eAE3C,MAAMt5B,EAAmC,CAACr7B,KAAK0qK,eAAiB,CAC9Dv5J,KAAM,UACNmnB,KAAM,UACNopB,QAAS1hD,KAAKw0D,gBACbx0D,KAAK2qK,gBAAkB,CACxBx5J,KAAM,WACNmnB,KAAM,+BACNopB,QAAS1hD,KAAKqlK,iBACbrlK,KAAK4qK,cAAgB,CACtBz5J,KAAM,gBACNmnB,KAAM,SACNopB,QAAS1hD,KAAK20D,gBAGhB30D,KAAK8hK,iBAAiBzmI,GAItBr7B,KAAKwmB,eAlFP,oBACE,OAAOxmB,KAAKgb,WAAWlQ,cAoFf,eACRnL,MAAM6mB,eACN,YAAiBxmB,KAAKq7B,QAAQg3E,QAASryG,KAAKw0D,gBAC5C,YAAiBx0D,KAAKqjK,OAAOjiK,UAAWpB,KAAKuqK,eAE7C,MAAMM,EAAkB9qK,IACtB,GAAGA,EAAE2a,kBAAkB89C,kBAAmB,CACxC,MAAMu/F,EAAWh4J,EAAE2a,OAAuB0wD,aAAa,WACvD,IAAI2sF,GAAWA,EAAQ94H,SAAS,mBAC9B,OAUF,OAPA,OAAAjV,EAAA,GAAYjqB,GAEZC,KAAK49B,QAAQj6B,KAAK,KAChB,YAAiB3D,KAAK2R,QAAQ0rB,QAASwtI,EAAgB,CAACp7I,SAAS,IAChE1vB,EAAE2a,OAA6BylB,WAG3B,IAIX,YAAiBngC,KAAK2R,QAAQ0rB,QAASwtI,EAAgB,CAACp7I,SAAS,IAezD,iBAAiBxkB,EAAgBJ,GACzC,OAAO7K,KAAK8K,cAAckC,YAAc,IAAmBwT,0BAA0BvV,EAAQJ,GAAO,IAAmB4V,iBAAiBxV,EAAQJ,GA0E1I,WAAW9C,GACjB,MAAMs1B,EAAWt1B,EAA4BA,QAC7C,IAAI+gB,EAA2C,GAC5CuU,IACDvU,EAAO,IAAkB+qB,aAAaxW,EAAS,CAC7C6gB,SAAWn2C,EAA4B4vD,iBAK3C,OAAA7qC,EAAA,GAAa9sB,KAAK2R,QAAQ0rB,QAAQpR,kBAAmBnD,GACrD9oB,KAAK2R,QAAQ0rB,QAAQn9B,UAAUC,OAAO,QAASk9B,GAI1C,iBAAiBjwB,GAGtB,OAFApN,KAAKgb,WAAW1N,iBAAiBF,GAE1BpN,KAGI,UAAU+H,EAAoB2S,EAAsB4rJ,EAAY,EAAG79J,GAAU,EACxFynC,EAA0C,GAAIC,EAA0C,I,8GACxF,GAAGnwC,KAAKulK,gBAAiB,OAAOvlK,KAAKulK,gBAErC,MAAM16J,EAAM9C,EAAQ8C,IACdoF,EAAUlI,EAA4BmnF,WAAannF,EAAQkI,OAAUlI,EAA4BmnF,SAAS+lB,UAAYltG,EAAQkI,OAC9HwI,EAAQ,IAAmBgG,oBAAoB1W,GAE/C+iK,EAAmC,mBAAd/iK,EAAQqD,IAA2B,IAAmB+lD,WAAWppD,GAC5F,CAAC/H,KAAKq7B,QAAQg3E,QAASryG,KAAK0qK,eAAe3vJ,SAASxQ,QAAQmZ,IAC1DA,EAAOxjB,UAAUC,OAAO,OAAQ2qK,KAGlC9qK,KAAKskK,SAASpkK,UAAUC,OAAO,cAAe2qK,GAE9C,MAAMC,EAAsBD,EAC5B,CAAC9qK,KAAKq7B,QAAQ9L,SAAUvvB,KAAK2qK,gBAAgB5vJ,SAASxQ,QAAQmZ,IAC5DA,EAAOxjB,UAAUC,OAAO,OAAQ4qK,KAGlC,MAAM35G,EAAmB,IAAmBA,iBAAiBrpD,GAC7D,CAAC/H,KAAKq7B,QAAQlpB,OAAQnS,KAAK4qK,cAAc7vJ,SAASxQ,QAAQmZ,IACxDA,EAAOxjB,UAAUC,OAAO,QAASixD,KAGnCpxD,KAAKgrK,WAAWjjK,GAChB,MAAMqC,EAAU,EAAM6gK,WAAU,UAACxyJ,EAAO1Q,EAAQykB,KAAMvc,EAAQq2J,EAAW5rJ,EAAQjS,EAASynC,EAAaC,EAAapoC,GAIpH,OAHA/H,KAAK0a,OAAO7P,IAAMA,EAClB7K,KAAK0a,OAAOzP,OAASlD,EAAQkD,OAEtBb,KAGF,0CAA0CqO,GAC/C,MAAmB,UAAZA,EAAMrN,GAAiB,EAA2BO,IAAI8M,EAAMsoC,YCzRxD,MAAM,WAAoE,EAGvF,YAAYrhD,GACVC,MAAM,OAAD,wBACAD,GAAO,CACV2K,SAAU,CAACF,EAAQF,EAAOvB,KACxB,GAAG1I,KAAKiL,OAAOm4B,cAAgBn5B,EAAO,OAAO5E,QAAQ6E,QAAQ,CAAC5B,MAAO,EAAGa,MAAO,KAE/E,MAAMyB,EAAQT,aAAM,EAANA,EAAQ4kC,QACtB,OAAO,IAAiBwC,cAAcvxC,KAAKiL,OAAQL,EAAOlC,GAAW/E,KAAKgB,IACxE,MAAMwE,EAAQxE,EAAM6sC,OAAO/kC,IAAIsiC,IACtB,CAACh0B,QAAS,KAAqBg0B,aAGxC,MAAO,CAACzmC,MAAO3D,EAAM2D,MAAOa,eAKlCnJ,KAAK4I,aAAc,EACnB5I,KAAKiL,OAASvL,EAAQuL,Q,2SClBX,MAAM,WAA6B,GAGhD,YAAYA,GACVtL,MAAM,IAAI,GAAiB,CAACsL,WAAU,IAmBxC,KAAAm8E,YAAe1sE,IACb1a,KAAKi3D,UAAUv8C,EAAOq0B,QAASr0B,EAAOK,SAAU,IAGlD,KAAA2sE,YAAehtE,IACb1a,KAAKi3D,UAAUv8C,EAAOq0B,QAASr0B,EAAOK,QAAS,IAGjD,KAAAsqJ,gBAAkB,KAChB,IAAiBmF,cAAc,IAAiBt7H,SAASlvC,KAAK0a,OAAOq0B,SAAU,GAAane,KAAKC,QAAQvC,cAAc00B,UA1BvHhjD,KAAKiL,OAASA,EAEdjL,KAAK8hK,iBAAiB,CAAC,CACrB3wJ,KAAM,WACNmnB,KAAM,+BACNopB,QAAS1hD,KAAKqlK,mBAShBrlK,KAAKwmB,eAeM,UAAUuoB,EAA4Br0B,EAAsB4rJ,EAAY,EAAGp2H,EAAgDC,G,8GACtI,GAAGnwC,KAAKulK,gBAAiB,OAAOvlK,KAAKulK,gBAErC,MAAMp9J,EAAQ,IAAiB+mC,SAASH,GAClCvhC,EAAM,EAAMy9J,WAAU,UAAC9iK,EAAOA,EAAMqkB,KAAMxsB,KAAKiL,OAAQq7J,EAAW5rJ,GAAQ,EAAOw1B,EAAaC,GAGpG,OAFAnwC,KAAK0a,OAAOq0B,QAAU5mC,EAAM4K,GAErBvF,M,2SClCX,MAAM09J,GAAkBjgK,IACtB,IAAkBkgK,uBAAuBlgK,GACxCkB,MAAMC,KAAKzL,SAAS+S,iBAAiB,gCAAkCzI,EAAS,OAA2BV,QAAQmgB,IAElHA,EAAK8b,YAWF,SAAe4J,GACpB11B,EACAzP,EACAulB,EACAzoB,EACAmoC,EACAC,G,0CAEA,IAAIhoC,QAAc,UAAkBijK,aAAangK,GACjD,IAAIulB,MAAiBroB,EACnB,OAGF,MAAMkjK,EAAY,IACHl/J,MAAMC,KAAKsO,EAAOhH,iBAAiB,QAAQW,KAAKqa,IAAQA,EAAIxuB,UAAUuV,SAAS,UAC9EiF,EAAS,KAGzB,GAAGzP,EAAOm4B,YAAa,CACrB,MAAMkoI,IAAevjK,EACfoD,EAAc,gCACpB,IAAIpD,IACFA,QAAgB,IAAmBiD,UAAU,CAC3CC,SACAE,YAAa,CAACC,EAAGD,GACjBP,MAAO,EACPM,MAAO,IACNvH,KAAKgB,GAGCA,EAAMmD,QAAQ,KAGnB0oB,KACF,OAIJ,GAAGzoB,EAAS,CAEWA,EAAQG,OAAOC,MACpB4K,KAAO5K,EAAM4K,KACvBu4J,IACFvjK,EAAU,IAAmB8pC,0BAA0B5mC,EAAQ9C,KAMnE,MAAMi3B,EAAKn3B,GAA4BA,EAAIwE,IAAI3K,IAAM,CACnDiZ,QAASjZ,EAAGiZ,QACZlQ,IAAM/I,EAAGsH,KAAgCyB,IACzCI,OAASnJ,EAAGsH,KAAgC6B,UAU9C,YAPA,IAAI,IACHqC,iBAAiB,CAChBrC,SACAE,YAAa,CAACC,EAAGD,KAElB8rD,UAAUlvD,EAASsjK,SAAahjK,OAAWA,EAAW6nC,EAAc9Q,EAAE8Q,QAAe7nC,EAAW8nC,EAAc/Q,EAAE+Q,QAAe9nC,IAMpI,GAAGF,EAAO,EACJ,OAAA2pF,GAAA,GAAS/pF,IAAYA,IACvBI,EAAQ,IAAiB+mC,SAASnnC,IAGpC,MAAMq3B,EAAKn3B,GAA4BA,EAAIwE,IAAI3K,IAAM,CACnDiZ,QAASjZ,EAAGiZ,QACZg0B,QAASjtC,EAAGsH,QAGd,IAAI,GAAqB6B,GAAQgsD,UAAU9uD,EAAM4K,GAAIs4J,SAAahjK,EAAW6nC,EAAc9Q,EAAE8Q,QAAe7nC,EAAW8nC,EAAc/Q,EAAE+Q,QAAe9nC,OAnF1JuE,EAAA,EAAUtL,iBAAiB,gBAAiB4pK,IAC5Ct+J,EAAA,EAAUtL,iBAAiB,kBAAoB2J,IACzC,IAAkBsgK,eAAetgK,IACnCigK,GAAejgK,KAoFnB,MAAMugK,GAA6C,IAAIl4J,IACjD,GAAoB,IAAI3L,IAEf,MAAM,WAAsB6jB,YAA3C,c,oBAOU,KAAAigJ,cAAe,EAEvB,uBAGE,MAAMjxJ,EAAMgxJ,GAAU73J,IAAI3T,KAAKiL,QAC5BuP,GAAOA,EAAI7O,IAAI3L,QAChBwa,EAAIrI,OAAOnS,MACPwa,EAAItX,MACNsoK,GAAUr5J,OAAOnS,KAAKiL,SAIvBjL,KAAKsuB,eACNtuB,KAAKsuB,cAAc0jB,UAAUhyC,MAI1B,mBACL,IAAIk+B,GAAU,EACd,YAAiBl+B,KAAYD,GAAM,mCAEjC,GADA,OAAAiqB,EAAA,GAAYjqB,GACTm+B,EAAS,OAEZ,MAAMjzB,EAASjL,KAAKiL,OACpBizB,GAAU,QACJkS,GAAiBpwC,KAAMA,KAAKiL,OAAQ,IAAMjL,KAAKiL,SAAWA,GAChEizB,GAAU,MAIP,cAAcx+B,GACnB,IAAI,IAAIkC,KAAKlC,EAEXM,KAAK4B,GAAKlC,EAAQkC,GAIf,kBAAkBlC,GAQvB,MAAMkrI,EAAY5qI,KAAKiL,OACvBjL,KAAKs5C,cAAc55C,GACnB,MAAMgsK,EAAY1rK,KAAKiL,OAEvB,GAAG2/H,IAAc8gC,EAAjB,CAOA,GAHA1rK,KAAKiL,OAAS,IAAgB0gK,kBAAkBD,IAAcA,EAC9D1rK,KAAKkH,QAAQ+D,OAAS,GAAKygK,EAExB9gC,EAAW,CACZ,MAAMpwH,EAAMgxJ,GAAU73J,IAAIi3H,GACvBpwH,IACDA,EAAIrI,OAAOnS,MACPwa,EAAItX,MACNsoK,GAAUr5J,OAAOy4H,IAKvB,OAAO5qI,KAAKwmC,UAGN,EAAE+f,GAAY,GACpB,MAAMx2C,EAAM,IAAkB+uF,SAAS9+F,KAAMA,KAAKiL,OAAQjL,KAAKw7B,SAAUx7B,KAAKggF,UAAWz5B,EAAWvmD,KAAK2/I,OACnGv1I,EAAU2F,EAAMA,EAAI3M,YAAciC,QAAQ6E,UAWhD,OAVGlK,KAAKouB,eACHre,GAAOA,EAAIiQ,QACZhgB,KAAKouB,aAAa7kB,KAAKa,GAGzBA,EAAQu9B,QAAQ,KACd3nC,KAAKouB,kBAAe/lB,KAIjB0H,EAGF,SACL,GAAG/P,KAAKsuB,cAAe,CACrB,IAAI,GAAK3iB,IAAI3L,KAAKiL,QAAS,CACzB,GAAGjL,KAAKyrK,aAAc,OACtBzrK,KAAKyrK,cAAe,EAEpB,IAAIjxJ,EAAMgxJ,GAAU73J,IAAI3T,KAAKiL,QAkB7B,OAjBIuP,IACFA,EAAM,IAAI7S,IACV6jK,GAAUhxJ,IAAIxa,KAAKiL,OAAQuP,IAG7BA,EAAI3Z,IAAIb,MAERA,KAAK+lB,GAAE,QAEP/lB,KAAKsuB,cAAc/kB,KAAK,CACtBynB,IAAKhxB,KACLyJ,KAAM,KACJ,GAAK5I,IAAIb,KAAKiL,QACPjL,KAAKwmC,YAKRxmC,KAAKyrK,cACbzrK,KAAKsuB,cAAc0jB,UAAUhyC,MAIjC,GAAKa,IAAIb,KAAKiL,QAEd,MAAM8E,EAAM/P,KAAK+lB,IACX3b,EAAU2F,EAAMA,EAAI3M,YAAciC,QAAQ6E,UAE7ClK,KAAKyrK,cACNrhK,EAAQu9B,QAAQ,KACd3nC,KAAKyrK,cAAe,IAIxB,MAAMjxJ,EAAMgxJ,GAAU73J,IAAI3T,KAAKiL,QAC/B,GAAGuP,EAAK,CACNA,EAAIrI,OAAOnS,MACX,MAAMiI,EAAMkE,MAAMC,KAAKoO,GACvBgxJ,GAAUr5J,OAAOnS,KAAKiL,QAGtB,IAAI,IAAIrJ,EAAI,EAAGD,EAASsG,EAAItG,OAAQC,EAAID,IAAUC,EAChDqG,EAAIrG,GAAG4kC,SAIX,OAAOp8B,GAIXulB,eAAeC,OAAO,iBAAkB,ICvPzB,MAAM,GAArB,cAwEU,KAAAg8I,eAAiB,KACvB,IAAI10J,EAAS,IAAmB2iE,cAAc75E,KAAK6rK,YAChD30J,GACD,IAAmB40J,gBAAgB,CAAC50J,EAAOjM,UAAWiM,EAAO60J,YAIzD,KAAAnsD,WAAa,KACnB,IAAmBosD,gBAAgBhsK,KAAK6rK,WAAY7rK,KAAKy6E,UAAU/pE,MAAMJ,IACvD,4BAAbA,EAAIjQ,OACFL,KAAKy6E,UAAY,EAClB7gD,GAAS,CAACC,YAAa,0BAEvB,IAAI,GAAU,0BAA2B,CACvCwB,QAAS,CAAC,CACR7B,QAAS,KACT0oC,UAAU,GACT,CACD1oC,QAAS,uBACT4C,SAAU,KACR,IAAI,GAAkB,IAAgB1nB,UAG1CmnB,mBAAoB,wBACpBG,oBAAqB,CAAC,YAAK,QAAS,CAACpvB,EAAA,EAAUklD,OAAOm6G,8BACrD7uI,WAMH,KAAA8uI,cAAgB,KACtB,IAAmBrgI,eAAe7rC,KAAK6rK,YAAY,IAG7C,KAAAprC,YAAc,KACpB,IAAI,GAAUzgI,KAAK6rK,aAGb,KAAAM,cAAgB,KACtB,MAAMj1J,EAAS,IAAmB2iE,cAAc75E,KAAK6rK,YACjD30J,IAEDA,EAAOg3F,cACR,IAAmB5D,YAAYtqG,KAAK6rK,WAAY30J,EAAOk1J,aACvD,IAAmBh8D,iBAAiBpwG,KAAK6rK,YAAY,IAErD,IAAmBz7D,iBAAiBpwG,KAAK6rK,cAIrC,KAAAl3G,cAAgB,KACtB,IAAI,GAAkB30D,KAAK6rK,aAG7B,KAAAj3G,cAAiB70D,IACZC,KAAKgS,OACNhS,KAAKgS,OACLhS,KAAKgS,KAAO,MAGd,IAAIkuB,EAAkB,KAEtB,IACEA,EAAK,OAAA+F,GAAA,GAAUlmC,EAAE2a,OAAQ,MACzB,MAAM3a,IAER,GAAImgC,EAAJ,CAGA,GADGngC,aAAa+pB,YAAY/pB,EAAE0H,iBAC3BzH,KAAK+a,QAAQ7a,UAAUuV,SAAS,UACjC,OAAO,EAEN1V,aAAa+pB,aAAY/pB,EAAE80D,cAAe,GAE7C70D,KAAKy6E,SAAW,GAAkBA,SAElCz6E,KAAK6rK,WAAa3rI,EAAGh5B,QAAQ+D,OAAOsgB,WACpCvrB,KAAKkX,OAAS,IAAmB2iE,cAAc75E,KAAK6rK,YAEpD7rK,KAAKq7B,QAAQ9wB,QAAQmZ,IACnB,MAAM+oC,EAAO/oC,EAAO5I,SAEpB4I,EAAO3I,QAAQ7a,UAAUC,OAAO,QAASssD,KAI3CzsD,KAAKq7B,QAAQr7B,KAAKq7B,QAAQ15B,OAAS,GAAGoZ,QAAQoS,UAAUC,YAAY,YAAK,IAAgB46G,oBAAoBhoI,KAAK6rK,cAElH3rI,EAAGhgC,UAAUW,IAAI,aACjB,aAAad,EAAGC,KAAK+a,SACrB,aAAY/a,KAAK+a,QAAS,KACxBmlB,EAAGhgC,UAAUoE,OAAO,aACpBtE,KAAK6rK,WAAa7rK,KAAKkX,OAASlX,KAAKy6E,cAAWpyE,MA7J5C,OACNrI,KAAKq7B,QAAU,CAAC,CACdlqB,KAAM,SACNmnB,KAAM,eACNopB,QAAS1hD,KAAKmsK,cACdrxJ,OAAQ,KAAO,IAAmBuxJ,eAAersK,KAAKkX,SACrD,CACD/F,KAAM,YACNmnB,KAAM,aACNopB,QAAS1hD,KAAKmsK,cACdrxJ,OAAQ,IAAM,IAAmBuxJ,eAAersK,KAAKkX,SACpD,CACD/F,KAAM,MACNmnB,KAAM,uBACNopB,QAAS1hD,KAAK4/G,WACd9kG,OAAQ,K,MAEN,QADiB9a,KAAKy6E,SAAW,EAAI,IAAmBrD,eAAesD,UAAU16E,KAAKy6E,UAAU5D,cAAc53C,SAASj/B,KAAKkX,OAAOjM,WAA8B,QAAlB,EAAAjL,KAAKkX,OAAOqH,cAAM,eAAEgxE,WAGpK,CACDp+E,KAAM,QACNmnB,KAAM,yBACNopB,QAAS1hD,KAAK4/G,WACd9kG,OAAQ,K,MAEN,OADiB9a,KAAKy6E,SAAW,EAAI,IAAmBrD,eAAesD,UAAU16E,KAAKy6E,UAAU5D,cAAc53C,SAASj/B,KAAKkX,OAAOjM,WAA8B,QAAlB,EAAAjL,KAAKkX,OAAOqH,cAAM,eAAEgxE,UAGpK,CACDp+E,KAAM,OACNmnB,KAAM,wBACNopB,QAAS1hD,KAAKygI,YACd3lH,OAAQ,IACC9a,KAAK6rK,aAAej/J,EAAA,EAAU+R,OAAS,KAAwB2tB,iBAAiBtsC,KAAKkX,OAAOjM,SAEpG,CACDkG,KAAM,SACNmnB,KAAM,0BACNopB,QAAS1hD,KAAKksK,cACdpxJ,OAAQ,IACC9a,KAAK6rK,aAAej/J,EAAA,EAAU+R,MAAQ,KAAwB2tB,iBAAiBtsC,KAAKkX,OAAOjM,SAEnG,CACDkG,KAAM,UACNmnB,KAAM,UACNopB,QAAS1hD,KAAK4rK,eACd9wJ,OAAQ,IAAwB,IAAlB9a,KAAKy6E,UAAkBz6E,KAAK6rK,aAAej/J,EAAA,EAAU+R,MAClE,CACDxN,KAAM,YACNmnB,KAAM,YACNopB,QAAS1hD,KAAK4rK,eACd9wJ,OAAQ,IAAwB,IAAlB9a,KAAKy6E,UAAkBz6E,KAAK6rK,aAAej/J,EAAA,EAAU+R,MAClE,CACDxN,KAAM,gBACNmnB,KAAM,SACNopB,QAAS1hD,KAAK20D,cACd75C,OAAQ,KAAM,IAGhB9a,KAAK+a,QAAU,GAAW/a,KAAKq7B,SAC/Br7B,KAAK+a,QAAQhI,GAAK,sBAClB/S,KAAK+a,QAAQ7a,UAAUW,IAAI,eAC3BF,SAASg2C,eAAe,cAAct1C,OAAOrB,KAAK+a,UCrFtD,IAAYuxJ,GCKAC,IDLZ,SAAYD,GACV,6BACA,+BACA,uBACA,2BAJF,CAAYA,QAAgB,KEgBb,MAAM,GAoBnB,YAAYhuI,GAXJ,KAAAkuI,YAAa,EAEb,KAAAC,YAAa,EACb,KAAAC,UAAW,EACX,KAAAC,UAAW,EA4DX,KAAAC,oBAAsB,KAC5BjpF,GAAA,EAAehwE,IAAI,MAAMhQ,KAAKkpK,IACxBA,IACFA,EAAW,KAAIA,UAGd7sK,KAAK8sK,4BACNh8J,aAAa9Q,KAAK8sK,2BAClB9sK,KAAK8sK,0BAA4B,GAGnC,MAAM1gH,EAASx/C,EAAA,EAAUmgK,iBAAiB,OAASF,GAC7CG,EAAS5gH,GAAUA,EAAOA,SAAWkgH,GAAiBW,UAEzDjtK,KAAKysK,YAAcO,GACpBnvG,GAAA,EAAkBqvG,qBAGjBF,IAAWhtK,KAAKwsK,aACjBxsK,KAAKwsK,YAAa,GAGpBxsK,KAAK0sK,SAAWtgH,GAAUA,EAAOA,SAAWkgH,GAAiBa,SAC7DntK,KAAKysK,YAAcO,EACnBhtK,KAAKotK,QAAUhhH,GAAUA,EAAOghH,QAChC,MAASptK,KAAKkiB,IAAI,aAAcliB,KAAKysK,YACrCzsK,KAAKo6B,cAID,KAAAizI,cAAgB,CAACxzI,EAA0B9nB,KAC9C/R,KAAKstK,qBAAuBzzI,IAC/B75B,KAAKstK,mBAAqBzzI,EAC1B,OAAAppB,EAAA,GAAezQ,KAAKutK,SAAU,YAAK1zI,EAAa9nB,IAChD/R,KAAKwtK,gBAAgB7+I,OAAO3uB,KAAKutK,YAe3B,KAAAnzI,SAAW,KACjB,MAAMvpB,EAAU,GAA0B48J,mBAC1C,GAAGztK,KAAKysK,WACN,GAAGzsK,KAAK0sK,SAAU,CAChB,MAAMpgK,EAAItM,KAAK0tK,KAAK,kCAAmC,IAAM,KAAWC,kBACxE3tK,KAAKqtK,cAAc,4BAA6B,CAAC/gK,SAC5C,GAAGtM,KAAKwsK,WACb,QAAoBnkK,IAAjBrI,KAAKotK,QAAuB,CAC7B,MAAMQ,EAAYjtK,SAASC,cAAc,QACnCwsK,EAAUptK,KAAKotK,QACf9+E,EAAU,KACd,MAAM3xC,EAAMD,KAAKC,MACjBixH,EAAUhgJ,UAAY,GAAK/oB,KAAKE,OAAOqoK,EAAUzwH,GAAO,KACrDA,EAAMywH,GACPnwH,cAAcwkG,IAGZA,EAAW1uG,YAAYu7C,EAAS,KACtCA,IAEA,MAAMhiF,EAAItM,KAAK0tK,KAAK,6BAA8B,IAAM,KAAWG,yBACnE7tK,KAAKqtK,cAAc,+BAAgC,CAACO,EAAWthK,SAE/DtM,KAAKqtK,cAAc,sCAGrBrtK,KAAKqtK,cAAc,iCAEbrtK,KAAK2sK,UACb3sK,KAAKqtK,cAAc,YAGrB,MAASrtK,KAAKkiB,IAAI,WAAYliB,KAAKysK,YAAczsK,KAAK2sK,UACtDzqK,OAAO8jB,sBAAsB,KACxBhmB,KAAK8tK,iBAAiBh9J,aAAa9Q,KAAK8tK,iBAQ3C9tK,KAAK8tK,gBAAkB5rK,OAAO4N,WANnB,KACT,aAAc9P,KAAK+tK,gBAAiB,WAAY/tK,KAAKysK,YAAczsK,KAAK2sK,SAAU,KAClF3sK,KAAK8tK,gBAAkB,EACvB,MAAS9tK,KAAKkiB,IAAI,qBAAsBliB,KAAKysK,YAAczsK,KAAK2sK,WAGrB97J,MA/I/C7Q,KAAKkiB,IAAM,OAAAkzC,EAAA,GAAO,UAAM/sD,OAAWA,GAEnCrI,KAAK+tK,gBAAkBptK,SAASC,cAAc,OAC9CZ,KAAK+tK,gBAAgB7tK,UAAUW,IAAI,qBAEnCb,KAAKutK,SAAW,YAAO,kDAAmD,CAAC97J,UAAU,IACrFzR,KAAKwtK,gBAAkB,IAAI,KAAqB,CAACnjJ,YAAY,IAC7DrqB,KAAKwtK,gBAAgBQ,mBAAmB,CAACnxH,MAAO,cAAe0+E,MAAM,IACrEv7H,KAAK+tK,gBAAgB1sK,OAAOrB,KAAKutK,UAEjCjvI,EAAet9B,QAAQhB,KAAK+tK,iBAE5BnhK,EAAA,EAAUtL,iBAAiB,2BAA6B8qD,IACtD77C,QAAQ2R,IAAIkqC,GAEZpsD,KAAK4sK,wBAGPhgK,EAAA,EAAUtL,iBAAiB,sBAAwBo8B,IAC7CA,IACF19B,KAAK2sK,UAAW,EAChB,MAAS3sK,KAAKkiB,IAAI,WAAYliB,KAAK2sK,UACnC3sK,KAAKo6B,cAITxtB,EAAA,EAAUtL,iBAAiB,qBAAuBo8B,IAChD,MAAS19B,KAAKkiB,IAAI,qBAAsBwb,GACpCA,IACF19B,KAAK2sK,UAAW,EAChB,MAAS3sK,KAAKkiB,IAAI,WAAYliB,KAAK2sK,UACnC3sK,KAAKo6B,cAITp6B,KAAK8sK,0BAA4B5qK,OAAO4N,WAAW9P,KAAK4sK,oBAAqB,GAA0Ba,mBAAqB,KAsDtH,KAAK5zI,EAA0BuC,GACrC,MAAM9vB,EAAI3L,SAASC,cAAc,KAQjC,OAPA0L,EAAEpM,UAAUW,IAAI,mBAChByL,EAAEjL,OAAO,YAAKw4B,IACd,YAAiBvtB,EAAIvM,IACnB,OAAAiqB,EAAA,GAAYjqB,GACZq8B,MAGK9vB,GC7II,SAAS2hK,GACtB9sH,EACA/9B,EACAE,EACA9f,EACAC,EACAy4C,EACApsB,EACAgtB,GAEA,GAAsB,iBAAb,EACPZ,EAAS,CAACs1F,GAAIt1F,EAAQu1F,GAAIv1F,EAAQ48E,GAAI58E,EAAQw1F,GAAIx1F,OAC7C,CACL,MAAMgyH,EAAgB,CAAC18B,GAAI,EAAGC,GAAI,EAAG3Y,GAAI,EAAG4Y,GAAI,GAChD,IAAI,MAAMlsF,KAAQ0oH,EAEhBhyH,EAAOsJ,GAAQtJ,EAAOsJ,IAAS0oH,EAAc1oH,GAIjDrE,EAAI8xF,YACJ9xF,EAAI+xF,OAAO9vH,EAAI84B,EAAOs1F,GAAIluH,GAC1B69B,EAAIgyF,OAAO/vH,EAAI5f,EAAQ04C,EAAOu1F,GAAInuH,GAClC69B,EAAIgtH,iBAAiB/qJ,EAAI5f,EAAO8f,EAAGF,EAAI5f,EAAO8f,EAAI44B,EAAOu1F,IACzDtwF,EAAIgyF,OAAO/vH,EAAI5f,EAAO8f,EAAI7f,EAASy4C,EAAO48E,IAC1C33E,EAAIgtH,iBAAiB/qJ,EAAI5f,EAAO8f,EAAI7f,EAAQ2f,EAAI5f,EAAQ04C,EAAO48E,GAAIx1G,EAAI7f,GACvE09C,EAAIgyF,OAAO/vH,EAAI84B,EAAOw1F,GAAIpuH,EAAI7f,GAC9B09C,EAAIgtH,iBAAiB/qJ,EAAGE,EAAI7f,EAAQ2f,EAAGE,EAAI7f,EAASy4C,EAAOw1F,IAC3DvwF,EAAIgyF,OAAO/vH,EAAGE,EAAI44B,EAAOs1F,IACzBrwF,EAAIgtH,iBAAiB/qJ,EAAGE,EAAGF,EAAI84B,EAAOs1F,GAAIluH,GAC1C69B,EAAIyyF,YAED9jH,GACDqxB,EAAIrxB,OAGHgtB,GACDqE,EAAIrE,SDdQ,GAAA2wH,mBAAqB,IDZrC,SAAYlB,GACV,sBACA,yBACA,mBACA,mBAJF,CAAYA,QAAc,KGC1B,MAAM6B,GAAMlsK,OAAOoE,iBACb+nK,GAAO,GAAKD,GACZE,GAAS,IAAMF,GACf,GAAQ,EAAIA,GACZG,GAAS,EAAIH,GAOJ,SAASI,GAAoBxzE,GAAW,GACrD,MAAM91F,EAASvE,SAASC,cAAc,UACtCsE,EAAO1B,MAAQ0B,EAAOzB,OAAS4qK,GAC/B,MAAMjhK,EAAUlI,EAAOyP,WAAW,MAG5B85J,GAAWJ,IAZJ,EAWgB,GAAQ,EAAeC,KACb,EAEjCI,EAAYhyH,KAAKC,MACvB,IAAIgyH,GAAa,EAEjB,MAAMt0B,EAAc,KAClB,GAAIn1I,EAAOwqB,YAIAi/I,IACTA,EAAazpK,EAAOwqB,kBAJpB,GAAGi/I,EACD,OAAO,EAMX,MAAMlyH,EAAOC,KAAKC,MAKZnzB,GC/C6BlV,GD+CHmoC,EAAOiyH,GA3B1B,ICpBiCniK,ED+CgB,EC/CMg1B,EDoBvD,KA2BoD,EC9CvD,GAAK18B,KAAK2lE,IAAI3lE,KAAKu3C,GAAK9nC,EAAIitB,GAAK,GAAKh1B,GADrC,IAAwB+H,EAAW/H,EAAsBg1B,EDiDpEn0B,EAAQwH,UAAU,EAAG,EAAGy5J,GAAMA,IAC9BjhK,EAAQk+D,UAAY0vB,IAAa7yE,EAAA,EAAWC,SAAW,GAAiBuuH,YAAY,iBAAmB,OAEvG,IAAI,IAAI/0I,EAAI,EAAGA,EApCJ,IAoCkBA,EAAG,CAG9B,IAAIgtK,EAEFA,EADCplJ,GAAY,GACE5nB,EAAI,EAAI,EAAe,EAAX4nB,EAAiC,GAAjBA,EAAW,IAEvC5nB,EAAI,EAAe,EAAX4nB,EAAe,EAAe,EAAXA,EAG5C,IAAI/lB,EA5CS,EA4C6B,EAAfmrK,EAK3BnrK,GAAU2qK,GAGVH,GAAU7gK,EAjBAqhK,EAAW7sK,EAAI,GAAUA,EAAI0sK,IAe5BD,GAAO5qK,GAAU,EAEH,GAAOA,EAAQ8qK,IAAQ,GAGlD,OAAO,GAGT,MAAO,CACLrpK,SACA2pK,eAAgB,KACd,aAAQx0B,GACRA,KAEF3rI,UAAY8oC,IACVwjD,EAAWxjD,EACX6iG,M,2SEEN,MAAM,WAAyB,GAC7B,YACSjsI,EACA0gK,EACA3iH,GAEPxsD,MAAM,CACJosD,SAAWhxC,GAAY,IAAmB8+D,cAAc9+D,EAAQhI,IAAI/S,KAAK8uK,UACzEhjH,SAAW/wC,IACTA,EAAQ/D,IAAIuvB,OAAOjiC,SACnBtE,KAAKmsD,oBAAsBnsD,KAAKmsD,sBAElCb,OAAQ,CAACvwC,EAAS/S,KAChB,MAAMqkD,EAAmBtxC,EAAQ/D,IAAIuvB,OAAOxlC,gBAAkBf,KAAKoO,KACnE48C,GAAuBjwC,EAAQ/D,IAAIuvB,OAAQvmC,KAAKoO,KAAMpG,GAEnDqkD,GACDrsD,KAAKmsD,oBAAsBnsD,KAAKmsD,sBAGpCP,gBAAiB,CAACD,EAAMF,KACtB,MAAMr9B,EAA+Bq9B,EAAQ,QAAKpjD,GAE5C,IAAC2O,GAAO+3J,GAAkBC,cAAc,CAAC93J,OAAQy0C,EAAK54C,GAAIqb,eAAc6gJ,QAASxjH,IAUvF,OATCE,EAAsB30C,IAAMA,GAE1BoX,aAAY,EAAZA,EAAczsB,UACdgqD,EAAsBv9B,aAAeA,EACtC/oB,QAAQC,IAAI8oB,GAAcuZ,QAAQ,YACxBgkB,EAAsBv9B,gBAI3Bu9B,GAETP,kBAAmB,OAjCd,KAAAh9C,OACA,KAAA0gK,WACA,KAAA3iH,qBAmCF,QACLnsD,KAAKoO,KAAKI,UAAY,GACtB7O,MAAMgP,SAOH,MAAM,GAsDX,cArDQ,KAAA2vB,eAAiB39B,SAASg2C,eAAe,sBAKzC,KAAArT,OAAqB,KAErB,KAAAphB,IAAM,OAAAkzC,EAAA,GAAO,UAAW,IAASy3E,IAAM,IAASz9G,MAAQ,IAAS09G,KAAO,IAASC,OAEjF,KAAAY,YAAc,IAAI,GAGnB,KAAAntD,YAAsD,GACtD,KAAAG,YAAgD,GAE/C,KAAAuuF,QAA8E,CACpF9hH,KAAMzsD,SAASg2C,eAAe,gBAC9Bw4H,oBAAqB,KACrB/tK,UAAWT,SAASg2C,eAAe,sBAE7B,KAAAyjC,gBAOJ,GAMI,KAAAg1F,mBAAuC,IAAIznK,IAE3C,KAAA0nK,QAAyC,CAAC32I,IAAK,EAAGhT,OAAQ,GAO1D,KAAA4pJ,iBAAkB,EAGlB,KAAAC,0BAA2B,EAof5B,KAAAzuF,YAAc,KACnB9gF,KAAKsjC,OAAStjC,KAAK2gF,YAAY3gF,KAAKy6E,UACpCz6E,KAAKsjC,OAAOv6B,UAAU2vB,KAAM,EAC5B14B,KAAKsjC,OAAOv6B,UAAU2c,QAAS,EAC/B1lB,KAAKqvK,QAAQ32I,IAAM14B,KAAKqvK,QAAQ3pJ,OAAS,EACzC1lB,KAAKwvK,wBAAqBnnK,EAC1BrI,KAAKshF,WAAathF,KAAKwgF,YAAYxgF,KAAKy6E,UACxCz6E,KAAKyvK,iBAybC,KAAAC,oBAAsB,KAC5B,IAAI1vK,KAAKuvK,yBACP,OAKF,GAFAvvK,KAAK2vK,2BAEF3vK,KAAKy6E,SAAW,EAAG,OAEtB,MAAMgG,EAAWzgF,KAAKygF,SAChBn4E,EAAQm4E,EAAShyE,kBAEjB6d,EAAQm0D,EAAS1/E,cAAcA,cAC/B2kB,EAAS+6D,EAAS1/E,cAAcu7B,mBAChCszI,IAAgBlqJ,EAAOjX,kBAC7B,GAAGnG,GAAS,GAKV,YAJGsnK,GACD5vK,KAAK6vK,6BAIF,GAAGD,EAAa,OAEvBtjJ,EAAMpsB,UAAUW,IAAI,iBAEpB,MAAMqU,EAAU,IAAI,GAAe,CACjC1U,KAAM,WACN88B,aAAa,EACb0lD,uBAAuB,IAGzB9tE,EAAQ9T,UAAUlB,UAAUW,IAAI,QAEhC,IAAgBshC,wBAAmB95B,OAAWA,EAAW,UAAU1E,KAAKk+B,IACtE,IAAIsoF,GAAQ,EACZ,MAAMh+D,EAAqB,KACtBg+D,GACDj1G,EAAQ9T,UAAUlB,UAAUC,OAAO,QAASkgF,EAAejyE,KAAKK,mBAGlEzO,KAAK8vK,sBAAqB,IAGtBzvF,EAAiB,IAAI,GAAe,CACxCjwE,WAAY,GACZk8C,sBAAuB,CACrB60B,WAAY,GACZvqE,KAAK,GAEP1I,YAAY,EACZi+C,uBAGFnsD,KAAK+vK,aAAe,KAClB,MAAM/uI,EAAYC,GAAA,EAAWx9B,OAAS,GAAK,EAC/Bo+B,EAASz5B,OAAO,EAAG44B,GAAWp1B,OAAO5L,KAAKgwK,yBAElDzlK,QAASU,IACXo1E,EAAex/E,IAAIoK,KAGjB42B,EAASlgC,SACX3B,KAAK+vK,kBAAe1nK,IAIxBrI,KAAK+vK,eAEL/vK,KAAKiwK,eAAkBhlK,IACrB,GAAGA,EAAOm4B,YACR,OAGF,MAAMqpB,EAAOzsD,KAAKgwK,wBAAwB/kK,GACpCilK,EAAQ7vF,EAAe10E,IAAIV,IAC7BilK,GAASzjH,EAAM4zB,EAAex/E,IAAIoK,GAC9BilK,IAAUzjH,GAAM4zB,EAAeluE,OAAOlH,IAGhD,MAAMmD,EAAOiyE,EAAejyE,KAC5BA,EAAKlO,UAAUW,IAAI,gBACnBb,KAAKuO,qBAAqBH,GAC1B8G,EAAQvD,QAAQtQ,OAAO+M,GAEvB+7G,GAAQ,EACRh+D,MAGFzmC,EAAOrkB,OAAO6T,EAAQ9T,YAGhB,KAAA4uK,wBAA2B/kK,GAC1BA,EAAOmgC,cAAgB,IAAmByuC,cAAc5uE,GAG1D,KAAAklK,qBAAuB,KAGzBnwK,KAAKowK,cAAct/J,aAAa9Q,KAAKowK,cACxCpwK,KAAKowK,aAAeluK,OAAO4N,WAAW,KACpC9P,KAAKowK,kBAAe/nK,EAEhBrI,KAAKygF,SAAShyE,oBAAqBzO,KAAKiwK,gBAY5C,aAAoB,KAEpB,MAAMvU,EAAOC,YAAYh/G,MAEnB0zH,EAAerwK,KAAKsjC,OAAOyM,UAE3B9jB,EAAoBjsB,KAAKygF,SAASx0D,kBAClCqkJ,EAAgBtwK,KAAKsjC,OAAOliC,UAAUsjB,wBACtC6rJ,EAAatkJ,EAAkBvH,wBAC/B6L,EAAWpkB,MAAMC,KAAKpM,KAAKsjC,OAAO/D,QAAQhP,UAIhD,IAAIomC,EAAY32D,KAAKsjC,OAAO/D,QAAQo3B,UACjCA,GAAa05G,EAAe15G,IAAWA,GAAa05G,GAEvD,MAAMG,EAASF,EAAchtJ,EAAIqzC,EAC3BkwE,EAAQypC,EAAchtJ,EAEtBmtJ,EAAe,OAAAxqI,GAAA,GAAUtlC,SAASswF,iBAAiBpsF,KAAKosC,KAAKs/H,EAAWntJ,GAAIve,KAAKosC,KAAKu/H,EAAS,IAAKvkJ,EAAkBqmB,SACtHo+H,EAAc,OAAAzqI,GAAA,GAAUtlC,SAASswF,iBAAiBpsF,KAAKosC,KAAKs/H,EAAWntJ,GAAIve,KAAKod,MAAM4kH,EAAQypC,EAAc7sK,OAAS,IAAKwoB,EAAkBqmB,SAIlJ,IAAIm+H,IAAiBC,EACnB,OAKF,MACMC,EADmBF,EAAa/rJ,wBACGpB,EAAIktJ,EAEvC34G,EAAwB,GACxBxI,EAAa9+B,EAASpL,QAAQsrJ,GAC9BnhH,EAAY/+B,EAASpL,QAAQurJ,GAI7BE,EAAiB,KAAY,GAAKrgJ,EAAS5qB,MAAM,EAAGd,KAAKJ,IAAI,EAAG4qD,EAFnD,KAGbwhH,EAAetgJ,EAAS5qB,MAAM2pD,EAHjB,IAiBhBshH,EAAejvK,SAChB3B,KAAKsjC,OAAOv6B,UAAU2vB,KAAM,GAG3Bm4I,EAAalvK,SACd3B,KAAKsjC,OAAOv6B,UAAU2c,QAAS,GAGjCmyC,EAAOtuD,QAAQqnK,GACf/4G,EAAOtuD,QAAQsnK,GAEfh5G,EAAOttD,QAAQzI,IACb,MAAMmJ,EAASnJ,EAAGoF,QAAQ+D,OAAOsgB,WACjCvrB,KAAK8wK,aAAa7lK,KAGpBjL,KAAK+wK,aAQL/wK,KAAKsjC,OAAOyM,UAAY0gI,EAAa95G,UAAYg6G,EAEjD3wK,KAAKkiB,IAAI,aAAcy5I,YAAYh/G,MAAQ++G,MAM1C,MAiBE,KAAAsV,iBAAmB,IACjBhxK,KAAKyvK,cAAc,OAGrB,KAAAA,cAAgB,CAACjqH,EAAmB,WACtCxlD,KAAKsjC,OAAOv6B,UAAUy8C,IACpBxlD,KAAK+vK,cACN/vK,KAAK+vK,eAGA1qK,QAAQ6E,WACPlK,KAAKwvK,mBAA2BxvK,KAAKwvK,oBAE/CxvK,KAAKkiB,IAAI,gBAAiBsjC,GACnBxlD,KAAKixK,YAAYzrH,IAlpCxBxlD,KAAKkxK,eAAiB,aAAa,MAAM,GAEzClxK,KAAKmxK,eAAiBnxK,KAAKkvK,QAAQ9hH,KAAK35C,cAAc,UAEtDzT,KAAKkvK,QAAQC,oBAAsBnvK,KAAKkvK,QAAQ9hH,KAAKrsD,cAErDf,KAAKmsD,mBAAqB,OAAAnyB,GAAA,GAASh6B,KAAK0vK,oBAAqB,KAAK,GAAO,GAEzE,MAAM0B,EAAazwK,SAASC,cAAc,OAC1CwwK,EAAWlxK,UAAUW,IAAI,4BACzBuwK,EAAW/vK,OAAOrB,KAAKkvK,QAAQ9tK,WAwB5B,MACD0rD,GAAe,CACb/xC,QAAS/a,KAAKkvK,QAAQ9tK,UACtB0tC,QAAUJ,IACR,MAAMunB,EAAShkD,EAAUgkD,SACzBhkD,EAAUy8B,EAAQ,EAAIunB,EAAS,EAAIA,EAAS,MAKlDj2D,KAAKqxK,oBAAsB,IAAI,IAAKp3G,YAAY,CAC9C7yD,IAAK,wBAEPpH,KAAK6gF,YAAY,GACjB7gF,KAAKsxK,UAAU,CACbv+J,GAAI/S,KAAKy6E,SACT/oE,MAAO,GACPgb,QAAS1sB,KAAKqxK,oBAAoBt2J,QAClC4/D,WAAY,IAGd36E,KAAKshF,WAAathF,KAAKwgF,YAAYxgF,KAAKy6E,UACxCz6E,KAAKsjC,OAAStjC,KAAK2gF,YAAY3gF,KAAKy6E,UAkBpC7tE,EAAA,EAAUtL,iBAAiB,gBAAiB,KAE1C43B,EAAA,EAAgBC,WAAWx1B,KAAMy1B,IAC/Bp5B,KAAKuvK,0BAA2B,EAEhC,IAAgB5gK,QAChB,IAAgBA,QAEhB,MACMysD,EADiB,IAAmBgc,eACXhc,QAC/B,IAAI,MAAMqf,KAAYrf,EACpBxuD,EAAA,EAAU0F,cAAc,qBAAsB,CAC5ClH,EAAG,qBACH2H,IAAK0nE,IAIT,IAAmB9rE,QAUnB3O,KAAKshF,WAAW3yE,QAChB3O,KAAK8gF,cACL9gF,KAAKuxK,cAAcn4I,OAIvB,MAAMo4I,EAAoB,IAAI,IAAYxxK,KAAKkvK,QAAQC,qBACvDiC,EAAWpwK,QAAQhB,KAAKkvK,QAAQC,qBAChC,MAAMl9J,EAAY,OAAAokD,EAAA,GAAer2D,KAAKkvK,QAAQ9hH,KAAMptD,KAAKkvK,QAAQ9tK,UAAW,CAAC2R,EAAIujD,KAK/EvjD,GAAMujD,EAAWpvD,QAAQuzE,UAAY,EAEjC,OACC1nE,EACG/S,KAAKyxK,wBACPzxK,KAAKyxK,sBAAwB,CAC3BpxK,KAAM,UACN0T,MAAO,KACL9B,EAAU,GACVjS,KAAKyxK,2BAAwBppK,IAIjCsK,EAAA,EAAwB++J,YAAY,EAAG,EAAG1xK,KAAKyxK,wBAEzCzxK,KAAKyxK,wBACb9+J,EAAA,EAAwB+2G,WAAW1pH,KAAKyxK,uBACxCzxK,KAAKyxK,2BAAwBppK,IAI9BrI,KAAKy6E,WAAa1nE,IAErB/S,KAAKwgF,YAAYztE,GAAIpE,QACrB3O,KAAK6gF,YAAY9tE,GACjB/S,KAAK8gF,gBACJ,KACD,IAAI,MAAM90E,KAAYhM,KAAKwgF,aACrBx0E,IAAahM,KAAKy6E,UACpBz6E,KAAKwgF,YAAYx0E,GAAU2C,cAG9BtG,EAAWmpK,GAGbxxK,KAAKkvK,QAAQ9hH,KAAKnhC,kBAAkCkU,QACrD,IAAmB7V,YACnB4O,EAAA,EAAgBC,WAAWx1B,KAAMy1B,IAE/B,GAA2Bu4I,kBAAkBv4I,EAAM1Y,gBACnD9T,EAAA,EAAUtL,iBAAiB,wBAA0B0c,IACnDkb,EAAA,EAAgB61C,YAAY,iBAAkB/wD,KAGzChe,KAAKuxK,cAAcn4I,KAkB5BjR,EAAA,EAAW7mB,iBAAiB,SAAU,KACpCtB,KAAK4xK,6BAGP,IAAI,GAA0B5xK,KAAKs+B,gBACnCt+B,KAAKs+B,eAAej9B,OAAO+vK,GAE3BthK,WAAW,KACTw5C,GAAA,EAAaxC,qBACZ,KAGL,eACE,OAAO9mD,KAAKshF,WAAWlzE,KAGlB,YAAYqsE,GACjBz6E,KAAKy6E,SAAWA,EAChBz6E,KAAK8uK,SAAW,IAAmBx3F,eAAiB,IAAmBA,eAAeu6F,kBAAkB7xK,KAAKy6E,UAAY,QACzH7tE,EAAA,EAAU6tE,SAAWA,EAGf,gBAAgB1/D,EAAsBiyJ,GAC5C,MACM8E,EAAe/2J,EAAQ7a,UAAUuV,SADrB,cAEjBq8J,GAAgB9E,GAAUjyJ,EAAQ7a,UAAUW,IAF3B,aAGlB,aAAcka,EAAS,aAAciyJ,EAAQ,IAAKA,OAAS3kK,EAAY,KACrE0S,EAAQ7a,UAAUoE,OAJF,cAKf0oK,IAAW8E,EAAe,EAAI,GAG3B,gBACNllK,EAAA,EAAUtL,iBAAiB,cAAgByV,I,MAGzC,MAAM9L,EAAS8L,EAAOwU,WAChBvU,EAAMhX,KAAK+xK,aAAa9mK,GAC9B,GAAG+L,IAAQ,IAAgB03F,MAAM33F,IAAW9L,IAAW2B,EAAA,EAAU+R,KAAM,CACrE,MACMquJ,EAA4B,sBAAR,QAAX,EADF,IAAgBxhI,QAAQz0B,GACjBq1C,cAAM,eAAEhhD,GAC5BpL,KAAKgyK,gBAAgBh7J,EAAIukB,SAAUyxI,MAIvCpgK,EAAA,EAAUtL,iBAAiB,cAAgB4U,IACzC,MAAMjL,EAASiL,EAAOqV,UAAS,GACzBrU,EAAS,IAAmB2iE,cAAc5uE,GAC7CiM,GACDlX,KAAKiyK,2BAA2B/6J,KAapCtK,EAAA,EAAUtL,iBAAiB,gBAAkBg5E,IAC3Ct6E,KAAKkyK,qBAAqB53F,EAAOvnE,MAGnCnG,EAAA,EAAUtL,iBAAiB,kBAAoByV,IAC7C/W,KAAKiwK,gBAAkBjwK,KAAKiwK,eAAel5J,EAAOwU,cAGpD3e,EAAA,EAAUtL,iBAAiB,eAAgB,EAAE2J,aAC3C,MAAMiM,EAAS,IAAmB2iE,cAAc5uE,GAC7CiM,IACDlX,KAAKw3D,eAAetgD,OAAQ7O,OAAWA,OAAWA,OAAWA,OAAWA,GAAW,GACnFrI,KAAKmyK,wBAAwBj7J,GAC7BlX,KAAKoyK,2BAITxlK,EAAA,EAAUtL,iBAAiB,sBAAwBw/B,IACjD,IAAI,MAAM71B,KAAU61B,EAAS,CAC3B,MAAM5pB,EAAS4pB,EAAQ71B,GACvBjL,KAAKqyK,aAAan7J,GAEflX,KAAKiwK,gBACNjwK,KAAKiwK,eAAehlK,EAAOsgB,YAG7BvrB,KAAKmyK,wBAAwBj7J,MAIjCtK,EAAA,EAAUtL,iBAAiB,cAAe,EAAE2J,aAC1CjL,KAAK8wK,aAAa7lK,GAEfjL,KAAKiwK,gBACNjwK,KAAKiwK,eAAehlK,KAIxB2B,EAAA,EAAUtL,iBAAiB,gBAAiB,EAAE2J,aAC5C,MAAMiM,EAAS,IAAmB2iE,cAAc5uE,GAC7CiM,IACDlX,KAAKsyK,kBAAkBp7J,GACvBlX,KAAKmyK,wBAAwBj7J,MAIjCtK,EAAA,EAAUtL,iBAAiB,yBAA2B4V,IACpDlX,KAAKmyK,wBAAwBj7J,GAC7BlX,KAAKsyK,kBAAkBp7J,GACvBlX,KAAKoyK,0BAGPxlK,EAAA,EAAUtL,iBAAiB,eAAgB,EAAE4V,SAAQuoJ,OAAMx0J,aACtDw0J,EACDz/J,KAAKshF,WAAWnvE,OAAOlH,GAEvBjL,KAAKqyK,aAAan7J,GAGjBlX,KAAKiwK,gBACNjwK,KAAKiwK,eAAehlK,KAIxB2B,EAAA,EAAUtL,iBAAiB,eAAiB2J,IAE1C,IAAI,MAAM8P,KAAW/a,KAAKovK,mBACrBr0J,EAAQ7T,QAAQ+D,OAAOsgB,aAAetgB,GACvCjL,KAAKuyK,gBAAgBx3J,GAAS,GAIjB5O,MAAMC,KAAKzL,SAAS+S,iBAAiB,0CAA0CzI,QACvFV,QAAQwQ,IACf/a,KAAKuyK,gBAAgBx3J,GAAS,OAKlCnO,EAAA,EAAUtL,iBAAiB,gBAAkBsK,IAC3C,IAAI5L,KAAKo6E,gBAAgBxuE,EAAOmH,IAE9B,YADA/S,KAAKsxK,UAAU1lK,GAEV,GAAGA,EAAOmH,KAAO/S,KAAKy6E,SAAU,CACrC,MAAM35C,EAAU,IAAmBw2C,eAAek7F,kBAAiB,GACnExyK,KAAKyyK,wBACL,IAAI,IAAI7wK,EAAI,EAAGD,EAASm/B,EAAQn/B,OAAQC,EAAID,IAAUC,EAAG,CACvD,MAAMsV,EAAS4pB,EAAQl/B,GACvB5B,KAAKqyK,aAAan7J,IAItB,MAAMmU,EAAWrrB,KAAKo6E,gBAAgBxuE,EAAOmH,IAC7C,OAAA+Z,EAAA,GAAazB,EAAS3Z,MAAO,IAAkB6a,cAAc3gB,EAAO8F,UAGtE9E,EAAA,EAAUtL,iBAAiB,gBAAkBsK,IAC3C,MAAMyf,EAAWrrB,KAAKo6E,gBAAgBxuE,EAAOmH,IACzCsY,IAIHrrB,KAAKkvK,QAAQ9hH,KAAKnhC,kBAAkCkU,QAErD9U,EAASjqB,UAAUkD,SACnB+mB,EAAS+hC,KAAK9oD,gBAEPtE,KAAKwgF,YAAY50E,EAAOmH,WACxB/S,KAAK2gF,YAAY/0E,EAAOmH,WACxB/S,KAAKo6E,gBAAgBxuE,EAAOmH,IAEnC/S,KAAK0yK,2BAGP9lK,EAAA,EAAUtL,iBAAiB,eAAiB45E,IAC1C,MAAMy3F,EAAoB3yK,KAAKkvK,QAAQ9hH,KACvC8tB,EAAM3wE,QAASkwE,IACb,MAAM7uE,EAAS,IAAmBwrE,eAAesD,UAAUD,GACrDm4F,EAAiB5yK,KAAKo6E,gBAAgBK,GAEzBz6E,KAAKwgF,YAAY/F,GACzBq0F,SAAW,IAAmBx3F,eAAeu6F,kBAAkBp3F,GAE1EzvB,GAAuB4nH,EAAexlH,KAAMulH,EAAmB/mK,EAAO+uE,YACtE3vB,GAAuB4nH,EAAexxK,UAAWpB,KAAKkvK,QAAQ9tK,UAAWwK,EAAO+uE,cAGlF36E,KAAK8uK,SAAW,IAAmBx3F,eAAeu6F,kBAAkB7xK,KAAKy6E,YAQ3E7tE,EAAA,EAAUtL,iBAAiB,eAAgB,EAAE2J,SAAQ+uJ,cACnD,MAAM9iJ,EAAS,IAAmB2iE,cAAc5uE,GAC5CiM,IAED8iJ,EAAQr4J,OACT3B,KAAK0oD,UAAUxxC,GAEflX,KAAK6yK,YAAY37J,MAKf,gBAAgBqvB,EAAqBiR,GAE3C,MAAMxgC,EAAMuvB,EAAOusI,UACnBvsI,EAAOrmC,UAAUC,OAAO,SAAUq3C,GAC/BA,EACDx3C,KAAKovK,mBAAmBvuK,IAAI0lC,GAE5BvmC,KAAKovK,mBAAmBj9J,OAAOo0B,IAG9BvvB,aAAG,EAAHA,EAAK+7J,WACN/7J,EAAI+7J,SAASrkK,UAAU8oC,GAIb,cAAcpe,G,0CAC1B,GAAGA,EAAMsiD,eACP,IAAI,MAAMt0E,KAAOgyB,EAAMsiD,eACrB,OAAA71B,GAAA,GAAmDz+C,GACnD,KAAwB4rK,iBAAiB,CACvC5rK,MACAu8B,SAAUvK,EAAMsiD,eAAet0E,KAKrC,KAAwB6rK,4BAEpBjzK,KAAKsvK,kBACPtvK,KAAKkzK,gBACLlzK,KAAKsvK,iBAAkB,GAGzB,MAAM6D,EAAuB,IAAmB/7F,eAAeC,mBAAmB1zE,KAAMy3D,IACtF,IAAI,MAAMxvD,KAAUwvD,EAClBp7D,KAAKsxK,UAAU1lK,KAenB,OAXGwtB,EAAMgiC,SAAWz9C,OAAOg1C,KAAKv5B,EAAMgiC,SAASz5D,eACvCwxK,EACHnzK,KAAKozK,2BACApzK,KAAKozK,qBAIZl6I,EAAA,EAAgBm6I,gBAAgBvyI,QAAQn/B,QACzC,KAAiB2xK,mBAGZtzK,KAAKyvK,gBAAgB9rK,KAAK,KAC/B,IAAmB4vK,yBAgBf,eAAe/tH,GACrB,MAAO,CAACtgC,MAAOllB,KAAKsjC,OAAOv6B,UAAUy8C,GAAQ,EAAIxlD,KAAKqvK,QAAQ7pH,IAGxD,yBAAyBtuC,GAC/B,QAAyB7O,IAAtB6O,EAAOs8J,aAA6BxzK,KAAKyzK,oBAAoBv8J,GAAS,OAAO,EAEhF,MAAMw8J,EAAY1zK,KAAK2zK,eAAe,OAChCC,EAAe5zK,KAAK2zK,eAAe,UAEzC,IAAID,EAAUxuJ,QAAU0uJ,EAAa1uJ,MACnC,OAAO,EAGT,MAAMA,EAAQhO,EAAOlX,KAAK8uK,UAC1B,QAAS4E,EAAUxuJ,OAASA,GAASwuJ,EAAUxuJ,UAAY0uJ,EAAa1uJ,OAASA,GAAS0uJ,EAAa1uJ,OAGjG,aAAaja,GACnBjL,KAAKshF,WAAWnvE,OAAOlH,GAGjB,aAAaiM,GACnB,IAAGlX,KAAK6zK,yBAAyB38J,GAO/B,YADAlX,KAAK8wK,aAAa55J,EAAOjM,QALzB,IAAIjL,KAAKshF,WAAW31E,IAAIuL,EAAOjM,QAE7B,YADAjL,KAAKshF,WAAWzgF,IAAIqW,EAAOjM,QAQ/B,MAAM+L,EAAMhX,KAAK+xK,aAAa76J,EAAOjM,QAClC+L,IACDhX,KAAKw3D,eAAetgD,OAAQ7O,EAAW2O,OAAK3O,OAAWA,OAAWA,GAAW,GAC7ErI,KAAKshF,WAAW96C,OAAOtvB,EAAOjM,SAc1B,qBAAqBwvE,G,MAC3B,MAAMq5F,EAA0B,IAAbr5F,EAAiBz6E,KAAKmxK,eAA+C,QAA9B,EAAAnxK,KAAKo6E,gBAAgBK,UAAS,eAAE42B,OAC1F,IAAIyiE,EACF,OAGF,MAAMx5F,EAAS,IAAmBhD,eAAey8F,UAAUt5F,GACrDu5F,EAA4B,IAAbv5F,KAAoBH,EAAOx5C,QAAQzsB,KAAK6C,IACnDA,EAAOg3F,cAAgBh3F,EAAOqH,OAAO4xF,eAAiB,KAAwB7jE,iBAAiBp1B,EAAOjM,QAAQ,IAGxH6oK,EAAW5zK,UAAUC,OAAO,cAAe6zK,GAE3C,MAAMz/I,EAAM+lD,EAAOmK,mBACnBqvF,EAAWlmJ,UAAY2G,EAAM,GAAKA,EAAM,GAGlC,wBACN,IAAI,MAAMkmD,KAAYz6E,KAAKo6E,gBACzBp6E,KAAKkyK,sBAAsBz3F,GAOvB,wBACN,MAAM7uE,EAAS,IAAmBwrE,eAAesD,UAAU16E,KAAKy6E,WAAa,KAC7Ez6E,KAAKshF,WAAW2yF,SAAS1pK,QAASwQ,IAChC,MAAM7D,EAAS,IAAmB2iE,cAAc9+D,EAAQhI,IACpD/S,KAAKyzK,oBAAoBv8J,EAAQtL,IACnC5L,KAAK8wK,aAAa/1J,EAAQhI,MAQxB,wBAAwBmE,EAAgBtL,GAC1C5L,KAAK+xK,aAAa76J,EAAOjM,UAIzBjL,KAAKyzK,oBAAoBv8J,EAAQtL,IACnC5L,KAAK8wK,aAAa55J,EAAOjM,SAItB,oBAAoBiM,EAAgBtL,EAAS,IAAmBwrE,eAAesD,UAAU16E,KAAKy6E,WACnG,SAAIvjE,GACDtL,IAAW,IAAmBwrE,eAAeq8F,oBAAoBv8J,EAAQtL,KACxEA,GAAU5L,KAAKy6E,WAAavjE,EAAO60J,WAOlC,mBAAmB39J,EAAwBqsE,GAChD,MAAMlrE,EAAa,IAAI,IAAW,KAAM,KAAM,KAC9CA,EAAWnO,UAAUE,iBAAiB,SAAUtB,KAAKmwK,sBACrD5gK,EAAWnO,UAAU8F,QAAQuzE,SAAW,GAAKA,EAC7ClrE,EAAWq7F,cAAgB5qG,KAAKgxK,iBAChCzhK,EAAWK,iBAAmB5P,KAAKyvK,cACnClgK,EAAWE,oBAAoBrB,GAE/B,MAAM8lK,EAAmB,IAAI,GAC3B9lK,EACA,IAAmBkpE,eAAiB,IAAmBA,eAAeu6F,kBAAkBp3F,GAAY,QACpGz6E,KAAKmsD,oBASP,OANAnsD,KAAK2gF,YAAYlG,GAAYlrE,EAC7BvP,KAAKwgF,YAAY/F,GAAYy5F,EAKtB3kK,EAGD,UAAU3D,GAChB,GAAG5L,KAAKo6E,gBAAgBxuE,EAAOmH,IAAK,OAEpC,MAAMgjD,EAAUp1D,SAASC,cAAc,OACvCm1D,EAAQ71D,UAAUW,IAAI,4BACtB,MAAMosC,EAAOtsC,SAASC,cAAc,QAC9Bg5D,EAAYj5D,SAASC,cAAc,QACzCg5D,EAAU15D,UAAUW,IAAI,cACrB+K,EAAO8gB,QAASktC,EAAUv4D,OAAOuK,EAAO8gB,SACtC,OAAAI,EAAA,GAAa8sC,EAAW,IAAkBrtC,cAAc3gB,EAAO8F,QACpE,MAAMoiK,EAAanzK,SAASC,cAAc,OAC1CkzK,EAAW5zK,UAAUW,IAAI,QAAS,WAAY,iBAC9C,MAAMe,EAAIjB,SAASC,cAAc,KACjCqsC,EAAK5rC,OAAOu4D,EAAWk6G,EAAYlyK,GACnC,OAAAs2B,GAAA,GAAO69B,GACPA,EAAQ10D,OAAO4rC,GAGf+d,GAAuB+K,EADG/1D,KAAKkvK,QAAQ9hH,KACYxhD,EAAO+uE,YAG1D,MAAMf,EAAK55E,KAAKqO,iBACVkB,EAAavP,KAAK0gF,mBAAmB9G,EAAIhuE,EAAOmH,IAEtDxD,EAAWnO,UAAUlB,UAAUW,IAAI,WAAY,kBAK/C,MAAM63B,EAAM/3B,SAASC,cAAc,OACnC83B,EAAIx4B,UAAUW,IAAI,gBAElB,MAAM6kB,EAAS/kB,SAASC,cAAc,OACtC8kB,EAAOxlB,UAAUW,IAAI,mBAErB63B,EAAIr3B,OAAOu4E,GACXrqE,EAAWnO,UAAUC,OAAOq3B,EAAKhT,GAIjC,MAAMsL,EAAMzhB,EAAWnO,UAEvB4pD,GAAuBz7C,EAAWnO,UAAWpB,KAAKkvK,QAAQ9tK,UAAWwK,EAAO+uE,YAE5E36E,KAAKuO,qBAAqBqrE,EAAI,MAAM,GAEpC55E,KAAKo6E,gBAAgBxuE,EAAOmH,IAAM,CAChCq6C,KAAM2I,EACN30D,UAAW4vB,EACXqgF,OAAQyiE,EACRpiK,MAAOkoD,GAGT55D,KAAK0yK,wBAGC,2BACN,MAAMnjK,EAAavP,KAAKkvK,QAAQC,oBAAoBljJ,kBAC9C7kB,EAAmBmI,EAAW6nC,YAAc7nC,EAAW4kK,YAAc,sBAAwB,iBACnGn0K,KAAKqxK,oBAAoBzzF,iBAAiB,CAACx2E,QAGrC,wBAyBN,OAxBIpH,KAAKozK,qBACPpzK,KAAKozK,mBAAqB,IAAI/tK,QAAe6E,IAC3ChI,OAAO4N,WAAW,KAChB,MACMstB,EADSzf,OAAOg1C,KAAK3yD,KAAKo6E,iBAAiBz4E,OAC3B,EAChByyK,GAAcp0K,KAAKkvK,QAAQC,oBAAoBjvK,UAAUuV,SAAS,QAErE2nB,IAASg3I,IACVp0K,KAAKkvK,QAAQC,oBAAoBjvK,UAAUC,OAAO,QAASi9B,GACxDA,IAASg3I,GACVp0K,KAAKoyK,wBAGPpyK,KAAKs+B,eAAep+B,UAAUC,OAAO,cAAei9B,IAGtDp9B,KAAK4xK,2BAEL5xK,KAAKozK,wBAAqB/qK,EAC1B6B,KACC,MAIAlK,KAAKozK,mBAGN,YAAY5tH,GAKlB,GAAGxlD,KAAKwvK,mBAAqC,OAAOxvK,KAAKwvK,mBAEzD,MAAMplK,EAAU,IAAI/E,QAAoB6E,GAAY,mCAClD,MAAM,SAACu2E,EAAQ,SAAEhG,EAAQ,SAAEq0F,GAAY9uK,KAKvC,IAAI0I,EAAYu4B,GAAA,EAAWx9B,OAAS,GAAK,KAAO,EAC5C+6B,EAAc,EAElB,MAAOtZ,MAAOmvJ,GAAsBr0K,KAAK2zK,eAAenuH,GACxD,GAAG6uH,EACD,GAAY,QAAT7uH,EAAgB,CACjB,MAAMz4C,EAAU,IAAmBuqE,eAAeC,iBAAiBkD,GAAU,GACvEv1D,EAAQnY,EAAQqO,UAAUlE,GAAUA,EAAO43J,IAAauF,GACxDC,EAAYzvK,KAAKJ,IAAI,EAAGygB,EAAQxc,GACtCA,EAAYwc,EAAQovJ,EACpB91I,EAAczxB,EAAQunK,GAAWxF,GAAY,OAE7CtwI,EAAc61I,EAMlB,IAGE,MAAME,EAAyB,IAAmBnzI,iBAAiB,GAAI5C,EAAa91B,EAAW+xE,GAAU,GACzG,IAAI85F,EAAuBv0J,SAAWygE,EAAShyE,kBAAmB,CAC9CgyE,EAAS1/E,cACjBM,OAAOrB,KAAKkxK,gBAGxB,MAAM5mK,QAAeiqK,EAAuBnqK,QAE5C,GAAGpK,KAAKwvK,qBAAuBplK,EAC7B,OAmBF,GAVY,WAATo7C,EACEl7C,EAAOq3B,QACR3hC,KAAKsjC,OAAOv6B,UAAUy8C,IAAQ,GAExBl7C,EAAOkqK,WACfx0K,KAAKsjC,OAAOv6B,UAAUy8C,IAAQ,GAGhCxlD,KAAKuvK,0BAA2B,EAE7BjlK,EAAOw2B,QAAQn/B,OAAQ,CACxB,MAAMm/B,EAAmB,QAAT0kB,EAAiBl7C,EAAOw2B,QAAQn7B,QAAQ8C,UAAY6B,EAAOw2B,QAErE1S,EAA+B,GAE/BwxE,EAA4B,GAC5B60E,EAAQr4I,IACZwjE,EAAUr2F,KAAK6yB,IAGjB0E,EAAQv2B,QAAS2M,IAGf,IADwB,IAAmB2iE,cAAc3iE,EAAOjM,QAE9D,OAGF,MAAM8P,EAAU/a,KAAKshF,WAAWzgF,IAAIqW,EAAOjM,QAAQ,EAAMwpK,GAAM,GAC5D15J,EAAQqT,cACTA,EAAa7kB,QAAQwR,EAAQqT,sBAI3B/oB,QAAQC,IAAI8oB,GAAcuZ,UAEhCi4D,EAAUr1F,QAAQ6xB,GAAYA,UAE9Bp8B,KAAKmsD,qBAGP,MAAMuoH,EAAepqK,EAAOw2B,QAAiB,QAAT0kB,EAAiB,EAAIl7C,EAAOw2B,QAAQn/B,OAAS,GAC9E+yK,IACD10K,KAAKqvK,QAAQ7pH,GAAQkvH,EAAa5F,IAGpC9uK,KAAKkiB,IAAIsjH,MAAM,cAAgB98H,EAAY,sBAAuB81B,EAAal0B,EAAQm2E,EAAShyE,mBAEhGqB,WAAW,KACT9P,KAAKsjC,OAAO+D,YACX,GACH,MAAM/2B,GACNtQ,KAAKkiB,IAAI1R,MAAMF,GAGdtQ,KAAKkxK,eAAenwK,eACrBf,KAAKkxK,eAAe5sK,SAGtB4F,QACCy9B,QAAQ,KACT3nC,KAAKwvK,wBAAqBnnK,IAG5B,OAAOrI,KAAKwvK,mBAAqBplK,EAG3B,yBAAyB1K,GAM/B,MAAMuvC,EAAa,oBACb7tC,EAAYT,SAASC,cAAc,OACzCQ,EAAUlB,UAAUW,IAAIouC,EAAYA,EAAa,IAAMvvC,EAAQi1K,eAE/D,MAAMpjK,EAAS5Q,SAASC,cAAc,OACtC2Q,EAAOrR,UAAUW,IAAIouC,EAAa,WAClC,YAAM19B,EAAQ7R,EAAQgS,OAEtB,MAAMse,EAAWrvB,SAASC,cAAc,OAQxC,OAPAovB,EAAS9vB,UAAUW,IAAIouC,EAAa,aACjCvvC,EAAQswB,UACT,YAAMA,EAAUtwB,EAAQswB,SAAUtwB,EAAQk1K,cAG5CxzK,EAAUC,OAAOkQ,EAAQye,GAElB,CAAC5uB,YAAWmQ,SAAQye,YAGrB,2BACN,GAAqB,IAAlBhwB,KAAKy6E,SACN,OAGF,MAAMgG,EAAWzgF,KAAKygF,SAChB2oB,EAAO3oB,EAAS1/E,cACtB,IAAI8zK,EAAwB1oK,MAAMC,KAAKg9F,EAAK74E,UAA4Blc,KAAKvS,GAAMA,EAAGmpB,QAAQ,uBAC9F,MAAM2yG,EAAkB59H,KAAKsjC,OAAOv6B,UAAU2c,SAAW+6D,EAAShyE,kBAGlE,GAAGmvH,GAAmBi3C,EACpB,OACK,IAAIj3C,EAMT,YALGi3C,IACDzrE,EAAKlpG,UAAUoE,OAAO,oBACtBuwK,EAAqBvwK,WAMzB,IAAIqM,EAAwEtQ,EAC5E,GAAIL,KAAKy6E,SAyBF,CACL9pE,EAAc3Q,KAAK80K,yBAAyB,CAC1CpjK,MAAO,yBACPse,SAAU,6BACV2kJ,cAAet0K,EAAO,WAGxBw0K,EAAuBlkK,EAAYvP,UAEnCyzK,EAAqB7zK,QzM2xBpB,UAA0B,MAACwlD,EAAK,MAAEhjD,EAAK,OAAEC,IAO9C,MAAMrC,EAAYT,SAASC,cAAc,OAEnCiZ,EAAM,KAAmByuC,wBAAwB9B,GAiBvD,OAhBG3sC,EACDkX,GAAY,CACVlX,MACAmX,IAAK5vB,EACLkC,MAAM,EACNc,MAAM,EACNZ,QACAC,SACA+iD,UACC7iD,KAAK,QAIRvC,EAAUlB,UAAUW,IAAI,yBAGnB,CAACO,ayMrzByB2zK,CAAiB,CAC5CvuH,MAAO,KACPhjD,MAAO,IACPC,OAAQ,MACPrC,WAEH,MAAMsiB,EAAS,YAAO,kDAAmD,CACvE4U,KAAM,mBACNnnB,KAAM,aAGR,YAAiBuS,EAAQ,KACvB,IAAI,GAAiB,IAAgBhP,KAAK,IAAmB0iE,eAAesD,UAAU16E,KAAKy6E,aAG7Fo6F,EAAqBxzK,OAAOqiB,OAjDX,CACjB/S,EAAc3Q,KAAK80K,yBAAyB,CAC1CpjK,MAAO,uCACPijK,cAAet0K,EAAO,YAGxBw0K,EAAuBlkK,EAAYvP,UAEnC,MAAMstB,EAAM/tB,SAASC,cAAc,OACnC8tB,EAAIxuB,UAAUW,IAAI,kCAElBb,KAAKg1K,gCAAkC,IAAI,IAAK/6G,YAAY,CAC1Dl/C,QAASpK,EAAYqf,WAGvB3qB,QAAQC,IAAI,CACVtF,KAAK8vK,sBAAqB,GAC1B,OAAA7sH,GAAA,GAA0Bv0B,EAAK,6BAC/B,iBACC/qB,KAAK,EAAEsxK,MACRJ,EAAqB30K,UAAUW,IAAI,WACnCuoG,EAAKlpG,UAAUC,OAAO,iBAAkB80K,KAG1CJ,EAAqB7zK,QAAQ0tB,GA4B/B06E,EAAK/nG,OAAOwzK,GACZzrE,EAAKlpG,UAAUW,IAAI,oBACnBuoG,EAAKliG,QAAQguK,gBAAkB70K,EAGzB,qBAAqB80K,GAC3B,OAAGn1K,KAAKo1K,4BAAoCp1K,KAAKo1K,4BAC1Cp1K,KAAKo1K,4BAA8B,IAAgB7+F,cAAc5yE,KAAK+5D,IAC3E,MAAM1tC,EAAWhwB,KAAKg1K,gCACtB,GAAGhlJ,EAAU,CACX,IAAI5oB,EAAkB2K,EAEnB2rD,EAAM/7D,QACPyF,EAAM,0CACN2K,EAAO,CAAC,YAAK,iBAAkB,CAAC2rD,EAAM/7D,YAEtCyF,EAAM,oDACN2K,EAAO,IAGTie,EAAS4tD,iBAAiB,CACxBx2E,MACA2K,SAIJ,GAAGojK,EAAqB,CACLn1K,KAAKygF,SACA1/E,cACjBb,UAAUC,OAAO,iBAAkBu9D,EAAM/7D,QAKhD,OAFA3B,KAAKo1K,iCAA8B/sK,EAE5Bq1D,EAAM/7D,SAIT,4BACN,MAAM8+E,EAAWzgF,KAAKygF,SAChBn0D,EAAQm0D,EAAS1/E,cAAcA,cAC/B2kB,EAAS+6D,EAAS1/E,cAAcu7B,mBACtChQ,EAAMpsB,UAAUoE,OAAO,iBACvBohB,EAAOlX,UAAY,GACnBxO,KAAK+vK,kBAAe1nK,EACpBrI,KAAKiwK,oBAAiB5nK,EA8MhB,aACN,MAAMo4E,EAAWzgF,KAAKygF,SAChB40F,EAAcr1K,KAAKs1K,qBAAqB70F,EAASx0D,mBACjDspJ,EAAav1K,KAAKs1K,qBAAqB70F,EAASxnC,kBAEhD61H,EAAW9uK,KAAK8uK,SACtB9uK,KAAKqvK,QAAQ32I,IAAM28I,EAAYvG,GAC/B9uK,KAAKqvK,QAAQ3pJ,OAAS6vJ,EAAWzG,GAG3B,qBAAqB/zJ,GAC3B,OAAO,IAAmB8+D,cAAc9+D,EAAQ7T,QAAQ+D,OAAOsgB,YAoB1D,qBAAqBnd,EAAwBD,EAAsBqnK,GAAc,EAAOtnK,GAAa,EAAOunK,GAAY,GAC7H,IAAIC,EAEJ,MAAMC,GAAeF,EAAY,GAAaloH,aAAe,GAAapa,SAASzsC,KAAK,IAExF0H,EAAKlH,QAAQgH,WAAa,KAAMA,EAChCE,EAAK9M,iBAAiB,YAAcvB,IAClC,GAAgB,IAAbA,EAAE2jB,OAAc,OAGnB1jB,KAAKkiB,IAAI,sBACT,MAAMxH,EAAS3a,EAAE2a,OACXgQ,EAAO,OAAAub,GAAA,GAAUvrB,EAAQ,MAE/B,GAAIgQ,EAAJ,CAIA,GAAGxc,EAAY,CACb,MAAM0nK,EAAcF,IAA0BhrJ,EAC3CgrJ,IAA0BE,GAC3BF,EAAsBx1K,UAAUoE,OAAO,UAGtComB,IACDA,EAAKxqB,UAAUW,IAAI,UACnB60K,EAAwBhrJ,EACxB1qB,KAAKovK,mBAAmBvuK,IAAI6pB,IAIhC,GAAGA,EAAM,CACJvc,GAASA,IAEZ,MAAMlD,EAASyf,EAAKxjB,QAAQ+D,OAAOsgB,WAC7Bm4E,GAAah5E,EAAKxjB,QAAQ2D,UAAOxC,EAEvCstK,EAAY,CACV1qK,SAAQy4F,mBAGViyE,MAED,CAAClmJ,SAAS,IAEV,MACDrhB,EAAK9M,iBAAiB,WAAavB,IACjC,MAAMmgC,EAAK,OAAA+F,GAAA,GAAUlmC,EAAE2a,OAAQ,MAC/B,GAAGwlB,EAAI,CACL,MAAMj1B,EAASi1B,EAAGh5B,QAAQ+D,OAAOsgB,WACjCvrB,KAAKkiB,IAAI,gBAAiB,IAAmB2zJ,kBAAkB5qK,OAKlEuqK,GACD,aAA0BpnK,EAAMpO,KAAK2tI,YAAY/4E,eAI9C,eAAel1D,EAMlB,IACF,MAAM0O,EAAOzN,SAASC,cAAc,MAgBpC,OAfAwN,EAAKlO,UAAUW,IAAI,YAGhBnB,EAAQkX,KACTxI,EAAKlO,UAAUW,IAAI,gBAGlBnB,EAAQyhF,YACT/yE,EAAKlO,UAAUW,IAAI,YAAcnB,EAAQyhF,YAOpC/yE,EAGF,eACL8I,EACA4+J,EACA9+J,EACA++J,EACA3nJ,EACA6gJ,GAAU,EACV+G,GAAY,GAGZ,IAAIh/J,KACFA,EAAMhX,KAAK+xK,aAAa76J,EAAOjM,SAI7B,OAIJ,IAAIgrK,EASJ,GARIH,IACC5+J,EAAO6/G,OAA4B,iBAAnB7/G,EAAO6/G,MAAM3rH,IAC9B6qK,EAAe/+J,EAAO6/G,OAGxB++C,EAAc,IAAmBr1J,iBAAiBvJ,EAAOjM,OAAQiM,EAAOk1J,cAGrD,iBAAlB0J,EAAY1qK,EASb,OARA4L,EAAII,gBAAgB5I,UAAY,GAChCwI,EAAIk/J,aAAa1nK,UAAY,UACtBwI,EAAIuvB,OAAOr/B,QAAQ2D,SAEvBmrK,GACDh2K,KAAKsyK,kBAAkBp7J,EAAQF,EAAKi4J,IAMxC,MAAMhkK,EAASiM,EAAOjM,OAChByoC,EAAeoiI,GAAe,IAAmBpiI,aAAaoiI,GAKH,CAE/D,IAAIxwD,EACJ,IAAIwwD,EAAYl2I,UAAYq2I,IAAiBviI,EAAc,CACzD,MAAMj7B,EAA8B,IAAmBgG,oBAAoBq3J,GACrEK,EAAsC,IAAIxuK,IAAI,CAAC,QAAS,MAAO,UACrE,GAAG8Q,IAAsB,UAAZA,EAAMrN,GAAiB+qK,EAAWxqK,IAAI8M,EAAMpY,OAAQ,CAC/D,MAAM6C,EAAO,IAAiBiuB,gBAAgB1Y,EAAO,GAAI,IAEzD,GAAc,mBAAXvV,EAAKkI,IACNk6G,EAAiB3kH,SAASC,cAAc,OACxC0kH,EAAeplH,UAAUW,IAAI,yBAEK,UAA9B4X,EAAqBpY,MACvBilH,EAAeplH,UAAUW,IAAI,YAG/BotB,GAAU,CACR9lB,MAAOsQ,EACP1Q,QAAS+tK,EACT10K,UAAWkkH,EACXj3F,kBAAkB,EAClBnrB,OACAkrB,iBAGC+nJ,EAAWxqK,IAAK8M,EAAqBpY,OAAO,CAC7C,MAAM+1K,EAAWz1K,SAASC,cAAc,QACxCw1K,EAASl2K,UAAUW,IAAI,cAEvBykH,EAAejkH,OAAO+0K,KAM9B,MAAMC,IAAqB/wD,MAAoBwwD,aAAW,EAAXA,EAAa/tK,SAE5D,IAAI4zB,EAkBJ,GAhBEA,EADCo6I,GAAiBD,EAAY/tK,QACnB,IAAmB2oB,oBAAoBolJ,OAAaztK,OAAWA,GAAW,EAAO0tK,EAAeM,GACnGJ,EACG,IAAmBvlJ,oBAAoBulJ,GACzCH,EAAYl2I,QAGVj/B,SAASi7B,yBAFT,IAAmBlL,oBAAoBolJ,OAAaztK,OAAWA,GAAW,OAAOA,EAAWguK,GAKtG/wD,GACD3pF,EAAS36B,QAAQskH,GAGnB,OAAA70G,EAAA,GAAeuG,EAAII,gBAAiBukB,GAGjCs6I,EAAc,CACf,MAAM16C,EAAO56H,SAASC,cAAc,KACpC26H,EAAKr7H,UAAUW,IAAI,UACnB06H,EAAKl6H,OAAO,YAAK,SAAU,MAC3B2V,EAAII,gBAAgBpW,QAAQu6H,QACvB,GAAGtwH,EAAOm4B,aAAen4B,IAAW6qK,EAAY7lK,SAAW6lK,EAAY5tK,OAAQ,CACpF,MAAMouK,EAAS,IAAgB32I,QAAQm2I,EAAY7lK,QACnD,GAAGqmK,GAAUA,EAAOvjK,GAAI,CACtB,MAAMwjK,EAAa51K,SAASC,cAAc,KAEvC01K,EAAOvjK,KAAOnG,EAAA,EAAU+R,KACzB43J,EAAWl1K,OAAO,YAAK,YAGvBk1K,EAAWl1K,OAAO,IAAI,KAAU,CAC9B4J,OAAQ6qK,EAAY7lK,OACpByqD,eAAe,IACd3/C,SAGLw7J,EAAWl1K,OAAO,MAElB2V,EAAII,gBAAgBpW,QAAQu1K,KAKlC,IAAIT,EAAYl2I,SAAWq2I,EAAwD,CACjF,MAAMzpJ,EAAOypJ,EAAepxK,KAAKJ,IAAIwxK,EAAazpJ,KAAMspJ,EAAYtpJ,MAAQ,GAAKspJ,EAAYtpJ,KAC7F,OAAA/b,EAAA,GAAeuG,EAAIk/J,aAAc,aAA8B,IAAIx5H,KAAY,IAAPlwB,UACnExV,EAAIk/J,aAAazlJ,YAAc,GAErB,OAAdulJ,IACEA,EACDh2K,KAAKsyK,kBAAkBp7J,EAAQF,EAAKi4J,GAEpCj4J,EAAIuvB,OAAOr/B,QAAQ2D,IAAMirK,EAAYjrK,KAKnC,kBAAkBqM,EAAgBF,EAAMhX,KAAK+xK,aAAa76J,EAAOjM,QAASgkK,GAAU,G,MAC1F,IAAIj4J,EAEF,OAGF,IAAIi4J,EAAS,CACX,MAAMnjI,EAAU,KAAwBQ,iBAAiBp1B,EAAOjM,QAAQ,GAErE6gC,IADc90B,EAAIuvB,OAAOrmC,UAAUuV,SAAS,aAE7C,aAAcuB,EAAIuvB,OAAQ,WAAYuF,EAAS,KAInD,IAAI0qI,EACJ,GAAuB,kBAAR,QAAZ,EAAAt/J,EAAO6/G,aAAK,eAAE3rH,GAAsB,CACrC,MAAM0qK,EAAyB,IAAmBr1J,iBAAiBvJ,EAAOjM,OAAQiM,EAAOk1J,cACrF0J,EAAYl2I,SAAWk2I,EAAYv3J,OAAO6I,KAAO0uJ,EAAY7qK,SAAW2B,EAAA,EAAU+R,OACpF63J,EAAmBV,IL/iDpB,SACL10K,EACA2G,EACA0uK,GAEA,IAAIzoK,EAWJ,IAVGjG,aAAO,EAAPA,EAASwW,OAAO6I,OAEfpZ,EADCjG,EAAQwW,OAAOuN,YACJ,UACJ/jB,EAAQwW,OAAO8yF,OACX,QAEA,WAIZrjG,EAEF,YADA5M,EAAUqvB,YAAc,IAI1B,MAAMyoH,EAAgB,SAAWlrI,EAC3B0iK,EAActvK,EAAU63C,iBAC9B,GAAGy3H,GAAeA,EAAYxwK,UAAUuV,SAASyjI,GAC/C,OAGF,MAAMn+H,EAAUpa,SAASC,cAAc,KACvCma,EAAQ7a,UAAUW,IAAI,sBAAgDq4I,GACtE93I,EAAUC,OAAO0Z,GAEd21J,GACDA,EAAYpsK,SKmhDZoyK,CAAiB1/J,EAAI2/J,WAAYH,GAEjC,MAAM5qK,EAAS,IAAmBwrE,eAAesD,UAAU16E,KAAKy6E,UAChE,IAAI2gE,EAEFA,EADCxvI,GAC2D,IAAjDA,EAAOirE,cAAc1xD,QAAQjO,EAAOjM,UAElCiM,EAAOqH,OAAOgxE,OAG7B,MAAM88E,EAAiB,IAAmBA,eAAen1J,GACnD0/J,EAAiBx7B,GAAYixB,EAG7BwK,EAAuB,OAAAv1H,GAAA,GAAQtqC,EAAI8/J,aACtCF,IAAmBC,GACpB7/J,EAAIkZ,WAAW7uB,OAAO2V,EAAI8/J,aAG5B,MAAMC,EAAmB7/J,EAAO+hH,wBAA0B/hH,EAAO+hH,sBAAwB,GAAK/hH,EAAOg3F,aAAe,GAC9G8oE,EAAwBhgK,EAAIigK,eAAiB,OAAA31H,GAAA,GAAQtqC,EAAIigK,eAC5DF,IACG//J,EAAIigK,gBACNjgK,EAAIigK,cAAgBt2K,SAASC,cAAc,OAC3CoW,EAAIigK,cAAcjpK,UAAY,6DAC9BgJ,EAAIigK,cAAcrpJ,UAAY,IAC9B5W,EAAIkZ,WAAWjvB,aAAa+V,EAAIigK,cAAejgK,EAAII,gBAAgBjW,eAIvE,MAAM+1K,EAAqBjI,EAAU,EAAI,IAazC,GAXA,aAAcj4J,EAAI8/J,YAAa,aAAcF,EAAgBM,EAAoBN,OAAiBvuK,EAAY,KAC5G2O,EAAI8/J,YAAYxyK,UACduyK,EAA2B,EAAJ,GAExB7/J,EAAIigK,eACL,aAAcjgK,EAAIigK,cAAe,aAAcF,EAAkBG,EAAoBH,OAAmB1uK,EAAY,KAClH2O,EAAIigK,cAAc3yK,gBACX0S,EAAIigK,eACTD,EAA4B,EAAJ,IAG1BJ,EACF,OAGCx7B,EACDpkI,EAAI8/J,YAAY52K,UAAUW,IAAI,oBAAqB,SAEnDmW,EAAI8/J,YAAY52K,UAAUoE,OAAO,oBAAqB,SAGxD,IAAIopF,GAAW,EAAMypF,GAAY,EAC9BjgK,EAAO+hH,uBAAiD,IAAxB/hH,EAAOg3F,cACxCl3F,EAAI8/J,YAAYlpJ,UAAY,IAC5BupJ,GAAY,GAEJ9K,EAERr1J,EAAI8/J,YAAYlpJ,UAAY,IAAM1W,EAAOg3F,cAAgB,MAEzDl3F,EAAI8/J,YAAYlpJ,UAAY,GAC5B8/D,GAAW,GAGb12E,EAAI8/J,YAAY52K,UAAUC,OAAO,SAAUutF,GAC3C12E,EAAI8/J,YAAY52K,UAAUC,OAAO,UAAWg3K,GAGtC,aAAalsK,GAEnB,MAAM8P,EAAU/a,KAAKshF,WAAW3tE,IAAI1I,GACpC,OAAO8P,aAAO,EAAPA,EAAS/D,IAGV,UAAUE,GAChB,GAAsB,iBAAb,EAAuB,CAC9B,MAAMkgK,EAAiB,IAAmBv9F,cAAc3iE,GACxD,IAAIkgK,EAAgB,CAClB,MAAMnsK,EAASiM,GAAU,KACzB,MAAO,CACLjM,SACAq7B,KAAM,IAAgB+xE,cAAcptG,GACpCsT,OAAQ,IAIZ,OAAO64J,EAGT,OAAOlgK,EAGD,cAAcF,EAAgB42B,GACpC,IAAI,SAACmlI,EAAQ,OAAExsI,GAAUvvB,EACzB,IAAI+7J,GAAYnlI,EAAS,CACvB,MAAM,OAAC1oC,EAAM,eAAE2pK,GAAkB73J,EAAI+7J,SAAWA,EAAWvE,GAAoBjoI,EAAOrmC,UAAUuV,SAAS,WACzGvQ,EAAOhF,UAAUW,IAAI,0BACrB0lC,EAAOllC,OAAO6D,GACd2pK,IAGEkE,GAIJ,aAAc/7J,EAAI+7J,SAAS7tK,OAAQ,aAAc0oC,EAAS,IAAKA,OAAUvlC,EAAY,KACnF2O,EAAI+7J,SAAS7tK,OAAOZ,SACpB0S,EAAI+7J,cAAW1qK,GACdulC,EAAU,EAAI,GAGZ,cAAcluC,GACnB,MAAMwX,EAASlX,KAAKq3K,UAAU33K,EAAQwX,QAEtCxX,EAAQwO,YAAa,EAErB,MAAMV,EAAMxN,KAAKiX,aAAavX,GAE9B,GAAG8N,EAAK,CACN,MAAM,OAACvC,GAAUiM,EACD,KAAwBo1B,iBAAiBrhC,GAAQ,IAE/DuC,EAAIwJ,IAAIuvB,OAAOrmC,UAAUW,IAAI,YAG3BoK,EAAO82B,UACT/hC,KAAKiyK,2BAA2B/6J,EAAQ1J,EAAIwJ,KAG9ChX,KAAKw3D,eAAetgD,OAAQ7O,EAAWmF,EAAIwJ,SAAK3O,EAAW3I,EAAQ0uB,aAAc1uB,EAAQuvK,SAAS,GAGpG,OAAOzhK,EAGD,2BAA2B0J,EAAgBF,GACjD,IAAI,GACF,OAIF,GADIA,IAAKA,EAAMhX,KAAK+xK,aAAa76J,EAAOjM,UACpC+L,EAAK,OAET,MAAM4Z,EAAiC,IAAgBiM,QAAQ3lB,EAAOjM,OAAO8vB,YAC7E/6B,KAAKs3K,cAActgK,KAAQ4Z,EAAKrS,OAAO+pH,cAAe13G,EAAKrS,OAAOg5J,iBAM7D,2BAA2B73K,GAKhC,MAAM,OAACuL,EAAM,QAAElD,EAAO,MAAEqH,GAAS1P,EAC3B8N,EAAMuhK,GAAkB93J,aAAa,OAAD,sCACrCvX,GACA,IAAmB83K,6BAA6BzvK,IAAQ,CAC3DmP,OAAQlX,KAAKq3K,UAAUpsK,MASzB,OANAjL,KAAKw3D,eAAehqD,EAAI0J,OAAQnP,EAASyF,EAAIwJ,IAAK5H,GAE/CrH,EAAQkD,SAAWA,IACpBuC,EAAIwJ,IAAIuvB,OAAOr/B,QAAQ+D,OAAS,GAAKlD,EAAQkD,QAGxCuC,EAGF,aAAa9N,GAclB,OAAOM,KAAKy3K,UAAU/3K,EAAQwX,OAAQxX,EAAQ0B,UAAW1B,EAAQyQ,WAAYzQ,EAAQyX,cAAezX,EAAQg7D,cAAeh7D,EAAQ2Q,UAAW3Q,EAAQ2B,OAAQ3B,EAAQ0Q,WAAY1Q,EAAQwO,WAAYxO,EAAQ4uB,cAAe5uB,EAAQ0uB,aAAc1uB,EAAQ0hI,UAGtP,UACLs2C,EACAt2K,EACA+O,GAAa,EACbgH,GAAgB,EAChBujD,GAAgB,EAChBrqD,GAAY,EACZhP,GAAS,EACT+O,EAAa,GACblC,IAAe9M,EACfktB,EACAF,EACAgzG,G,QAEA,MAAMlqH,EAASlX,KAAKq3K,UAAUK,GACxBzsK,EAASiM,EAAOjM,OAEhBswB,EAAW,IAAI,GAUrB,GATAA,EAASr7B,UAAUW,IAAI,gBAAiB,UAAYuP,GACpDmrB,EAAS1E,kBAAkB,CACzBzI,eACAE,gBACAkN,WAAYnrB,EACZpF,SACA+0E,UAAWohD,IAGVjxH,GAAclF,IAAW2B,EAAA,EAAU+R,MAAQ1T,EAAO82B,SAAU,CAEvC,sBAAR,QAAX,EADU,IAAgByJ,QAAQvgC,GAC7BmhD,cAAM,eAAEhhD,IACdpL,KAAKgyK,gBAAgBz2I,GAAU,GAInC,MAAMo8I,EAAah3K,SAASC,cAAc,OAC1C+2K,EAAWz3K,UAAUW,IAAI,gBAEzB,MAAM+2K,EAAqBj3K,SAASC,cAAc,QAClDg3K,EAAmB13K,UAAUW,IAAI,cAEjC,MAAMm/E,EAAY,IAAI,KAAU,CAC9B/0E,SACAm2H,WACAlqH,OAAQ7G,EACRqqD,gBACA96D,WAAW,IAGbg4K,EAAmBv2K,OAAO2+E,EAAUjlE,SAOlC68J,EAAmB13K,UAAUW,IAAI,SAEjC+2K,EAAmBv2K,UAAU6rC,GAAmBjiC,IAGlD,MAAMgiC,EAAOtsC,SAASC,cAAc,QACpCqsC,EAAK/sC,UAAUW,IAAI,qBACnBosC,EAAK1sC,aAAa,MAAO,QAKzB,MAAM2/B,EAAKv/B,SAASC,cAAc,MAClCs/B,EAAGhgC,UAAUW,IAAI,iBACdsW,GACD,OAAA+gB,GAAA,GAAOgI,GAGTA,EAAG7+B,OAAOk6B,EAAUo8I,GACpBz3I,EAAGh5B,QAAQ+D,OAAS,GAAKA,EAEzB,MAAM0rK,EAAah2K,SAASC,cAAc,QAC1C+1K,EAAWz2K,UAAUW,IAAI,iBAAkB,kBAE3C,MAAMq1K,EAAev1K,SAASC,cAAc,QAC5Cs1K,EAAah2K,UAAUW,IAAI,gBAE3B,MAAMi2K,EAAcn2K,SAASC,cAAc,OAC3Ck2K,EAAY9oK,UAAY,uCAExB,MAAM6pK,EAASl3K,SAASC,cAAc,KACtCi3K,EAAO33K,UAAUW,IAAI,gBAErB,MAAMi3K,EAAYn3K,SAASC,cAAc,QACzCk3K,EAAU53K,UAAUW,IAAI,wBACxBi3K,EAAUz2K,OAAOs1K,EAAYT,GAC7B2B,EAAOx2K,OAAOu2K,EAAoBE,GAElC,MAAM5nJ,EAAavvB,SAASC,cAAc,KAC1CsvB,EAAWhwB,UAAUW,IAAI,mBACzBqvB,EAAW7uB,OAAO4rC,GAElB0qI,EAAWt2K,OAAOw2K,EAAQ3nJ,GAE1B,MAAMlZ,EAAiB,CACrBukB,WACAo8I,aACA/9G,UAAWomB,EAAUjlE,QACrB68J,qBACAjB,aACAT,eACAY,cACA1/J,gBAAiB61B,EACjB9J,YAAajD,EACbqG,OAAQrG,EACRhQ,cASF,GAAG9uB,EAAW,CAEZA,EADeC,EAAS,SAAW,WACjB6+B,GAYpB,OATIhyB,IAEFgyB,EAAG4yI,UAAY97J,GAEK,QAAjB,KAAa4Z,YAAI,eAAE3lB,UAAWA,GAC/BjL,KAAKuyK,gBAAgBryI,GAAI,IAItB,CAAClpB,MAAKE,UAGR,UAAUA,GACf,MAAMF,EAAMhX,KAAK+xK,aAAa76J,EAAOjM,QACrC,IAAI+L,EACF,OAGF,MAAM+gK,EAAmB/gK,EAAII,gBAAgB3D,cAAc,0BACrDukK,EAAmB,GAAa9W,cAAchqJ,EAAOjM,OAAQ8sK,IAC/DA,GAAoBC,IACtB,OAAAvnK,EAAA,GAAeuG,EAAII,gBAAiB4gK,GACpChhK,EAAII,gBAAgBlX,UAAUW,IAAI,gBAI/B,YAAYqW,GACjB,MAAMF,EAAMhX,KAAK+xK,aAAa76J,EAAOjM,QACjC+L,IAIJA,EAAII,gBAAgBlX,UAAUoE,OAAO,eACrCtE,KAAKw3D,eAAetgD,EAAQ,KAAMF,OAAK3O,OAAWA,OAAWA,EAAW,QAI5E,MAAM0mK,GAAoB,IAAI,GAC9B,KAAeA,kBAAoBA,GACpB,qB,oBC/6DsL,oBAAoBp8H,MAAKA,KAA7JslI,EAAOC,QAAmL,SAASn4K,GAAG,IAAIuU,EAAE,GAAG,SAAS4nB,EAAEt6B,GAAG,GAAG0S,EAAE1S,GAAG,OAAO0S,EAAE1S,GAAGs2K,QAAQ,IAAI7wD,EAAE/yG,EAAE1S,GAAG,CAACA,EAAEA,EAAEglE,GAAE,EAAGsxG,QAAQ,IAAI,OAAOn4K,EAAE6B,GAAG4kJ,KAAKn/B,EAAE6wD,QAAQ7wD,EAAEA,EAAE6wD,QAAQh8I,GAAGmrF,EAAEzgD,GAAE,EAAGygD,EAAE6wD,QAAQ,OAAOh8I,EAAEyV,EAAE5xC,EAAEm8B,EAAEpE,EAAExjB,EAAE4nB,EAAEqF,EAAE,SAASxhC,EAAEuU,EAAE1S,GAAGs6B,EAAEA,EAAEn8B,EAAEuU,IAAIqJ,OAAOw6J,eAAep4K,EAAEuU,EAAE,CAAC8jK,YAAW,EAAGzkK,IAAI/R,KAAKs6B,EAAEnW,EAAE,SAAShmB,GAAG,oBAAoBs4K,QAAQA,OAAOC,aAAa36J,OAAOw6J,eAAep4K,EAAEs4K,OAAOC,YAAY,CAAC3zK,MAAM,WAAWgZ,OAAOw6J,eAAep4K,EAAE,aAAa,CAAC4E,OAAM,KAAMu3B,EAAE5nB,EAAE,SAASvU,EAAEuU,GAAG,GAAG,EAAEA,IAAIvU,EAAEm8B,EAAEn8B,IAAI,EAAEuU,EAAE,OAAOvU,EAAE,GAAG,EAAEuU,GAAG,iBAAiBvU,GAAGA,GAAGA,EAAEw4K,WAAW,OAAOx4K,EAAE,IAAI6B,EAAE+b,OAAO+zD,OAAO,MAAM,GAAGx1C,EAAEnW,EAAEnkB,GAAG+b,OAAOw6J,eAAev2K,EAAE,UAAU,CAACw2K,YAAW,EAAGzzK,MAAM5E,IAAI,EAAEuU,GAAG,iBAAiBvU,EAAE,IAAI,IAAIsnH,KAAKtnH,EAAEm8B,EAAEqF,EAAE3/B,EAAEylH,EAAE,SAAS/yG,GAAG,OAAOvU,EAAEuU,IAAI5N,KAAK,KAAK2gH,IAAI,OAAOzlH,GAAGs6B,EAAEmrF,EAAE,SAAStnH,GAAG,IAAIuU,EAAEvU,GAAGA,EAAEw4K,WAAW,WAAW,OAAOx4K,EAAEy4K,SAAS,WAAW,OAAOz4K,GAAG,OAAOm8B,EAAEqF,EAAEjtB,EAAE,IAAIA,GAAGA,GAAG4nB,EAAEA,EAAE,SAASn8B,EAAEuU,GAAG,OAAOqJ,OAAO86J,UAAUngG,eAAekuE,KAAKzmJ,EAAEuU,IAAI4nB,EAAEH,EAAE,GAAGG,EAAEA,EAAEpgB,EAAE,GAAj5B,CAAq5B,CAAC,SAAS/b,EAAEuU,EAAE4nB,GAAG,cAAa,SAAU5nB,GAAG,IAAI4nB,EAAE5nB,EAAEokK,cAAcpkK,EAAEqkK,mBAAmB/2K,EAAE,SAAS7B,GAAG,IAAI6B,EAAEg3K,uBAAuB,MAAM,IAAIxpJ,MAAM,8CAA8CrvB,IAAIA,EAAE,IAAIC,KAAKo5B,MAAM,WAAWp5B,KAAK8xD,OAAOn0C,OAAOugD,OAAO,CAAC26G,aAAa,KAAKC,mBAAmB,KAAKC,iBAAiB,GAAGC,YAAY,uBAAuB9hD,kBAAkB,KAAK+hD,iBAAiB,GAAGC,uBAAsB,EAAG/hD,YAAY,EAAEC,iBAAiB,EAAEC,cAAc,EAAE8hD,gBAAgB,EAAEC,aAAY,EAAG9hD,aAAY,EAAG+hD,YAAY,IAAIt5K,GAAGC,KAAKs5K,sBAAsB,GAAG13K,EAAEg3K,qBAAqB,WAAW,OAAO18I,GAAG5nB,EAAEgD,WAAWhD,EAAEgD,UAAUqlI,cAAcroI,EAAEgD,UAAUqlI,aAAa48B,cAAcjlK,EAAEklK,aAAa53K,EAAE62K,UAAUgB,YAAY,WAAWz5K,KAAKgyJ,SAAShyJ,KAAKgyJ,OAAO0nB,UAAU15K,KAAKgyJ,OAAO0nB,YAAYnvK,SAAQ,SAAUxK,GAAGA,EAAEkF,UAAUjF,KAAKgyJ,OAAO/sJ,cAAcjF,KAAKgyJ,QAAQhyJ,KAAK25K,cAAc35K,KAAK45K,oBAAoB55K,KAAK25K,aAAa/7I,eAAe59B,KAAK25K,eAAe/3K,EAAE62K,UAAUoB,cAAc,SAAS95K,GAAG,GAAG,cAAcC,KAAKo5B,MAAM,CAAC,IAAI,IAAI9kB,EAAE,GAAG4nB,EAAE,EAAEA,EAAEn8B,EAAEq3H,iBAAiBl7F,IAAI5nB,EAAE4nB,GAAGn8B,EAAE+5K,eAAe59I,GAAGl8B,KAAK+5K,QAAQC,YAAY,CAAC3tD,QAAQ,SAAS4tD,QAAQ3lK,MAAM1S,EAAE62K,UAAUyB,iBAAiB,SAASn6K,GAAG,OAAOA,GAAGA,EAAEqN,SAASpN,KAAK25K,aAAa55K,EAAEqN,QAAQpN,KAAK45K,mBAAkB,IAAK55K,KAAK25K,aAAa,IAAIz9I,EAAEl8B,KAAK45K,mBAAkB,GAAI55K,KAAK25K,cAAc/3K,EAAE62K,UAAU0B,eAAe,WAAWn6K,KAAK65K,cAAc,kBAAkB75K,KAAK65K,eAAe75K,KAAKo6K,oBAAoBp6K,KAAK25K,aAAaU,sBAAsBr6K,KAAK8xD,OAAO+mH,aAAa74K,KAAK8xD,OAAOslE,iBAAiBp3H,KAAK8xD,OAAOslE,kBAAkBp3H,KAAKo6K,oBAAoB5nD,QAAQxyH,KAAK25K,aAAaW,aAAat6K,KAAKo6K,oBAAoBG,eAAex6K,IAAIC,KAAK65K,cAAc95K,EAAEy6K,cAAcx6K,KAAKy6K,gBAAgBz6K,KAAK25K,aAAae,aAAa16K,KAAK26K,eAAe36K,KAAK8xD,OAAOqlE,aAAan3H,KAAKy6K,gBAAgBjoD,QAAQxyH,KAAK25K,aAAaW,aAAat6K,KAAK46K,kBAAkB56K,KAAK25K,aAAae,aAAa16K,KAAK66K,iBAAiB76K,KAAK8xD,OAAOulE,eAAer3H,KAAK46K,kBAAkBpoD,QAAQxyH,KAAKo6K,sBAAsBx4K,EAAE62K,UAAUqC,eAAe,SAAS/6K,GAAG,OAAOA,GAAGA,EAAEqN,QAAQkH,EAAEjP,QAAQ6E,QAAQnK,GAAGuU,EAAEgD,UAAUqlI,aAAa48B,aAAa,CAACrgK,MAAMlZ,KAAK8xD,OAAOonH,wBAAwBv1K,KAAK5D,IAAIC,KAAKgyJ,OAAOjyJ,EAAEC,KAAK25K,aAAaoB,wBAAwBh7K,MAAM6B,EAAE62K,UAAUuC,WAAW,WAAWh7K,KAAK+5K,UAAU/5K,KAAK+5K,QAAQ,IAAIzlK,EAAE2mK,OAAOj7K,KAAK8xD,OAAOknH,eAAep3K,EAAE62K,UAAUyC,WAAW,WAAW,IAAIn7K,GAAGC,KAAK8xD,OAAOsnH,YAAYp5K,KAAKm7K,WAAWn7K,KAAKo7K,WAAW10K,KAAK1G,MAAM,OAAOA,KAAKq7K,cAAc,GAAGr7K,KAAKwqB,YAAY,EAAExqB,KAAKg7K,aAAa,IAAI31K,QAAQ,CAACiP,EAAE4nB,KAAK,IAAIt6B,EAAEs6B,IAAI,OAAOA,EAAE8rB,KAAKjgD,SAAS,IAAI,QAAQuM,IAAI,MAAM,IAAI,OAAOtU,KAAKs5K,sBAAsBp9I,EAAE8rB,KAAKszH,eAAev7K,EAAEm8B,EAAE8rB,KAAKuzH,MAAM,MAAM,IAAI,OAAOv7K,KAAK+5K,QAAQlsK,oBAAoB,UAAUjM,GAAG5B,KAAK+mH,WAAW/mH,KAAK+5K,QAAQz4K,iBAAiB,UAAUM,GAAG5B,KAAK+5K,QAAQC,YAAYr8J,OAAOugD,OAAO,CAACmuD,QAAQ,OAAOmvD,mBAAmBx7K,KAAK25K,aAAa8B,WAAWC,cAAc17K,KAAK25K,aAAa8B,YAAYz7K,KAAK8xD,YAAYlwD,EAAE62K,UAAUx0K,MAAM,SAASlE,GAAG,GAAG,cAAcC,KAAKo5B,MAAM,CAAC,GAAGp5B,KAAKo5B,MAAM,SAASr5B,GAAGC,KAAK8xD,OAAOsnH,YAAY,CAAC,IAAI9kK,EAAEtU,KAAK+5K,QAAQ,OAAO,IAAI10K,QAAQ,CAACtF,EAAEm8B,KAAK,IAAIt6B,EAAEs6B,IAAI,YAAYA,EAAE8rB,KAAKjgD,UAAUuM,EAAEzG,oBAAoB,UAAUjM,GAAG5B,KAAK27K,UAAU57K,MAAMuU,EAAEhT,iBAAiB,UAAUM,GAAG0S,EAAE0lK,YAAY,CAAC3tD,QAAQ,YAAY,OAAOrsH,KAAK27K,UAAUt2K,QAAQ6E,YAAYtI,EAAE62K,UAAUmD,OAAO,WAAW,WAAW57K,KAAKo5B,QAAQp5B,KAAKo5B,MAAM,YAAYp5B,KAAK67K,aAAaj6K,EAAE62K,UAAUoC,iBAAiB,SAAS96K,GAAGC,KAAK8xD,OAAOulE,cAAct3H,EAAEC,KAAK46K,mBAAmB56K,KAAK25K,cAAc35K,KAAK46K,kBAAkBkB,KAAKC,gBAAgBh8K,EAAEC,KAAK25K,aAAargK,YAAY,MAAM1X,EAAE62K,UAAUkC,eAAe,SAAS56K,GAAGC,KAAK8xD,OAAOqlE,YAAYp3H,EAAEC,KAAKy6K,iBAAiBz6K,KAAK25K,cAAc35K,KAAKy6K,gBAAgBqB,KAAKC,gBAAgBh8K,EAAEC,KAAK25K,aAAargK,YAAY,MAAM1X,EAAE62K,UAAUxxJ,MAAM,SAASlnB,GAAG,GAAG,aAAaC,KAAKo5B,MAAM,OAAOp5B,KAAKk6K,iBAAiBn6K,GAAGC,KAAKm6K,iBAAiBn6K,KAAKs5K,sBAAsB,EAAEt5K,KAAKk7K,aAAav3K,KAAK,IAAI3D,KAAK86K,eAAe/6K,IAAI4D,KAAK5D,IAAIC,KAAKqyH,WAAWtyH,EAAEC,KAAKo5B,MAAM,YAAYp5B,KAAKg8K,UAAUh8K,KAAK+5K,QAAQC,YAAY,CAAC3tD,QAAQ,mBAAmBrsH,KAAKqyH,WAAWG,QAAQxyH,KAAKy6K,iBAAiBz6K,KAAKqyH,WAAWG,QAAQxyH,KAAK46K,sBAAsBh5K,EAAE62K,UAAUxzK,KAAK,WAAW,GAAG,aAAajF,KAAKo5B,MAAM,CAACp5B,KAAKo5B,MAAM,WAAWp5B,KAAKy6K,gBAAgB9vF,aAAa3qF,KAAKo6K,oBAAoBzvF,aAAa3qF,KAAK46K,kBAAkBjwF,aAAa3qF,KAAKqyH,WAAW1nC,aAAa3qF,KAAKy5K,cAAc,IAAI15K,EAAEC,KAAK+5K,QAAQ,OAAO,IAAI10K,QAAQiP,IAAI,IAAI4nB,EAAEt6B,IAAI,SAASA,EAAEomD,KAAKjgD,UAAUhI,EAAE8N,oBAAoB,UAAUquB,GAAG5nB,MAAMvU,EAAEuB,iBAAiB,UAAU46B,GAAGn8B,EAAEi6K,YAAY,CAAC3tD,QAAQ,SAASrsH,KAAK8xD,OAAOwlE,aAAav3H,EAAEi6K,YAAY,CAAC3tD,QAAQ,YAAY,OAAOhnH,QAAQ6E,WAAWtI,EAAE62K,UAAUwD,cAAc,WAAW,aAAaj8K,KAAKo5B,OAAOp5B,KAAK+5K,UAAU/5K,KAAK+5K,QAAQC,YAAY,CAAC3tD,QAAQ,iBAAiBrsH,KAAK+5K,UAAUn4K,EAAE62K,UAAU2C,UAAU,SAASr7K,GAAGC,KAAKq7K,cAAc9xK,KAAKxJ,GAAGC,KAAKwqB,aAAazqB,EAAE4B,QAAQC,EAAE62K,UAAU0C,WAAW,SAASp7K,GAAGC,KAAKy3H,gBAAgB13H,IAAI6B,EAAE62K,UAAU1xD,OAAO,WAAW,IAAI/mH,KAAK8xD,OAAOsnH,YAAY,CAAC,IAAIr5K,EAAE,IAAIunB,WAAWtnB,KAAKwqB,aAAaxqB,KAAKq7K,cAAc5pJ,QAAO,SAAUnd,EAAE4nB,GAAG,OAAOn8B,EAAEya,IAAI0hB,EAAE5nB,GAAGA,EAAE4nB,EAAEv6B,SAAS,GAAG3B,KAAKy3H,gBAAgB13H,GAAGC,KAAKw3H,SAASx3H,KAAK8xD,OAAOwlE,oBAAoBt3H,KAAK+5K,SAASn4K,EAAE62K,UAAUhhD,gBAAgB,aAAa71H,EAAE62K,UAAUkD,QAAQ,aAAa/5K,EAAE62K,UAAUoD,SAAS,aAAaj6K,EAAE62K,UAAUuD,QAAQ,aAAap6K,EAAE62K,UAAUjhD,OAAO,aAAaz3H,EAAEm4K,QAAQt2K,IAAI4kJ,KAAKxmJ,KAAKk8B,EAAE,KAAK,SAASn8B,EAAEuU,GAAG,IAAI4nB,EAAEA,EAAE,WAAW,OAAOl8B,KAAlB,GAA0B,IAAIk8B,EAAEA,GAAG,IAAIggJ,SAAS,cAAb,GAA8B,MAAMn8K,GAAG,iBAAiBmC,SAASg6B,EAAEh6B,QAAQnC,EAAEm4K,QAAQh8I,M,gCCA7oN,gHAsDO,MAAMigJ,EAuBX,YAAmBr6K,EAAiBs6K,EAAY,GAAWh7K,EAAyBT,SAASC,cAAc,QAAxF,KAAAkB,KAAwC,KAAAV,YAnBpD,KAAAi7K,gBAA0B,EAE1B,KAAA9vE,mBAA6B,EAC7B,KAAAjH,oBAA8B,EAM9B,KAAAvwD,4BAA6B,EAC1B,KAAAunI,yBAA0B,EAyF7B,KAAAj1I,SAAW,KAOhB,GAAGrnC,KAAK+0C,2BAGN,OAFA/0C,KAAKwtG,qBACLxtG,KAAKs8K,yBAA0B,IAK5Bt8K,KAAK4qG,eAAkB5qG,KAAK4P,kBAAsB5P,KAAKu/B,SAAYv/B,KAAKw0C,sBAC1Ex0C,KAAKq8K,kBAERr8K,KAAKq8K,gBAAkBn6K,OAAO8jB,sBAAsB,KAClDhmB,KAAKq8K,gBAAkB,EAEvB,MAAME,EAAiBv8K,KAAKoB,UAAUpB,KAAKw8K,gBAC3Cx8K,KAAKslG,oBAAsBtlG,KAAKusG,qBAAuBgwE,EAAiB,EAAKv8K,KAAKusG,mBAAqBgwE,EAAiB,GAAK,EAC7Hv8K,KAAKusG,mBAAqBgwE,EAGvBv8K,KAAKw0C,oBACNx0C,KAAKw0C,qBAGJx0C,KAAKq+B,kBACNr+B,KAAKq+B,wBA7GTr+B,KAAKoB,UAAUlB,UAAUW,IAAI,cAE7Bb,KAAKkiB,IAAM,YAAO,UAAYk6J,EAAY,IAAMA,EAAY,IAAK,IAAShtJ,OAEvEttB,IACDqK,MAAMC,KAAKtK,EAAGyuB,UAAUhmB,QAAQutB,GAAK93B,KAAKoB,UAAUC,OAAOy2B,IAE3Dh2B,EAAGT,OAAOrB,KAAKoB,YAKZ,oBACFpB,KAAKy8K,sBAIRz8K,KAAKy8K,qBAAsB,EAC3Bz8K,KAAKoB,UAAUE,iBAAiB,SAAUtB,KAAKqnC,SAAU,CAACnjB,SAAS,EAAMuL,SAAS,KAG7E,uBACDzvB,KAAKy8K,sBAITz8K,KAAKy8K,qBAAsB,EAC3Bz8K,KAAKoB,UAAUyM,oBAAoB,SAAU7N,KAAKqnC,SAAU,CAAC5X,SAAS,KAGjE,eACFzvB,KAAK08K,+BAIRx6K,OAAOZ,iBAAiB,SAAUtB,KAAKqnC,SAAU,CAACnjB,SAAS,IAC3DlkB,KAAK28K,oBAEL38K,KAAK08K,6BAA+B,YAAuB,KACzD18K,KAAK+0C,4BAA6B,EAE/B/0C,KAAKq8K,kBACNr8K,KAAKwtG,gBACLxtG,KAAKs8K,yBAA0B,IAEhC,KACDt8K,KAAK+0C,4BAA6B,EAE/B/0C,KAAKs8K,0BACNt8K,KAAKqnC,WACLrnC,KAAKs8K,yBAA0B,MAK9B,kBACDt8K,KAAK08K,+BAITx6K,OAAO2L,oBAAoB,SAAU7N,KAAKqnC,UAC1CrnC,KAAK48K,uBAEL58K,KAAK08K,+BACL18K,KAAK08K,kCAA+Br0K,GAG/B,OAAO0S,GACZ/a,KAAKoB,UAAUC,OAAO0Z,GAGjB,kBAAkBrb,GAEvB,OAAO,YAAiB,OAAD,wBAClBA,GAAO,CACV0B,UAAWpB,KAAKoB,aAuCb,gBACFpB,KAAKq8K,kBACNn6K,OAAO+jB,qBAAqBjmB,KAAKq8K,iBACjCr8K,KAAKq8K,gBAAkB,IAQd,MAAMQ,UAAmBV,EAKtC,YAAYr6K,EAAiBs6K,EAAY,GAAWU,EAAiB,IAAKC,GACxEp9K,MAAMmC,EAAIs6K,GADwC,KAAAU,iBAF7C,KAAA/zK,UAAiC,CAAC2vB,KAAK,EAAMhT,QAAQ,GAsBrD,KAAA2Y,iBAAmB,KACxB,IAAKr+B,KAAK4qG,gBAAkB5qG,KAAK4P,iBAAmB,OAEpD,GAAG5P,KAAK+0C,2BAEN,YADA/0C,KAAKqnC,WAIP,MAAMuvB,EAAe52D,KAAKoB,UAAUw1D,aACpC,IAAIA,EACF,OAGF,MACMomH,EAAepmH,EADA52D,KAAKoB,UAAU69F,aAE9BlvD,EAAY/vC,KAAKusG,mBAIpBvsG,KAAK4qG,eAAiB76D,GAAa/vC,KAAK88K,gBAAkB98K,KAAKslG,qBAAuB,GACvFtlG,KAAK4qG,gBAGJ5qG,KAAK4P,kBAAqBotK,EAAejtI,GAAc/vC,KAAK88K,gBAAkB98K,KAAKslG,qBAAuB,GAC3GtlG,KAAK4P,oBAlCP5P,KAAKoB,UAAUlB,UAAUW,IAAI,gBAC7Bb,KAAKwmB,eACLxmB,KAAKw8K,eAAiB,YAGjB,oBAAoB16K,GACzB9B,KAAKu/B,QAAUz9B,EACf9B,KAAKkiB,IAAI,uBAAwBpgB,EAAI9B,MA+BhC,WAAWqrB,IACfrrB,KAAKu/B,SAAWv/B,KAAK+oK,SAAW/oK,KAAKoB,WAAWJ,WAAWqqB,GAGvD,UAAUA,IACdrrB,KAAKu/B,SAAWv/B,KAAK+oK,SAAW/oK,KAAKoB,WAAWC,UAAUgqB,GAGtD,mBACL,OAAOrrB,KAAK42D,aAAe/xD,KAAKE,MAAM/E,KAAK+vC,UAAY/vC,KAAKoB,UAAUmoG,cAGxE,qBACE,OAAOvpG,KAAKylG,oBAAsB,EAGpC,cAAcniF,GACZtjB,KAAKoB,UAAU2uC,UAAYzsB,EAG7B,gBAEE,OAAOtjB,KAAKoB,UAAU2uC,UAGjB,qBAAqBprC,GAC1B3E,KAAKusG,mBAAqB5nG,EAC1B3E,KAAKorG,wBAELprG,KAAK+vC,UAAYprC,EAGZ,wBACF3E,KAAK08K,+BACN18K,KAAK48K,uBACL58K,KAAKoB,UAAUE,iBAAiB,SAAWvB,IACzC,YAAYA,GACZC,KAAK28K,qBACJ,CAACltJ,SAAS,EAAMvL,SAAS,EAAOrF,MAAM,KAI7C,mBACE,OAAO7e,KAAKoB,UAAUw1D,cAInB,MAAMqmH,UAAoBd,EAC/B,YAAYr6K,EAAiBs6K,EAAY,GAAWU,EAAiB,IAAYI,EAAa,GAAW97K,EAAyBT,SAASC,cAAc,QAKvJ,GAJAjB,MAAMmC,EAAIs6K,EAAWh7K,GAD6B,KAAA07K,iBAA6B,KAAAI,aAAwB,KAAA97K,YAGvGpB,KAAKoB,UAAUlB,UAAUW,IAAI,iBAEzB,IAAoB,CACtB,MAAMs8K,EAAsBp9K,KACtBA,EAAEq9K,QAAUp9K,KAAKoB,UAAUg2C,YAAcp3C,KAAKoB,UAAU+yK,cAC1Dn0K,KAAKoB,UAAUm8F,YAAcx9F,EAAEuoE,OAAS,EACxC,YAAYvoE,KAIhBC,KAAKoB,UAAUE,iBAAiB,QAAS67K,EAAoB,CAACj5J,SAAS,IAGzElkB,KAAKw8K,eAAiB,gB,gCChU1B,qEAyBe,MAAMa,EAKnB,YAAY39K,EAAgC,IAC1C,MAAMqG,EAAQ/F,KAAK+F,MAAQpF,SAASC,cAAc,SAClDmF,EAAM7F,UAAUW,IAAI,kBAEjBnB,EAAQ8lC,aACTz/B,EAAM7F,UAAUW,IAAI,8BAGnBnB,EAAQqF,OACTgB,EAAM7F,UAAUW,IAAI,wBAGnBnB,EAAQ6W,UACTvW,KAAK89B,kBAAiB,GAGxB,MAAM19B,EAAQJ,KAAKI,MAAQO,SAASC,cAAc,SAoClD,IAAIqsC,EAWJ,GA9CA7sC,EAAMF,UAAUW,IAAI,wBACpBT,EAAMC,KAAO,WACVX,EAAQc,OACTJ,EAAM2S,GAAK,SAAWrT,EAAQc,MAG7Bd,EAAQy3B,UACT/2B,EAAM+2B,SAAU,GAGfz3B,EAAQu5B,UACT,IAAgBE,WAAWx1B,KAAKy1B,IAC9B,MAAMkkJ,EAAa,YAAgBlkJ,EAAO15B,EAAQu5B,UAClD,IAAI9B,EAEFA,EADCz3B,EAAQ69K,YAC6C,IAA5C79K,EAAQ69K,YAAYp4J,QAAQm4J,GAE5BA,EAGZt9K,KAAK4F,iBAAiBuxB,GAEtB/2B,EAAMkB,iBAAiB,SAAU,KAC/B,IAAIqD,EAEFA,EADCjF,EAAQ69K,YACD79K,EAAQ69K,YAAYn9K,EAAM+2B,QAAU,EAAI,GAExC/2B,EAAM+2B,QAGhB,IAAgBmC,SAAS55B,EAAQu5B,SAAUt0B,OAM9CjF,EAAQ44B,MACT2U,EAAOjtC,KAAKitC,KAAOtsC,SAASC,cAAc,QAC1CqsC,EAAK/sC,UAAUW,IAAI,oBACnB,YAAMosC,EAAMvtC,EAAQ44B,KAAM54B,EAAQuoC,WAElCliC,EAAM7F,UAAUW,IAAI,4BAGtBkF,EAAM1E,OAAOjB,GAEVV,EAAQS,OAAQ,CACjB4F,EAAM7F,UAAUW,IAAI,yBAEpB,MAAMV,EAASQ,SAASC,cAAc,OACtCT,EAAOD,UAAUW,IAAI,mBACrBkF,EAAM1E,OAAOlB,OACR,CACL,MAAMmsE,EAAM3rE,SAASC,cAAc,OACnC0rE,EAAIpsE,UAAUW,IAAI,gBAElB,MAAM28K,EAAW78K,SAAS4nB,gBAAgB,6BAA8B,OACxEi1J,EAASt9K,UAAUW,IAAI,sBACvB28K,EAASh1J,eAAe,KAAM,UAAW,aACzC,MAAM4kB,EAAMzsC,SAAS4nB,gBAAgB,6BAA8B,OACnE6kB,EAAI5kB,eAAe,KAAM,OAAQ,UACjC4kB,EAAI5kB,eAAe,KAAM,IAAK,MAC9Bg1J,EAASn8K,OAAO+rC,GAEhB,MAAMqwI,EAAK98K,SAASC,cAAc,OAClC68K,EAAGv9K,UAAUW,IAAI,2BAEjB,MAAMkvB,EAASpvB,SAASC,cAAc,OACtCmvB,EAAO7vB,UAAUW,IAAI,uBAErByrE,EAAIjrE,OAAO0uB,EAAQ0tJ,EAAID,GAEvBz3K,EAAM1E,OAAOirE,GAGZr/B,GACDlnC,EAAM1E,OAAO4rC,GAGZvtC,EAAQy8B,YACTp2B,EAAM7F,UAAUW,IAAI,kBAAmB,gBACvC,YAAOkF,OAAOsC,OAAWA,GAAW,IAE5B3I,EAAQg+K,WAChB33K,EAAM7F,UAAUW,IAAI,gBAIxB,cACE,OAAOb,KAAKI,MAAM+2B,QAGpB,YAAYA,GAKVn3B,KAAK4F,iBAAiBuxB,GAEtB,MAAMhU,EAAQ,IAAIsW,MAAM,SAAU,CAAC5I,SAAS,EAAMxG,YAAY,IAC9DrqB,KAAKI,MAAMkS,cAAc6Q,GAGpB,iBAAiBgU,GACtBn3B,KAAKI,MAAM+2B,QAAUA,EAGhB,iBAAiBiqC,GAEtB,OADAphE,KAAK+F,MAAM7F,UAAUC,OAAO,oBAAqBihE,GAC1C,IAAMphE,KAAK89B,kBAAkBsjC,M,gCCtJzB,SAAStjC,EAAiBzS,EAAyB+1C,GAOhE,OANGA,EACD/1C,EAAS9gB,QAAQzI,GAAMA,EAAGvB,aAAa,WAAY,SAEnD8qB,EAAS9gB,QAAQzI,GAAMA,EAAG6oC,gBAAgB,aAGrC,IAAM7M,EAAiBzS,GAAW+1C,GAb3C,mC,gCCMe,SAASn7B,EAAUnkC,EAASk6H,GACzC,OAAOl6H,EAAGm+G,QAAQ+b,GAPpB,mC,kDCiHA,MAAMj7D,EAAkB,IAjGjB,MACE,WACL,OAAO,IAAWnmC,UAAU,uBAAuBj3B,KAAM2G,GAChDA,GAIJ,eAAeq5B,EAKlB,IAIF,OAAO3jC,KAAKm5B,WAAWx1B,KAAKy1B,IAC1B,IAAIukJ,EACAC,EACJ,MAAM5/J,EAAwC,CAC5CixI,SAAU,KACV4uB,aAAc,CACZzyK,EAAG,gCACHy2D,KAAMl+B,EAASk+B,KACfhB,MAAOl9B,EAASk9B,QAKlB88G,EADCh6I,EAASm+B,gBACW,IAAWuvF,aAAa,aAAc1tH,EAASm+B,gBAAiB1oC,GAAO,GAEvE/zB,QAAQ6E,QAAQ,CACnCkB,EAAG,4BAKP,MAAM0yK,EAAU1kJ,EAAM2kJ,SAChBC,EAAQ,IAAI12J,WAAWw2J,EAAQE,MAAMr8K,OAAS,IAWpD,OCjES,SAA8CsG,GAC3D,IAAGm/I,UAAU,oBAAqBA,QAGhC,MAAM,IAAIh4H,MAAM,oBAFhBg4H,OAAO62B,gBAAgBh2K,GDqDrBi2K,CAAUF,GACVA,EAAMxjK,IAAIsjK,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdJ,EADCj6I,EAASq+B,YACO,IAAWqvF,aAAa,aAAc1tH,EAASq+B,YAAa5oC,GAAO,GAEnE/zB,QAAQ6E,QAAQ,IAAIod,YAGhCjiB,QAAQC,IAAI,CAACq4K,EAAoBC,IAAiBj6K,KAAMw6K,IAC7DngK,EAAOixI,SAAWkvB,EAAO,GACzBngK,EAAO6/J,aAAaE,SAAWD,EAC/B9/J,EAAO6/J,aAAaO,kBAAoBD,EAAO,GAExC,IAAWvjJ,UAAU,iCAAkC5c,OAK7D,MAAMixI,EAAkB71H,EAAwB15B,EAAe,IACpE,OAAO,IAAW2xJ,aAAa,aAAcpC,EAAU71H,GAAO,GAAOz1B,KAAM06K,GAElE,IAAWzjJ,UAAU,qBAAsB,CAChDq0H,SAAUovB,GACT3+K,GAASiE,KAAKi/D,IACD,uBAAXA,EAAKx3D,GACN,IAAWkzK,QAAQ17G,EAAKr3B,MAGnBq3B,KAKN,qBAAqB37D,GAC1B,OAAO,IAAW2zB,UAAU,+BAAgC,CAAC3zB,SAGxD,sBACL,OAAO,IAAW2zB,UAAU,+BAGvB,sBACL,OAAO,IAAWA,UAAU,iCAehC,IAAemmC,gBAAkBA,EAClB","file":"13.f5538912196e125de757.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport forEachReverse from \"./array/forEachReverse\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"./array/forEachReverse\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n \n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(result => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n\n if(older) {\n if(this.reverse) this.previous.unshift(processed);\n else this.next.push(processed);\n } else {\n if(this.reverse) this.next.push(processed);\n else this.previous.unshift(processed);\n }\n });\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport appMessagesIdsManager from \"../lib/appManagers/appMessagesIdsManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport forEachReverse from \"./array/forEachReverse\";\nimport filterChatPhotosMessages from \"./filterChatPhotosMessages\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n\n constructor(options: Omit, 'loadMore'> & {onEmptied?: () => void, isInner?: boolean} = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = appMessagesIdsManager.incrementMessageId(maxId, 1);\n\n return appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then(value => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: (message) => {\n const filtered = this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options, \n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n \n // };\n }\n }\n\n protected filterMids(mids: number[]) {\n const storage = this.searchContext.isScheduled ? \n appMessagesManager.getScheduledMessagesStorage(this.searchContext.peerId) : \n appMessagesManager.getMessagesStorage(this.searchContext.peerId);\n const filtered = appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storage, mids.length) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = (obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = this.filterMids(sorted);\n const targets = filtered.map(message => this.processItem(message)).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(this.searchContext.useSearch === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious() {\n let previous = this.previous;\n\n if(this.otherSideLoader) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext() {\n let next = this.next;\n\n if(this.otherSideLoader) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n \n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed && \n this.otherSideLoader && \n value && \n this.searchContext?.useSearch !== false/* && \n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(public name: LangPackKey | boolean, public type: string, private clearable = true, className?: string, clickable = true, public autonomous = true, public onFound?: () => void) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then(res => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n drawStatus: false,\r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch(err => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTab;\r\n}\r\n\r\nexport interface SliderSuperTabEventableConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n this.slider.addTab(this);\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type']\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach(el => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find(t => t instanceof tabConstructor) as SliderSuperTab;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport type { InputFile } from \"../layer\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n attachClickEvent(this.container, () => {\r\n new PopupAvatar().open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n if(this.isGeoChat){\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n appChatsManager.createChannel({\r\n title, \r\n about: '', \r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords, \r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length){\r\n appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChat(title, this.peerIds.map(peerId => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n }\r\n });\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n this.peerIds.forEach(userId => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: userId,\r\n container: this.list,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(userId));\r\n });\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private startLocating(){\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = \"https://nominatim.openstreetmap.org/reverse\";\r\n uri += \"?lat=\"+location.coords.latitude;\r\n uri += \"&lon=\"+location.coords.longitude;\r\n uri += \"&format=json\";\r\n uri += \"&addressdetails=1\";\r\n uri += \"&accept-language=en\";\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { DocumentAttribute, Message, PhotoSize } from \"../layer\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport { onMediaLoad } from \"../helpers/files\";\r\nimport copy from \"../helpers/object/copy\";\r\nimport deepEqual from \"../helpers/object/deepEqual\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\r\n\r\nexport class AppMediaPlaybackController {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n private playingMediaType: PlaybackMediaType;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n \r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n public loop: boolean;\r\n public round: boolean;\r\n private _volume: number;\r\n private _muted: boolean;\r\n private _playbackRate: number;\r\n private _loop: boolean;\r\n private _round: boolean;\r\n private lockedSwitchers: boolean;\r\n private playbackRates: Record = {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n };\r\n\r\n private pip: HTMLVideoElement;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.browserPlay,\r\n pause: this.browserPause,\r\n stop: this.browserStop,\r\n seekbackward: this.browserSeekBackward,\r\n seekforward: this.browserSeekForward,\r\n seekto: this.browserSeekTo,\r\n previoustrack: this.browserPrevious,\r\n nexttrack: this.browserNext\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (doc) => {\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const,\r\n 'loop' as const,\r\n 'round' as const\r\n ];\r\n keys.forEach(key => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\r\n this.playbackRates[this.playingMediaType] = value as number;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n rootScope.dispatchEvent('media_playback_params', this.getPlaybackParams());\r\n }\r\n\r\n public getPlaybackParams() {\r\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\r\n return {\r\n volume, \r\n muted, \r\n playbackRate,\r\n playbackRates,\r\n loop,\r\n round\r\n };\r\n }\r\n\r\n public setPlaybackParams(params: ReturnType) {\r\n this.playbackRates = params.playbackRates;\r\n this._volume = params.volume;\r\n this._muted = params.muted;\r\n this._playbackRate = params.playbackRate;\r\n this._loop = params.loop;\r\n this._round = params.round;\r\n }\r\n \r\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(doc.supportsStreaming || cacheContext.url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDocsManager.downloadDoc(doc);\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = (media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n\r\n if(this.playingMedia === media) {\r\n media.playbackRate = this.playbackRate;\r\n\r\n if(doc.type === 'audio') {\r\n media.loop = this.loop;\r\n }\r\n }\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n if(document.pictureInPictureElement) {\r\n return;\r\n }\r\n\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appPhotosManager.preloadPhoto(doc, size);\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n const result = appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n if(result.cached) {\r\n const url = await result.loadPromise;\r\n artwork.push({\r\n src: url,\r\n sizes: '160x160',\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n result.loadPromise.then((url) => {\r\n if(this.playingMedia !== playingMedia || !url) {\r\n return;\r\n }\r\n \r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n\r\n title = appPeersManager.getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute?.title ?? doc.file_name;\r\n artist = attribute?.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach(size => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n public setCurrentMediadata() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) return;\r\n const message = this.getMessageByMedia(playingMedia);\r\n this.setNewMediadata(message, playingMedia);\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n const message = details.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\r\n return message;\r\n }\r\n\r\n public getPlayingDetails() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) {\r\n return;\r\n }\r\n\r\n const message = this.getMessageByMedia(playingMedia);\r\n return {\r\n doc: appMessagesManager.getMediaFromMessage(message) as MyDocument,\r\n message,\r\n media: playingMedia,\r\n playbackParams: this.getPlaybackParams()\r\n };\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n this.setMedia(media, message);\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n const listLoader = this.listLoader;\r\n const current = listLoader.getCurrent();\r\n if(!current || !verify(current)) {\r\n const previous = listLoader.getPrevious();\r\n\r\n let idx = previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(previous.length - idx);\r\n } else {\r\n idx = listLoader.getNext().findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n if(this.playingMedia !== media) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('media_play', this.getPlayingDetails());\r\n }, 0);\r\n };\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n // if(this.pip) {\r\n // this.pip.play();\r\n // }\r\n\r\n rootScope.dispatchEvent('media_pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || \r\n (!this.round && listLoader.current && !listLoader.next.length) || \r\n !listLoader.getNext().length || \r\n !this.next()) {\r\n this.stop();\r\n rootScope.dispatchEvent('media_stop');\r\n }\r\n };\r\n\r\n // public get pip() {\r\n // return document.pictureInPictureElement as HTMLVideoElement;\r\n // }\r\n\r\n public toggle(play?: boolean, media = this.playingMedia) {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = media.paused;\r\n }\r\n\r\n if(media.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n media.play();\r\n } else {\r\n media.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = (media = this.playingMedia) => {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n if(media === this.playingMedia) {\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n \r\n this.mediaDetails.delete(media);\r\n }\r\n \r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n \r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public go = (length: number, dispatchJump?: boolean) => {\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || !listLoader) {\r\n return;\r\n }\r\n\r\n if(this.playingMediaType === 'audio') {\r\n return listLoader.goRound(length, dispatchJump);\r\n } else {\r\n return listLoader.go(length, dispatchJump);\r\n }\r\n };\r\n\r\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\r\n const handler: MediaSessionActionHandler = (details) => {\r\n cb(this.pip, details);\r\n };\r\n\r\n return handler;\r\n }\r\n\r\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\r\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\r\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\r\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\r\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\r\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\r\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\r\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\r\n\r\n public next = () => {\r\n return this.go(1);\r\n };\r\n\r\n public previous = () => {\r\n if(this.seekToStart(this.playingMedia)) {\r\n return;\r\n }\r\n\r\n return this.go(-1);\r\n };\r\n\r\n public seekToStart(media: HTMLMediaElement) {\r\n if(media?.currentTime > 5) {\r\n media.currentTime = 0;\r\n this.toggle(true, media);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n let listLoader = this.listLoader;\r\n if(!listLoader) {\r\n listLoader = this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n rootScope.dispatchEvent('media_stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n listLoader.reverse = reverse;\r\n }\r\n\r\n listLoader.setSearchContext(this.searchContext);\r\n listLoader.current = current;\r\n\r\n listLoader.load(true);\r\n listLoader.load(false);\r\n }\r\n\r\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n let mediaType: PlaybackMediaType = 'audio';\r\n if(doc?.type) {\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n mediaType = 'voice';\r\n } else if(doc.type === 'video') {\r\n mediaType = 'video';\r\n }\r\n }\r\n\r\n return mediaType;\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\r\n\r\n this._playbackRate = this.playbackRates[mediaType];\r\n\r\n this.playingMedia = media;\r\n this.playingMediaType = mediaType;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if(mediaType === 'audio') {\r\n this.playingMedia.loop = this.loop;\r\n }\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n let onPlay: () => void;\r\n if(media) {\r\n onPlay = () => {\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n };\r\n \r\n if(!media.paused) {\r\n onPlay();\r\n }\r\n \r\n media.addEventListener('play', onPlay);\r\n }\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return (playPaused = wasPlaying) => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n \r\n // If it's still not cleaned\r\n if(this.playingMedia === media) {\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n if(media) {\r\n media.removeEventListener('play', onPlay);\r\n }\r\n\r\n // I don't remember what it was for\r\n // if(media && this.playingMedia === media) {\r\n // this.stop();\r\n // }\r\n\r\n if(playPaused) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n\r\n public setPictureInPicture(video: HTMLVideoElement) {\r\n this.pip = video;\r\n\r\n // let wasPlaying = this.pause();\r\n\r\n const listenerSetter = new ListenerSetter();\r\n listenerSetter.add(video)('leavepictureinpicture', () => {\r\n if(this.pip !== video) {\r\n return;\r\n }\r\n\r\n this.pip = undefined;\r\n // if(wasPlaying) {\r\n // this.play();\r\n // }\r\n\r\n listenerSetter.removeAll();\r\n }, {once: true});\r\n\r\n listenerSetter.add(video)('play', (e) => {\r\n if(this.playingMedia !== video) {\r\n this.pause();\r\n }\r\n // if(this.pause()) {\r\n // listenerSetter.add(video)('pause', () => {\r\n // this.play();\r\n // }, {once: true});\r\n // }\r\n });\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\nimport { fastRaf } from \"../schedulers\";\nimport throttleWith from \"./throttleWith\";\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { i18n, LangPackKey } from \"../lib/langPack\";\n\nexport default function formatBytes(bytes: number, decimals = 2) {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return i18n(sizes[i], [parseFloat((bytes / Math.pow(k, i)).toFixed(dm))]);\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport RangeSelector from \"./rangeSelector\";\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport './middleEllipsis';\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport htmlToSpan from \"../helpers/dom/htmlToSpan\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport formatBytes from \"../helpers/formatBytes\";\nimport { animateSingle } from \"../helpers/animation\";\nimport clamp from \"../helpers/number/clamp\";\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\nimport MediaProgressLine from \"./mediaProgressLine\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach(mid => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach(elem => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; //mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; //mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nfunction wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n \n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n \n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nfunction wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(RichTextProcessor.wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(appMessagesManager.wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(appMessagesManager.wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, RichTextProcessor.wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(appMessagesManager.wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map(s => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map(element => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public render() {\n this.classList.add('audio');\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(this.message);\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploading = isOutgoing && this.preloader;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploading) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = isVoice ? wrapVoiceMessage(this) : wrapAudio(this);\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID, \n inputFilter: {_: 'inputMessagesFilterEmpty'}, \n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach(img => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDocsManager.downloadDoc(doc);\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n \n //setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n //}, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploading) {\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: appPhotosManager.choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = RichTextProcessor.wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach(child => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, (title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport accumulate from \"../helpers/array/accumulate\";\r\nimport clamp from \"../helpers/number/clamp\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find(r => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map(size => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map(ratio => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map(ratio => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.updateWithOptions({peerId: this.peerId});\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach(inputField => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach(inputField => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach(inputField => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach(r => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport ripple from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public titleRight: HTMLElement;\r\n public subtitle: HTMLElement;\r\n public media: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string | HTMLElement | DocumentFragment,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n titleRightSecondary: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n havePadding = true;\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n \r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n havePadding = true;\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n const titleRight = options.titleRight || options.titleRightSecondary;\r\n if(titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n if(typeof(options.title) === 'string') {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(options.title);\r\n }\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(titleRight) {\r\n const titleRightEl = this.titleRight = document.createElement('div');\r\n titleRightEl.classList.add('row-title', 'row-title-right');\r\n\r\n if(options.titleRightSecondary) {\r\n titleRightEl.classList.add('row-title-right-secondary');\r\n }\r\n\r\n if(typeof(titleRight) === 'string') {\r\n titleRightEl.innerHTML = titleRight;\r\n } else {\r\n titleRightEl.append(titleRight);\r\n }\r\n\r\n c.append(titleRightEl);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n public createMedia(size?: 'small') {\r\n this.container.classList.add('row-with-padding');\r\n \r\n const media = this.media = document.createElement('div');\r\n media.classList.add('row-media');\r\n\r\n if(size) {\r\n media.classList.add('row-media-' + size);\r\n }\r\n\r\n this.container.append(media);\r\n\r\n return media;\r\n }\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string,\r\n alignRight?: boolean\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n\r\n if(options.alignRight) {\r\n label.classList.add('radio-field-right');\r\n }\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey,\r\n langPackArguments: FormatterArguments\r\n}>) {\r\n toast(i18n(options.langPackKey, options.langPackArguments));\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(options: UsernameInputField['options']) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!RichTextProcessor.isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = apiManager.invokeApi('channels.checkUsername', {\r\n channel: appChatsManager.getChannelInput(this.options.peerId.toChatId()),\r\n username\r\n });\r\n } else {\r\n this.checkUsernamePromise = apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n this.checkUsernamePromise.then(available => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && RichTextProcessor.isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string | DocumentFragment,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach(o => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach(button => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach(o => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n appProfileManager.getChatInviteLink(this.chatId, true).then(link => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n });\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n appChatsManager.migrateChat(this.chatId).then(channelId => {\r\n return appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Scrollable from \"../components/scrollable\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then(done => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager, { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport PeerTitle from \"./peerTitle\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport appPeersManager, { IsPeerType } from \"../lib/appManagers/appPeersManager\";\nimport { generateDelimiter, SettingSection } from \"./sidebarLeft\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterUnique from \"../helpers/array/filterUnique\";\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport findAndSplice from \"../helpers/array/findAndSplice\";\nimport AvatarElement from \"./avatar\";\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n \n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n \n constructor(options: {\n appendTo: AppSelectPeers['appendTo'], \n onChange?: AppSelectPeers['onChange'], \n peerType?: AppSelectPeers['peerType'], \n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void, \n renderResultsFunc?: AppSelectPeers['renderResultsFunc'], \n chatRightsAction?: AppSelectPeers['chatRightsAction'], \n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = (peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter(peerId => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = peerIds.filter(peerId => {\n if(peerId.isPeerId()) {\n const peer = appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId));\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n //target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private renderSaved() {\n if(!this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || appUsersManager.testSelfSearch(this.query))) {\n this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true).promise;\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = dialogs[dialogs.length - 1].index || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = dialogs.filter(d => this.filterByRights(d.peerId));\n }\n\n this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map(dialog => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private filterByRights(peerId: PeerId) {\n return (\n peerId.isUser() && \n (this.chatRightsAction !== 'send_messages' || appUsersManager.canSendToUser(peerId))\n ) || appChatsManager.hasRights(peerId.toChatId(), this.chatRightsAction);\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = resultPeerIds.filter(peerId => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter(peerId => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map(participant => {\n return appChatsManager.getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = peerIds.filter(peerId => {\n return appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(peerId => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.scrollable,\n drawStatus: false,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = appProfileManager.getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = appUsersManager.getUserStatusString(peerId);\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center'\n });\n }\n \n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n //const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach(value => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center', \n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n dialog: this.userId.toPeerId(false),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(this.userId));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n });\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }) {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? appChatsManager.combineParticipantBannedRights(options.chatId, options.participant.banned_rights) : defaultBannedRights;\n \n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: appChatsManager.hasRights(options.chatId, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n if((\n options.participant && \n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n (chat as Chat.channel).username &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n \n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter(i => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach(info => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach(flag => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n });\n\n this.eventListener.addEventListener('destroy', () => {\n appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = new AppUserPermissionsTab(this.slider);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, 'LI');\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = (li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = (appChatsManager.getChat(this.chatId) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach(info => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map(t => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: appPeersManager.getPeerId(participant.peer),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n if(needAdd) {\n if(!li) {\n add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n } else {\n setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n }\n\n if(update.prev_participant?._ !== 'channelParticipantBanned') {\n ++exceptionsCount;\n }\n } else {\n if(li) {\n li.remove();\n }\n\n if(update.prev_participant?._ === 'channelParticipantBanned') {\n --exceptionsCount;\n }\n }\n\n setLength();\n });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then(res => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appPeersManager, { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n peerId: PeerId, \n // actionType: 'leave' | 'delete', \n peerType: PeerType = appPeersManager.getDialogType(peerId), \n onSelect?: (promise: Promise) => void\n ) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n appChatsManager.deleteChannel\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport debounce from \"../../../helpers/schedulers/debounce\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\nimport CheckboxField from \"../../checkboxField\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await appReactionsManager.getActiveAvailableReactions();\n const chatFull = await appProfileManager.getChatFull(this.chatId);\n let originalReactions = chatFull.available_reactions ?? [];\n const enabledReactions = new Set(originalReactions);\n\n const toggleSection = new SettingSection({\n caption: appChatsManager.isBroadcast(this.chatId) ? 'EnableReactionsChannelInfo' : 'EnableReactionsGroupInfo'\n });\n\n const toggleCheckboxField = new CheckboxField({toggle: true, checked: !!enabledReactions.size});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions'\n });\n\n toggleSection.content.append(toggleRow.container);\n\n const reactionsSection = new SettingSection({\n name: 'AvailableReactions'\n });\n\n const checkboxFields = availableReactions.map(availableReaction => {\n const checkboxField = new CheckboxField({\n toggle: true, \n checked: enabledReactions.has(availableReaction.reaction)\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n enabledReactions.add(availableReaction.reaction);\n\n if(!toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(true);\n }\n } else {\n enabledReactions.delete(availableReaction.reaction);\n\n if(!enabledReactions.size && toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(false);\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n this.listenerSetter.add(toggleRow.checkboxField.input)('change', () => {\n if(!toggleCheckboxField.checked) {\n checkboxFields.forEach(checkboxField => checkboxField.checked = false);\n saveReactionsDebounced();\n } else if(checkboxFields.every(checkboxField => !checkboxField.checked)) {\n checkboxFields.forEach(checkboxField => checkboxField.checked = true);\n saveReactionsDebounced();\n }\n });\n\n const saveReactions = () => {\n const newReactions = Array.from(enabledReactions);\n if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n return;\n }\n\n const chatFull = appProfileManager.getCachedFullChat(this.chatId);\n if(chatFull) {\n chatFull.available_reactions = newReactions;\n }\n \n appChatsManager.setChatAvailableReactions(this.chatId, newReactions);\n originalReactions = newReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', saveReactions, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\r\nimport AppChatReactionsTab from \"./chatReactions\";\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n private tempId: number;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n this.tempId ??= 0;\r\n const tempId = ++this.tempId;\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n let chatFull = await appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(this.chatId);\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach(callback => callback());\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_full_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatFull = appProfileManager.getCachedFullChat(chatId) || chatFull;\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n const canChangeType = appChatsManager.hasRights(this.chatId, 'change_type');\r\n const canChangePermissions = appChatsManager.hasRights(this.chatId, 'change_permissions');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n \r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n \r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n \r\n if(canChangeType) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = new AppChatTypeTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(canChangeType || canChangePermissions) {\r\n const reactionsRow = new Row({\r\n titleLangKey: 'Reactions',\r\n icon: 'reactions',\r\n clickable: () => {\r\n const tab = new AppChatReactionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open().then(() => {\r\n if(this.tempId !== tempId) {\r\n return;\r\n }\r\n \r\n this.listenerSetter.add(tab.eventListener)('destroy', setReactionsLength);\r\n });\r\n }\r\n });\r\n\r\n const availableReactions = await appReactionsManager.getAvailableReactions();\r\n const availableReactionsLength = availableReactions.filter(availableReaction => !availableReaction.pFlags.inactive).length;\r\n const setReactionsLength = () => {\r\n const reactions = chatFull.available_reactions ?? [];\r\n reactionsRow.subtitle.innerHTML = reactions.length + '/' + availableReactionsLength;\r\n };\r\n\r\n setReactionsLength();\r\n\r\n section.content.append(reactionsRow.container);\r\n }\r\n\r\n if(canChangePermissions && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = new AppGroupPermissionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = () => {\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +appChatsManager.hasRights(this.chatId, f, chat.default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && canChangeType) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !appUsersManager.isContact(this.peerId.toUserId());\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n appMessagesManager.togglePeerMute(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', (update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = appPeersManager.getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !appNotificationsManager.isMuted(update.notify_settings);\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !appNotificationsManager.isPeerLocalMuted(this.peerId, false);\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n appUsersManager.addContact(this.peerId, this.nameInputField.value, this.lastNameInputField.value, appUsersManager.getUser(this.peerId).phone)\r\n .finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map(sel => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","import { _i18n } from \"../lib/langPack\";\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}","import { Chat, User } from \"../layer\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport generateFakeIcon from \"./generateFakeIcon\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\n\nexport default function generateTitleIcons(peerId: PeerId) {\n const elements: Element[] = [];\n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n elements.push(generateVerifiedIcon());\n }\n\n if((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\nrootScope.addEventListener('context_menu_toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = (_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !this.verifyTouchTarget(_e)) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport findAndSplice from \"../helpers/array/findAndSplice\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\nimport appMessagesManager, { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { openAvatarViewer } from \"./avatar\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(public scrollable: Scrollable) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) \n || (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n \n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, lastIndex = 0, minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars, \n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n //console.log(xDiff, yDiff);\n return false;\n }, \n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n }, \n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n \n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n \n //console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then(value => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(Promise.resolve(appProfileManager.getChatFull(peerId.toChatId())));\n }\n \n promises.push(appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then((result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, m => {\n return ((m as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = (photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container');\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = () => {\n if(photo) {\n const res = wrapPhoto({\n container: avatar,\n photo,\n size: appPhotosManager.choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach(img => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n appAvatarsManager.putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.avatars.append(avatar);\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach(target => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport callbackify from \"../helpers/callbackify\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Chat, ChatFull, User } from \"../layer\";\nimport appChatsManager, { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport I18n from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateTitleIcons from \"./generateTitleIcons\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport PeerTitle from \"./peerTitle\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\n\nlet setText = (text: Parameters[1], row: Row) => {\n //fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n \n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(\n public scrollable: Scrollable, \n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.isDialog = this.isDialog;\n this.avatar.attachClickEvent();\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n Promise.resolve(appProfileManager.getProfileByPeerId(this.peerId)).then(full => {\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n });\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n const peer: Channel | User.user = appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: () => {\n const peer: User = appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n copyTextToClipboard(this.link.title.textContent);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then(chatFull => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n toast(I18n.format('LinkCopied', true));\n // });\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n \n //let checked = this.notificationsCheckbox.checked;\n appMessagesManager.togglePeerMute(this.peerId);\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('peer_title_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.fillUsername();\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n // const photo = appPeersManager.getPeerPhoto(peerId);\n // if(!photo && this.avatars) {\n this.setAvatar();\n // }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n public setPeerStatus = (needClear = false) => {\n const peerId = this.peerId;\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n if(!peerId || (rootScope.myId === peerId && this.isDialog)) return;\n\n appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, true, () => peerId === this.peerId, !this.isDialog);\n };\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach(row => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n public setAvatar() {\n if(this.canBeDetailed()) {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable);\n this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar.updateWithOptions({peerId: this.peerId});\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n private fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const username = appPeersManager.getPeerUsername(peerId);\n setText(username, this.username);\n }\n }\n\n private fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const user = appUsersManager.getUser(peerId);\n setText(user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined, this.phone);\n }\n }\n\n private fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n notificationsRow.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n });\n }\n }\n\n private fillRows() {\n const peerId = this.peerId;\n\n this.fillUsername();\n this.fillUserPhone();\n this.fillNotifications();\n this.setMoreDetails();\n\n replaceContent(this.name, new PeerTitle({\n peerId,\n dialog: this.isDialog,\n }).element);\n\n this.name.append(...generateTitleIcons(peerId));\n\n this.setPeerStatus(true);\n }\n\n public fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n this.cleanupHTML();\n this.setAvatar();\n this.fillRows();\n }\n\n public setMoreDetails(override?: true) {\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId || appPeersManager.isRestricted(peerId) || !this.canBeDetailed()) {\n return;\n }\n\n callbackify(appProfileManager.getProfileByPeerId(peerId, override), (peerFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId || appPeersManager.isRestricted(peerId)) {\n //this.log.warn('peer changed');\n return;\n }\n \n //this.log('chatInfo res 2:', chatFull);\n \n // if(peerFull.about) {\n setText(peerFull.about ? RichTextProcessor.wrapRichText(peerFull.about) : undefined, this.bio);\n // }\n\n if(!peerId.isUser()) {\n const chat: Chat.channel = appChatsManager.getChat(peerId.toChatId());\n if(chat.username) {\n setText('https://t.me/' + chat.username, this.link);\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite) {\n setText(exportedInvite.link, this.link);\n }\n }\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n setText(location.address, this.location);\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n });\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n } = {};\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = new AppEditChatTab(this.slider);\n } else {\n tab = new AppEditContactTab(this.slider);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n rootScope.addEventListener('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n rootScope.addEventListener('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n }\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', () => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map(peerId => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = new AppAddMembersTab(this.slider);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const filtered = this.searchSuper.filterMessagesByType(mids.map(mid => appMessagesManager.getMessageByPeer(peerId, mid)), inputFilter);\n if(filtered.length) {\n const history = this.historiesStorage[peerId][inputFilter];\n if(history) {\n history.unshift(...filtered.map(message => ({mid: message.mid, peerId: message.peerId})));\n }\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = this.historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex(m => m.mid === mid);\n if(idx !== -1) {\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n \n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n this.searchSuper.usedFromHistory[inputFilter]--;\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n \n this.editBtn.classList.add('hide');\n\n this.searchSuper.cleanupHTML(true);\n\n this.container.classList.toggle('can-add-members', this.searchSuper.canViewMembers() && appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {})\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n\n this.cleanupHTML();\n\n this.profile.fillProfileElements();\n\n this.toggleEditBtn();\n }\n\n private toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad = false) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppSharedMediaTab = AppSharedMediaTab);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n public sharedMediaTab: AppSharedMediaTab;\r\n private isColumnProportionSet = false;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n\r\n this.sharedMediaTab = new AppSharedMediaTab(this);\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n /* public selectTab(id: number) {\r\n const res = super.selectTab(id);\r\n\r\n if(id !== -1) {\r\n this.toggleSidebar(true);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));\r\n\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n //this.selectTab(this.sharedMediaTab);\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport appPollsManager from \"../../../lib/appManagers/appPollsManager\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport ripple from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public open(message: any) {\r\n const ret = super.open();\r\n const poll = appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n setInnerHTML(title, RichTextProcessor.wrapEmojiText(poll.poll.question));\r\n\r\n const percents = poll.results.results.map(v => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n setInnerHTML(answerTitle, RichTextProcessor.wrapEmojiText(answer.text));\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n appPollsManager.getVotes(message, answer.option, offset, limit).then(votesList => {\r\n votesList.votes.forEach(vote => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: vote.user_id.toPeerId(false),\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then(votes => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"./avatar\";\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueueIntersector;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: LazyLoadQueueIntersector,\n avatarSize: number\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n \n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach(el => el.remove());\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport appPollsManager from \"../lib/appManagers/appPollsManager\";\r\nimport serverTimeManager from \"../lib/mtproto/serverTimeManager\";\r\nimport { RichTextProcessor } from \"../lib/richtextprocessor\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport ripple from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Poll, PollResults } from \"../layer\";\r\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\r\nimport StackedAvatars from \"./stackedAvatars\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nrootScope.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n setInnerHTML(textEl, RichTextProcessor.wrapRichText(solution, {entities: solution_entities}));\r\n appImManager.chat.bubbles.bubblesContainer.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: any;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n constructor() {\r\n super();\r\n // элемент создан\r\n }\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n const pollId = this.message.media.poll.id;\r\n const {poll, results} = appPollsManager.getPoll(pollId);\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n \r\n setInnerHTML(this.firstElementChild, RichTextProcessor.wrapEmojiText(poll.question));\r\n\r\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\r\n setInnerHTML(el, RichTextProcessor.wrapEmojiText(poll.answers[idx].text));\r\n });\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - serverTimeManager.serverTimeOffset) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n new AppPollResultsTab(appSidebarRight).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter(el => el.classList.contains('is-chosing')).map(el => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach(el => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find(r => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach(target => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach(target => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map(v => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n const peerIds = (results.recent_voters || []).map(userId => userId.toPeerId());\r\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\r\n stackedAvatars.render(peerIds);\r\n replaceContent(this.avatarsDiv, stackedAvatars.container);\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach(svg => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map(p => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map(p => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach(svg => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\r\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat/chat';\r\nimport { getEmojiToneIndex } from '../vendor/emoji';\r\nimport deferredPromise from '../helpers/cancellablePromise';\r\nimport { formatFullSentTime } from '../helpers/date';\r\nimport mediaSizes, { MediaSizeType, ScreenSize } from '../helpers/mediaSizes';\r\nimport { IS_SAFARI } from '../environment/userAgent';\r\nimport { Message, MessageMedia, PhotoSize, StickerSet, WebPage } from '../layer';\r\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport appMessagesManager from '../lib/appManagers/appMessagesManager';\r\nimport appPhotosManager, { MyPhoto } from '../lib/appManagers/appPhotosManager';\r\nimport LottieLoader from '../lib/rlottie/lottieLoader';\r\nimport webpWorkerController from '../lib/webp/webpWorkerController';\r\nimport animationIntersector from './animationIntersector';\r\nimport appMediaPlaybackController, { MediaSearchContext } from './appMediaPlaybackController';\r\nimport AudioElement, { findMediaTargets } from './audio';\r\nimport ReplyContainer from './chat/replyContainer';\r\nimport { Layouter, RectPart } from './groupedLayout';\r\nimport LazyLoadQueue from './lazyLoadQueue';\r\nimport PollElement from './poll';\r\nimport ProgressivePreloader from './preloader';\r\nimport './middleEllipsis';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { onMediaLoad } from '../helpers/files';\r\nimport { animateSingle } from '../helpers/animation';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport { fastRaf } from '../helpers/schedulers';\r\nimport appDownloadManager, { DownloadBlob, ThumbCache } from '../lib/appManagers/appDownloadManager';\r\nimport appStickersManager from '../lib/appManagers/appStickersManager';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent, simulateClickEvent } from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport { clearBadCharsAndTrim } from '../helpers/cleanSearchText';\r\nimport blur from '../helpers/blur';\r\nimport IS_WEBP_SUPPORTED from '../environment/webpSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\r\nimport { MiddleEllipsisElement } from './middleEllipsis';\r\nimport { joinElementsWith } from '../lib/langPack';\r\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\r\nimport { NULL_PEER_ID } from '../lib/mtproto/mtproto_config';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\r\nimport assumeType from '../helpers/assumeType';\r\nimport appMessagesIdsManager from '../lib/appManagers/appMessagesIdsManager';\r\nimport throttle from '../helpers/schedulers/throttle';\r\nimport { SendMessageEmojiInteractionData } from '../types';\r\nimport IS_VIBRATE_SUPPORTED from '../environment/vibrateSupport';\r\nimport Row from './row';\r\nimport { ChatAutoDownloadSettings } from '../helpers/autoDownload';\r\nimport formatBytes from '../helpers/formatBytes';\r\nimport toHHMMSS from '../helpers/string/toHHMMSS';\r\nimport createVideo from '../helpers/dom/createVideo';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\n\r\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\r\n\r\nlet roundVideoCircumference = 0;\r\nmediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\r\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\r\n const width = mediaSizes.active.round.width;\r\n const halfSize = width / 2;\r\n const radius = halfSize - 7;\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n elements.forEach(element => {\r\n element.setAttributeNS(null, 'width', '' + width);\r\n element.setAttributeNS(null, 'height', '' + width);\r\n\r\n const circle = element.firstElementChild as SVGCircleElement;\r\n circle.setAttributeNS(null, 'cx', '' + halfSize);\r\n circle.setAttributeNS(null, 'cy', '' + halfSize);\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n });\r\n }\r\n});\r\n\r\nexport function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, size, searchContext, autoDownload}: {\r\n doc: MyDocument, \r\n container?: HTMLElement, \r\n message?: Message.message, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n noInfo?: true,\r\n noPlayButton?: boolean,\r\n group?: string,\r\n onlyPreview?: boolean,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n autoDownload?: ChatAutoDownloadSettings,\r\n size?: PhotoSize,\r\n searchContext?: MediaSearchContext,\r\n}) {\r\n const autoDownloadSize = autoDownload?.video;\r\n let noAutoDownload = autoDownloadSize === 0;\r\n const isAlbumItem = !(boxWidth && boxHeight);\r\n const canAutoplay = /* doc.sticker || */(\r\n (\r\n doc.type !== 'video' || (\r\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && \r\n !isAlbumItem\r\n )\r\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\r\n );\r\n let spanTime: HTMLElement, spanPlay: HTMLElement;\r\n\r\n if(!noInfo) {\r\n spanTime = document.createElement('span');\r\n spanTime.classList.add('video-time');\r\n container.append(spanTime);\r\n \r\n let needPlayButton = false;\r\n if(doc.type !== 'gif') {\r\n spanTime.innerText = toHHMMSS(doc.duration, false);\r\n\r\n if(!noPlayButton && doc.type !== 'round') {\r\n if(canAutoplay && !noAutoDownload) {\r\n spanTime.classList.add('tgico', 'can-autoplay');\r\n } else {\r\n needPlayButton = true;\r\n }\r\n }\r\n } else {\r\n spanTime.innerText = 'GIF';\r\n\r\n if(!canAutoplay && !noPlayButton) {\r\n needPlayButton = true;\r\n noAutoDownload = undefined;\r\n }\r\n }\r\n\r\n if(needPlayButton) {\r\n spanPlay = document.createElement('span');\r\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\r\n container.append(spanPlay);\r\n }\r\n }\r\n\r\n let res: {\r\n thumb?: typeof photoRes,\r\n loadPromise: Promise\r\n } = {} as any;\r\n\r\n if(doc.mime_type === 'image/gif') {\r\n const photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader,\r\n loadPromises,\r\n autoDownloadSize,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\r\n if(video.parentElement) {\r\n video.remove();\r\n } */\r\n\r\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\r\n\r\n const video = createVideo();\r\n video.classList.add('media-video');\r\n video.muted = true;\r\n if(doc.type === 'round') {\r\n const divRound = document.createElement('div');\r\n divRound.classList.add('media-round', 'z-depth-1');\r\n divRound.dataset.mid = '' + message.mid;\r\n divRound.dataset.peerId = '' + message.peerId;\r\n (divRound as any).message = message;\r\n\r\n const size = mediaSizes.active.round;\r\n const halfSize = size.width / 2;\r\n const strokeWidth = 3.5;\r\n const radius = halfSize - (strokeWidth * 2);\r\n divRound.innerHTML = `\r\n \r\n `;\r\n\r\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\r\n if(!roundVideoCircumference) {\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n }\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n \r\n spanTime.classList.add('tgico');\r\n\r\n const isUnread = message.pFlags.media_unread;\r\n if(isUnread) {\r\n divRound.classList.add('is-unread');\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\r\n\r\n divRound.prepend(canvas, spanTime);\r\n divRound.append(video);\r\n container.append(divRound);\r\n\r\n const ctx = canvas.getContext('2d');\r\n /* ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\r\n ctx.clip(); */\r\n\r\n const onLoad = () => {\r\n const message: Message.message = (divRound as any).message;\r\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\r\n const clear = () => {\r\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\r\n if(isInDOM(globalVideo)) {\r\n return;\r\n }\r\n \r\n globalVideo.removeEventListener('play', onPlay);\r\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.removeEventListener('pause', onPaused);\r\n globalVideo.removeEventListener('ended', onEnded);\r\n });\r\n };\r\n \r\n const onFrame = () => {\r\n ctx.drawImage(globalVideo, 0, 0);\r\n \r\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + offset;\r\n \r\n return !globalVideo.paused;\r\n };\r\n\r\n const onTimeUpdate = () => {\r\n if(!globalVideo.duration) {\r\n return;\r\n }\r\n \r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n\r\n if(globalVideo.paused) {\r\n onFrame();\r\n }\r\n \r\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n \r\n const onPlay = () => {\r\n video.classList.add('hide');\r\n divRound.classList.remove('is-paused');\r\n animateSingle(onFrame, canvas);\r\n \r\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\r\n preloader.onClick();\r\n }\r\n };\r\n \r\n const onPaused = () => {\r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n \r\n divRound.classList.add('is-paused');\r\n };\r\n \r\n const onEnded = () => {\r\n video.classList.remove('hide');\r\n divRound.classList.add('is-paused');\r\n \r\n video.currentTime = 0;\r\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\r\n \r\n if(globalVideo.currentTime) {\r\n globalVideo.currentTime = 0;\r\n }\r\n };\r\n \r\n globalVideo.addEventListener('play', onPlay);\r\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.addEventListener('pause', onPaused);\r\n globalVideo.addEventListener('ended', onEnded);\r\n \r\n attachClickEvent(canvas, (e) => {\r\n cancelEvent(e);\r\n \r\n // ! костыль\r\n if(preloader && !preloader.detached) {\r\n preloader.onClick();\r\n }\r\n \r\n // ! can't use it here. on Safari iOS video won't start.\r\n /* if(globalVideo.readyState < 2) {\r\n return;\r\n } */\r\n \r\n if(globalVideo.paused) {\r\n const hadSearchContext = !!searchContext;\r\n if(appMediaPlaybackController.setSearchContext(searchContext || {\r\n peerId: NULL_PEER_ID, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n useSearch: false\r\n })) {\r\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\r\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\r\n }\r\n \r\n globalVideo.play();\r\n } else {\r\n globalVideo.pause();\r\n }\r\n });\r\n \r\n if(globalVideo.paused) {\r\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\r\n onFrame();\r\n onTimeUpdate();\r\n video.classList.add('hide');\r\n } else {\r\n onPaused();\r\n }\r\n } else {\r\n onPlay();\r\n }\r\n };\r\n\r\n if(message.pFlags.is_outgoing) {\r\n (divRound as any).onLoad = onLoad;\r\n divRound.dataset.isOutgoing = '1';\r\n } else {\r\n onLoad();\r\n }\r\n } else {\r\n video.autoplay = true; // для safari\r\n }\r\n\r\n let photoRes: ReturnType;\r\n if(message) {\r\n photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n autoDownloadSize: autoDownload?.photo,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n\r\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n if(withTail) {\r\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\r\n video.width = +foreignObject.getAttributeNS(null, 'width');\r\n video.height = +foreignObject.getAttributeNS(null, 'height');\r\n foreignObject.append(video);\r\n }\r\n } else { // * gifs masonry\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n if(gotThumb) {\r\n gotThumb.promise.then(() => {\r\n video.poster = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n if(!video.parentElement && container) {\r\n (photoRes?.aspecter || container).append(video);\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const isUpload = !!(message?.media as any)?.preloader;\r\n if(isUpload) { // means upload\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n preloader.attach(container, false);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n } else if(doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n cancelable: false,\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const renderDeferred = deferredPromise();\r\n video.addEventListener('error', (e) => {\r\n if(video.error.code !== 4) {\r\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\r\n }\r\n \r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n if(!renderDeferred.isFulfilled) {\r\n renderDeferred.resolve();\r\n }\r\n }, {once: true});\r\n\r\n onMediaLoad(video).then(() => {\r\n if(group) {\r\n animationIntersector.addAnimation(video, group);\r\n }\r\n\r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n renderDeferred.resolve();\r\n });\r\n\r\n if(doc.type === 'video') {\r\n const onTimeUpdate = () => {\r\n if(!video.videoWidth) {\r\n return;\r\n }\r\n \r\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n\r\n video.addEventListener('timeupdate', throttledTimeUpdate);\r\n\r\n if(spanPlay) {\r\n video.addEventListener('timeupdate', () => {\r\n sequentialDom.mutateElement(spanPlay, () => {\r\n spanPlay.remove();\r\n });\r\n }, {once: true});\r\n }\r\n }\r\n\r\n video.muted = true;\r\n video.loop = true;\r\n //video.play();\r\n video.autoplay = true;\r\n\r\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\r\n const load = () => {\r\n if(preloader && noAutoDownload && !withoutPreloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n let loadPromise: Promise = Promise.resolve();\r\n if((preloader && !isUpload) || withoutPreloader) {\r\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n const promise = loadPromise = appDocsManager.downloadDoc(doc, lazyLoadQueue?.queueId, noAutoDownload);\r\n if(preloader) {\r\n preloader.attach(container, false, promise);\r\n }\r\n } else if(doc.supportsStreaming) {\r\n if(noAutoDownload) {\r\n loadPromise = Promise.reject();\r\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\r\n preloader.attach(container, false, null);\r\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\r\n preloader.detach();\r\n }, {once: true});\r\n }\r\n }\r\n }\r\n\r\n if(!noAutoDownload && loadPhotoThumbFunc) {\r\n loadPhotoThumbFunc();\r\n loadPhotoThumbFunc = null;\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n loadPromise.then(() => {\r\n if(middleware && !middleware()) {\r\n renderDeferred.resolve();\r\n return;\r\n }\r\n\r\n if(doc.type === 'round') {\r\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\r\n }\r\n\r\n renderImageFromUrl(video, cacheContext.url);\r\n }, () => {});\r\n\r\n return {download: loadPromise, render: renderDeferred};\r\n };\r\n\r\n if(preloader && !isUpload) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n\r\n /* if(doc.size >= 20e6 && !doc.downloaded) {\r\n let downloadDiv = document.createElement('div');\r\n downloadDiv.classList.add('download');\r\n\r\n let span = document.createElement('span');\r\n span.classList.add('btn-circle', 'tgico-download');\r\n downloadDiv.append(span);\r\n\r\n downloadDiv.addEventListener('click', () => {\r\n downloadDiv.remove();\r\n loadVideo();\r\n });\r\n\r\n container.prepend(downloadDiv);\r\n\r\n return;\r\n } */\r\n\r\n if(doc.type === 'gif' && !canAutoplay) {\r\n attachClickEvent(container, (e) => {\r\n cancelEvent(e);\r\n spanPlay.remove();\r\n load();\r\n }, {capture: true, once: true});\r\n } else {\r\n res.loadPromise = !lazyLoadQueue ? load().render : (lazyLoadQueue.push({div: container, load: () => load().render}), Promise.resolve());\r\n }\r\n\r\n return res;\r\n}\r\n\r\nrootScope.addEventListener('download_start', (docId) => {\r\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n if(element.querySelector('.preloader-container.manual')) {\r\n simulateClickEvent(element);\r\n }\r\n });\r\n});\r\n\r\nexport function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType}: {\r\n message: Message.message, \r\n withTime?: boolean,\r\n fontWeight?: number,\r\n voiceAsMusic?: boolean,\r\n showSender?: boolean,\r\n searchContext?: MediaSearchContext,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n sizeType?: MediaSizeType\r\n}): HTMLElement {\r\n if(!fontWeight) fontWeight = 500;\r\n if(!sizeType) sizeType = '' as any;\r\n const noAutoDownload = autoDownloadSize === 0;\r\n\r\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\r\n const uploading = message.pFlags.is_outgoing && (message.media as any)?.preloader;\r\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\r\n const audioElement = new AudioElement();\r\n audioElement.withTime = withTime;\r\n audioElement.message = message;\r\n audioElement.noAutoDownload = noAutoDownload;\r\n audioElement.lazyLoadQueue = lazyLoadQueue;\r\n audioElement.loadPromises = loadPromises;\r\n \r\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\r\n if(searchContext) audioElement.searchContext = searchContext;\r\n if(showSender) audioElement.showSender = showSender;\r\n if(uploading) audioElement.preloader = (message.media as any).preloader;\r\n\r\n audioElement.dataset.fontWeight = '' + fontWeight;\r\n audioElement.dataset.sizeType = sizeType;\r\n audioElement.render();\r\n return audioElement;\r\n }\r\n\r\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\r\n let ext = '';\r\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \r\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \r\n 'file';\r\n\r\n let docDiv = document.createElement('div');\r\n docDiv.classList.add('document', `ext-${ext}`);\r\n docDiv.dataset.docId = '' + doc.id;\r\n\r\n const icoDiv = document.createElement('div');\r\n icoDiv.classList.add('document-ico');\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\r\n docDiv.classList.add('document-with-thumb');\r\n\r\n let imgs: (HTMLImageElement | HTMLCanvasElement)[] = [];\r\n // ! WARNING, use thumbs for check when thumb will be generated for media\r\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type)) {\r\n icoDiv.innerHTML = ``;\r\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\r\n } else {\r\n const wrapped = wrapPhoto({\r\n photo: doc, \r\n message: null, \r\n container: icoDiv, \r\n boxWidth: 54, \r\n boxHeight: 54,\r\n loadPromises,\r\n withoutPreloader: true,\r\n lazyLoadQueue,\r\n size: appPhotosManager.choosePhotoSize(doc, 54, 54, true)\r\n });\r\n icoDiv.style.width = icoDiv.style.height = '';\r\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\r\n if(wrapped.images.full) imgs.push(wrapped.images.full);\r\n }\r\n\r\n imgs.forEach(img => img.classList.add('document-thumb'));\r\n } else {\r\n icoDiv.innerText = ext;\r\n }\r\n\r\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\r\n let fileName = doc.file_name ? RichTextProcessor.wrapPlainText(doc.file_name) : 'Unknown.file';\r\n const descriptionEl = document.createElement('div');\r\n descriptionEl.classList.add('document-description');\r\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\r\n \r\n if(withTime) {\r\n descriptionParts.push(formatFullSentTime(message.date));\r\n }\r\n\r\n if(showSender) {\r\n descriptionParts.push(appMessagesManager.wrapSenderToPeer(message));\r\n }\r\n\r\n docDiv.innerHTML = `\r\n ${(cacheContext.downloaded && !uploading) || !message.mid ? '' : `
`}\r\n
\r\n
\r\n `;\r\n\r\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\r\n const middleEllipsisEl = new MiddleEllipsisElement();\r\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\r\n middleEllipsisEl.dataset.sizeType = sizeType;\r\n middleEllipsisEl.textContent = fileName;\r\n // setInnerHTML(middleEllipsisEl, fileName);\r\n\r\n nameDiv.append(middleEllipsisEl);\r\n\r\n if(showSender) {\r\n nameDiv.append(appMessagesManager.wrapSentTime(message));\r\n }\r\n\r\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\r\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\r\n\r\n docDiv.prepend(icoDiv);\r\n\r\n if(!uploading && message.pFlags.is_outgoing && !message.mid) {\r\n return docDiv;\r\n }\r\n\r\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\r\n const onLoad = () => {\r\n if(downloadDiv) {\r\n downloadDiv.classList.add('downloaded');\r\n const _downloadDiv = downloadDiv;\r\n setTimeout(() => {\r\n _downloadDiv.remove();\r\n }, 200);\r\n downloadDiv = null;\r\n }\r\n\r\n if(preloader) {\r\n preloader = null;\r\n }\r\n };\r\n\r\n const load = (e?: Event) => {\r\n const save = !e || e.isTrusted;\r\n const doc = appDocsManager.getDoc(docDiv.dataset.docId);\r\n let download: DownloadBlob;\r\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\r\n if(!save) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else if(doc.type === 'pdf') {\r\n const canOpenAfter = appDocsManager.downloading.has(doc.id) || cacheContext.downloaded;\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n if(canOpenAfter) {\r\n download.then(() => {\r\n setTimeout(() => { // wait for preloader animation end\r\n const url = appDownloadManager.getCacheContext(doc).url;\r\n window.open(url);\r\n }, rootScope.settings.animationsEnabled ? 250 : 0);\r\n });\r\n }\r\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else {\r\n download = appDocsManager.saveDocFile(doc, queueId);\r\n }\r\n\r\n if(downloadDiv) {\r\n download.then(onLoad);\r\n preloader.attach(downloadDiv, true, download);\r\n }\r\n\r\n return {download};\r\n };\r\n\r\n if(appDocsManager.downloading.has(doc.id)) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = new ProgressivePreloader();\r\n preloader.attach(downloadDiv, false, appDocsManager.downloading.get(doc.id));\r\n } else if(!cacheContext.downloaded || uploading) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n\r\n if(!preloader) {\r\n preloader = new ProgressivePreloader();\r\n\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(downloadDiv);\r\n preloader.setDownloadFunction(load);\r\n\r\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\r\n simulateClickEvent(preloader.preloader);\r\n }\r\n } else {\r\n preloader.attach(downloadDiv);\r\n (message.media as any).promise.then(onLoad);\r\n }\r\n }\r\n\r\n attachClickEvent(docDiv, (e) => {\r\n if(preloader) {\r\n preloader.onClick(e);\r\n } else {\r\n load(e);\r\n }\r\n });\r\n\r\n return docDiv;\r\n}\r\n\r\n/* function wrapMediaWithTail(photo: MyPhoto | MyDocument, message: {mid: number, message: string}, container: HTMLElement, boxWidth: number, boxHeight: number, isOut: boolean) {\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');\r\n \r\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", 'foreignObject');\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, true);\r\n if(gotThumb) {\r\n foreignObject.append(gotThumb.image);\r\n }\r\n appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight);\r\n \r\n const width = +foreignObject.getAttributeNS(null, 'width');\r\n const height = +foreignObject.getAttributeNS(null, 'height');\r\n\r\n svg.setAttributeNS(null, 'width', '' + width);\r\n svg.setAttributeNS(null, 'height', '' + height);\r\n\r\n svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\r\n svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n\r\n const clipId = 'clip' + message.mid + '_' + nextRandomInt(9999);\r\n svg.dataset.clipId = clipId;\r\n \r\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", 'defs');\r\n let clipPathHTML: string = '';\r\n \r\n if(message.message) {\r\n //clipPathHTML += ``;\r\n } else {\r\n if(isOut) {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n } else {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n }\r\n }\r\n\r\n defs.innerHTML = `${clipPathHTML}`;\r\n \r\n container.style.width = parseInt(container.style.width) - 9 + 'px';\r\n container.classList.add('with-tail');\r\n\r\n svg.append(defs, foreignObject);\r\n container.append(svg);\r\n\r\n let img = foreignObject.firstElementChild as HTMLImageElement;\r\n if(!img) {\r\n foreignObject.append(img = new Image());\r\n }\r\n\r\n return img;\r\n} */\r\n\r\nexport function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter}: {\r\n photo: MyPhoto | MyDocument, \r\n message?: any, \r\n container: HTMLElement, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n middleware?: () => boolean, \r\n size?: PhotoSize,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n noBlur?: boolean,\r\n noThumb?: boolean,\r\n noFadeIn?: boolean,\r\n blurAfter?: boolean,\r\n}) {\r\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\r\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\r\n appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: Promise.resolve(),\r\n full: Promise.resolve()\r\n },\r\n images: {\r\n thumb: null,\r\n full: null\r\n },\r\n preloader: null,\r\n aspecter: null\r\n };\r\n }\r\n\r\n let noAutoDownload = autoDownloadSize === 0;\r\n\r\n if(!size) {\r\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\r\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\r\n }\r\n\r\n container.classList.add('media-container');\r\n let aspecter = container;\r\n\r\n let isFit = true;\r\n let loadThumbPromise: Promise = Promise.resolve();\r\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\r\n let image: HTMLImageElement;\r\n let cacheContext: ThumbCache;\r\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\r\n // if(withTail) {\r\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\r\n // } else {\r\n image = new Image();\r\n\r\n if(boxWidth && boxHeight && !size) { // !album\r\n const set = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\r\n _: 'photoSize',\r\n w: photo.w,\r\n h: photo.h,\r\n size: photo.size,\r\n type: 'full'\r\n } : undefined);\r\n size = set.photoSize;\r\n isFit = set.isFit;\r\n cacheContext = appDownloadManager.getCacheContext(photo, size.type);\r\n\r\n if(!isFit) {\r\n aspecter = document.createElement('div');\r\n aspecter.classList.add('media-container-aspecter');\r\n aspecter.style.width = set.size.width + 'px';\r\n aspecter.style.height = set.size.height + 'px';\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\r\n if(gotThumb) {\r\n loadThumbPromise = gotThumb.loadPromise;\r\n const thumbImage = gotThumb.image; // local scope\r\n thumbImage.classList.add('media-photo');\r\n container.append(thumbImage);\r\n } else {\r\n const res = wrapPhoto({\r\n container,\r\n message,\r\n photo,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n size,\r\n lazyLoadQueue,\r\n isOut,\r\n loadPromises,\r\n middleware,\r\n withoutPreloader,\r\n withTail,\r\n autoDownloadSize,\r\n noBlur,\r\n noThumb: true,\r\n blurAfter: true\r\n //noFadeIn: true\r\n });\r\n const thumbImage = res.images.full;\r\n thumbImage.classList.add('media-photo', 'thumbnail');\r\n //container.append(thumbImage);\r\n }\r\n\r\n container.classList.add('media-container-fitted');\r\n container.append(aspecter);\r\n }\r\n } else {\r\n if(!size) {\r\n size = appPhotosManager.choosePhotoSize(photo, boxWidth, boxHeight, true);\r\n }\r\n \r\n cacheContext = appDownloadManager.getCacheContext(photo, size?.type);\r\n }\r\n\r\n if(!noThumb) {\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\r\n if(gotThumb) {\r\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\r\n thumbImage = gotThumb.image;\r\n thumbImage.classList.add('media-photo');\r\n aspecter.append(thumbImage);\r\n }\r\n }\r\n // }\r\n\r\n image.classList.add('media-photo');\r\n \r\n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\r\n\r\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\r\n\r\n let preloader: ProgressivePreloader;\r\n if(message?.media?.preloader && !withoutPreloader) { // means upload\r\n preloader = message.media.preloader;\r\n preloader.attach(container);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const getDownloadPromise = () => {\r\n const promise = isGif && !size ? \r\n appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \r\n appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\r\n\r\n return promise;\r\n };\r\n\r\n const renderOnLoad = (url: string) => {\r\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\r\n };\r\n\r\n const onLoad = (): Promise => {\r\n if(middleware && !middleware()) return Promise.resolve();\r\n\r\n if(blurAfter) {\r\n const result = blur(cacheContext.url, 12);\r\n return result.promise.then(() => {\r\n // image = result.canvas;\r\n return renderOnLoad(result.canvas.toDataURL());\r\n });\r\n }\r\n\r\n return renderOnLoad(cacheContext.url);\r\n };\r\n\r\n let loadPromise: Promise;\r\n const canAttachPreloader = (\r\n (size as PhotoSize.photoSize).w >= 150 && \r\n (size as PhotoSize.photoSize).h >= 150\r\n ) || noAutoDownload;\r\n const load = () => {\r\n if(noAutoDownload && !withoutPreloader && preloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n const promise = getDownloadPromise();\r\n\r\n if(preloader && \r\n !cacheContext.downloaded && \r\n !withoutPreloader && \r\n canAttachPreloader\r\n ) {\r\n preloader.attach(container, false, promise);\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n const renderPromise = promise.then(onLoad);\r\n renderPromise.catch(() => {});\r\n return {download: promise, render: renderPromise};\r\n };\r\n\r\n if(preloader) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n \r\n if(cacheContext.downloaded) {\r\n loadThumbPromise = loadPromise = load().render;\r\n } else {\r\n if(!lazyLoadQueue) loadPromise = load().render;\r\n /* else if(noAutoDownload) {\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(container);\r\n } */ else lazyLoadQueue.push({div: container, load: () => load().download});\r\n }\r\n\r\n if(loadPromises && loadThumbPromise) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: loadThumbPromise,\r\n full: loadPromise || Promise.resolve()\r\n },\r\n images: {\r\n thumb: thumbImage,\r\n full: image\r\n },\r\n preloader,\r\n aspecter\r\n };\r\n}\r\n\r\nexport function renderImageWithFadeIn(\r\n container: HTMLElement, \r\n image: HTMLImageElement, \r\n url: string, \r\n needFadeIn: boolean, \r\n aspecter = container,\r\n thumbImage?: HTMLElement\r\n) {\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve) => {\r\n /* if(photo._ === 'document') {\r\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n return resolve();\r\n } */\r\n\r\n renderImageFromUrl(image, url, () => {\r\n sequentialDom.mutateElement(container, () => {\r\n aspecter.append(image);\r\n\r\n fastRaf(() => {\r\n resolve();\r\n });\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n image.classList.remove('fade-in');\r\n \r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n });\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n });\r\n}\r\n\r\n// export function renderImageWithFadeIn(container: HTMLElement, \r\n// image: HTMLImageElement, \r\n// url: string, \r\n// needFadeIn: boolean, \r\n// aspecter = container,\r\n// thumbImage?: HTMLImageElement\r\n// ) {\r\n// if(needFadeIn) {\r\n// // image.classList.add('fade-in-new', 'not-yet');\r\n// image.classList.add('fade-in');\r\n// }\r\n\r\n// return new Promise((resolve) => {\r\n// /* if(photo._ === 'document') {\r\n// console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n// return resolve();\r\n// } */\r\n\r\n// renderImageFromUrl(image, url, () => {\r\n// sequentialDom.mutateElement(container, () => {\r\n// aspecter.append(image);\r\n// // (needFadeIn ? getHeavyAnimationPromise() : Promise.resolve()).then(() => {\r\n\r\n// // fastRaf(() => {\r\n// resolve();\r\n// // });\r\n\r\n// if(needFadeIn) {\r\n// fastRaf(() => {\r\n// /* if(!image.isConnected) {\r\n// alert('aaaa');\r\n// } */\r\n// // fastRaf(() => {\r\n// image.classList.remove('not-yet');\r\n// // });\r\n// });\r\n\r\n// image.addEventListener('transitionend', () => {\r\n// sequentialDom.mutate(() => {\r\n// image.classList.remove('fade-in-new');\r\n \r\n// if(thumbImage) {\r\n// thumbImage.remove();\r\n// }\r\n// });\r\n// }, {once: true});\r\n// }\r\n// // });\r\n// });\r\n// });\r\n// });\r\n// }\r\n\r\nexport function wrapStickerAnimation({\r\n size,\r\n doc,\r\n middleware,\r\n target,\r\n side,\r\n skipRatio,\r\n play\r\n}: {\r\n size: number,\r\n doc: MyDocument,\r\n middleware?: () => boolean,\r\n target: HTMLElement,\r\n side: 'left' | 'center' | 'right',\r\n skipRatio?: number,\r\n play: boolean\r\n}) {\r\n const animationDiv = document.createElement('div');\r\n animationDiv.classList.add('emoji-animation');\r\n\r\n // const size = 280;\r\n animationDiv.style.width = size + 'px';\r\n animationDiv.style.height = size + 'px';\r\n\r\n const stickerPromise = wrapSticker({\r\n div: animationDiv,\r\n doc,\r\n middleware,\r\n withThumb: false,\r\n needFadeIn: false,\r\n loop: false,\r\n width: size,\r\n height: size,\r\n play,\r\n group: 'none',\r\n skipRatio\r\n }).then(animation => {\r\n assumeType(animation);\r\n animation.addEventListener('enterFrame', (frameNo) => {\r\n if(frameNo === animation.maxFrame) {\r\n animation.remove();\r\n animationDiv.remove();\r\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\r\n }\r\n });\r\n\r\n if(IS_VIBRATE_SUPPORTED) {\r\n animation.addEventListener('firstFrame', () => {\r\n navigator.vibrate(100);\r\n }, {once: true});\r\n }\r\n\r\n return animation;\r\n });\r\n\r\n const generateRandomSigned = (max: number) => {\r\n const r = Math.random() * max * 2;\r\n return r > max ? -r % max : r;\r\n };\r\n\r\n const randomOffsetX = generateRandomSigned(16);\r\n const randomOffsetY = generateRandomSigned(4);\r\n const stableOffsetX = size / 8 * (side === 'right' ? 1 : -1);\r\n const setPosition = () => {\r\n if(!isInDOM(target)) {\r\n return;\r\n }\r\n \r\n const rect = target.getBoundingClientRect();\r\n /* const boxWidth = Math.max(rect.width, rect.height);\r\n const boxHeight = Math.max(rect.width, rect.height);\r\n const x = rect.left + ((boxWidth - size) / 2);\r\n const y = rect.top + ((boxHeight - size) / 2); */\r\n\r\n const rectX = side === 'right' ? rect.right : rect.left;\r\n\r\n const addOffsetX = side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0) + stableOffsetX + randomOffsetX;\r\n const x = rectX + addOffsetX;\r\n // const y = rect.bottom - size + size / 4;\r\n const y = rect.top + ((rect.height - size) / 2) + (side === 'center' ? 0 : randomOffsetY);\r\n // animationDiv.style.transform = `translate(${x}px, ${y}px)`;\r\n animationDiv.style.top = y + 'px';\r\n animationDiv.style.left = x + 'px';\r\n };\r\n\r\n const onScroll = throttleWithRaf(setPosition);\r\n\r\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\r\n\r\n setPosition();\r\n\r\n appImManager.emojiAnimationContainer.append(animationDiv);\r\n\r\n return {animationDiv, stickerPromise};\r\n}\r\n\r\nexport function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic}: {\r\n doc: MyDocument, \r\n div: HTMLElement, \r\n middleware?: () => boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n group?: string, \r\n play?: boolean, \r\n onlyThumb?: boolean,\r\n emoji?: string,\r\n width?: number,\r\n height?: number,\r\n withThumb?: boolean,\r\n loop?: boolean,\r\n loadPromises?: Promise[],\r\n needFadeIn?: boolean,\r\n needUpscale?: boolean,\r\n skipRatio?: number,\r\n static?: boolean\r\n}): Promise {\r\n const stickerType = doc.sticker;\r\n if(stickerType === 1) {\r\n asStatic = true;\r\n }\r\n\r\n if(!width) {\r\n width = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(!height) {\r\n height = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(stickerType === 2) {\r\n //LottieLoader.loadLottie();\r\n LottieLoader.loadLottieWorkers();\r\n }\r\n \r\n if(!stickerType) {\r\n console.error('wrong doc for wrapSticker!', doc);\r\n throw new Error('wrong doc for wrapSticker!');\r\n }\r\n\r\n div.dataset.docId = '' + doc.id;\r\n div.classList.add('media-sticker-wrapper');\r\n\r\n /* if(stickerType === 3) {\r\n const videoRes = wrapVideo({\r\n doc,\r\n boxWidth: width,\r\n boxHeight: height,\r\n container: div,\r\n group,\r\n lazyLoadQueue,\r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n noPlayButton: true,\r\n noInfo: true\r\n });\r\n\r\n if(videoRes.thumb) {\r\n if(videoRes.thumb.images.thumb) {\r\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\r\n }\r\n\r\n if(videoRes.thumb.images.full) {\r\n videoRes.thumb.images.full.classList.add('media-sticker');\r\n }\r\n }\r\n\r\n return videoRes.loadPromise;\r\n } */\r\n \r\n //console.log('wrap sticker', doc, div, onlyThumb);\r\n\r\n let cacheContext: ThumbCache;\r\n if(asStatic && stickerType !== 1) {\r\n const thumb = appPhotosManager.choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\r\n cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\r\n } else {\r\n cacheContext = appDownloadManager.getCacheContext(doc);\r\n }\r\n\r\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\r\n const downloaded = cacheContext.downloaded && !needFadeIn;\r\n\r\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\r\n const isThumbNeededForType = isAnimated;\r\n \r\n let loadThumbPromise = deferredPromise();\r\n let haveThumbCached = false;\r\n if((\r\n doc.thumbs?.length || \r\n doc.stickerCachedThumbs\r\n ) && \r\n !div.firstElementChild && (\r\n !downloaded || \r\n isThumbNeededForType || \r\n onlyThumb\r\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\r\n ) {\r\n let thumb = doc.stickerCachedThumbs && doc.stickerCachedThumbs[toneIndex] || doc.thumbs[0];\r\n \r\n //console.log('wrap sticker', thumb, div);\r\n\r\n let thumbImage: HTMLImageElement;\r\n const afterRender = () => {\r\n if(!div.childElementCount) {\r\n thumbImage.classList.add('media-sticker', 'thumbnail');\r\n \r\n sequentialDom.mutateElement(div, () => {\r\n div.append(thumbImage);\r\n loadThumbPromise.resolve();\r\n });\r\n }\r\n };\r\n\r\n if('url' in thumb) {\r\n thumbImage = new Image();\r\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\r\n haveThumbCached = true;\r\n } else if('bytes' in thumb) {\r\n if(thumb._ === 'photoPathSize') {\r\n if(thumb.bytes.length) {\r\n const d = appPhotosManager.getPathFromPhotoPathSize(thumb);\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\r\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\r\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n path.setAttributeNS(null, 'd', d);\r\n svg.append(path);\r\n div.append(svg);\r\n } else {\r\n thumb = doc.thumbs.find(t => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\r\n }\r\n } \r\n \r\n if(thumb && thumb._ !== 'photoPathSize' && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n haveThumbCached = true;\r\n } else {\r\n webpWorkerController.convert('' + doc.id, (thumb as PhotoSize.photoStrippedSize).bytes as Uint8Array).then(bytes => {\r\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\r\n doc.pFlags.stickerThumbConverted = true;\r\n \r\n if(middleware && !middleware()) return;\r\n \r\n if(!div.childElementCount) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n }\r\n }).catch(() => {});\r\n }\r\n }\r\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\r\n thumbImage = new Image();\r\n\r\n const load = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n\r\n const r = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\r\n };\r\n \r\n if(cacheContext.url) {\r\n r();\r\n return Promise.resolve();\r\n } else {\r\n return appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\r\n }\r\n };\r\n \r\n if(lazyLoadQueue && onlyThumb) {\r\n lazyLoadQueue.push({div, load});\r\n return Promise.resolve();\r\n } else {\r\n load();\r\n\r\n if((thumb as any).url) {\r\n haveThumbCached = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(loadPromises && haveThumbCached) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n if(onlyThumb) { // for sticker panel\r\n return Promise.resolve();\r\n }\r\n \r\n const load = async() => {\r\n if(middleware && !middleware()) return;\r\n\r\n if(stickerType === 2 && !asStatic) {\r\n /* if(doc.id === '1860749763008266301') {\r\n console.log('loaded sticker:', doc, div);\r\n } */\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 500));\r\n //return;\r\n\r\n //console.time('download sticker' + doc.id);\r\n\r\n //appDocsManager.downloadDocNew(doc.id).promise.then(res => res.json()).then(async(json) => {\r\n //fetch(doc.url).then(res => res.json()).then(async(json) => {\r\n return await appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId)\r\n .then(async(blob) => {\r\n //console.timeEnd('download sticker' + doc.id);\r\n //console.log('loaded sticker:', doc, div/* , blob */);\r\n if(middleware && !middleware()) {\r\n throw new Error('wrapSticker 2 middleware');\r\n }\r\n\r\n let animation = await LottieLoader.loadAnimationWorker({\r\n container: div,\r\n loop: loop && !emoji,\r\n autoplay: play,\r\n animationData: blob,\r\n width,\r\n height,\r\n name: 'doc' + doc.id,\r\n needUpscale,\r\n skipRatio,\r\n toneIndex\r\n }, group, middleware);\r\n\r\n //const deferred = deferredPromise();\r\n \r\n animation.addEventListener('firstFrame', () => {\r\n const element = div.firstElementChild;\r\n if(needFadeIn !== false) {\r\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\r\n }\r\n\r\n const cb = () => {\r\n if(element && element !== animation.canvas) {\r\n element.remove();\r\n }\r\n };\r\n\r\n if(!needFadeIn) {\r\n if(element) {\r\n sequentialDom.mutate(cb);\r\n }\r\n } else {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.add('fade-in');\r\n if(element) {\r\n element.classList.add('fade-out');\r\n }\r\n \r\n animation.canvas.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.remove('fade-in');\r\n cb();\r\n });\r\n }, {once: true});\r\n });\r\n }\r\n\r\n if(withThumb !== false) {\r\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\r\n }\r\n\r\n //deferred.resolve();\r\n }, {once: true});\r\n \r\n if(emoji) {\r\n const data: SendMessageEmojiInteractionData = {\r\n a: [],\r\n v: 1\r\n };\r\n\r\n let sendInteractionThrottled: () => void;\r\n\r\n appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\r\n\r\n attachClickEvent(div, async(e) => {\r\n cancelEvent(e);\r\n const animation = LottieLoader.getAnimation(div);\r\n \r\n if(animation.paused) {\r\n const doc = appStickersManager.getAnimatedEmojiSoundDocument(emoji);\r\n if(doc) {\r\n const audio = document.createElement('audio');\r\n audio.style.display = 'none';\r\n div.parentElement.append(audio);\r\n\r\n try {\r\n await appDocsManager.downloadDoc(doc);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n audio.src = cacheContext.url;\r\n audio.play();\r\n await onMediaLoad(audio, undefined, true);\r\n \r\n audio.addEventListener('ended', () => {\r\n audio.src = '';\r\n audio.remove();\r\n }, {once: true});\r\n } catch(err) {\r\n \r\n }\r\n }\r\n\r\n animation.autoplay = true;\r\n animation.restart();\r\n }\r\n\r\n const peerId = appImManager.chat.peerId;\r\n if(!peerId.isUser()) {\r\n return;\r\n }\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji, true);\r\n if(!doc) {\r\n return;\r\n }\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n const isOut = bubble.classList.contains('is-out');\r\n\r\n const {animationDiv} = wrapStickerAnimation({\r\n doc,\r\n middleware,\r\n side: isOut ? 'right' : 'left',\r\n size: 280,\r\n target: div,\r\n play: true\r\n });\r\n\r\n if(bubble) {\r\n if(isOut) {\r\n animationDiv.classList.add('is-out');\r\n } else {\r\n animationDiv.classList.add('is-in');\r\n }\r\n }\r\n\r\n if(!sendInteractionThrottled) {\r\n sendInteractionThrottled = throttle(() => {\r\n const length = data.a.length;\r\n if(!length) {\r\n return;\r\n }\r\n \r\n const firstTime = data.a[0].t;\r\n \r\n data.a.forEach((a) => {\r\n a.t = (a.t - firstTime) / 1000;\r\n });\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n appMessagesManager.setTyping(appImManager.chat.peerId, {\r\n _: 'sendMessageEmojiInteraction',\r\n msg_id: appMessagesIdsManager.getServerMessageId(+bubble.dataset.mid),\r\n emoticon: emoji,\r\n interaction: {\r\n _: 'dataJSON',\r\n data: JSON.stringify(data)\r\n }\r\n }, true);\r\n \r\n data.a.length = 0;\r\n }, 1000, false);\r\n }\r\n\r\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\r\n if(e.isTrusted) {\r\n data.a.push({\r\n i: 1,\r\n t: Date.now()\r\n });\r\n \r\n sendInteractionThrottled();\r\n }\r\n });\r\n }\r\n\r\n return animation;\r\n\r\n //return deferred;\r\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\r\n });\r\n\r\n //console.timeEnd('render sticker' + doc.id);\r\n } else if(asStatic || stickerType === 3) {\r\n let media: HTMLElement;\r\n if(asStatic) {\r\n media = new Image();\r\n } else {\r\n media = createVideo();\r\n (media as HTMLVideoElement).muted = true;\r\n\r\n if(play) {\r\n (media as HTMLVideoElement).autoplay = true;\r\n (media as HTMLVideoElement).loop = true;\r\n }\r\n }\r\n\r\n const thumbImage = div.firstElementChild !== media && div.firstElementChild;\r\n if(needFadeIn !== false) {\r\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage : (!thumbImage || thumbImage.tagName === 'svg'))) && rootScope.settings.animationsEnabled;\r\n }\r\n\r\n media.classList.add('media-sticker');\r\n\r\n if(needFadeIn) {\r\n media.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const r = () => {\r\n if(middleware && !middleware()) return resolve();\r\n \r\n const onLoad = () => {\r\n sequentialDom.mutateElement(div, () => {\r\n div.append(media);\r\n if(thumbImage) {\r\n thumbImage.classList.add('fade-out');\r\n }\r\n\r\n if(stickerType === 3 && !appDocsManager.isSavingLottiePreview(doc, toneIndex)) {\r\n // const perf = performance.now();\r\n assumeType(media);\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width * window.devicePixelRatio;\r\n canvas.height = height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(media, 0, 0, canvas.width, canvas.height);\r\n appDocsManager.saveLottiePreview(doc, canvas, toneIndex);\r\n // console.log('perf', performance.now() - perf);\r\n }\r\n\r\n if(stickerType === 3 && group) {\r\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\r\n }\r\n\r\n resolve();\r\n\r\n if(needFadeIn) {\r\n media.addEventListener('animationend', () => {\r\n media.classList.remove('fade-in');\r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n };\r\n\r\n if(asStatic) {\r\n renderImageFromUrl(media, cacheContext.url, onLoad);\r\n } else {\r\n (media as HTMLVideoElement).src = cacheContext.url;\r\n onMediaLoad(media as HTMLVideoElement).then(onLoad);\r\n }\r\n };\r\n\r\n if(cacheContext.url) r();\r\n else {\r\n let promise: Promise;\r\n if(stickerType === 2 && asStatic) {\r\n const thumb = appPhotosManager.choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\r\n promise = appDocsManager.getThumbURL(doc, thumb).promise\r\n } else {\r\n promise = appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId);\r\n }\r\n \r\n promise.then(r, resolve);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || isAnimated) ? \r\n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \r\n load();\r\n\r\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\r\n loadThumbPromise = loadPromise as any;\r\n if(loadPromises) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n }\r\n\r\n return loadPromise;\r\n}\r\n\r\nexport async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height}: {\r\n set: StickerSet.stickerSet,\r\n lazyLoadQueue: LazyLoadQueue,\r\n container: HTMLElement,\r\n group: string,\r\n autoplay: boolean,\r\n width: number,\r\n height: number\r\n}) {\r\n if(set.thumbs?.length) {\r\n container.classList.add('media-sticker-wrapper');\r\n lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n const downloadOptions = appStickersManager.getStickerSetThumbDownloadOptions(set);\r\n const promise = appDownloadManager.download(downloadOptions);\r\n\r\n if(set.pFlags.animated && !set.pFlags.videos) {\r\n return promise\r\n .then((blob) => {\r\n lottieLoader.loadAnimationWorker({\r\n container,\r\n loop: true,\r\n autoplay,\r\n animationData: blob,\r\n width,\r\n height,\r\n needUpscale: true,\r\n name: 'setThumb' + set.id\r\n }, group);\r\n });\r\n } else {\r\n let media: HTMLElement;\r\n if(set.pFlags.videos) {\r\n media = createVideo();\r\n (media as HTMLVideoElement).autoplay = true;\r\n (media as HTMLVideoElement).muted = true;\r\n (media as HTMLVideoElement).loop = true;\r\n } else {\r\n media = new Image();\r\n }\r\n\r\n media.classList.add('media-sticker');\r\n \r\n return promise.then(blob => {\r\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\r\n container.append(media);\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n const stickerSet = await promise;\r\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\r\n wrapSticker({\r\n doc: stickerSet.documents[0],\r\n div: container, \r\n group: group,\r\n lazyLoadQueue\r\n }); // kostil\r\n }\r\n}\r\n\r\nexport function wrapStickerToRow({doc, row, size}: {\r\n doc: MyDocument,\r\n row: Row,\r\n size?: 'small' | 'large',\r\n}) {\r\n const previousMedia = row.media;\r\n const media = row.createMedia('small');\r\n\r\n if(previousMedia) {\r\n media.classList.add('hide');\r\n }\r\n\r\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\r\n\r\n const _size = size === 'small' ? 32 : 48;\r\n const result = wrapSticker({\r\n div: media,\r\n doc: doc,\r\n width: _size,\r\n height: _size,\r\n loadPromises\r\n });\r\n\r\n loadPromises && Promise.all(loadPromises).then(() => {\r\n media.classList.remove('hide');\r\n previousMedia.remove();\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport function wrapLocalSticker({emoji, width, height}: {\r\n doc?: MyDocument,\r\n url?: string,\r\n emoji?: string,\r\n width: number,\r\n height: number,\r\n}) {\r\n const container = document.createElement('div');\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: container,\r\n loop: false,\r\n play: true,\r\n width,\r\n height,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n return {container};\r\n}\r\n\r\nexport function wrapReply(title: Parameters[0], subtitle: Parameters[1], message?: any) {\r\n const replyContainer = new ReplyContainer('reply');\r\n replyContainer.fill(title, subtitle, message);\r\n /////////console.log('wrapReply', title, subtitle, media);\r\n return replyContainer.container;\r\n}\r\n\r\nexport function prepareAlbum(options: {\r\n container: HTMLElement,\r\n items: {w: number, h: number}[],\r\n maxWidth: number,\r\n minWidth: number,\r\n spacing: number,\r\n maxHeight?: number,\r\n forMedia?: true\r\n}) {\r\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\r\n const layout = layouter.layout();\r\n\r\n const widthItem = layout.find(item => item.sides & RectPart.Right);\r\n const width = widthItem.geometry.width + widthItem.geometry.x;\r\n\r\n const heightItem = layout.find(item => item.sides & RectPart.Bottom);\r\n const height = heightItem.geometry.height + heightItem.geometry.y;\r\n\r\n const container = options.container;\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n const children = container.children;\r\n\r\n layout.forEach(({geometry, sides}, idx) => {\r\n let div: HTMLElement;\r\n div = children[idx] as HTMLElement;\r\n if(!div) {\r\n div = document.createElement('div');\r\n container.append(div);\r\n }\r\n\r\n div.classList.add('album-item', 'grouped-item');\r\n\r\n div.style.width = (geometry.width / width * 100) + '%';\r\n div.style.height = (geometry.height / height * 100) + '%';\r\n div.style.top = (geometry.y / height * 100) + '%';\r\n div.style.left = (geometry.x / width * 100) + '%';\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Top) {\r\n div.style.borderTopLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\r\n div.style.borderBottomLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Top) {\r\n div.style.borderTopRightRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\r\n div.style.borderBottomRightRadius = 'inherit';\r\n }\r\n\r\n if(options.forMedia) {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n div.append(mediaDiv);\r\n }\r\n\r\n // @ts-ignore\r\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\r\n });\r\n\r\n /* if(options.forMedia) {\r\n layout.forEach((_, i) => {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n options.container.children[i].append(mediaDiv);\r\n });\r\n } */\r\n}\r\n\r\nexport function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload}: {\r\n groupId: string, \r\n attachmentDiv: HTMLElement,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n uploading?: boolean,\r\n isOut: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n autoDownload?: ChatAutoDownloadSettings,\r\n}) {\r\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\r\n\r\n // !lowest msgID will be the FIRST in album\r\n const storage = appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of storage) {\r\n const m = chat.getMessage(mid);\r\n const media = m.media.photo || m.media.document;\r\n\r\n const size: any = media._ === 'photo' ? appPhotosManager.choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\r\n items.push({size, media, message: m});\r\n }\r\n\r\n /* // * pending\r\n if(storage[0] < 0) {\r\n items.reverse();\r\n } */\r\n\r\n prepareAlbum({\r\n container: attachmentDiv,\r\n items: items.map(i => ({w: i.size.w, h: i.size.h})),\r\n maxWidth: mediaSizes.active.album.width,\r\n minWidth: 100,\r\n spacing: 2,\r\n forMedia: true\r\n });\r\n\r\n items.forEach((item, idx) => {\r\n const {size, media, message} = item;\r\n\r\n const div = attachmentDiv.children[idx] as HTMLElement;\r\n div.dataset.mid = '' + message.mid;\r\n div.dataset.peerId = '' + message.peerId;\r\n const mediaDiv = div.firstElementChild as HTMLElement;\r\n const isPhoto = media._ === 'photo';\r\n if(isPhoto) {\r\n wrapPhoto({\r\n photo: media,\r\n message,\r\n container: mediaDiv,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n size,\r\n loadPromises,\r\n autoDownloadSize: autoDownload.photo\r\n });\r\n } else {\r\n wrapVideo({\r\n doc: message.media.document,\r\n container: mediaDiv,\r\n message,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n autoDownload\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType}: {\r\n albumMustBeRenderedFull: boolean,\r\n message: any,\r\n messageDiv: HTMLElement,\r\n bubble: HTMLElement,\r\n uploading?: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n autoDownloadSize?: number,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n searchContext?: MediaSearchContext,\r\n useSearch?: boolean,\r\n sizeType?: MediaSizeType\r\n}) {\r\n let nameContainer: HTMLElement;\r\n const mids = albumMustBeRenderedFull ? chat.getMidsByMid(message.mid) : [message.mid];\r\n /* if(isPending) {\r\n mids.reverse();\r\n } */\r\n\r\n mids.forEach((mid, idx) => {\r\n const message = chat.getMessage(mid);\r\n const div = wrapDocument({\r\n message,\r\n loadPromises,\r\n autoDownloadSize,\r\n lazyLoadQueue,\r\n searchContext,\r\n sizeType\r\n });\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('document-container');\r\n container.dataset.mid = '' + mid;\r\n container.dataset.peerId = '' + message.peerId;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.classList.add('document-wrapper');\r\n \r\n if(message.message) {\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('document-message');\r\n\r\n const richText = RichTextProcessor.wrapRichText(message.message, {\r\n entities: message.totalEntities\r\n });\r\n\r\n setInnerHTML(messageDiv, richText);\r\n wrapper.append(messageDiv);\r\n }\r\n\r\n if(mids.length > 1) {\r\n const selection = document.createElement('div');\r\n selection.classList.add('document-selection');\r\n container.append(selection);\r\n \r\n container.classList.add('grouped-item');\r\n\r\n if(idx === 0) {\r\n nameContainer = wrapper;\r\n }\r\n }\r\n\r\n wrapper.append(div);\r\n container.append(wrapper);\r\n messageDiv.append(container);\r\n });\r\n\r\n if(mids.length > 1) {\r\n bubble.classList.add('is-multiple-documents', 'is-grouped');\r\n }\r\n\r\n return nameContainer;\r\n}\r\n\r\nexport function wrapPoll(message: any) {\r\n const elem = new PollElement();\r\n elem.message = message;\r\n elem.setAttribute('peer-id', '' + message.peerId);\r\n elem.setAttribute('poll-id', message.media.poll.id);\r\n elem.setAttribute('message-id', '' + message.mid);\r\n elem.render();\r\n return elem;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport insertInDescendSortedArray from \"./array/insertInDescendSortedArray\";\nimport { getMiddleware } from \"./middleware\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach(element => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(id: SortedElementId, batch = false, updateElementWith?: SortedList['updateElementWith'], updateBatch = batch) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public update(id: SortedElementId, batch = false, element = this.get(id), updateElementWith?: SortedList['updateElementWith']) {\n if(!element) {\n return;\n }\n\n element.index = this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\nimport appDialogsManager, { AppDialogsManager, DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\nimport safeAssign from \"../helpers/object/safeAssign\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> = {}) {\n super({\n getIndex: options.getIndex || ((element) => appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || ((element) => {\n const status = appUsersManager.getUserStatusString(element.id);\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport cancelEvent from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelContextMenuOpening } from \"../../components/misc\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n textArgs?: FormatterArguments,\n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n // ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) textElement.innerHTML = options.regularText;\n }\n \n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n \n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach(b => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\n\nexport default class PopupDeleteMessages {\n constructor(peerId: PeerId, mids: number[], type: ChatType, onConfirm?: () => void) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = appChatsManager.getChat(peerId.toChatId());\n\n const hasRights = appChatsManager.hasRights(peerId.toChatId(), 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = hasRights ? mids.slice() : mids.filter(mid => {\n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { PopupButton } from \".\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n let title: string, description: string, buttons: PopupButton[] = [];\n\n title = `Send Message${mids.length > 1 ? 's' : ''} Now`;\n description = mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?';\n\n const callback = () => {\n onConfirm && onConfirm();\n appMessagesManager.sendScheduledMessages(peerId, mids);\n };\n\n buttons.push({\n langKey: 'Send',\n callback\n });\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n title,\n description,\n buttons\n });\n\n popup.show();\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachContextMenuListener } from \"../misc\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n//const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected appMessagesManager: AppMessagesManager;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n\n constructor(options: {\n appMessagesManager: AppMessagesManager,\n listenElement: HTMLElement,\n listenerSetter: ListenerSetter,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(this.listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n this.listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, this.listenerSetter);\n\n return;\n }\n\n const getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n this.listenerSetter.add(this.listenElement)('mousedown', (e) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n \n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(!seenSet.has(mid)) {\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach(element => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n });\n }\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storage = this.isScheduled ? this.appMessagesManager.getScheduledMessagesStorage(peerId) : this.appMessagesManager.getMessagesStorage(peerId);\n for(const mid of mids) {\n const message = this.appMessagesManager.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.appMessagesManager.canForward(message);\n }\n \n if(!cantDelete) {\n cantDelete = !this.appMessagesManager.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = (doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n if(diff < 0) {\n toast(I18n.format('Chat.Selection.LimitToast', true));\n return false;\n /* const it = this.selectedMids.values();\n do {\n const mid = it.next().value;\n const mounted = this.appImManager.getMountedBubble(mid);\n if(mounted) {\n this.toggleByBubble(mounted.bubble);\n } else {\n const mids = this.appMessagesManager.getMidsByMid(mid);\n for(const mid of mids) {\n this.selectedMids.delete(mid);\n }\n }\n } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach(mid => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: searchSuper.container,\n listenerSetter: new ListenerSetter(),\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach(element => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', () => this.cancelSelection(), {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n rootScope.dispatchEvent('history_focus', {\n peerId,\n mid\n });\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(private chat: Chat, private bubbles: ChatBubbles, private input: ChatInput, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: bubbles.bubblesContainer,\n listenerSetter: bubbles.listenerSetter,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach(item => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement) => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.bubbles.peerId);\n if(set) {\n const mids = this.chat.getMidsByMid(mid);\n mids.forEach(mid => set.delete(mid));\n }\n }\n\n this.bubbles.getBubbleGroupedItems(bubble).forEach(this.toggleByElement);\n return;\n }\n\n if(!this.toggleMid(this.bubbles.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(mid);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.bubbles.peerId, mid));\n };\n\n protected toggleByMid = (peerId: PeerId, mid: number) => {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(+element.dataset.mid));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected isGroupedMidsSelected(mid: number) {\n const mids = this.chat.getMidsByMid(mid);\n const selectedMids = mids.filter(mid => this.isMidSelected(this.bubbles.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && \n !bubble.classList.contains('is-outgoing') && \n !bubble.classList.contains('bubble-first') && \n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = this.chat.input.center(animate);\n\n SetTransition(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n this.selectionLeft = \n this.selectionRight = \n null;\n this.selectedText = undefined;\n }\n \n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n });\n\n //const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n \n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = () => {\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n //this.toggleByBubble(mounted.message.grouped_id ? mounted.bubble.querySelector(`.grouped-item[data-mid=\"${mid}\"]`) : mounted.bubble);\n this.toggleByElement(mounted.bubble);\n }\n /* const bubble = this.appImManager.bubbles[mid];\n if(bubble) {\n this.toggleByBubble(bubble);\n } */\n }\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport { logger } from \"../lib/logger\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { attachContextMenuListener, openBtnMenu, positionMenu, putPreloader } from \"./misc\";\nimport ripple from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants, Message, MessageMedia, Photo, WebPage } from \"../layer\";\nimport SortedUserList from \"./sortedUserList\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appSidebarRight from \"./sidebarRight\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport cleanSearchText from \"../helpers/cleanSearchText\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport handleTabSwipe from \"../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../helpers/windowSize\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupForward from \"./popups/forward\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport Row from \"./row\";\nimport htmlToDocumentFragment from \"../helpers/dom/htmlToDocumentFragment\";\nimport { SearchSelection } from \"./chat/selection\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, simulateClickEvent } from \"../helpers/dom/clickEvent\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport AppMediaViewer from \"./appMediaViewer\";\nimport lockTouchScroll from \"../helpers/dom/lockTouchScroll\";\nimport copy from \"../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../helpers/object/getObjectKeysAndSort\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport escapeRegExp from \"../helpers/string/escapeRegExp\";\nimport limitSymbols from \"../helpers/string/limitSymbols\";\nimport findAndSplice from \"../helpers/array/findAndSplice\";\nimport { ScrollStartCallbackDimensions } from \"../helpers/fastSmoothScroll\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport appWebPagesManager from \"../lib/appManagers/appWebPagesManager\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n this.buttons.forEach(button => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n });\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: () => appMessagesManager.canForward(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => appMessagesManager.canDeleteMessage(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n rootScope.dispatchEvent('history_focus', {\n peerId: this.peerId,\n mid: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message, \n middleware: () => boolean, \n promises: Promise[], \n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n \n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n public urlsToRevoke: string[] = [];\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n \n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, appMessagesManager);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && !this.loaded[this.mediaTab.inputFilter]/* && false */) {\n //this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n //this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n \n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n \n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = (className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map(el => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map(k => +k).sort((a, b) => a - b);\n const idx = targets.findIndex(item => item.mid === mid && item.peerId === peerId);\n \n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return appMessagesManager.filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: message.peerId, \n container: searchGroup.list, \n drawStatus: false,\n avatarSize: 54\n });\n\n appDialogsManager.setLastMessage(dialog, message, dom, this.searchContext.query);\n }\n\n private processPhotoVideoFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: ReturnType;\n const size = appPhotosManager.choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n }).thumb;\n } else {\n wrapped = wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach(image => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n elemsToAppend.push({element: div, message});\n }\n\n private processDocumentFilter({message, elemsToAppend, inputFilter}: ProcessSearchSuperResult) {\n const document = appMessagesManager.getMediaFromMessage(message);\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n const div = wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n elemsToAppend.push({element: div, message});\n }\n\n private processUrlFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n let webpage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage;\n\n if(!webpage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = RichTextProcessor.matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n //display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webpage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webpage.description = message.message;\n }\n }\n\n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: appPhotosManager.choosePhotoSize(webpage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true));\n }\n \n let title = appWebPagesManager.wrapTitle(webpage);\n\n const subtitleFragment = appWebPagesManager.wrapDescription(webpage);\n const aFragment = htmlToDocumentFragment(RichTextProcessor.wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', appMessagesManager.wrapSenderToPeer(message));\n }\n \n if(!title.textContent) {\n //title = new URL(webpage.url).hostname;\n title.append(RichTextProcessor.wrapPlainText(webpage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: appMessagesManager.wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n elemsToAppend.push({element: row.container, message});\n }\n }\n \n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n \n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n for(const message of messages) {\n try {\n options.message = message;\n processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n }\n }\n \n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach(details => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach(child => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.forEach((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const peer = appPeersManager.getPeer(peerId);\n \n //////////this.log('contacts peer', peer);\n \n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId, \n container: group.list, \n drawStatus: false,\n avatarSize: 48,\n autonomous: group.autonomous\n });\n \n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(appProfileManager.getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n \n appMessagesManager.getConversations(query, 0, 20, 0).promise\n .then(onLoad)\n .then(value => {\n if(value) {\n setResults(value.dialogs.map(d => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return appStateManager.getState().then(state => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(peerId => {\n let {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.searchGroups.recent.list,\n drawStatus: false,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(peerId.isUser() ? appUsersManager.getUserStatusString(peerId) : appProfileManager.getChatMembersString(peerId.toChatId()));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n appUsersManager.getTopPeers('correspondents').then(peers => {\n if(!middleware()) return;\n\n const idx = peers.findIndex(peer => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n dialog: peer.id, \n container: this.searchGroups.people.list, \n drawStatus: false,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({lazyLoadQueue: this.lazyLoadQueue, rippleEnabled: false});\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, 'LI');\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n participants.forEach(participant => {\n const peerId = appChatsManager.getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n return;\n }\n\n const user = appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n return;\n }\n\n this.membersList.add(peerId);\n });\n };\n\n if(appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then(participants => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = Promise.resolve(appProfileManager.getChatFull(id)).then(chatFull => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const logStr = 'load [' + type + ']: ';\n\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n //this.log(logStr + 'will render from cache', used, history, ids, loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n messages.push(...this.filterMessagesByType(ids.map(m => appMessagesManager.getMessageByPeer(m.peerId, m.mid)), type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n\n return Promise.resolve();\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n \n //this.log(logStr + 'search house of glass pre', type, maxId);\n \n //let loadCount = history.length ? 50 : 15;\n return this.loadPromises[type] = appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ?? (this.nextRates[type] = 0)\n }).then(value => {\n history.push(...value.history.map(m => ({mid: m.mid, peerId: m.peerId})));\n \n this.log(logStr + 'search house of glass', type, value);\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return Promise.resolve();\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n (this.loadPromises[type] || Promise.resolve()).then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch(err => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n }\n \n public async load(single = false, justLoad = false) {\n // if(testScroll/* || 1 === 1 */) {\n // return;\n // }\n\n //return;\n \n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n if(this.hideEmptyTabs) {\n const mediaTabs = this.mediaTabs.filter(mediaTab => mediaTab.inputFilter !== 'inputMessagesFilterEmpty')\n const filters = mediaTabs.map(mediaTab => ({_: mediaTab.inputFilter}));\n\n const counters = await appMessagesManager.getSearchCounters(peerId, filters);\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach(mediaTab => {\n const counter = counters.find(c => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count && firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n if(counter.count) ++count;\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n const canViewMembers = this.canViewMembers();\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter(t => t !== this.mediaTab);\n toLoad = toLoad.filter(mediaTab => {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, mediaTab => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map(mediaTab => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware)\n });\n\n return Promise.all(promises).catch(err => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return this.searchContext.peerId.isAnyChat() && !appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()) && appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants');\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach(mediaTab => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach(mediaTab => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach(url => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\nimport { closeBtnMenu, openBtnMenu } from \"./misc\";\r\n\r\nconst ButtonMenuToggle = (\r\n options: Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n listenerSetter: ListenerSetter, \r\n asDiv: boolean,\r\n container: HTMLElement\r\n }> = {}, \r\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', \r\n buttons: ButtonMenuItemOptions[], \r\n onOpen?: (e: Event) => void,\r\n onClose?: () => void\r\n) => {\r\n options.asDiv = true;\r\n const button = options.container ?? ButtonIcon('more', options);\r\n button.classList.add('btn-menu-toggle');\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options, onClose);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void, options?: AttachClickOptions, onClose?: () => void) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n closeBtnMenu();\r\n } else {\r\n onOpen && onOpen(e);\r\n openBtnMenu(openedMenu, onClose);\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\n\r\nexport enum PrivacyType {\r\n Everybody = 2,\r\n Contacts = 1,\r\n Nobody = 0\r\n}\r\n\r\nexport class AppPrivacyManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map(inputRule => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacyRulesDetails(rules: PrivacyRule[]) {\r\n const types: PrivacyType[] = [];\r\n\r\n type peers = {users: UserId[], chats: ChatId[]};\r\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\r\n rules.forEach(rule => {\r\n switch(rule._) {\r\n case 'privacyValueAllowAll':\r\n types.push(2);\r\n break;\r\n case 'privacyValueDisallowAll':\r\n types.push(0);\r\n break;\r\n case 'privacyValueAllowContacts': \r\n types.push(1);\r\n break;\r\n /* case 'privacyValueDisallowContacts':\r\n types.push('Except My Contacts');\r\n break; */\r\n case 'privacyValueAllowChatParticipants':\r\n allowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueAllowUsers':\r\n allowPeers.users.push(...rule.users);\r\n break;\r\n case 'privacyValueDisallowChatParticipants':\r\n disallowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueDisallowUsers':\r\n disallowPeers.users.push(...rule.users);\r\n break;\r\n }\r\n });\r\n\r\n return {type: types[0], disallowPeers, allowPeers};\r\n }\r\n}\r\n\r\nconst appPrivacyManager = new AppPrivacyManager();\r\nMOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;\r\nexport default appPrivacyManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../lib/appManagers/appPrivacyManager\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey]\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter(r => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n new AppAddMembersTab(options.tab.slider).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = appPrivacyManager.getPrivacy(options.inputKey).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach(k => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map(id => id.toPeerId()));\r\n arr.push(...from.chats.map(id => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', () => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>).forEach(([k, chatKey, usersKey], idx) => {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({_: usersKey, users: splitted.users.map(id => appUsersManager.getUserInput(id))});\r\n }\r\n }\r\n });\r\n }\r\n \r\n appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else if(caption instanceof HTMLElement) {\r\n replaceContent(captionElement, caption);\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach(peerId => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { i18n, LangPackKey } from \"../../../../lib/langPack\";\r\nimport anchorCopy from \"../../../../helpers/dom/anchorCopy\";\r\nimport appUsersManager from \"../../../../lib/appManagers/appUsersManager\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const formatted = '+' + appUsersManager.getSelf().phone;\r\n const captionEl = document.createElement('div');\r\n captionEl.append(\r\n i18n('PrivacyPhoneInfo'), \r\n document.createElement('br'), \r\n document.createElement('br'), \r\n i18n('PrivacyPhoneInfo4'),\r\n document.createElement('br'),\r\n anchorCopy({\r\n mePath: formatted\r\n })\r\n );\r\n\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [captionEl, captionEl, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n }\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { toastNew } from \"../../components/toast\";\nimport { copyTextToClipboard } from \"../clipboard\";\nimport cancelEvent from \"./cancelEvent\";\nimport { attachClickEvent } from \"./clickEvent\";\n\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n if(options.mePath) {\n const href = 'https://t.me/' + options.mePath;\n anchor.href = anchor.innerText = href;\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(anchor.href);\n toastNew({langPackKey: 'LinkCopied'});\n });\n\n return anchor;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: true,\r\n play: true,\r\n width: 160,\r\n height: 160\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n passwordManager.confirmPasswordEmail('' + code)\r\n .then(value => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch(err => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n passwordManager.cancelPasswordEmail().then(value => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n passwordManager.resendPasswordEmail().then(value => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = RichTextProcessor.matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationHintTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../../../helpers/dom/setInnerHTML\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return passwordManager.getState().then(_state => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n setInnerHTML(passwordInputField.label, RichTextProcessor.wrapEmojiText(this.state.hint));\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n passwordManager.check(passwordInputField.value, this.state).then(auth => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = new AppTwoStepVerificationTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport { toast } from \"../../toast\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport findAndSplice from \"../../../helpers/array/findAndSplice\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n apiManager.invokeApi('auth.resetAuthorizations').then(value => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n \r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach(auth => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then(value => {\r\n if(value) {\r\n target.remove();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n section.caption.parentElement.prepend(section.caption);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n section.content.append(list);\r\n\r\n const add = (peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, 'LI');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then(res => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../../../lib/appManagers/appPrivacyManager\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport passwordManager from \"../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport appDraftsManager from \"../../../lib/appManagers/appDraftsManager\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppBlockedUsersTab(this.slider);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = new AppTwoStepVerificationTab(this.slider);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.updateActiveSessions();\r\n }, {once: true});\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice(p => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n appUsersManager.getBlocked().then(res => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n passwordManager.getState().then(state => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyPhoneNumberTab(this.slider).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyLastSeenTab(this.slider).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyProfilePhotoTab(this.slider).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyCallsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyForwardMessagesTab(this.slider).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyAddToGroupsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n appPrivacyManager.getPrivacy(key).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(\r\n numberVisibilityRow.container, \r\n lastSeenTimeRow.container, \r\n photoVisibilityRow.container, \r\n callRow.container, \r\n linkAccountRow.container, \r\n groupChatsAddRow.container\r\n );\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(apiManager.invokeApi('account.getContentSettings').then(settings => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then(drafts => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n apiManager.invokeApi('account.getAuthorizations').then(auths => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\r\n const context = canvas.getContext('2d');\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n return outPixel;\r\n}\r\n\r\nexport function averageColor(imageUrl: string) {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n resolve(averageColorFromCanvas(canvas));\r\n });\r\n });\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n \r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = hexa[0] === '#' ? 1 : 0;\r\n if(hexa.length === (5 + offset)) {\r\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\r\n }\r\n\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map(v => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\nimport { hexToRgb } from \"../../helpers/color\";\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n /* private readonly _curve = [ \n 0, 25, 50, 75, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, \n 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1830, 1860, 1890, 1920, \n 1950, 1980, 2010, 2040, 2070, 2100, 2130, 2160, 2190, 2220, 2250, 2280, 2310, \n 2340, 2370, 2400, 2430, 2460, 2490, 2520, 2550, 2580, 2610, 2630, 2640, 2650, \n 2660, 2670, 2680, 2690, 2700\n ]; */\n private readonly _curve = [\n 0 , 0.25 , 0.50 , 0.75 , 1 , 1.5 , 2 , 2.5 , 3 , 3.5 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ,\n 13 , 14 , 15 , 16 , 17 , 18 , 18.3 , 18.6 , 18.9 , 19.2 , 19.5 , 19.8 , 20.1 , 20.4 , 20.7 ,\n 21.0 , 21.3 , 21.6 , 21.9 , 22.2 , 22.5 , 22.8 , 23.1 , 23.4 , 23.7 , 24.0 , 24.3 , 24.6 ,\n 24.9 , 25.2 , 25.5 , 25.8 , 26.1 , 26.3 , 26.4 , 26.5 , 26.6 , 26.7 , 26.8 , 26.9 , 27 ,\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n { x: 0.80, y: 0.10 },\n { x: 0.60, y: 0.20 },\n { x: 0.35, y: 0.25 },\n { x: 0.25, y: 0.60 },\n { x: 0.20, y: 0.90 },\n { x: 0.40, y: 0.80 },\n { x: 0.65, y: 0.75 },\n { x: 0.75, y: 0.40 }\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n while(shift > 0) {\n positions.push(positions.shift());\n --shift;\n }\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n \n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax,\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n \n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n \n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private drawOnWheel = () => {\n let diff = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n diff = diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n if(diff) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = () => {\n const frames = this._frames;\n const id = frames.shift();\n if(id) {\n this.drawImageData(id);\n }\n \n const leftLength = frames.length;\n if(!leftLength) {\n this._animatingToNextPosition = undefined;\n }\n\n return !!leftLength;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map(color => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d');\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d');\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n \n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition() {\n if(this._colors.length < 2) {\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n \n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n \n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n \n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animate(this.drawNextPositionAnimated);\n }\n\n public scrollAnimate(start?: boolean) {\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","import { ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla } from \"../helpers/color\";\r\nimport attachGrabListeners from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStateManager, { Theme } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach(color => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n \r\n background.id = '2';\r\n background.intensity = 0;\r\n background.slug = '';\r\n background.color = hex.toLowerCase();\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n const color = (background.color || '').split(',')[0];\r\n const isColored = !!color && !background.slug;\r\n \r\n // * set active if type is color\r\n if(isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(color || '#cccccc');\r\n \r\n if(!isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection } from \"..\";\r\nimport { averageColor, averageColorFromCanvas } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport deferredPromise from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { requestFile } from \"../../../helpers/files\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport ChatBackgroundGradientRenderer from \"../../chat/gradientRenderer\";\r\nimport { AccountWallPapers, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager, { DownloadBlob } from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appPhotosManager from \"../../../lib/appManagers/appPhotosManager\";\r\nimport appStateManager, { Theme, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\n\r\nlet uploadTempId = 0;\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private theme: Theme;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n private wallpapersByElement: Map = new Map();\r\n private elementsByKey: Map = new Map();\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n new AppBackgroundColorTab(this.slider).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', () => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n const wallpaper = this.wallpapersByElement.get(active);\r\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\r\n return;\r\n }\r\n \r\n this.setBackgroundDocument(wallpaper);\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\r\n const wallpapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallpapers.forEach((wallpaper) => {\r\n this.addWallPaper(wallpaper);\r\n });\r\n\r\n //console.log(accountWallpapers);\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(file => {\r\n const id = 'wallpaper-upload-' + ++uploadTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: 'full',\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = appDocsManager.saveDoc(document);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = URL.createObjectURL(file);\r\n\r\n let wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n const upload = appDownloadManager.upload(file, file.name);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = upload.addNotifyListener;\r\n deferred.cancel = upload.cancel;\r\n\r\n upload.then(inputFile => {\r\n apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n }\r\n }).then(_wallpaper => {\r\n const newDoc = (_wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const newCacheContext = appDownloadManager.getCacheContext(newDoc);\r\n Object.assign(newCacheContext, cacheContext);\r\n\r\n wallpaper = _wallpaper as WallPaper.wallPaper;\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n this.setBackgroundDocument(wallpaper).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n }, deferred.reject);\r\n\r\n const key = this.getWallpaperKey(wallpaper);\r\n deferred.then(() => {\r\n this.clicked.delete(key);\r\n }, (err) => {\r\n container.remove();\r\n //console.error('i saw the body drop', err);\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallpaper, false);\r\n this.clicked.add(key);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find(t => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private getColorsFromWallpaper(wallpaper: WallPaper) {\r\n return wallpaper.settings ? [\r\n wallpaper.settings.background_color,\r\n wallpaper.settings.second_background_color,\r\n wallpaper.settings.third_background_color,\r\n wallpaper.settings.fourth_background_color\r\n ].filter(Boolean).map(color => '#' + color.toString(16)).join(',') : '';\r\n }\r\n\r\n private getWallpaperKey(wallpaper: WallPaper) {\r\n return '' + wallpaper.id;\r\n }\r\n\r\n private getWallpaperKeyFromTheme(theme: Theme) {\r\n return '' + theme.background.id;\r\n }\r\n\r\n private addWallPaper(wallpaper: WallPaper, append = true) {\r\n const colors = this.getColorsFromWallpaper(wallpaper);\r\n const hasFile = wallpaper._ === 'wallPaper';\r\n if((hasFile && wallpaper.pFlags.pattern && !colors)/* || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\r\n return;\r\n }\r\n\r\n const isDark = !!wallpaper.pFlags.dark;\r\n\r\n const doc: MyDocument = hasFile ? (wallpaper.document = appDocsManager.saveDoc(wallpaper.document)) : undefined;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n container.dataset.id = '' + wallpaper.id;\r\n\r\n const key = this.getWallpaperKey(wallpaper);\r\n this.wallpapersByElement.set(container, wallpaper);\r\n this.elementsByKey.set(key, container);\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n let wrapped: ReturnType, size: PhotoSize;\r\n if(hasFile) {\r\n size = appPhotosManager.choosePhotoSize(doc, 200, 200);\r\n wrapped = wrapPhoto({\r\n photo: doc,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: size,\r\n noFadeIn: wallpaper.pFlags.pattern\r\n });\r\n\r\n (wrapped.loadPromises.thumb || wrapped.loadPromises.full).then(() => {\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n\r\n if(wallpaper.pFlags.pattern) {\r\n media.classList.add('is-pattern');\r\n \r\n if(isDark) {\r\n wrapped.images.full.style.display = 'none';\r\n if(wrapped.images.thumb) {\r\n wrapped.images.thumb.style.display = 'none';\r\n }\r\n } else if(wallpaper.settings?.intensity) {\r\n wrapped.images.full.style.opacity = '' + Math.abs(wallpaper.settings.intensity) / 100;\r\n }\r\n }\r\n } else {\r\n container.append(media);\r\n }\r\n\r\n if(wallpaper.settings && wallpaper.settings.background_color !== undefined) {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\r\n canvas.classList.add('background-colors-canvas');\r\n \r\n if(isDark && hasFile) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n wrapped.loadPromises.full.then(() => {\r\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\r\n canvas.style.opacity = '' + Math.abs(wallpaper.settings.intensity) / 100;\r\n media.append(canvas);\r\n });\r\n } else {\r\n media.append(canvas);\r\n }\r\n }\r\n\r\n if(this.getWallpaperKeyFromTheme(this.theme) === key) {\r\n container.classList.add('active');\r\n }\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const wallpaper = this.wallpapersByElement.get(target);\r\n if(wallpaper._ === 'wallPaperNoFile') {\r\n this.setBackgroundDocument(wallpaper);\r\n return;\r\n }\r\n \r\n const key = this.getWallpaperKey(wallpaper);\r\n if(this.clicked.has(key)) return;\r\n this.clicked.add(key);\r\n \r\n const doc = wallpaper.document as MyDocument;\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const load = () => {\r\n const promise = this.setBackgroundDocument(wallpaper);\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then(response => {\r\n appDownloadManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (wallpaper: WallPaper) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const doc = (wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const deferred = deferredPromise();\r\n let download: Promise | DownloadBlob;\r\n if(doc) {\r\n download = appDocsManager.downloadDoc(doc, appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0);\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n } else {\r\n download = Promise.resolve();\r\n }\r\n\r\n download.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url?: string) => {\r\n //const perf = performance.now();\r\n let getPixelPromise: Promise;\r\n if(url && !this.theme.background.color) {\r\n getPixelPromise = averageColor(url);\r\n } else {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(this.getColorsFromWallpaper(wallpaper));\r\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\r\n }\r\n\r\n getPixelPromise.then((pixel) => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n \r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n // const hsla = 'rgba(0, 0, 0, 0.3)';\r\n //console.log(doc, hsla, performance.now() - perf);\r\n\r\n const slug = (wallpaper as WallPaper.wallPaper).slug ?? '';\r\n background.id = wallpaper.id;\r\n background.intensity = wallpaper.settings?.intensity ?? 0;\r\n background.color = this.getColorsFromWallpaper(wallpaper);\r\n background.slug = slug;\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n if(slug) {\r\n this.saveToCache(slug, url);\r\n }\r\n\r\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\r\n });\r\n };\r\n\r\n if(!doc) {\r\n onReady();\r\n return;\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\r\n promise.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(canvas.toDataURL());\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const target = this.elementsByKey.get(this.getWallpaperKeyFromTheme(this.theme));\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from \".\";\r\nimport appStickersManager, { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../misc\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { toastNew } from \"../toast\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return appStickersManager.getStickerSet(this.stickerSetInput).then(set => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n setInnerHTML(this.h6, RichTextProcessor.wrapEmojiText(set.set.title));\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from \"./eachTimeout\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from \"../environment/ctx\";\nimport noop from \"./noop\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SettingSection } from \"..\";\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\nimport RadioField from \"../../radioField\";\nimport Row, { RadioFormFromRows } from \"../../row\";\nimport SliderSuperTab from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n appReactionsManager.getQuickReaction(),\n appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter(reaction => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction === quickReaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n appReactionsManager.setDefaultReaction(value);\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection, SettingSection } from \"..\";\r\nimport RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport appStateManager, { State } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { wrapStickerSetThumb, wrapStickerToRow } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport IS_GEOLOCATION_SUPPORTED from \"../../../environment/geolocationSupport\";\r\nimport appReactionsManager from \"../../../lib/appManagers/appReactionsManager\";\r\nimport AppQuickReactionTab from \"./quickReaction\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n public valueContainer: HTMLElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(\r\n name: LangPackKey, \r\n step: number, \r\n initialValue: number, \r\n minValue: number, \r\n maxValue: number,\r\n writeValue = true\r\n ) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = this.valueContainer = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n\r\n if(writeValue) {\r\n valueDiv.innerHTML = '' + initialValue;\r\n }\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step, \r\n min: minValue, \r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n if(writeValue) {\r\n //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n new AppBackgroundTab(this.slider).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers', \r\n name, \r\n value: 'kilometers', \r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles', \r\n stateKey\r\n })\r\n });\r\n \r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'], \r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey, \r\n name, \r\n value: format, \r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString(\"en-us-u-hc-\" + format, {\r\n hour: '2-digit', \r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map(row => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\r\n\r\n const reactionsRow = new Row({\r\n titleLangKey: 'DoubleTapSetting',\r\n havePadding: true,\r\n clickable: () => {\r\n new AppQuickReactionTab(this.slider).open();\r\n }\r\n });\r\n\r\n const renderQuickReaction = () => {\r\n Promise.resolve(appReactionsManager.getQuickReaction()).then(reaction => {\r\n wrapStickerToRow({\r\n row: reactionsRow,\r\n doc: reaction.static_icon,\r\n size: 'small'\r\n });\r\n });\r\n };\r\n\r\n renderQuickReaction();\r\n\r\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const stickersContent = section.generateContentElement();\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n stickersContent[method](row.container);\r\n };\r\n\r\n appStickersManager.getAllStickers().then(allStickers => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n section.content.append(reactionsRow.container, suggestCheckboxField.label, loopCheckboxField.label);\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { generateSection, SettingSection } from \"..\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: 70\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n });\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = appUsersManager.getSelf();\r\n\r\n const userFull = await appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = peerIds.map(peerId => appPeersManager.getInputPeerById(peerId));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter(peerId => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.dialogsByFilters.set(filter, new Set(appMessagesManager.dialogsStorage.getFolderDialogs(filter.id).map(d => d.peerId)));\r\n }\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await appUsersManager.getContacts();\r\n peerIds.forEach(peerId => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: this.selector.scrollable,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n setInnerHTML(span, RichTextProcessor.wrapEmojiText(filter.title));\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach(el => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n /////////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container, \r\n onChange: this.onSelectChange, \r\n peerType: ['dialogs'], \r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats'\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport InputField from \"../../inputField\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, i18n_, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport deepEqual from \"../../../helpers/object/deepEqual\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\nimport documentFragmentToHTML from \"../../../helpers/dom/documentFragmentToHTML\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n appMessagesManager.filtersStorage.updateDialogFilter(this.filter, true).then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach(o => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = appMessagesManager.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = appMessagesManager.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch(err => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = documentFragmentToHTML(RichTextProcessor.wrapDraftText(filter.title));\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(key => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList();\r\n\r\n let peers = filter[key];\r\n\r\n // filter peers where we're kicked\r\n const hasPeer = (peerId: PeerId) => {\r\n return !!appMessagesManager.getDialogOnly(peerId) || (peerId.isUser() ? appUsersManager.getUser(peerId.toUserId())._ === 'user' : false);\r\n };\r\n \r\n forEachReverse(peers, (peerId, idx, arr) => {\r\n if(!hasPeer(peerId)) {\r\n arr.splice(idx, 1);\r\n }\r\n });\r\n\r\n peers = peers.slice();\r\n\r\n const renderMore = (_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n if(peerId.isUser() ? false : !appMessagesManager.getDialogOnly(peerId)) {\r\n continue;\r\n }\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: ul,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach(el => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') {\r\n this.setFilter(this.originalFilter, true);\r\n this.onEditOpen();\r\n } else {\r\n this.onCreateOpen();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport cancelEvent from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private renderFolder(dialogFilter: DialogFilterSuggested | DialogFilter | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: DialogFilter | MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach(key => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n for(const dialog of folder) {\r\n if(appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, () => {\r\n new AppEditFolderTab(this.slider).open(appMessagesManager.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, () => {\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n new AppEditFolderTab(this.slider).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return apiManager.invokeApi('messages.getSuggestedDialogFilters').then(suggestedFilters => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach(el => el.remove());\r\n\r\n suggestedFilters.forEach(filter => {\r\n const div = this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n appMessagesManager.filtersStorage.createDialogFilter(f, true).then(bool => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport appStateManager from \"../../../lib/appManagers/appStateManager\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = () => {\r\n const muted = appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === appNotificationsManager.isMuted(notifySettings) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? 0x7FFFFFFF : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n appNotificationsManager.getContactSignUpNotification().then(enabled => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then(langPack => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { addCancelButton } from \"./popups\";\nimport PopupPeer, { PopupPeerOptions } from \"./popups/peer\";\n\n// type PopupConfirmationOptions = Pick;\ntype PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\n };\n\n const buttons = addCancelButton([button]);\n const cancelButton = buttons.find(button => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes = checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SettingSection } from \"../..\";\nimport { LangPackKey } from \"../../../../lib/langPack\";\nimport CheckboxField from \"../../../checkboxField\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts', \n name: 'contacts',\n stateKey: key + 'contacts',\n withRipple: true\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats', \n name: 'private',\n stateKey: key + 'private',\n withRipple: true\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats', \n name: 'groups',\n stateKey: key + 'groups',\n withRipple: true\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels', \n name: 'channels',\n stateKey: key + 'channels',\n withRipple: true\n });\n\n section.content.append(\n contactsCheckboxField.label, \n privateCheckboxField.label, \n groupsCheckboxField.label, \n channelsCheckboxField.label\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle');\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from \"../../../../helpers/formatBytes\";\nimport debounce from \"../../../../helpers/schedulers/debounce\";\nimport appStateManager from \"../../../../lib/appManagers/appStateManager\";\nimport I18n from \"../../../../lib/langPack\";\nimport rootScope from \"../../../../lib/rootScope\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { RangeSettingSelector } from \"../generalSettings\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle');\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle');\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SettingSection } from \"..\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport formatBytes from \"../../../helpers/formatBytes\";\nimport copy from \"../../../helpers/object/copy\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport appStateManager, { AutoDownloadPeerTypeSettings, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\nimport { FormatterArguments, i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport Button from \"../../button\";\nimport CheckboxField from \"../../checkboxField\";\nimport confirmationPopup from \"../../confirmationPopup\";\nimport Row from \"../../row\";\nimport { SliderSuperTabEventable, SliderSuperTabEventableConstructable } from \"../../sliderTab\";\nimport AppAutoDownloadFileTab from \"./autoDownload/file\";\nimport AppAutoDownloadPhotoTab from \"./autoDownload/photo\";\nimport AppAutoDownloadVideoTab from \"./autoDownload/video\";\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n protected async init() {\n this.header.classList.add('with-border');\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await appStateManager.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia', \n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n withRipple: true\n });\n\n const onChange = () => {\n toggleDisability([resetButton], \n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) && \n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo, /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = new tabConstructor(this.slider, true);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n \n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n }\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n }\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n }\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n rootScope.settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n rootScope.settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('settings_updated', {key: 'settings', value: rootScope.settings});\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach(row => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n \n appStateManager.pushToState('settings', settings);\n rootScope.dispatchEvent('settings_updated', {key: 'settings', value: settings});\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoCheckboxField.label,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n \n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n const gifsCheckboxField = new CheckboxField({\n text: 'AutoplayGIF', \n name: 'gifs', \n stateKey: 'settings.autoPlay.gifs',\n withRipple: true\n });\n const videosCheckboxField = new CheckboxField({\n text: 'AutoplayVideo', \n name: 'videos', \n stateKey: 'settings.autoPlay.videos',\n withRipple: true\n });\n\n section.content.append(gifsCheckboxField.label, videosCheckboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey, args: FormatterArguments = [];\n \n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map(key => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n \n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map(key => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n \n replaceContent(row.subtitle, i18n(key, args));\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport Button from \"../../button\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport AppGeneralSettingsTab from \"./generalSettings\";\r\nimport AppEditProfileTab from \"./editProfile\";\r\nimport AppChatFoldersTab from \"./chatFolders\";\r\nimport AppNotificationsTab from \"./notifications\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport AppDataAndStorageTab from \"./dataAndStorage\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport PeerProfile from \"../../peerProfile\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SliderSuperTabConstructable } from \"../../sliderTab\";\r\nimport PopupAvatar from \"../../popups/avatar\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { AccountAuthorizations, Authorization } from \"../../../layer\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n storage: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n } = {} as any;\r\n private profile: PeerProfile;\r\n\r\n private languageRow: Row;\r\n private devicesRow: Row;\r\n\r\n private authorizations: Authorization.authorization[];\r\n private getAuthorizationsPromise: Promise;\r\n\r\n protected init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.buttons.edit = ButtonIcon('edit');\r\n\r\n this.header.append(this.buttons.edit, btnMenu);\r\n\r\n this.profile = new PeerProfile(this.scrollable, this.listenerSetter, false);\r\n this.profile.init();\r\n this.profile.setPeer(rootScope.myId);\r\n this.profile.fillProfileElements();\r\n\r\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\r\n changeAvatarBtn.addEventListener('click', () => {\r\n const canvas = document.createElement('canvas');\r\n new PopupAvatar().open(canvas, (upload) => {\r\n upload().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n });\r\n });\r\n });\r\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\r\n \r\n const updateChangeAvatarBtn = () => {\r\n const user = appUsersManager.getSelf();\r\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\r\n };\r\n \r\n updateChangeAvatarBtn();\r\n this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\r\n if(rootScope.myId === peerId) {\r\n updateChangeAvatarBtn();\r\n }\r\n });\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n \r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n \r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const b: [string, LangPackKey, SliderSuperTabConstructable][] = [\r\n ['unmute', 'AccountSettings.Notifications', AppNotificationsTab],\r\n ['data', 'DataSettings', AppDataAndStorageTab],\r\n ['lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab],\r\n ['settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab],\r\n ['folder', 'AccountSettings.Filters', AppChatFoldersTab],\r\n ];\r\n\r\n const rows = b.map(([icon, langPackKey, tabConstructor]) => {\r\n return new Row({\r\n titleLangKey: langPackKey,\r\n icon,\r\n clickable: () => {\r\n new tabConstructor(this.slider, true).open();\r\n }\r\n });\r\n });\r\n\r\n rows.push(\r\n this.devicesRow = new Row({\r\n titleLangKey: 'Devices',\r\n titleRightSecondary: ' ',\r\n icon: 'activesessions',\r\n clickable: async() => {\r\n if(!this.authorizations) {\r\n await this.updateActiveSessions();\r\n }\r\n\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.authorizations = undefined;\r\n this.updateActiveSessions(true);\r\n }, {once: true});\r\n tab.open();\r\n }\r\n }),\r\n\r\n this.languageRow = new Row({\r\n titleLangKey: 'AccountSettings.Language',\r\n titleRightSecondary: i18n('LanguageName'),\r\n icon: 'language',\r\n clickable: () => {\r\n new AppLanguageTab(this.slider).open();\r\n }\r\n })\r\n );\r\n\r\n buttonsDiv.append(...rows.map(row => row.container));\r\n\r\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\r\n // profileSection.content.append(this.profile.element);\r\n\r\n const buttonsSection = new SettingSection();\r\n buttonsSection.content.append(buttonsDiv);\r\n\r\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\r\n\r\n /* rootScope.$on('user_auth', (e) => {\r\n this.fillElements();\r\n }); */\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = new AppEditProfileTab(this.slider);\r\n tab.open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n private getAuthorizations(overwrite?: boolean) {\r\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\r\n\r\n const promise = this.getAuthorizationsPromise = apiManager.invokeApi('account.getAuthorizations')\r\n .finally(() => {\r\n if(this.getAuthorizationsPromise === promise) {\r\n this.getAuthorizationsPromise = undefined;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public updateActiveSessions(overwrite?: boolean) {\r\n return this.getAuthorizations(overwrite).then(auths => {\r\n this.authorizations = auths.authorizations;\r\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length && \r\n !this.channelNameInputField.input.classList.contains('error') && \r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChannel({\r\n title, \r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n new AppAddMembersTab(this.slider).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = RichTextProcessor.getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n new PopupCreateContact();\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n const isContact = appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList();\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach(el => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n appUsersManager.getContactsPeerIds(query, undefined, 'online').then(contacts => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId = 1;\n private wasFilterId: number;\n\n init() {\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, AppArchivedTab.filterId).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.wasFilterId = appDialogsManager.filterId;\n appDialogsManager.setFilterId(AppArchivedTab.filterId);\n appDialogsManager.onTabChange();\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterId(this.wasFilterId);\n appDialogsManager.onTabChange();\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport AppNewGroupTab from \"./newGroup\";\r\nimport { toast } from \"../../toast\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport type { LazyLoadQueueIntersector } from \"../../lazyLoadQueue\";\r\nimport { i18n, join, _i18n } from \"../../../lib/langPack\";\r\nimport rootScope from '../../../lib/rootScope';\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport SortedUserList from \"../../sortedUserList\";\r\nimport { PeerLocated, Update, Updates } from \"../../../layer\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport { SettingChatListSection } from \"..\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueueIntersector;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n protected init() {\r\n this.container.classList.add('people-nearby-container');\r\n this.setTitle('PeopleNearby');\r\n\r\n this.errorCategory = document.createElement('div');\r\n this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n const emoji = '🧭';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n stickerContainer.classList.add('sticker-container');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 86,\r\n height: 86,\r\n emoji,\r\n needUpscale: true\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n this.locatedPeers = new Map();\r\n\r\n const m = () => {\r\n const sortedUserList = new SortedUserList({\r\n avatarSize: 42, \r\n createChatListOptions: {\r\n dialogSize: 48,\r\n new: true\r\n },\r\n autonomous: false,\r\n onUpdate: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n const elements: HTMLElement[] = [\r\n this.parseDistance(peer.distance)\r\n ];\r\n\r\n if(!element.id.isUser()) {\r\n elements.push(appProfileManager.getChatMembersString(element.id.toChatId()));\r\n }\r\n\r\n element.dom.lastMessageSpan.textContent = '';\r\n element.dom.lastMessageSpan.append(...join(elements, false));\r\n },\r\n getIndex: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n return 0x7FFFFFFF - peer.distance;\r\n }\r\n });\r\n\r\n appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n \r\n return sortedUserList;\r\n };\r\n \r\n const peopleSection = this.peopleSection = new SettingChatListSection({\r\n name: 'PeopleNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const chatsSection = this.chatsSection = new SettingChatListSection({\r\n name: 'ChatsNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const btnMakeVisible = peopleSection.makeButton({\r\n text: 'MakeMyselfVisible',\r\n icon: 'location'\r\n });\r\n\r\n const btnMakeInvisible = peopleSection.makeButton({\r\n text: 'StopShowingMe',\r\n icon: 'location'\r\n });\r\n\r\n const btnCreateGroup = chatsSection.makeButton({\r\n text: 'NearbyCreateGroup',\r\n icon: 'newgroup'\r\n });\r\n\r\n attachClickEvent(btnMakeVisible, () => {\r\n confirmationPopup({\r\n titleLangKey: 'MakeMyselfVisibleTitle',\r\n descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n button: {\r\n langKey: 'OK'\r\n }\r\n }).then(() => {\r\n this.startWatching();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnMakeInvisible, () => {\r\n this.stopWatching();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnCreateGroup, () => {\r\n new AppNewGroupTab(this.slider).open([], true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n btnMakeVisible.classList.add('primary');\r\n btnMakeInvisible.classList.add('danger');\r\n btnCreateGroup.classList.add('primary');\r\n\r\n this.content.append(this.retryBtn);\r\n this.scrollable.append(\r\n stickerContainer,\r\n caption,\r\n peopleSection.container,\r\n chatsSection.container,\r\n this.errorCategory\r\n );\r\n }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach(peer => {\r\n const peerId = appPeersManager.getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = \"No groups or channels found around you.\";\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = \"Location permission denied. Click below to retry.\";\r\n } else {\r\n this.errorCategory.innerHTML = \"An error has occurred. Please retry later clicking the button below.\";\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p)\r\n * (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport I18n, { FormatterArguments, i18n, i18n_, LangPackKey } from \"../../lib/langPack\";\nimport AppPeopleNearbyTab from \"./tabs/peopleNearby\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { attachClickEvent, CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport { closeBtnMenu } from \"../misc\";\nimport ButtonIcon from \"../buttonIcon\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport IS_GEOLOCATION_SUPPORTED from \"../../environment/geolocationSupport\";\nimport type SortedUserList from \"../sortedUserList\";\nimport Button, { ButtonOptions } from \"../button\";\nimport noop from \"../../helpers/noop\";\nimport ripple from \"../ripple\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport AvatarElement from \"../avatar\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n //private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n \n public archivedCount: HTMLSpanElement;\n\n private newBtnMenu: HTMLElement;\n\n //private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n new AppAddMembersTab(this).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n new AppNewGroupTab(this).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n new AppContactsTab(this).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: ButtonMenuItemOptions & {verify?: () => boolean} = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n new AppArchivedTab(this).open();\n },\n verify: () => {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: rootScope.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', () => {\n rootScope.settings.theme = themeCheckboxField.input.checked ? 'night' : 'day';\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(rootScope.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n new AppPeopleNearbyTab(this).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n new AppSettingsTab(this).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, (e) => {\n filteredButtons.forEach(button => {\n if(button.verify) {\n button.element.classList.toggle('hide', !button.verify());\n }\n });\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n new AppNewChannelTab(this).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n // this.updateBtn.classList.add('btn-update');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\n\n attachClickEvent(this.updateBtn, () => {\n location.reload();\n });\n \n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n appStateManager.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-30');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach(el => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then(dialogs => dialogs.map(d => d.peerId)),\n appMessagesManager.getConversations(value).promise.then(({dialogs}) => dialogs.map(d => d.peerId)),\n appUsersManager.getContactsPeerIds(value, true)\n ]).then(results => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach(peerId => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach(dateData => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, 'LI') as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n \n appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n appStateManager.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n appStateManager.getState().then(state => {\n this.searchGroups.recent.clear();\n \n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n appStateManager.releaseSinglePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n appStateManager.pushToState('recentSearch', recentSearch);\n });\n });\n });\n }\n}\n\nexport type SettingSectionOptions = {\n name?: LangPackKey, \n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n if(options.caption) {\n const caption = this.caption = this.generateContentElement();\n caption.classList.add(className + '-caption');\n container.append(caption);\n\n if(options.caption !== true) {\n i18n_({element: caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\r\n\r\ntype Group = {bubble: HTMLElement, mid: number, timestamp: number}[];\r\ntype BubbleGroup = {timestamp: number, fromId: PeerId, mid: number, group: Group};\r\nexport default class BubbleGroups {\r\n private bubbles: Array = []; // map to group\r\n private detailsMap: Map = new Map();\r\n private groups: Array = [];\r\n //updateRAFs: Map = new Map();\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeBubble(bubble: HTMLElement) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n if(details.group.length) {\r\n findAndSplice(details.group, d => d.bubble === bubble);\r\n if(!details.group.length) {\r\n indexOfAndSplice(this.groups, details.group);\r\n } else {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n this.detailsMap.delete(bubble);\r\n }\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n details.mid = mid;\r\n }\r\n }\r\n \r\n addBubble(bubble: HTMLElement, message: MyMessage, reverse: boolean) {\r\n //return;\r\n\r\n const timestamp = message.date;\r\n const mid = message.mid;\r\n let fromId = message.viaBotId || message.fromId;\r\n let group: Group;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as any).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n \r\n // try to find added\r\n this.removeBubble(bubble);\r\n \r\n const insertObject = {bubble, mid, timestamp};\r\n if(this.bubbles.length) {\r\n let foundBubble: BubbleGroup;\r\n let foundAtIndex = -1;\r\n for(let i = 0; i < this.bubbles.length; ++i) {\r\n const bubble = this.bubbles[i];\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n const good = bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n\r\n if(good) {\r\n foundAtIndex = i;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n break;\r\n }\r\n } else {\r\n foundAtIndex = -1;\r\n }\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n if(mid > bubble.mid) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(foundAtIndex !== -1) {\r\n foundBubble = this.bubbles[foundAtIndex];\r\n }\r\n /* const foundBubble = this.bubbles.find(bubble => {\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n return bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n }); */\r\n\r\n if(!foundBubble) this.groups.push(group = [insertObject]);\r\n else {\r\n group = foundBubble.group;\r\n \r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < group.length; ++i) {\r\n const _timestamp = group[i].timestamp;\r\n const _mid = group[i].mid;\r\n\r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n group.splice(i, 0, insertObject);\r\n }\r\n } else {\r\n this.groups.push(group = [insertObject]);\r\n }\r\n\r\n //console.log('[BUBBLE]: addBubble', bubble, message.mid, fromId, reverse, group);\r\n\r\n const bubbleGroup = {timestamp, fromId, mid: message.mid, group};\r\n let insertIndex = 0;\r\n for(; insertIndex < this.bubbles.length; ++insertIndex) {\r\n if(this.bubbles[insertIndex].mid < mid) {\r\n break;\r\n }\r\n }\r\n \r\n this.bubbles.splice(insertIndex, 0, {timestamp, fromId, mid: message.mid, group});\r\n this.updateGroup(group);\r\n\r\n this.detailsMap.set(bubble, bubbleGroup);\r\n }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach(object => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n updateGroup(group: Group) {\r\n /* if(this.updateRAFs.has(group)) {\r\n window.cancelAnimationFrame(this.updateRAFs.get(group));\r\n this.updateRAFs.delete(group);\r\n } */\r\n \r\n //this.updateRAFs.set(group, window.requestAnimationFrame(() => {\r\n //this.updateRAFs.delete(group);\r\n \r\n if(!group.length) {\r\n return;\r\n }\r\n \r\n const first = group[0].bubble;\r\n\r\n //console.log('[BUBBLE]: updateGroup', group, first);\r\n \r\n if(group.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n const length = group.length - 1;\r\n for(let i = 1; i < length; ++i) {\r\n const bubble = group[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = group[group.length - 1].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n //}));\r\n }\r\n\r\n updateGroupByMessageId(mid: number) {\r\n const details = this.bubbles.find(g => g.mid === mid);\r\n if(details) {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n cleanup() {\r\n this.bubbles = [];\r\n this.groups = [];\r\n this.detailsMap.clear();\r\n /* for(let value of this.updateRAFs.values()) {\r\n window.cancelAnimationFrame(value);\r\n }\r\n this.updateRAFs.clear(); */\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n const entry = entries\r\n .filter(entry => entry.boundingClientRect.top < entry.rootBounds.top)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n\r\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\r\n }\r\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from \"../../helpers/callbackify\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { MessagePeerReaction, ReactionCount } from \"../../layer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport SetTransition from \"../singleTransition\";\nimport StackedAvatars from \"../stackedAvatars\";\nimport { wrapSticker, wrapStickerAnimation } from \"../wrappers\";\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: ReturnType;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n \n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n \n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const availableReaction = appReactionsManager.getReaction(reactionCount.reaction);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc: availableReaction.center_icon ?? availableReaction.static_icon,\n width: size,\n height: size,\n static: true\n }).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n });\n }\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map(reaction => appPeersManager.getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = !!this.reactionCount.pFlags.chosen) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition(this, 'is-chosen', isChosen, this.isConnected ? 300 : 0);\n }\n }\n\n public fireAroundAnimation() {\n callbackify(appReactionsManager.getReaction(this.reactionCount.reaction), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false\n }) as Promise,\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false\n }).stickerPromise\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n fastRaf(() => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n });\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(remove, 1e3);\n });\n } else {\n remove();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport { Message, ReactionCount } from \"../../layer\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport ReactionElement, { ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT } from \"./reaction\";\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n }\n \n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(message: Message.message, type: ReactionLayoutType, isPlaceholder?: boolean) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.isPlaceholder);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n availableReactionsResult instanceof Promise ? \n reactions.results : \n reactions.results.filter(reactionCount => {\n return appReactionsManager.isReactionActive(reactionCount.reaction);\n })\n ) : [];\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some(reactionCount => reactionCount.reaction === reaction);\n if(!found) {\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && !!reactions.pFlags.can_see_list && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n const reactionElementIdx = this.sorted.findIndex(reactionElement => reactionElement.reactionCount.reaction === reactionCount.reaction);\n let reactionElement = reactionElementIdx !== -1 && this.sorted[reactionElementIdx];\n if(!reactionElement) {\n reactionElement = new ReactionElement();\n reactionElement.init(this.type);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n \n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter(reaction => reaction.reaction === reactionCount.reaction) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== rootScope.peerId) return;\n\n changedResults.forEach(reactionCount => {\n const reactionElement = this.sorted.find(reactionElement => reactionElement.reactionCount.reaction === reactionCount.reaction);\n if(reactionElement) {\n reactionElement.fireAroundAnimation();\n }\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\r\nimport { Message } from \"../../layer\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ripple from \"../ripple\";\r\nimport I18n from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (message) => {\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach(element => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n public stackedAvatars: StackedAvatars;\r\n public text: I18n.IntlElement;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!this.stackedAvatars) {\r\n this.stackedAvatars = new StackedAvatars({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n avatarSize: 30\r\n });\r\n\r\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\r\n }\r\n\r\n leftPart = this.stackedAvatars.container;\r\n\r\n this.stackedAvatars.render(replies.recent_repliers.map(peer => appPeersManager.getPeerId(peer)), this.loadPromises);\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.prepend(leftPart);\r\n }\r\n \r\n if(!this.text) {\r\n this.text = new I18n.IntlElement();\r\n }\r\n\r\n const text = this.text;\r\n if(replies) {\r\n if(replies.replies) {\r\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\r\n } else {\r\n text.compareAndUpdate({key: 'LeaveAComment'});\r\n }\r\n } else {\r\n text.compareAndUpdate({key: 'ViewInChat'});\r\n }\r\n\r\n if(replies) {\r\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n }/* else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n } */\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text.element);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatTime, getFullDate } from \"../../helpers/date\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { Message } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat, { ChatType } from \"./chat\";\nimport ReactionsElement from \"./reactions\";\nimport RepliesElement from \"./replies\";\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType, \n message: Message.message | Message.messageService,\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n \n let editedSpan: HTMLElement, sponsoredSpan: HTMLElement, reactionsElement: ReactionsElement, reactionsMessage: Message.message;\n \n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n let hasReactions: boolean;\n \n let time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n \n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n \n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n \n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, RichTextProcessor.wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n \n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n if(message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n hasReactions = true;\n\n reactionsMessage = appMessagesManager.getGroupsFirstMessage(message);\n\n reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'inline', true);\n reactionsElement.render();\n args.unshift(reactionsElement);\n }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n \n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n if(reactionsElement) {\n const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n _reactionsElement.init(reactionsMessage, 'inline');\n _reactionsElement.render();\n }\n clonedArgs = clonedArgs.map(a => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueueIntersector\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = ({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? chat.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = chat.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n // need to download separately\n if(originalMessage._ === 'messageEmpty') {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n chat.appMessagesManager.wrapSingleMessage(replyToPeerId, message.reply_to_mid);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n originalPeerTitle = new PeerTitle({\n peerId: originalMessage.fromId || originalMessage.fwdFromId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const wrapped = wrapReply(originalPeerTitle, undefined, originalMessage);\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(wrapped);\n } else {\n bubbleContainer.append(wrapped);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport isObject from \"../../helpers/object/isObject\";\nimport validateInitObject from \"../../helpers/object/validateInitObject\";\nimport I18n from \"../langPack\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport appStateManager from \"./appStateManager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then(popEmojis => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then(recentEmojis => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n public indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = appStateManager.getState().then(state => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = RichTextProcessor.fixEmoji(emoji);\n this.getRecentEmojis().then(recent => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n appStateManager.pushToState('recentEmoji', recent);\n rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n\nconst appEmojiManager = new AppEmojiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appEmojiManager = appEmojiManager);\nexport default appEmojiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport cancelEvent from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport pause from \"../../../helpers/schedulers/pause\";\nimport appEmojiManager from \"../../../lib/appManagers/appEmojiManager\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../misc\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport IS_TOUCH_SUPPORTED from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\nimport Emoji from \"../../../config/emoji\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = RichTextProcessor.wrapSingleEmoji(emoji);\n } else {\n emoji = RichTextProcessor.fixEmoji(emoji);\n kek = RichTextProcessor.wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach(c => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach(unified => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n appEmojiManager.getRecentEmojis().then(recent => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map(category => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = RichTextProcessor.fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\n\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport { LazyLoadQueueRepeat2 } from \"./lazyLoadQueue\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n\r\n constructor(private element: HTMLElement, private group: string, private scrollable: Scrollable, attach = true) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter(p => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const promise = this.scrollPromise.then(() => {\r\n const res = wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n\r\n const willBeAPoster = !!gotThumb;\r\n let img: HTMLImageElement;\r\n if(willBeAPoster) {\r\n img = new Image();\r\n img.classList.add('media-poster');\r\n\r\n if(!gotThumb.cacheContext.url) {\r\n gotThumb.promise.then(() => {\r\n img.src = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n const afterRender = () => {\r\n if(img) {\r\n div.append(img);\r\n div.style.opacity = '';\r\n }\r\n };\r\n\r\n (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appDocsManager, {MyDocument} from \"../../../lib/appManagers/appDocsManager\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n apiManager.invokeApi('messages.getSavedGifs', {hash: '0'}).then((res) => {\r\n //console.log('getSavedGifs res:', res);\r\n\r\n if(res._ === 'messages.savedGifs') {\r\n res.gifs.forEach((doc, idx) => {\r\n res.gifs[idx] = doc = appDocsManager.saveDoc(doc);\r\n //if(doc._ === 'documentEmpty') return;\r\n masonry.add(doc as MyDocument);\r\n });\r\n }\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue, { LazyLoadQueueRepeat } from \"../../lazyLoadQueue\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(private regularLazyLoadQueue: LazyLoadQueue, private group: string) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.animated) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.animated,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach(player => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n });\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: DocumentFragment | string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n if(typeof(categoryTitle) === 'string') titleDiv.innerHTML = categoryTitle;\r\n else titleDiv.append(categoryTitle);\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then(documents => {\r\n documents.forEach(doc => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, RichTextProcessor.wrapEmojiText(set.title), promise.then(stickerSet => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n appStickersManager.getRecentStickers().then(stickers => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter(p => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter(p => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach(el => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { toast } from \"../../components/toast\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\r\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\r\nimport appUsersManager, { MyTopPeer } from \"./appUsersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport rootScope from \"../rootScope\";\r\nimport appDraftsManager from \"./appDraftsManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\n\r\nexport class AppInlineBotsManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return apiManagerProxy.invokeApi('messages.getInlineBotResults', {\r\n bot: appUsersManager.getUserInput(botId),\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then(botResults => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach(result => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[this.generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n public generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\r\n return queryId + '_' + resultId;\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex(topPeer => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n rootScope.dispatchEvent('history_focus', {peerId: botId.toPeerId()});\r\n return appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n rootScope.dispatchEvent('history_focus', {peerId, threadId});\r\n appDraftsManager.setDraft(peerId, threadId, '@' + appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return apiManagerProxy.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n msg_id: appMessagesIdsManager.getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(RichTextProcessor.wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = appDocsManager.getMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = appPhotosManager.getMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n\r\nconst appInlineBotsManager = new AppInlineBotsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appInlineBotsManager = appInlineBotsManager);\r\nexport default appInlineBotsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appInlineBotsManager, { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n appStickersManager.toggleStickerSet(full.set).then(changed => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `
`;\r\n\r\n setInnerHTML(details.firstElementChild, RichTextProcessor.wrapEmojiText(set.title));\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n appStickersManager.getStickerSet(set).then(set => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach(animation => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return appStickersManager.getFeaturedStickers().then(coveredSets => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex(covered => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return appStickersManager.searchStickerSets(query, false).then(coveredSets => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue, { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport pause from \"../../helpers/schedulers/pause\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.emojiTab = new EmojiTab();\n this.stickersTab = new StickersTab();\n this.gifsTab = new GifsTab();\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n new AppStickersTab(appSidebarRight).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n new AppGifsTab(appSidebarRight).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n rootScope.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(\r\n element: HTMLElement, \r\n overflowElement: HTMLElement, \r\n lookForSticky?: boolean, \r\n rect = element.getBoundingClientRect(),\r\n overflowRect = overflowElement.getBoundingClientRect()\r\n) {\r\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowLeft\r\n || rect.left >= overflowRight) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n\n export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat,\n [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { addCancelButton } from \".\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\r\nimport { ChatInvite, Updates } from \"../../layer\";\r\nimport apiUpdatesManager from \"../../lib/appManagers/apiUpdatesManager\";\r\nimport appAvatarsManager from \"../../lib/appManagers/appAvatarsManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { i18n, _i18n } from \"../../lib/langPack\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { toastNew } from \"../toast\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(hash: string, chatInvite: ChatInvite.chatInvite) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n const peerId = chat.id.toPeerId(true);\r\n rootScope.dispatchEvent('history_focus', {peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.header.remove();\r\n\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.classList.add('avatar-100');\r\n avatarElem.isDialog = false;\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n appAvatarsManager.putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n setInnerHTML(title, RichTextProcessor.wrapEmojiText(chatInvite.title));\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from \"../components/scrollable\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport reflowScrollableElement from \"./dom/reflowScrollableElement\";\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n\n /**\n * \n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable, \n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight, \n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n //previousScrollHeight = scrollHeight;\n //previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n //this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n\n /* if(DEBUG) {\n this.log('performHistoryResult: messagesQueueOnRender, scrollTop:', scrollTop, scrollHeight, previousScrollHeightMinusTop);\n } */\n }\n\n public restore(useReflow?: boolean) {\n const {container, scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n if(previousScrollHeightMinusTop === undefined) {\n throw new Error('scroll was not saved');\n }\n\n const scrollHeight = container.scrollHeight;\n if(scrollHeight === this.scrollHeight) {\n return;\n }\n\n this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n \n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop', \n previousScrollHeightMinusTop, scrollHeight, \n newScrollTop, container.container.clientHeight); */\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n \n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n // touchSupport for safari iOS\n //isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n //container.scrollTop = scrollHeight;\n //isTouchSupported && isApple && (container.container.style.overflow = '');\n\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(container);\n }\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n\n return;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n debugger;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport type { AppMessagesManager, HistoryResult, HistoryStorage, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\r\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\r\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport ripple from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { ChatInvite, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, User, WebPage } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection, ScrollStartCallbackDimensions } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport deferredPromise from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport serverTimeManager from \"../../lib/mtproto/serverTimeManager\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast, toastNew } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport debounce, { DebounceReturnType } from \"../../helpers/schedulers/debounce\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport { cancelContextMenuOpening } from \"../misc\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport Button from \"../button\";\r\nimport { CallType } from \"../../lib/calls/types\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport PopupJoinChatInvite from \"../popups/joinChatInvite\";\r\nimport { InternalLink, INTERNAL_LINK_TYPE } from \"../../lib/appManagers/internalLink\";\r\nimport ReactionsElement, { REACTIONS_ELEMENTS } from \"./reactions\";\r\nimport type ReactionElement from \"./reaction\";\r\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport pause from \"../../helpers/schedulers/pause\";\r\nimport ScrollSaver from \"../../helpers/scrollSaver\";\r\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\r\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\r\nimport getViewportSlice from \"../../helpers/dom/getViewportSlice\";\r\nimport SuperIntersectionObserver from \"../../helpers/dom/superIntersectionObserver\";\r\nimport generateFakeIcon from \"../generateFakeIcon\";\r\nimport copyFromElement from \"../../helpers/dom/copyFromElement\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nconst SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\nconst STICKY_OFFSET = 3;\r\nconst SCROLLED_DOWN_THRESHOLD = 300;\r\n\r\nexport default class ChatBubbles {\r\n public bubblesContainer: HTMLDivElement;\r\n private chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n public peerId: PeerId;\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLElement, \r\n firstTimestamp: number, \r\n container: HTMLElement,\r\n timeout?: number \r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: {message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]}[] = [];\r\n private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n private historyStorage: HistoryStorage;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderMid: number;\r\n\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n \r\n private hoverBubble: HTMLElement;\r\n private hoverReaction: HTMLElement;\r\n private sliceViewportDebounced: DebounceReturnType;\r\n private resizeObserver: ResizeObserver;\r\n private willScrollOnLoad: boolean;\r\n private observer: SuperIntersectionObserver;\r\n\r\n // private reactions: Map;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appStickersManager: AppStickersManager, \r\n private appUsersManager: AppUsersManager, \r\n private appInlineBotsManager: AppInlineBotsManager, \r\n private appPhotosManager: AppPhotosManager, \r\n private appPeersManager: AppPeersManager,\r\n private appProfileManager: AppProfileManager,\r\n private appDraftsManager: AppDraftsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appChatsManager: AppChatsManager,\r\n private appReactionsManager: AppReactionsManager,\r\n private appWebPagesManager: AppWebPagesManager\r\n ) {\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.bubblesContainer = document.createElement('div');\r\n this.bubblesContainer.classList.add('bubbles', 'scrolled-down');\r\n\r\n this.chatInner = document.createElement('div');\r\n this.chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n this.bubblesContainer.append(this.scrollable.container);\r\n\r\n // * constructor end\r\n\r\n this.log = this.chat.log;\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // this.reactions = new Map();\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', ({storage, peerId, mid}) => {\r\n if(this.chat.getMessagesStorage() === storage) {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = this.chat.getMessage(mid);\r\n \r\n if(+bubble.dataset.timestamp >= (message.date + serverTimeManager.serverTimeOffset - 1)) {\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n this.setBubblePosition(bubble, message, false);\r\n //this.log('history_update', this.bubbles[mid], mid, message);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n //this.renderMessage(message, false, false, bubble);\r\n }\r\n });\r\n\r\n //this.listenerSetter.add(rootScope)('')\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map(m => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', (e) => {\r\n const {storage, tempId, tempMessage, mid} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.getMessagesStorage() !== storage) {\r\n return;\r\n }\r\n \r\n //this.log('message_sent', e);\r\n\r\n // cannot use it here because new message will be rendered again\r\n // await getHeavyAnimationPromise();\r\n\r\n const mounted = this.getMountedBubble(tempId, tempMessage) || this.getMountedBubble(mid);\r\n if(mounted) {\r\n const message = this.chat.getMessage(mid);\r\n const bubble = mounted.bubble;\r\n //this.bubbles[mid] = bubble;\r\n \r\n /////this.log('message_sent', bubble);\r\n\r\n const reactionsElements = Array.from(bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\r\n if(reactionsElements.length) {\r\n reactionsElements.forEach(reactionsElement => {\r\n reactionsElement.changeMessage(message as Message.message);\r\n });\r\n }\r\n\r\n if(message.replies) {\r\n const repliesElement = bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && message.media.document.thumbs?.length) {\r\n getHeavyAnimationPromise().then(() => {\r\n const timeSpan = div.querySelector('.time');\r\n const newDiv = wrapDocument({message});\r\n div.replaceWith(newDiv);\r\n \r\n if(timeSpan) {\r\n newDiv.querySelector('.document-size').append(timeSpan);\r\n }\r\n });\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(message.grouped_id) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n if(message.media?.poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n const newPoll = message.media.poll;\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', newPoll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = message.media.document.id;\r\n }\r\n }\r\n }\r\n\r\n /* bubble.classList.remove('is-sending');\r\n bubble.classList.add('is-sent');\r\n bubble.dataset.mid = '' + mid;\r\n\r\n this.bubbleGroups.removeBubble(bubble, tempId); */\r\n\r\n if(message.media?.webpage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, false, bubble, false);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n this.renderMessage(mounted.message, true, false, mounted.bubble, false); */\r\n }\r\n \r\n //delete this.bubbles[tempId];\r\n } else {\r\n this.log.warn('message_sent there is no bubble', e);\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n if(bubbles[tempId]) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n delete bubbles[tempId];\r\n\r\n //getHeavyAnimationPromise().then(() => {\r\n fastRaf(() => {\r\n const mid = +bubble.dataset.mid;\r\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\r\n bubble.classList.remove('is-sending', 'is-outgoing');\r\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n //});\r\n\r\n bubble.dataset.mid = '' + mid;\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n //this.log('scheduled timing:', timestamp, maxTimestamp);\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storage, peerId, mid}) => {\r\n // fastRaf(() => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n const message = this.chat.getMessage(mid);\r\n const mounted = message.grouped_id ? this.getGroupedBubble(message.grouped_id) : this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n\r\n const updatePosition = this.chat.type === 'scheduled';\r\n \r\n const scrollSaver = new ScrollSaver(this.scrollable, true);\r\n scrollSaver.save();\r\n this.safeRenderMessage(mounted.message, true, false, mounted.bubble, updatePosition);\r\n scrollSaver.restore();\r\n\r\n if(updatePosition) {\r\n (this.messagesQueuePromise || Promise.resolve()).then(() => {\r\n this.deleteEmptyDateGroups();\r\n });\r\n }\r\n // });\r\n });\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.listenerSetter.add(rootScope)('missed_reactions_element', ({message, changedResults}) => {\r\n if(this.peerId !== message.peerId || !message.reactions || !message.reactions.results.length) {\r\n return;\r\n }\r\n \r\n const bubble = this.getBubbleByMessage(message);\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n if(message.grouped_id) {\r\n const grouped = this.getGroupedBubble(message.grouped_id);\r\n message = grouped.message;\r\n }\r\n\r\n this.appendReactionsElementToBubble(bubble, message, changedResults);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_reactions', (arr) => {\r\n let scrollSaver: ScrollSaver;\r\n\r\n for(const {message, changedResults} of arr) {\r\n if(this.peerId !== message.peerId) {\r\n return;\r\n }\r\n \r\n const bubble = this.getBubbleByMessage(message);\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n if(!scrollSaver) {\r\n scrollSaver = new ScrollSaver(this.scrollable, true);\r\n scrollSaver.save();\r\n }\r\n \r\n const key = message.peerId + '_' + message.mid;\r\n const set = REACTIONS_ELEMENTS.get(key);\r\n if(set) {\r\n for(const element of set) {\r\n element.update(message, changedResults);\r\n }\r\n } else {\r\n rootScope.dispatchEvent('missed_reactions_element', {message, changedResults});\r\n }\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n }\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, groupId, deletedMids}) => {\r\n //fastRaf(() => { // ! can't use delayed smth here, need original bubble to be edited\r\n if(peerId !== this.peerId) return;\r\n const mids = this.appMessagesManager.getMidsByAlbum(groupId);\r\n const renderedId = mids.concat(deletedMids).find(mid => this.bubbles[mid]);\r\n if(!renderedId) return;\r\n\r\n const renderMaxId = getObjectKeysAndSort(this.appMessagesManager.groupedMessagesStorage[groupId], 'asc').pop();\r\n\r\n this.safeRenderMessage(this.chat.getMessage(renderMaxId), true, false, this.bubbles[renderedId], false);\r\n //});\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_downloaded', ({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n getHeavyAnimationPromise().then(() => {\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach(mid => {\r\n /* const promise = (this.scrollable.scrollLocked && this.scrollable.scrollLockedPromise) || Promise.resolve();\r\n promise.then(() => {\r\n \r\n }); */\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n const {mid, replyMid} = this.needUpdate.splice(idx, 1)[0];\r\n \r\n //this.log('messages_downloaded', mid, replyMid, i, this.needUpdate, this.needUpdate.length, mids, this.bubbles[mid]);\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const message = this.chat.getMessage(mid);\r\n \r\n const repliedMessage = this.appMessagesManager.getMessageByPeer(obj.replyToPeerId, replyMid);\r\n if(repliedMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: this.bubblesContainer,\r\n verifyTouchTarget: (e) => {\r\n if(this.chat.selection.isSelecting || !this.chat.canSend()) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n\r\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\r\n if(e.button !== 0) return;\r\n \r\n const code: HTMLElement = findUpTag(e.target, 'CODE');\r\n if(code) {\r\n cancelEvent(e);\r\n copyFromElement(code);\r\n toastNew({langPackKey: 'TextCopied'});\r\n return;\r\n }\r\n });\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE && this.chat.type !== 'pinned') {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n if(this.chat.selection.isSelecting || \r\n !this.chat.canSend()) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n const dateBubble = dateMessage.div;\r\n\r\n // dateMessage.container.classList.add('has-sticky-dates');\r\n\r\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\r\n // if(this.previousStickyDate) {\r\n // dateBubble.classList.add('kek');\r\n // }\r\n\r\n dateBubble.classList.toggle('is-sticky', stuck);\r\n if(stuck) {\r\n this.previousStickyDate = dateBubble;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(this.previousStickyDate) {\r\n // fastRaf(() => {\r\n // this.bubblesContainer.classList.add('has-sticky-dates');\r\n // });\r\n }\r\n });\r\n\r\n if(!IS_SAFARI) {\r\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\r\n }\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced.clearTimeout();\r\n // }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced();\r\n // }\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', ({storage, mid}) => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n const gradientRenderer = this.chat.gradientRenderer;\r\n if(gradientRenderer) {\r\n gradientRenderer.toNextPosition();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.updateUnreadByDialog();\r\n });\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n this.finishPeerChange();\r\n this.chat.input.finishPeerChange();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', (e) => {\r\n if(e.key === 'settings.emoji.big') {\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(!isScrolledDown) {\r\n this.setMessagesQueuePromise();\r\n }\r\n \r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n mids.forEach(mid => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n const message = this.chat.getMessage(mid);\r\n this.safeRenderMessage(message, undefined, false, bubble);\r\n // this.bubbleGroups.addBubble(bubble, message, false);\r\n }\r\n });\r\n\r\n if(isScrolledDown) {\r\n this.scrollable.setScrollTopSilently(99999);\r\n } else {\r\n this.performHistoryResult([], true, false, undefined);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_views', (arr) => {\r\n fastRaf(() => {\r\n let scrollSaver: ScrollSaver;\r\n for(const {peerId, views, mid} of arr) {\r\n if(this.peerId !== peerId) return;\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(postViewsElements.length) {\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach(postViews => {\r\n if(different || postViews.innerHTML !== str) {\r\n if(!scrollSaver) {\r\n scrollSaver = new ScrollSaver(this.scrollable, true);\r\n scrollSaver.save();\r\n }\r\n\r\n different = true;\r\n postViews.innerHTML = str;\r\n }\r\n });\r\n }\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n });\r\n\r\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\r\n\r\n this.listenerSetter.add(rootScope)('chat_changing', ({to}) => {\r\n const freeze = to !== this.chat;\r\n\r\n const cb = () => {\r\n this.observer.toggleObservingNew(freeze);\r\n };\r\n\r\n if(!freeze) {\r\n setTimeout(() => {\r\n cb();\r\n }, 400);\r\n } else {\r\n cb();\r\n }\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n }\r\n\r\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n };\r\n\r\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.chat.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId()),\r\n random_id: sponsoredMessage.random_id\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n private createResizeObserver() {\r\n if(!('ResizeObserver' in window) || this.resizeObserver) {\r\n return;\r\n }\r\n\r\n const container = this.scrollable.container;\r\n let wasHeight = 0/* container.offsetHeight */;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n // let skipNext = true;\r\n\r\n const onResizeEnd = () => {\r\n const height = container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n //this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries: ResizeObserverCallback = (entries) => {\r\n /* if(skipNext) {\r\n skipNext = false;\r\n return;\r\n } */\r\n\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n \r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n\r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n //if(isSafari) { // * fix opening keyboard while ESG is active \r\n part = -realDiff;\r\n //}\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.setScrollTopSilently(needScrollTop);\r\n }\r\n \r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(container);\r\n }\r\n\r\n private destroyResizeObserver() {\r\n const resizeObserver = this.resizeObserver;\r\n if(!resizeObserver) {\r\n return;\r\n }\r\n\r\n resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n private onBubblesMouseMove = (e: MouseEvent) => {\r\n const content = findUpClassName(e.target, 'bubble-content');\r\n if(content && !this.chat.selection.isSelecting) {\r\n const bubble = findUpClassName(content, 'bubble');\r\n if(!this.chat.selection.canSelectBubble(bubble)) {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n let {hoverBubble, hoverReaction} = this;\r\n if(bubble === hoverBubble) {\r\n return;\r\n }\r\n\r\n this.unhoverPrevious();\r\n\r\n hoverBubble = this.hoverBubble = bubble;\r\n hoverReaction = this.hoverReaction;\r\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\r\n if(!hoverReaction) {\r\n hoverReaction = this.hoverReaction = document.createElement('div');\r\n hoverReaction.classList.add('bubble-hover-reaction');\r\n\r\n const stickerWrapper = document.createElement('div');\r\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\r\n hoverReaction.append(stickerWrapper);\r\n\r\n content.append(hoverReaction);\r\n\r\n let message: Message.message = this.chat.getMessage(+bubble.dataset.mid);\r\n message = this.appMessagesManager.getGroupsFirstMessage(message);\r\n\r\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\r\n Promise.all([\r\n this.appReactionsManager.getAvailableReactionsByMessage(message),\r\n pause(400)\r\n ]).then(([availableReactions]) => {\r\n const availableReaction = availableReactions[0];\r\n if(!availableReaction) {\r\n hoverReaction.remove();\r\n return;\r\n }\r\n\r\n wrapSticker({\r\n div: stickerWrapper,\r\n doc: availableReaction.select_animation,\r\n width: 18,\r\n height: 18,\r\n needUpscale: true,\r\n middleware,\r\n group: CHAT_ANIMATION_GROUP,\r\n withThumb: false,\r\n needFadeIn: false\r\n }).then(player => {\r\n assumeType(player);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n player.addEventListener('firstFrame', () => {\r\n if(!middleware()) {\r\n // debugger;\r\n return;\r\n }\r\n\r\n hoverReaction.dataset.loaded = '1';\r\n this.setHoverVisible(hoverReaction, true);\r\n }, {once: true});\r\n\r\n attachClickEvent(hoverReaction, (e) => {\r\n cancelEvent(e); // cancel triggering selection\r\n\r\n this.appReactionsManager.sendReaction(message, availableReaction.reaction);\r\n this.unhoverPrevious();\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n } else if(hoverReaction.dataset.loaded) {\r\n this.setHoverVisible(hoverReaction, true);\r\n }\r\n } else {\r\n this.unhoverPrevious();\r\n }\r\n };\r\n\r\n public setReactionsHoverListeners() {\r\n this.listenerSetter.add(rootScope)('context_menu_toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(rootScope)('overlay_toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.bubblesContainer)('mousemove', this.onBubblesMouseMove);\r\n }\r\n\r\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\r\n SetTransition(hoverReaction, 'is-visible', visible, 200, visible ? undefined : () => {\r\n hoverReaction.remove();\r\n }, 2);\r\n }\r\n\r\n private unhoverPrevious = () => {\r\n const {hoverBubble, hoverReaction} = this;\r\n if(hoverBubble) {\r\n this.setHoverVisible(hoverReaction, false);\r\n this.hoverBubble = undefined;\r\n this.hoverReaction = undefined;\r\n }\r\n };\r\n\r\n public setStickyDateManually() {\r\n return;\r\n\r\n const timestamps = Object.keys(this.dateMessages).map(k => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.observer.unobserve(target, this.unreadedObserverCallback);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = rootScope.idle.focusPromise.then(() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map(i => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max(this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).maxId || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = this.chat.getMessage(mid);\r\n if(this.appMessagesManager.isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = () => {\r\n this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = (e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble) return;\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n new PopupDatePicker(new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const spoiler: HTMLElement = findUpClassName(target, 'spoiler');\r\n if(spoiler) {\r\n const messageDiv = findUpClassName(spoiler, 'message');\r\n\r\n const className = 'is-spoiler-visible';\r\n const isVisible = messageDiv.classList.contains(className);\r\n if(!isVisible) {\r\n cancelEvent(e);\r\n }\r\n\r\n const duration = 400 / 2;\r\n const showDuration = 5000;\r\n const useRafs = !isVisible ? 2 : 0;\r\n if(useRafs) {\r\n messageDiv.classList.add('will-change');\r\n }\r\n\r\n const spoilerTimeout = messageDiv.dataset.spoilerTimeout;\r\n if(spoilerTimeout !== null) {\r\n clearTimeout(+spoilerTimeout);\r\n delete messageDiv.dataset.spoilerTimeout;\r\n }\r\n\r\n SetTransition(messageDiv, className, true, duration, () => {\r\n messageDiv.dataset.spoilerTimeout = '' + window.setTimeout(() => {\r\n SetTransition(messageDiv, className, false, duration, () => {\r\n messageDiv.classList.remove('will-change');\r\n delete messageDiv.dataset.spoilerTimeout;\r\n });\r\n }, showDuration);\r\n }, useRafs);\r\n\r\n return;\r\n }\r\n\r\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\r\n if(reactionElement) {\r\n cancelEvent(e);\r\n if(reactionElement.classList.contains('is-inactive')) {\r\n return;\r\n }\r\n\r\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\r\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\r\n\r\n const message = reactionsElement.getMessage();\r\n this.appReactionsManager.sendReaction(message, reactionCount.reaction);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message = this.appMessagesManager.filterMessages(this.chat.getMessage(bubbleMid), message => !!(message as Message.message).replies)[0] as Message.message;\r\n const replies = message.replies;\r\n if(replies) {\r\n this.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then(message => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion', \r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n\r\n const doc = message.media?.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))\r\n || target.classList.contains('canvas-thumbnail')) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\r\n if(preloader) {\r\n simulateClickEvent(preloader);\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : Object.keys(this.bubbles).map(k => +k).filter(id => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find(e => e.element === this.bubbles[id])) return false;\r\n\r\n const message = this.chat.getMessage(id);\r\n const media = this.appMessagesManager.getMediaFromMessage(message);\r\n \r\n return media && f(media);\r\n }).sort((a, b) => a - b);\r\n\r\n ids.forEach(id => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex(t => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: this.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId, \r\n lastMsgId: replyToMid, \r\n type: this.chat.type, \r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public onGoDownClick() {\r\n if(this.replyFollowHistory.length) {\r\n forEachReverse(this.replyFollowHistory, (mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else {\r\n const message = this.chat.getMessage(mid);\r\n if(!message.deleted) {\r\n bad = false;\r\n }\r\n }\r\n \r\n if(bad) {\r\n this.replyFollowHistory.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n } else {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n }\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public getGroupedBubble(groupId: string) {\r\n const group = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n for(const [mid] of group) {\r\n if(this.bubbles[mid]) {\r\n const maxId = Math.max(...group.keys()); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: +mid,\r\n message: this.chat.getMessage(maxId) as Message.message\r\n };\r\n }\r\n }\r\n }\r\n\r\n public getBubbleByMessage(message: Message.message | Message.messageService) {\r\n if(!(message as Message.message).grouped_id) return this.bubbles[message.mid];\r\n const grouped = this.getGroupedBubble((message as Message.message).grouped_id);\r\n return grouped?.bubble;\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public getMountedBubble(mid: number, message = this.chat.getMessage(mid)) {\r\n if(message.grouped_id && this.appMessagesManager.getMidsByAlbum(message.grouped_id).length > 1) {\r\n const a = this.getGroupedBubble(message.grouped_id);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid, message};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number) {\r\n return this.bubbles[getObjectKeysAndSort(this.bubbles).find(id => {\r\n if(id < mid) return false;\r\n return !!this.bubbles[id]?.parentElement;\r\n })];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(!this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n // some messages can have negative id (such as sponsored message)\r\n const history = Object.keys(this.bubbles)\r\n .map(id => +id)\r\n .sort((a, b) => a - b)\r\n .filter(id => id > 0 && !this.skippedMids.has(id));\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* if(history.length === 75) {\r\n this.log('load more', this.scrollable.scrollHeight, this.scrollable.scrollTop, this.scrollable);\r\n return;\r\n } */\r\n /* false && */this.getHistory(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n \r\n // if scroll down after search\r\n if(history.indexOf(historyStorage.maxId) !== -1) {\r\n this.setLoaded('bottom', true);\r\n return;\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* false && */this.getHistory(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions) => {\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced.clearTimeout();\r\n }\r\n\r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.scrolledDown && !ignoreHeavyAnimation) {\r\n return;\r\n }\r\n } else {\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\r\n }\r\n \r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced();\r\n }\r\n \r\n this.setStickyDateManually();\r\n }\r\n \r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\r\n return;\r\n }\r\n\r\n const distanceToEnd = scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\r\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions) {\r\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n \r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350 + (scrollDimensions?.duration ?? 0));\r\n }\r\n \r\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.bubblesContainer.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.bubblesContainer.classList.contains('scrolled-down')) {\r\n this.bubblesContainer.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n };\r\n\r\n public setScroll() {\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED && false) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public updateUnreadByDialog() {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n this.unreadOut.delete(msgId);\r\n\r\n if(bubble.classList.contains('is-outgoing')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\r\n bubble.classList.add('is-read');\r\n }\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\r\n let deleted = false;\r\n mids.forEach(mid => {\r\n if(!(mid in this.bubbles)) return;\r\n \r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n const bubble = this.bubbles[mid];\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeBubble(bubble);\r\n if(this.observer) {\r\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\r\n this.unreaded.delete(bubble);\r\n\r\n this.observer.unobserve(bubble, this.viewsObserverCallback);\r\n this.viewsMids.delete(mid);\r\n }\r\n //this.unreaded.findAndSplice(mid => mid === id);\r\n bubble.remove();\r\n //bubble.remove();\r\n\r\n if(this.emptyPlaceholderMid === mid) {\r\n this.emptyPlaceholderMid = undefined;\r\n }\r\n\r\n // this.reactions.delete(mid);\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.scrollable.ignoreNextScrollEvent();\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n\r\n if(!ignoreOnScroll) {\r\n this.onScroll();\r\n }\r\n }\r\n\r\n private setTopPadding(middleware = this.getMiddleware()) {\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.setScrollTopSilently(scrollHeight);\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n return {\r\n isPaddingNeeded,\r\n unsetPadding: isPaddingNeeded ? () => {\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n } : undefined\r\n };\r\n }\r\n \r\n public renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(() => {\r\n if(!middleware()) return;\r\n this.renderNewMessagesByIds(mids);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = mids.filter(mid => {\r\n const message = this.chat.getMessage(mid);\r\n const replyTo = message.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter(mid => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble || \r\n this.scrollingToBubble === this.getLastBubble() || \r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\r\n\r\n const promise = this.performHistoryResult(mids, false, true);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n // it will be called only once even if was set multiple times (that won't happen)\r\n promise.then(unsetPadding);\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n }\r\n\r\n public getLastBubble() {\r\n const lastDateGroup = this.getLastDateGroup();\r\n if(lastDateGroup) {\r\n return lastDateGroup.lastElementChild as HTMLElement;\r\n }\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end' && whichChild(bubble) === (this.stickyIntersector ? STICKY_OFFSET : 1)/* && this.chat.setPeerPromise */) {\r\n const dateGroup = bubble.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n let margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n const promise = this.scrollable.scrollIntoViewNew({\r\n element, \r\n position, \r\n margin, \r\n forceDirection, \r\n forceDuration, \r\n axis: 'y', \r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.bubblesContainer.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering,\r\n startCallback: (dimensions) => {\r\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\r\n this.onScroll(true, dimensions);\r\n }\r\n });\r\n\r\n // fix flickering date when opening unread chat and focusing message\r\n if(forceDirection === FocusDirection.Static) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n private getLastDateGroup() {\r\n let lastTime = 0, lastElem: HTMLElement;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n if(dateMessage.firstTimestamp > lastTime) {\r\n lastElem = dateMessage.container;\r\n lastTime = dateMessage.firstTimestamp;\r\n }\r\n }\r\n\r\n return lastElem;\r\n }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\r\n let dateElement: HTMLElement;\r\n \r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n \r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n \r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n\r\n return bubble;\r\n }\r\n\r\n public getDateContainerByMessage(message: any, reverse: boolean) {\r\n const date = new Date(message.date * 1000);\r\n date.setHours(0, 0, 0);\r\n const dateTimestamp = date.getTime();\r\n if(!this.dateMessages[dateTimestamp]) {\r\n const bubble = this.createDateBubble(message.date, date);\r\n // bubble.classList.add('is-sticky');\r\n const fakeBubble = this.createDateBubble(message.date, date);\r\n fakeBubble.classList.add('is-fake');\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble, fakeBubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.observer && this.observer.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.observer && delete this.observer;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.observer) {\r\n this.observer.disconnect();\r\n\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n\r\n this.viewsMids.clear();\r\n }\r\n\r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.emptyPlaceholderMid = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n // this.reactions.clear();\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n\r\n this.bubblesContainer.classList.remove('has-sticky-dates');\r\n this.scrollable.cancelMeasure();\r\n }\r\n\r\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string): {cached?: boolean, promise: Chat['setPeerPromise']} {\r\n //console.time('appImManager setPeer');\r\n //console.time('appImManager setPeer pre promise');\r\n ////console.time('appImManager: pre render start');\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.peerId = peerId;\r\n this.preloader.detach();\r\n return null;\r\n }\r\n\r\n const samePeer = this.peerId === peerId;\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled' || this.chat.isRestricted) {\r\n lastMsgId = 0;\r\n }\r\n\r\n const historyStorage = this.historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n let topMessage = chatType === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : this.historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let followingUnread: boolean;\r\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId);\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\r\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\r\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\r\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\r\n }\r\n\r\n followingUnread = !isTarget;\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n //lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\r\n\r\n const {scrollable} = this;\r\n \r\n if(samePeer) {\r\n const mounted = this.getMountedBubble(lastMsgId);\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\r\n this.scrollToEnd();\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.chat.apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.peerId = peerId;\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: this.appPeersManager.isAnyGroup(peerId) || this.appUsersManager.isBot(peerId)\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('setPeer peerId:', peerId, this.historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\r\n\r\n /* this.setPeerPromise = null;\r\n this.preloader.detach();\r\n return true; */\r\n\r\n //////appSidebarRight.toggleSidebar(true);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map(mid => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n this.destroyResizeObserver();\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\r\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\r\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const scrollFromDown = !fromUp && samePeer;\r\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\r\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\r\n\r\n let result: ReturnType;\r\n if(!savedPosition) {\r\n result = this.getHistory(lastMsgId, true, isJump, additionMsgId);\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult(savedPosition.mids, true, false, undefined);\r\n }) as any,\r\n cached: true\r\n };\r\n }\r\n\r\n const {promise, cached} = result;\r\n\r\n // clear \r\n if(!cached) {\r\n if(!samePeer) {\r\n scrollable.container.textContent = '';\r\n //oldChatInner.remove();\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam);\r\n this.preloader.attach(this.bubblesContainer);\r\n }\r\n }\r\n\r\n //console.timeEnd('appImManager setPeer pre promise');\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = promise.then(() => {\r\n ////this.log('setPeer removing preloader');\r\n\r\n if(cached) {\r\n if(!samePeer) {\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam); // * костыль\r\n }\r\n }\r\n\r\n this.preloader.detach();\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollPosition = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.setScrollTopSilently(savedPosition.top);\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if(haveToScrollToBubble) {\r\n let unsetPadding: () => void;\r\n if(scrollFromDown) {\r\n scrollable.setScrollTopSilently(99999);\r\n } else if(scrollFromUp) {\r\n const set = this.setTopPadding();\r\n if(set.isPaddingNeeded) {\r\n unsetPadding = set.unsetPadding;\r\n }\r\n\r\n scrollable.setScrollTopSilently(0);\r\n }\r\n\r\n const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n \r\n let promise: Promise;\r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n const lastBubble = this.getLastBubble();\r\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\r\n\r\n if(position === 'end' && lastBubble === bubble && samePeer) {\r\n promise = this.scrollToEnd();\r\n } else {\r\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\r\n }\r\n\r\n if(!followingUnread && isTarget) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n\r\n if(unsetPadding) {\r\n (promise || Promise.resolve()).then(() => {\r\n unsetPadding();\r\n });\r\n }\r\n } else {\r\n scrollable.setScrollTopSilently(99999);\r\n }\r\n\r\n // if(!cached) {\r\n this.onRenderScrollSet();\r\n // }\r\n\r\n this.onScroll();\r\n\r\n const middleware = this.getMiddleware();\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n\r\n // if(cached) {\r\n // this.onRenderScrollSet();\r\n // }\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n const needReactionsInterval = this.appPeersManager.isChannel(peerId);\r\n if(needReactionsInterval) {\r\n const middleware = this.getMiddleware();\r\n const fetchReactions = () => {\r\n if(!middleware()) return;\r\n\r\n const mids: number[] = [];\r\n for(const mid in this.bubbles) {\r\n let message: MyMessage = this.chat.getMessage(+mid);\r\n if(message._ !== 'message') {\r\n continue;\r\n }\r\n\r\n message = this.appMessagesManager.getGroupsFirstMessage(message);\r\n mids.push(message.mid);\r\n }\r\n\r\n const promise = mids.length ? this.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\r\n promise.then(() => {\r\n setTimeout(fetchReactions, 10e3);\r\n });\r\n };\r\n\r\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\r\n fetchReactions();\r\n });\r\n }\r\n\r\n const needFetchInterval = this.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n // warning\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n this.setLoaded('bottom', true);\r\n }\r\n } else {\r\n afterSetPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n scrollable.checkForTriggers();\r\n\r\n if(needFetchInterval) {\r\n const f = () => {\r\n this.fetchNewPromise = new Promise((resolve) => {\r\n if(!middleware() || !this.appMessagesManager.isFetchIntervalNeeded(peerId)) {\r\n resolve();\r\n return;\r\n }\r\n \r\n this.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((historyStorage) => {\r\n if(!middleware() || !historyStorage) {\r\n resolve();\r\n return;\r\n }\r\n \r\n const slice = historyStorage.history.slice;\r\n const isBottomEnd = slice.isEnd(SliceEnd.Bottom);\r\n if(scrollable.loadedAll.bottom && scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n });\r\n }\r\n \r\n this.log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(dialog?.pFlags.unread_mark) {\r\n this.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n\r\n /* if(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\r\n return new Promise((resolve) => fastRaf(resolve));\r\n } */\r\n //console.timeEnd('appImManager setPeer');\r\n }).catch(err => {\r\n this.log.error('getHistory promise error:', err);\r\n if(!middleware()) {\r\n this.preloader.detach();\r\n }\r\n\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n public onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const storage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n this.appMessagesManager.readHistory(this.peerId, storage.maxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public finishPeerChange() {\r\n const isChannel = this.appPeersManager.isChannel(this.peerId);\r\n const canWrite = this.chat.canSend();\r\n \r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.bubblesContainer.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', this.chat.isAnyGroup());\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n\r\n this.createResizeObserver();\r\n }\r\n\r\n public renderMessagesQueue(message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]) {\r\n /* let dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(reverse) dateMessage.container.insertBefore(bubble, dateMessage.div.nextSibling);\r\n else dateMessage.container.append(bubble);\r\n return; */\r\n\r\n /* if(DEBUG && message.mid === 4314759167) {\r\n this.log('renderMessagesQueue', message, bubble, reverse, promises);\r\n } */\r\n\r\n this.messagesQueue.push({message, bubble, reverse, promises});\r\n\r\n return this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(this.messagesQueuePromise || !this.messagesQueue.length) return Promise.resolve();\r\n\r\n return this.messagesQueuePromise = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n const queue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const promises = queue.reduce((acc, {promises}) => (acc.push(...promises), acc), []);\r\n\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n this.log('promises to call', promises, queue, this.isHeavyAnimationInProgress);\r\n const middleware = this.getMiddleware();\r\n Promise.all(promises).then(() => {\r\n if(!middleware()) {\r\n throw 'setMessagesQueuePromise: peer changed!';\r\n }\r\n\r\n if(this.messagesQueueOnRender) {\r\n this.messagesQueueOnRender();\r\n }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n queue.forEach(({message, bubble, reverse}) => {\r\n this.setBubblePosition(bubble, message, reverse);\r\n });\r\n\r\n //setTimeout(() => {\r\n resolve();\r\n //}, 500);\r\n this.messagesQueuePromise = null;\r\n\r\n if(this.messagesQueue.length) {\r\n this.setMessagesQueuePromise();\r\n }\r\n\r\n this.setUnreadDelimiter(); // не нашёл места лучше\r\n // this.setStickyDateManually();\r\n }).catch(reject);\r\n }, 0);\r\n });\r\n\r\n //this.messagesQueuePromise.catch(() => {});\r\n }\r\n\r\n public setBubblePosition(bubble: HTMLElement, message: Message.message | Message.messageService, reverse: boolean) {\r\n if(message.pFlags.local) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n\r\n const dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(this.chat.type === 'scheduled' || this.chat.type === 'pinned'/* || true */) { // ! TEMP COMMENTED\r\n const offset = this.stickyIntersector ? STICKY_OFFSET : 1;\r\n let children = Array.from(dateMessage.container.children).slice(offset) as HTMLElement[];\r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < children.length; ++i) {\r\n const t = children[i];\r\n const timestamp = +t.dataset.timestamp;\r\n if(message.date < timestamp) {\r\n break;\r\n } else if(message.date === timestamp) {\r\n foundMidOnSameTimestamp = +t.dataset.mid;\r\n }\r\n \r\n if(foundMidOnSameTimestamp && message.mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n \r\n // * 1 for date, 1 for date sentinel\r\n let index = offset + i;\r\n /* if(bubble.parentElement) { // * if already mounted\r\n const currentIndex = whichChild(bubble);\r\n if(index > currentIndex) {\r\n index -= 1; // * minus for already mounted\r\n }\r\n } */\r\n \r\n positionElementByIndex(bubble, dateMessage.container, index);\r\n } else {\r\n if(reverse) {\r\n dateMessage.container.insertBefore(bubble, dateMessage.container.children[this.stickyIntersector ? STICKY_OFFSET - 1 : 0].nextSibling);\r\n } else {\r\n dateMessage.container.append(bubble);\r\n }\r\n }\r\n\r\n if(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._))) {\r\n this.bubbleGroups.addBubble(bubble, message, reverse);\r\n } else {\r\n bubble.classList.add('is-group-first', 'is-group-last');\r\n }\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n \r\n // reverse means top\r\n private renderMessage(message: Message.message | Message.messageService, reverse = false, multipleRender = false, bubble: HTMLElement = null, updatePosition = true) {\r\n /* if(DEBUG) {\r\n this.log.debug('message to render:', message);\r\n } */\r\n if(!bubble && this.bubbles[message.mid]) {\r\n return;\r\n }\r\n\r\n const isMessage = message._ === 'message';\r\n const groupId = isMessage && message.grouped_id;\r\n\r\n //return;\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(message.deleted) return;\r\n else if(groupId && albumMustBeRenderedFull) { // will render only last album's message\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n const maxId = Math.max(...storage.keys());\r\n if(message.mid < maxId) {\r\n return;\r\n }\r\n }\r\n \r\n const peerId = this.peerId;\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = message.fromId === rootScope.myId || (message.pFlags.out && this.appPeersManager.isMegagroup(peerId));\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n //messageDiv.innerText = message.message;\r\n\r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n // bubble\r\n if(!bubble) {\r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble = document.createElement('div');\r\n bubble.classList.add('bubble');\r\n contentWrapper.appendChild(bubbleContainer);\r\n bubble.appendChild(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.observer) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n this.appMessagesManager.isMentionUnread(message) || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid);\r\n if(isUnread) {\r\n this.observer.observe(bubble, this.unreadedObserverCallback);\r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n } else {\r\n const save = ['is-highlighted', 'is-group-first', 'is-group-last'];\r\n const wasClassNames = bubble.className.split(' ');\r\n const classNames = ['bubble'].concat(save.filter(c => wasClassNames.includes(c)));\r\n bubble.className = classNames.join(' ');\r\n\r\n contentWrapper = bubble.lastElementChild as HTMLElement;\r\n if(!contentWrapper.classList.contains('bubble-content-wrapper')) {\r\n contentWrapper = bubble.querySelector('.bubble-content-wrapper');\r\n }\r\n \r\n bubbleContainer = contentWrapper.firstElementChild as HTMLDivElement;\r\n bubbleContainer.innerHTML = '';\r\n bubbleContainer.style.cssText = '';\r\n contentWrapper.innerHTML = '';\r\n contentWrapper.appendChild(bubbleContainer);\r\n //bubbleContainer.style.marginBottom = '';\r\n const transitionDelay = contentWrapper.style.transitionDelay;\r\n contentWrapper.style.cssText = '';\r\n contentWrapper.style.transitionDelay = transitionDelay;\r\n\r\n if(bubble === this.firstUnreadBubble) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n // * Нужно очистить прошлую информацию, полезно если удалить последний элемент из альбома в ПОСЛЕДНЕМ БАББЛЕ ГРУППЫ (видно по аватару)\r\n const originalMid = +bubble.dataset.mid;\r\n const sameMid = +message.mid === originalMid;\r\n /* if(updatePosition) {\r\n bubble.remove(); // * for positionElementByIndex\r\n } */\r\n\r\n if(!sameMid) {\r\n delete this.bubbles[originalMid];\r\n this.skippedMids.delete(originalMid);\r\n }\r\n\r\n //bubble.innerHTML = '';\r\n }\r\n\r\n // ! reset due to album edit or delete item\r\n this.bubbles[+message.mid] = bubble;\r\n bubble.dataset.mid = '' + message.mid;\r\n bubble.dataset.peerId = '' + message.peerId;\r\n bubble.dataset.timestamp = '' + message.date;\r\n\r\n const loadPromises: Promise[] = [];\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n this.skippedMids.add(+message.mid);\r\n return bubble;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n s.append(i18n('ChatMigration.From', [new PeerTitle({peerId: action.chat_id.toPeerId(true)}).element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n s.append(i18n('ChatMigration.To', [new PeerTitle({peerId: action.channel_id.toPeerId(true)}).element]));\r\n } else {\r\n s.append(this.appMessagesManager.wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document && \r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupId && albumMustBeRenderedFull) {\r\n const t = this.appMessagesManager.getAlbumText(groupId);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n \r\n /* let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = this.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n setInnerHTML(attachmentDiv, richText);\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n\r\n const timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type, \r\n message\r\n });\r\n messageDiv.append(timeSpan);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n bubble.classList.add('channel-post');\r\n\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n if(!message.pFlags.is_outgoing && this.observer) {\r\n this.observer.observe(bubble, this.viewsObserverCallback);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = RichTextProcessor.wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = RichTextProcessor.wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.appInlineBotsManager.checkSwitchReturn(botId).then(peerId => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then(peerId => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n if(typeof(text) === 'string') {\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n } else {\r\n buttonEl.append(text);\r\n }\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button);\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n if(isOutgoing) {\r\n bubble.classList.add('is-outgoing');\r\n }\r\n\r\n const messageWithReplies = isMessage && this.appMessagesManager.getMessageWithReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = our && (!fwdFrom || this.peerId !== rootScope.myId);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n \r\n let processingWebPage = false;\r\n \r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n ////////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n \r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n \r\n break;\r\n }\r\n \r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo, \r\n message,\r\n container: attachmentDiv,\r\n withTail, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webpage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webpage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webpage.photo as any;\r\n if(photo || webpage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n\r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n \r\n const doc = webpage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message: message as Message.message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n //}\r\n } else {\r\n const docDiv = wrapDocument({\r\n message: message as Message.message,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises,\r\n sizeType: 'documentName',\r\n searchContext: {\r\n useSearch: false,\r\n peerId: this.peerId,\r\n inputFilter: {\r\n _: 'inputMessagesFilterEmpty'\r\n }\r\n }\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n quoteTextDiv.classList.add('has-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webpage.site_name) {\r\n const html = RichTextProcessor.wrapRichText(webpage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, RichTextProcessor.wrapEmojiText(webpage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n const title = this.appWebPagesManager.wrapTitle(webpage);\r\n if(title.textContent) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, title);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n const description = this.appWebPagesManager.wrapDescription(webpage);\r\n if(description.textContent) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, description);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n this.appPhotosManager.setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n }\r\n \r\n box.append(quote);\r\n \r\n //bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n \r\n //this.log('night running', bubble.scrollHeight);\r\n \r\n break;\r\n }\r\n \r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n this.appPhotosManager.setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\r\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc, \r\n container: attachmentDiv, \r\n message: message as Message.message, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n\r\n const newNameContainer = wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n sizeType: 'documentName'\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n lastContainer && lastContainer.append(timeSpan);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ? \r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') : \r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const contactDetails = document.createElement('div');\r\n contactDetails.className = 'contact-details';\r\n const contactNameDiv = document.createElement('div');\r\n contactNameDiv.className = 'contact-name';\r\n contactNameDiv.append(\r\n RichTextProcessor.wrapEmojiText([\r\n contact.first_name,\r\n contact.last_name\r\n ].filter(Boolean).join(' '))\r\n );\r\n\r\n const contactNumberDiv = document.createElement('div');\r\n contactNumberDiv.className = 'contact-number';\r\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\r\n\r\n contactDiv.append(contactDetails);\r\n contactDetails.append(contactNameDiv, contactNumberDiv);\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.updateWithOptions({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n peerId: contact.user_id.toPeerId()\r\n });\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.appPeersManager.isAnyGroup(peerId)) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n \r\n let isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + this.appUsersManager.getUser(message.viaBotId).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n setInnerHTML(title, RichTextProcessor.wrapEmojiText(fwdFrom.from_name));\r\n title.classList.add('peer-title');\r\n //title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n \r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n \r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n const peer = this.appPeersManager.getPeer(message.fromId);\r\n const pFlags = (peer as User.user)?.pFlags;\r\n if(pFlags && (pFlags.scam || pFlags.fake)) {\r\n nameDiv.append(generateFakeIcon(pFlags.scam));\r\n }\r\n\r\n if(!our) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n\r\n const needAvatar = this.chat.isAnyGroup() && !isOut;\r\n if(needAvatar) {\r\n let avatarElem = new AvatarElement();\r\n avatarElem.classList.add('user-avatar', 'avatar-40');\r\n avatarElem.updateWithOptions({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n peerId: ((fwdFrom && (this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID,\r\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined,\r\n loadPromises\r\n });\r\n \r\n //this.log('exec loadDialogPhoto', message);\r\n\r\n contentWrapper.append(avatarElem);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n }\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n this.appendReactionsElementToBubble(bubble, message);\r\n }\r\n\r\n /* if(isMessage) {\r\n const reactionHover = document.createElement('div');\r\n reactionHover.classList.add('bubble-reaction-hover');\r\n contentWrapper.append(reactionHover);\r\n } */\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n private appendReactionsElementToBubble(bubble: HTMLElement, message: Message.message, changedResults?: ReactionCount[]) {\r\n if(this.peerId.isUser()/* || true */) {\r\n return;\r\n }\r\n\r\n const reactionsMessage = this.appMessagesManager.getGroupsFirstMessage(message);\r\n if(!reactionsMessage.reactions || !reactionsMessage.reactions.results.length) {\r\n return;\r\n }\r\n\r\n // message = this.appMessagesManager.getMessageWithReactions(message);\r\n\r\n const reactionsElement = new ReactionsElement();\r\n reactionsElement.init(reactionsMessage, 'block');\r\n reactionsElement.render(changedResults);\r\n\r\n if(bubble.classList.contains('is-message-empty')) {\r\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\r\n } else {\r\n const messageDiv = bubble.querySelector('.message');\r\n if(bubble.classList.contains('is-multiple-documents')) {\r\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\r\n let documentMessageDiv = documentContainer.querySelector('.document-message');\r\n\r\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\r\n if(!timeSpan) {\r\n timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message\r\n });\r\n }\r\n \r\n reactionsElement.append(timeSpan);\r\n\r\n if(!documentMessageDiv) {\r\n documentMessageDiv = document.createElement('div');\r\n documentMessageDiv.classList.add('document-message');\r\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\r\n }\r\n\r\n documentMessageDiv.append(reactionsElement);\r\n } else {\r\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\r\n reactionsElement.append(timeSpan);\r\n \r\n messageDiv.append(reactionsElement);\r\n }\r\n }\r\n }\r\n\r\n private safeRenderMessage(message: any, reverse?: boolean, multipleRender?: boolean, bubble?: HTMLElement, updatePosition?: boolean) {\r\n try {\r\n return this.renderMessage(message, reverse, multipleRender, bubble, updatePosition);\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n }\r\n\r\n public async performHistoryResult(history: (Message.message | Message.messageService | number)[], reverse: boolean, isBackLimit: boolean, additionMsgId?: number) {\r\n // commented bot getProfile in getHistory!\r\n // if(!history/* .filter((id: number) => id > 0) */.length) {\r\n // if(!isBackLimit) {\r\n // this.scrollable.loadedAll.top = true;\r\n\r\n // /* if(this.chat.type === 'discussion') {\r\n // const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n // if(serviceStartMessageId) history.push(serviceStartMessageId);\r\n // history.push(this.chat.threadId);\r\n // } */\r\n // } else {\r\n // this.scrollable.loadedAll.bottom = true;\r\n // }\r\n // }\r\n\r\n history = history.slice(); // need\r\n\r\n if(additionMsgId) {\r\n history.unshift(additionMsgId);\r\n }\r\n\r\n /* if(testScroll && additionMsgID) {\r\n for(let i = 0; i < 3; ++i) {\r\n let _history = history.slice();\r\n setTimeout(() => {\r\n this.performHistoryResult(_history, reverse, isBackLimit, 0, resetPromises);\r\n }, 0);\r\n }\r\n } */\r\n\r\n //console.time('appImManager render history');\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 1e3));\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will render some messages:', history.length, this.isHeavyAnimationInProgress, this.messagesQueuePromise);\r\n } */\r\n\r\n let scrollSaver: ScrollSaver, hadScroll: boolean/* , viewportSlice: ReturnType */;\r\n if(this.chatInner.parentElement) {\r\n this.messagesQueueOnRender = () => {\r\n scrollSaver = new ScrollSaver(this.scrollable, reverse);\r\n \r\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\r\n const viewportSlice = this.getViewportSlice();\r\n this.deleteViewportSlice(viewportSlice, true);\r\n }\r\n \r\n scrollSaver.save();\r\n const saved = scrollSaver.getSaved();\r\n hadScroll = saved.scrollHeight !== saved.clientHeight;\r\n };\r\n }\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (mid: typeof history[0]) => {\r\n const message: Message.message | Message.messageService = typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n if(message.pFlags.local) {\r\n this.processLocalMessageRender(message);\r\n } else {\r\n this.safeRenderMessage(message, reverse, true);\r\n }\r\n };\r\n\r\n const length = history.length;\r\n if(reverse) for(let i = 0; i < length; ++i) cb(history[i]);\r\n else for(let i = length - 1; i >= 0; --i) cb(history[i]);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n this.setLoaded('bottom', true, false);\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n this.setLoaded('top', true, false);\r\n }\r\n } else {\r\n this.setLoaded('top', true);\r\n this.setLoaded('bottom', true);\r\n }\r\n\r\n await this.messagesQueuePromise;//.then(() => new Promise(resolve => setTimeout(resolve, 100)))\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore(history.length === 1 && !reverse ? false : true);\r\n this.onRenderScrollSet(scrollSaver.getSaved());\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\r\n const className = 'has-sticky-dates';\r\n if(!this.bubblesContainer.classList.contains(className)) {\r\n const isLoading = !this.preloader.detached;\r\n\r\n if(isLoading || \r\n (\r\n state ??= {\r\n scrollHeight: this.scrollable.scrollHeight,\r\n clientHeight: this.scrollable.container.clientHeight\r\n }, \r\n state.scrollHeight !== state.clientHeight\r\n )\r\n ) {\r\n /* for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n dateMessage.div.classList.add('is-sticky');\r\n } */\r\n \r\n const middleware = this.getMiddleware();\r\n const callback = () => {\r\n if(!middleware()) return;\r\n this.bubblesContainer.classList.add(className);\r\n };\r\n\r\n if(this.willScrollOnLoad) {\r\n callback();\r\n } else {\r\n setTimeout(callback, 600);\r\n }\r\n\r\n return;\r\n }\r\n }\r\n \r\n this.willScrollOnLoad = undefined;\r\n }\r\n\r\n onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then(history => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n const promise = this.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n })\r\n .then(value => ({history: value.history.map(m => m.mid)}));\r\n\r\n return promise;\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {history: mids.slice().reverse()};\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter(mid => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex(mid => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex(mid => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n this.log('getHistory: targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)), \r\n bottomIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n if(!this.bubbles[mid] || this.skippedMids.has(mid)) {\r\n this.log.warn('animateAsLadder: no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n const contentWrapper = this.bubbles[mid].lastElementChild as HTMLElement;\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n \r\n contentWrapper.classList.add('zoom-fade');\r\n contentWrapper.style.transitionDelay = lastMsDelay + 'ms';\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n \r\n //this.log('supa', bubble);\r\n\r\n setBubbles.push(contentWrapper);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n // fastRaf(() => {\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.classList.remove('zoom-fade');\r\n });\r\n });\r\n // });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.style.transitionDelay = '';\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n // if(!IS_SAFARI) {\r\n // this.needReflowScroll = true;\r\n // }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private renderEmptyPlaceholder(type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted', bubble: HTMLElement, message: any, elements: (Node | string)[]) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n else if(type === 'restricted') {\r\n title = document.createElement('span');\r\n title.innerText = this.appPeersManager.getRestrictionReasonText(this.peerId);\r\n }\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n findAndSplice(this.messagesQueue, q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n const loadPromise = this.appStickersManager.getGreetingSticker().then(doc => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n this.renderMessagesQueue(message, bubble, false, [loadPromise]);\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map(elem => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private processLocalMessageRender(message: Message.message | Message.messageService) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const bubble = this.safeRenderMessage(message, undefined, undefined, undefined, isSponsored);\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.appPeersManager.isBot(this.peerId);\r\n if(this.chat.isRestricted) {\r\n this.renderEmptyPlaceholder('restricted', bubble, message, elements);\r\n } else if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = this.appPeersManager.getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = this.appMessagesIdsManager.generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param || this.appUsersManager.isBot(peerId.toUserId())) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = this.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite).show();\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n \r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.observer.observe(button, this.viewsObserverCallback);\r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n } else if(this.appPeersManager.isAnyGroup(this.peerId) && this.appPeersManager.getPeer(this.peerId).pFlags.creator) {\r\n this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.appPeersManager.isUser(this.peerId) && !isBot && this.chat.canSend() && this.chat.type === 'chat') {\r\n this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n /* for(let i = 1; i < elements.length; i += 2) {\r\n elements.splice(i, 0, '\\n');\r\n } */\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const method: 'append' | 'prepend' = isSponsored ? 'append' : 'prepend';\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.onAnimateLadder = () => {\r\n this.chatInner[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else {\r\n this.chatInner[method](bubble);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderMid = message.mid;\r\n // }\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n let offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = this.appMessagesIdsManager.generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(this.appMessagesIdsManager.generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): GenerateLocalMessageType {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n const message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: this.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n this.appMessagesManager.saveMessages([message], {storage: new Map()});\r\n message.mid = mid;\r\n return message;\r\n }\r\n\r\n public getViewportSlice() {\r\n // this.log.trace('viewport slice');\r\n return getViewportSlice({\r\n overflowElement: this.scrollable.container, \r\n selector: '.bubbles-date-group .bubble:not(.is-date)',\r\n extraSize: Math.max(700, windowSize.height) * 2\r\n });\r\n }\r\n\r\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\r\n // return;\r\n\r\n const {invisibleTop, invisibleBottom} = slice;\r\n const invisible = invisibleTop.concat(invisibleBottom);\r\n if(!invisible.length) {\r\n return;\r\n }\r\n\r\n if(invisibleTop.length) this.setLoaded('top', false);\r\n if(invisibleBottom.length) this.setLoaded('bottom', false);\r\n\r\n const mids = invisible.map(({element}) => +element.dataset.mid);\r\n\r\n let scrollSaver: ScrollSaver;\r\n if(!!invisibleTop.length !== !!invisibleBottom.length && !ignoreScrollSaving) {\r\n scrollSaver = new ScrollSaver(this.scrollable, !!invisibleTop.length);\r\n scrollSaver.save();\r\n }\r\n \r\n this.deleteMessagesByIds(mids, false, true);\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n } else if(invisibleTop.length) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n }\r\n\r\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\r\n // Safari cannot reset the scroll.\r\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation)/* || true */) {\r\n return;\r\n }\r\n\r\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\r\n // scrollSaver.save();\r\n const slice = this.getViewportSlice();\r\n // if(IS_SAFARI) slice.invisibleTop = [];\r\n this.deleteViewportSlice(slice);\r\n // scrollSaver.restore();\r\n }\r\n\r\n private setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n /* if(!checkPlaceholders) {\r\n return;\r\n } */\r\n\r\n if(side === 'bottom' && this.appPeersManager.isBroadcast(this.peerId) && !this.chat.isRestricted/* && false */) {\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n \r\n const promise = this.getSponsoredMessagePromise = this.chat.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId())\r\n }, {cacheSeconds: 300}).then(sponsoredMessages => {\r\n if(!middleware()) return;\r\n\r\n /* forEachReverse(sponsoredMessages.messages, (message, idx, arr) => {\r\n if(message.chat_invite || message.chat_invite_hash) {\r\n arr.splice(idx, 1);\r\n }\r\n }); */\r\n\r\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\r\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\r\n \r\n const sponsoredMessage = sponsoredMessages.messages.shift();\r\n if(!sponsoredMessage) {\r\n return;\r\n }\r\n\r\n sponsoredMessages.messages.push(sponsoredMessage);\r\n const message = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n \r\n return Promise.all([\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(() => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n const promise = this.performHistoryResult([message], false, true);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n if(side === 'top' && value && this.appPeersManager.isBot(this.peerId) && !this.chat.isRestricted) {\r\n this.log('inject bot description');\r\n\r\n const middleware = this.getMiddleware();\r\n return Promise.resolve(this.appProfileManager.getProfile(this.peerId.toUserId())).then(userFull => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n this.checkIfEmptyPlaceholderNeeded();\r\n return;\r\n }\r\n\r\n const message = this.generateLocalFirstMessage(false, message => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n this.processLocalMessageRender(message);\r\n });\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n public checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderMid === undefined && \r\n (\r\n this.chat.isRestricted || \r\n !this.appMessagesManager.getHistoryStorage(this.peerId).count || \r\n (\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = this.generateLocalFirstMessage(true);\r\n this.processLocalMessageRender(message);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public getHistory(maxId = 0, reverse = false, isBackLimit = false, additionMsgId = 0, justLoad = false): {cached: boolean, promise: Promise} {\r\n const peerId = this.peerId;\r\n\r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(true)};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = this.chat.getMessage(additionMsgIds[i]);\r\n if(message.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: ReturnType | {history: number[]} = this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: Promise;\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result instanceof Promise && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && result instanceof Promise;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && result instanceof Promise) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result as Promise;\r\n result = {history: additionMsgIds};\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: typeof result) => {\r\n if('offsetIdOffset' in historyResult && historyResult.history.isEnd(SliceEnd.Top)) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n //this.log('discussion got history', loadCount, backLimit, historyResult, isTopEnd);\r\n const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n historyResult.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse());\r\n }\r\n\r\n await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (result: HistoryResult) => {\r\n /* if(maxId && result.history?.length) {\r\n if(this.bubbles[maxId]) {\r\n result.history.findAndSplice(mid => mid === maxId); \r\n }\r\n } */\r\n\r\n ////console.timeEnd('render history total');\r\n \r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(result);\r\n }).then(() => {\r\n return this.performHistoryResult(result.history as number[] || [], reverse, isBackLimit, !isAdditionRender && additionMsgId);\r\n });\r\n };\r\n\r\n const processPromise = (result: Promise) => {\r\n const promise = result.then((result) => {\r\n //this.log('getHistory not cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n\r\n if(reverse ? this.getHistoryTopPromise !== promise : this.getHistoryBottomPromise !== promise) {\r\n this.log.warn('getHistory: peer changed');\r\n ////console.timeEnd('render history total');\r\n return Promise.reject();\r\n }\r\n\r\n if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n // fastRaf(() => {\r\n // this.scrollable.checkForTriggers();\r\n // });\r\n return true;\r\n }\r\n //console.timeEnd('appImManager call getHistory');\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(result instanceof Promise) {\r\n cached = false;\r\n promise = processPromise(result);\r\n } else if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n return null;\r\n } else {\r\n cached = true;\r\n //this.log('getHistory cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n promise = sup(result as HistoryResult);\r\n //return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise);\r\n //return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('ship went past rocks of magnets');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n });\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n promise.then(() => {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n });\r\n\r\n return {cached, promise};\r\n }\r\n\r\n public setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n let readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter(mid => !this.bubbles[mid].classList.contains('is-out'))\r\n .map(i => +i)\r\n .sort((a, b) => a - b)\r\n .find(i => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyStorage.maxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copyTextToClipboard } from \"../clipboard\";\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from \"./getVisibleRect\";\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, selector, extraSize}: {\n overflowElement: HTMLElement,\n selector: string,\n extraSize?: number\n}) {\n // const perf = performance.now();\n const overflowRect = overflowElement.getBoundingClientRect();\n const elements = Array.from(overflowElement.querySelectorAll(selector));\n\n const invisibleTop: ViewportSlicePart = [], \n visible: typeof invisibleTop = [], \n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n \n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom; \n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n if(extraSize && visible.length) {\n const maxTop = visible[0].rect.top;\n const minTop = maxTop - extraSize;\n const minBottom = visible[visible.length - 1].rect.bottom;\n const maxBottom = minBottom + extraSize;\n \n for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n const element = invisibleTop[i];\n if(element.rect.top >= minTop) {\n invisibleTop.splice(i, 1);\n visible.unshift(element);\n }\n }\n\n for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n const element = invisibleBottom[i];\n if(element.rect.bottom <= maxBottom) {\n invisibleBottom.splice(i--, 1);\n --length;\n visible.push(element);\n }\n }\n }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(peerId: PeerId, mid: number, unpin?: true, onConfirm?: () => void) {\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const canUnpin = appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + (appMessagesManager.pinnedMessages[peerId]?.count || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ReportReason } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport { wrapSticker } from \"../wrappers\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then(bool => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const doc = appStickersManager.getAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n const size = 100;\n wrapSticker({\n doc,\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n loop: false,\n play: true\n }).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { ReportReason } from \"../../layer\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach(b => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = appStickersManager.preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport Scrollable from \"../scrollable\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }]\n });\n\n const scrollable = new Scrollable(undefined);\n scrollable.onAdditionalScroll = () => {\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\n };\n\n this.description.replaceWith(scrollable.container);\n\n scrollable.container.append(this.description);\n scrollable.container.classList.add('scrolled-top');\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport PopupElement from \".\";\nimport { Message } from \"../../layer\";\nimport { generateDelimiter, SettingSection } from \"../sidebarLeft\";\nimport ReactionsElement from \"../chat/reactions\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport Scrollable from \"../scrollable\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport appDialogsManager from \"../../lib/appManagers/appDialogsManager\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport appReactionsManager from \"../../lib/appManagers/appReactionsManager\";\nimport { wrapSticker } from \"../wrappers\";\nimport ReactionElement from \"../chat/reaction\";\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private appMessagesManager: AppMessagesManager, \n private message: Message.message\n ) {\n super('popup-reacted-list', /* [{\n langKey: 'Close',\n isCancel: true\n }] */null, {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const message = this.appMessagesManager.getGroupsFirstMessage(this.message);\n\n const canViewReadParticipants = this.appMessagesManager.canViewMessageReadParticipants(message);\n\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map(reactionCount => {\n return {\n ...reactionCount,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block');\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n \n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n \n newMessage.reactions.results.forEach(reactionCount => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = reactionCount.reaction !== 'checks';\n const skipReactionsList = reactionCount.reaction === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction)) {\n reactionCount.reaction = undefined;\n }\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n result.combined.forEach(({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 54,\n rippleEnabled: false,\n meAsSaved: false,\n drawStatus: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n const availableReaction = appReactionsManager.getReactionCached(reaction);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24\n });\n \n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, appUsersManager.getUserStatusString(peerId.toUserId()));\n });\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n \n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n });\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block');\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport noop from \"../../helpers/noop\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { Message, AvailableReaction } from \"../../layer\";\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport Scrollable, { ScrollableBase, ScrollableX } from \"../scrollable\";\nimport { wrapSticker } from \"../wrappers\";\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: string\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: string;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private appReactionsManager: AppReactionsManager,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach(type => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = 'CHAT-MENU-REACTIONS-' + Date.now();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach(reaction => {\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: reaction.reaction\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(player => {\n assumeType(player);\n \n players.appear = player;\n \n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n \n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n \n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(player => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n \n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n \n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, MenuPositionPadding, openBtnMenu, positionMenu } from \"../misc\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport PopupSponsored from \"../popups/sponsored\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport { IS_APPLE } from \"../../environment/userAgent\";\r\nimport PopupReactedList from \"../popups/reactedList\";\r\nimport { ChatReactionsMenu, REACTION_CONTAINER_SIZE } from \"./reactionsMenu\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private isSponsored: boolean;\r\n private isOverBubble: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n private reactionsMenu: ChatReactionsMenu;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private viewerPeerId: PeerId;\r\n private middleware: ReturnType;\r\n private canOpenReactedList: boolean;\r\n\r\n constructor(\r\n private attachTo: HTMLElement, \r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appPeersManager: AppPeersManager, \r\n private appPollsManager: AppPollsManager,\r\n private appDocsManager: AppDocsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appReactionsManager: AppReactionsManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.middleware = getMiddleware();\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(attachTo, (e) => {\r\n if(chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n chat.log('touchend', e);\r\n\r\n const badSelectors = [\r\n '.name',\r\n '.peer-title',\r\n '.reply',\r\n '.document',\r\n 'audio-element',\r\n 'avatar-element',\r\n 'a',\r\n '.bubble-beside-button',\r\n 'replies-element',\r\n '[data-saved-from]:not(.bubble)',\r\n 'poll-element',\r\n 'attachment'\r\n ];\r\n let good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\r\n if(good) {\r\n cancelEvent(e);\r\n //onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n this.onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.chat.bubbles.listenerSetter});\r\n } else attachContextMenuListener(attachTo, this.onContextMenu, this.chat.bubbles.listenerSetter);\r\n }\r\n\r\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n let element = this.element;\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(element && element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n\r\n const isSponsored = this.isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n //this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' || \r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(this.chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find(mid => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n this.isOverBubble = !!contentWrapper;\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = this.chat.getMessage(this.mid);\r\n this.noForwards = !isSponsored && !this.appMessagesManager.canForward(this.message);\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n\r\n const initResult = this.init();\r\n element = initResult.element;\r\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\r\n let isReactionsMenuVisible = false;\r\n if(reactionsMenu) {\r\n const className = 'is-visible';\r\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\r\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\r\n\r\n if(reactionsMenuPosition === 'horizontal') {\r\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\r\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\r\n const INNER_CONTAINER_PADDING = 8;\r\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\r\n const nextVisiblePart = visibleLength % 1;\r\n const MIN_NEXT_VISIBLE_PART = 0.65;\r\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\r\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\r\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\r\n }\r\n // }\r\n }\r\n }\r\n \r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\r\n\r\n if(reactionsMenu) {\r\n reactionsMenu.widthContainer.style.top = element.style.top;\r\n reactionsMenu.widthContainer.style.left = element.style.left;\r\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\r\n element.parentElement.append(reactionsMenu.widthContainer);\r\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\r\n }\r\n\r\n openBtnMenu(element, () => {\r\n if(reactionsMenu) {\r\n reactionsMenu.container.classList.remove('is-visible');\r\n }\r\n\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n cleanup();\r\n\r\n setTimeout(() => {\r\n destroy();\r\n }, 300);\r\n });\r\n\r\n if(isReactionsMenuVisible) {\r\n reactionsMenu.container.classList.add('is-visible');\r\n }\r\n };\r\n\r\n public cleanup() {\r\n this.listenerSetter.removeAll();\r\n this.reactionsMenu && this.reactionsMenu.cleanup();\r\n this.middleware.clean();\r\n }\r\n\r\n public destroy() {\r\n this.cleanup();\r\n }\r\n\r\n private filterButtons(buttons: ChatContextMenu['buttons']) {\r\n if(this.isSponsored) {\r\n return buttons.filter(button => {\r\n return button.isSponsored;\r\n });\r\n } else {\r\n return buttons.filter(button => {\r\n let good: boolean;\r\n\r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(this.chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ? \r\n button.verify() : \r\n button.notDirect && button.verify() && button.notDirect();\r\n }\r\n\r\n return good;\r\n });\r\n }\r\n }\r\n\r\n private setButtons() {\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: () => this.chat.canSend() && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: () => this.appMessagesManager.canEditMessage(this.message, 'text') && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n if(!!this.appMessagesManager.getMessageByPeer(peerId, mid).message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: () => this.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: () => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n this.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: () => (this.message as Message.message).pFlags.pinned && this.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n this.appDocsManager.saveDocFile((this.message as any).media.document);\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll;\r\n return this.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || !this.message.pFlags.out) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: () => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && this.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n onClick: () => {\r\n if(this.viewerPeerId) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: this.viewerPeerId\r\n });\r\n } else if(this.canOpenReactedList) {\r\n new PopupReactedList(this.appMessagesManager, this.message as Message.message);\r\n } else {\r\n return false;\r\n }\r\n },\r\n verify: () => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || this.appMessagesManager.canViewMessageReadParticipants(this.message)),\r\n notDirect: () => true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n }\r\n\r\n private init() {\r\n this.cleanup();\r\n this.setButtons();\r\n \r\n const filteredButtons = this.filterButtons(this.buttons);\r\n const element = this.element = ButtonMenu(filteredButtons, this.listenerSetter);\r\n element.id = 'bubble-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n const viewsButton = filteredButtons.find(button => !button.icon);\r\n if(viewsButton) {\r\n const reactions = (this.message as Message.message).reactions;\r\n const recentReactions = reactions?.recent_reactions;\r\n const isViewingReactions = !!recentReactions?.length;\r\n const participantsCount = this.appMessagesManager.canViewMessageReadParticipants(this.message) ? (this.appPeersManager.getPeer(this.peerId) as MTChat.chat).participants_count : undefined;\r\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\r\n\r\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\r\n const i18nElem = new I18n.IntlElement({\r\n key: isViewingReactions ? (\r\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\r\n ) : 'NobodyViewed',\r\n args: isViewingReactions ? (\r\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\r\n ) : undefined,\r\n element: viewsButton.textElement\r\n });\r\n\r\n let fakeText: HTMLElement;\r\n if(isViewingReactions) {\r\n if(participantsCount === undefined) {\r\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\r\n } else {\r\n fakeText = i18n(\r\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n [recentReactions.length, participantsCount]\r\n );\r\n }\r\n } else {\r\n fakeText = i18n('Loading');\r\n }\r\n\r\n fakeText.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeText);\r\n\r\n const MAX_AVATARS = 3;\r\n const PADDING_PER_AVATAR = .875;\r\n i18nElem.element.style.visibility = 'hidden';\r\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\r\n const middleware = this.middleware.get();\r\n this.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(fakeText) {\r\n fakeText.remove();\r\n }\r\n\r\n const reactions = result.combined;\r\n const reactedLength = participantsCount === undefined ? \r\n result.reactionsCount : \r\n (\r\n isViewingReactions ? \r\n reactions.filter(reaction => reaction.reaction).length : \r\n reactions.length\r\n );\r\n\r\n let fakeElem: HTMLElement;\r\n if(reactions.length === 1) {\r\n fakeElem = new PeerTitle({\r\n peerId: reactions[0].peerId,\r\n onlyFirstName: true,\r\n dialog: false,\r\n }).element;\r\n\r\n if(!isViewingReactions || result.readParticipants.length <= 1) {\r\n this.viewerPeerId = reactions[0].peerId;\r\n }\r\n } else if(isViewingReactions) {\r\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\r\n fakeElem = i18n(\r\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n isFull ? [reactedLength] : [reactedLength, reactions.length]\r\n );\r\n } else {\r\n if(!reactions.length) {\r\n i18nElem.element.style.visibility = '';\r\n } else {\r\n fakeElem = i18n('MessageSeen', [reactions.length]);\r\n }\r\n }\r\n\r\n if(fakeElem) {\r\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\r\n fakeElem.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeElem);\r\n }\r\n\r\n if(reactions.length) {\r\n const avatars = new StackedAvatars({avatarSize: 24});\r\n avatars.render(recentReactions ? recentReactions.map(r => this.appPeersManager.getPeerId(r.peer_id)) : reactions.map(reaction => reaction.peerId));\r\n viewsButton.element.append(avatars.container);\r\n\r\n // if(reactions.length > 1) {\r\n // if(isViewingReactions) {\r\n this.canOpenReactedList = true;\r\n // }\r\n }\r\n });\r\n }\r\n\r\n let menuPadding: MenuPositionPadding;\r\n let reactionsMenu: ChatReactionsMenu;\r\n let reactionsMenuPosition: 'horizontal' | 'vertical';\r\n if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.appReactionsManager, reactionsMenuPosition, this.middleware);\r\n reactionsMenu.init(this.appMessagesManager.getGroupsFirstMessage(this.message));\r\n // element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 36;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n const paddingLeft = 0, paddingRight = 0;\r\n if(reactionsMenuPosition === 'vertical') {\r\n menuPadding = {\r\n top: paddingLeft,\r\n // bottom: 36, // positionMenu will detect it itself somehow\r\n left: totalSize\r\n };\r\n } else {\r\n menuPadding = {\r\n top: totalSize,\r\n right: paddingRight,\r\n left: paddingLeft\r\n };\r\n }\r\n }\r\n\r\n this.chat.container.append(element);\r\n\r\n return {\r\n element, \r\n cleanup: () => {\r\n this.cleanup();\r\n reactionsMenu && reactionsMenu.cleanup();\r\n },\r\n destroy: () => {\r\n element.remove();\r\n reactionsMenu.widthContainer.remove();\r\n },\r\n menuPadding,\r\n reactionsMenu,\r\n reactionsMenuPosition\r\n };\r\n }\r\n\r\n private onSendScheduledClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = () => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const str = mids.reduce((acc, mid) => {\r\n const message = this.chat.getMessage(mid);\r\n return acc + (message?.message ? message.message + '\\n' : '');\r\n }, '').trim();\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = () => {\r\n let threadMessage: Message.message;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = this.appMessagesManager.getMessageByPeer(this.peerId, this.chat.threadId);\r\n }\r\n\r\n const username = this.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : this.peerId);\r\n const msgId = this.appMessagesIdsManager.getServerMessageId(this.mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? this.appMessagesIdsManager.getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + this.peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + this.appMessagesIdsManager.getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [this.peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu } from \"../misc\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!this.chat.appPeersManager.isBroadcast(this.chat.peerId)) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map(el => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach(el => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach(el => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter(v => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find(a => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = this.chat.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n ...this.chat.getMessageSendingParams()\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption', \r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId, \r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '', \r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n \r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement, \r\n position: 'center'\r\n });\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then(response => response.arrayBuffer())\n .then(arrayBuffer => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { prepareAlbum, wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo, onMediaLoad } from \"../../helpers/files\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport rootScope from \"../../lib/rootScope\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport createVideo from \"../../helpers/dom/createVideo\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: rootScope.config.caption_length_max\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find(file => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter(file => {\n const found = this.files.find(_file => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > rootScope.config.caption_length_max) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach(d => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.chat.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.chat.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map(d => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private attachMedia(file: File, params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.src = params.objectURL = URL.createObjectURL(file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n return createPosterFromVideo(video).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n });\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then(duration => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = URL.createObjectURL(file);\n }\n\n return promise;\n }\n\n private attachDocument(file: File, params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL = URL.createObjectURL(file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n if(params.objectURL) {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n cacheContext.url = params.objectURL;\n cacheContext.downloaded = file.size;\n }\n\n const docDiv = wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(file, params, itemDiv) : this.attachDocument(file, params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach(file => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter(n => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach(p => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map(s => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map(o => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport cancelEvent from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string[]\r\n}) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS)); \r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable, \r\n element: target as HTMLElement, \r\n position: 'center', \r\n forceDuration: 100, \r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n hiding: () => void\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller?: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller && this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list, \r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\r\n if(this.init) {\r\n return;\r\n }\r\n \r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller && this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController && this.controller) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n const useRafs = this.controller || hide ? 0 : 2;\r\n\r\n if(hide) {\r\n this.dispatchEvent('hiding');\r\n }\r\n\r\n SetTransition(\r\n this.container, \r\n 'is-visible', \r\n !hide, \r\n rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0, \r\n () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n }, \r\n useRafs\r\n );\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n appStickersManager.preloadAnimatedEmojiSticker(emoticon);\r\n appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach(sticker => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private appEmojiManager: AppEmojiManager) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach(emoji => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.appEmojiManager.getBothEmojiKeywords().then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = this.appEmojiManager.searchEmojis(q);\r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n protected className: string, \r\n onSelect: (target: Element) => boolean | void\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach(d => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n if(!doNotShow) {\r\n this.toggle(!data.length);\r\n }\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n \r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: options.peerId\r\n });\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n setInnerHTML(name, RichTextProcessor.wrapEmojiText(options.name));\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n setInnerHTML(description, RichTextProcessor.wrapEmojiText(options.description));\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { BotInfo, ChatFull, UserFull } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\n\nexport function processPeerFullForCommands(full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex; \n \n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n \n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach(botInfo => {\n botInfo.commands.forEach((botCommand, idx) => {\n const c = '/' + botCommand.command;\n commands.set(botCommand.command, {\n peerId: botInfo.user_id.toPeerId(false), \n command: botCommand.command, \n name: c, \n description: botCommand.description,\n index: idx\n });\n\n if(index) {\n index.indexObject(botCommand.command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map(command => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n \n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId) {\n if(!this.appUsersManager.isBot(peerId)) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n Promise.resolve(this.appProfileManager.getProfileByPeerId(peerId)).then(full => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach(helper => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId());\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n this.render(peerIds.map(peerId => {\n const user = this.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n }).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { KeyboardButton, ReplyMarkup } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ListenerSetter, { Listener } from \"../../helpers/listenerSetter\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport confirmationPopup from \"../confirmationPopup\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private appMessagesManager: AppMessagesManager;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n appMessagesManager: AppMessagesManager,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', () => {\r\n this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public checkForceReply() {\r\n const replyMarkup = this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private getReplyMarkup(): ReplyMarkup {\r\n return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public render(replyMarkup: ReplyMarkup.replyKeyboardMarkup = this.getReplyMarkup() as any) {\r\n this.element.innerHTML = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n setInnerHTML(btn, RichTextProcessor.wrapEmojiText(button.text));\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) {\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { renderImageWithFadeIn, wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport GifsMasonry from \"../gifsMasonry\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = this.appInlineBotsManager.generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n ...this.chat.getMessageSendingParams(),\r\n clearDraft: true,\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then(botResults => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n setInnerHTML(preview, RichTextProcessor.wrapEmojiText([...item.title.trim()][0]));\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n setInnerHTML(title, RichTextProcessor.wrapEmojiText(item.title));\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n setInnerHTML(description, RichTextProcessor.wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n }));\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then(blob => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then(dataURL => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n setInnerHTML(btnSwitchToPM, RichTextProcessor.wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type ChatInput from \"./input\";\nimport callbackify from \"../../helpers/callbackify\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport { processPeerFullForCommands } from \"./commandsHelper\";\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n private chatInput: ChatInput,\n private appProfileManager: AppProfileManager\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(full);\n \n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n \n // this.container.style.top = \n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppNotificationsManager } from '../../lib/appManagers/appNotificationsManager';\r\nimport type { AppChatsManager } from '../../lib/appManagers/appChatsManager';\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from '../../lib/appManagers/appPeersManager';\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { AppDraftsManager, MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type { AppEmojiManager } from '../../lib/appManagers/appEmojiManager';\r\nimport type { ServerTimeManager } from '../../lib/mtproto/serverTimeManager';\r\nimport type { AppUsersManager } from '../../lib/appManagers/appUsersManager';\r\nimport type { AppInlineBotsManager } from '../../lib/appManagers/appInlineBotsManager';\r\nimport type { AppMessagesIdsManager } from '../../lib/appManagers/appMessagesIdsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message, ChatFull, UserFull } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport { tsNow } from '../../helpers/date';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport { emojiFromCodePoints } from '../../vendor/emoji';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { openBtnMenu, putPreloader } from '../misc';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { BOT_START_PARAM, NULL_PEER_ID } from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport AvatarElement from '../avatar';\r\nimport type { AppProfileManager } from '../../lib/appManagers/appProfileManager';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ChatBotCommands from './botCommands';\r\nimport copy from '../../helpers/object/copy';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\r\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\nconst SEND_AS_ANIMATION_DURATION = 300;\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n private sendAsAvatar: AvatarElement;\r\n private sendAsContainer: HTMLElement;\r\n private sendAsCloseBtn: HTMLElement;\r\n private sendAsBtnMenu: HTMLElement;\r\n private sendAsPeerIds: PeerId[];\r\n public sendAsPeerId: PeerId;\r\n private updatingSendAsPromise: Promise;\r\n\r\n private botCommandsToggle: HTMLElement;\r\n private botCommands: ChatBotCommands;\r\n private botCommandsIcon: HTMLDivElement;\r\n private hasBotCommands: number;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appMessagesIdsManager: AppMessagesIdsManager, \r\n private appDocsManager: AppDocsManager, \r\n private appChatsManager: AppChatsManager, \r\n private appPeersManager: AppPeersManager, \r\n private appWebPagesManager: AppWebPagesManager, \r\n private appImManager: AppImManager, \r\n private appDraftsManager: AppDraftsManager, \r\n private serverTimeManager: ServerTimeManager, \r\n private appNotificationsManager: AppNotificationsManager,\r\n private appEmojiManager: AppEmojiManager,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager,\r\n private appProfileManager: AppProfileManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input');\r\n this.chatInput.style.display = 'none';\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach(group => {\r\n const container = RadioForm(group.elements.map(e => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.sendAsContainer = document.createElement('div');\r\n this.sendAsContainer.classList.add('new-message-send-as-container');\r\n\r\n this.sendAsCloseBtn = document.createElement('div');\r\n this.sendAsCloseBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\r\n\r\n const sendAsButtons: ButtonMenuItemOptions[] = [{\r\n text: 'SendMessageAsTitle',\r\n onClick: undefined\r\n }];\r\n\r\n let previousAvatar: HTMLElement;\r\n const onSendAsMenuToggle = (visible: boolean) => {\r\n if(visible) {\r\n previousAvatar = this.sendAsAvatar;\r\n }\r\n\r\n const isChanged = this.sendAsAvatar !== previousAvatar;\r\n const useRafs = !visible && isChanged ? 2 : 0;\r\n\r\n SetTransition(this.sendAsCloseBtn, 'is-visible', visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n if(!isChanged) {\r\n SetTransition(previousAvatar, 'is-visible', !visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n }\r\n };\r\n\r\n ButtonMenuToggle({\r\n noRipple: true, \r\n listenerSetter: this.listenerSetter, \r\n container: this.sendAsContainer\r\n }, 'top-right', sendAsButtons, () => {\r\n onSendAsMenuToggle(true);\r\n }, () => {\r\n onSendAsMenuToggle(false);\r\n });\r\n\r\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\r\n this.sendAsBtnMenu = this.sendAsContainer.firstElementChild as any;\r\n this.sendAsBtnMenu.classList.add('scrollable', 'scrollable-y');\r\n this.sendAsContainer.append(this.sendAsCloseBtn);\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n this.appMessagesManager.goToNextMention(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(value => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n appMessagesManager: this.appMessagesManager,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n\r\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.appProfileManager);\r\n this.botCommandsToggle = document.createElement('div');\r\n this.botCommandsToggle.classList.add('new-message-bot-commands');\r\n\r\n const scaler = document.createElement('div');\r\n scaler.classList.add('new-message-bot-commands-icon-scale');\r\n\r\n const icon = this.botCommandsIcon = document.createElement('div');\r\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\r\n scaler.append(icon);\r\n this.botCommandsToggle.append(scaler);\r\n\r\n attachClickEvent(this.botCommandsToggle, (e) => {\r\n cancelEvent(e);\r\n const isShown = icon.classList.contains('state-back');\r\n if(isShown) {\r\n this.botCommands.toggle(true);\r\n icon.classList.remove('state-back');\r\n } else {\r\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\r\n icon.classList.add('state-back');\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.botCommands.addEventListener('visible', () => {\r\n icon.classList.add('state-back');\r\n });\r\n\r\n this.botCommands.addEventListener('hiding', () => {\r\n icon.classList.remove('state-back');\r\n });\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n new PopupCreatePoll(this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n //this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.sendAsContainer, this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.appEmojiManager);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.appUsersManager, this.appInlineBotsManager);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.sendAsContainer) {\r\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\r\n if(peerId.isChannel() && this.chat.peerId === peerId) {\r\n this.updateSendAs();\r\n }\r\n });\r\n }\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.chat.peerId]) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n new PopupNewMedia(this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then(result => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public center(animate = false) {\r\n const neededFakeContainer = this.getNeededFakeContainer();\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n \r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n //scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform, \r\n borderRadius, \r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer && \r\n neededFakeContainer.classList.contains('chat-input-control') && \r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom, \r\n widthTo\r\n };\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public getNeededFakeContainer() {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(this.startParam !== undefined || \r\n !this.chat.canSend() || \r\n this.chat.type === 'pinned' || \r\n this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = (callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && this.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n \r\n const dialog = this.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true) + this.serverTimeManager.serverTimeOffset,\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.style.display = 'none';\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = this.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n if(this.messageInputField.value === draft.rMessage && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(draft.rMessage, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n public finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, sendAsContainer, botCommandsToggle} = this;\r\n chatInput.style.display = '';\r\n \r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', this.appPeersManager.canPinMessage(peerId));\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.appMessagesManager.getScheduledMessages(peerId).then(mids => {\r\n if(!middleware()) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(this.newMessageWrapper) {\r\n this.updateOffset(null, false, true);\r\n }\r\n\r\n if(botCommandsToggle) {\r\n this.hasBotCommands = undefined;\r\n this.botCommands.toggle(true, undefined, true);\r\n this.updateBotCommandsToggle(true);\r\n botCommandsToggle.remove();\r\n if(this.appPeersManager.isBot(peerId)) {\r\n const userId = peerId.toUserId();\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const getUserFullResult = this.appProfileManager.getProfile(userId);\r\n callbackify(getUserFullResult, (userFull) => {\r\n if(!middleware()) return;\r\n this.updateBotCommands(userFull, !(getUserFullResult instanceof Promise));\r\n });\r\n }\r\n }\r\n\r\n if(sendAsContainer) {\r\n if(this.sendAsAvatar) {\r\n this.sendAsAvatar.remove();\r\n this.sendAsAvatar = undefined;\r\n }\r\n \r\n sendAsContainer.remove();\r\n this.sendAsPeerId = undefined;\r\n this.updatingSendAsPromise = undefined;\r\n\r\n this.updateSendAs(true);\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n \r\n if(this.messageInput) {\r\n this.updateMessageInput();\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(this.appPeersManager.canPinMessage(this.chat.peerId) ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n\r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n \r\n this.startParam = startParam;\r\n\r\n this.center(false);\r\n }\r\n\r\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\r\n if(type) {\r\n this.newMessageWrapper.dataset.offset = type;\r\n } else {\r\n delete this.newMessageWrapper.dataset.offset;\r\n }\r\n\r\n SetTransition(this.newMessageWrapper, 'has-offset', forwards, skipAnimation ? 0 : 300, undefined, useRafs);\r\n }\r\n\r\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\r\n this.hasBotCommands = userFull.bot_info && userFull.bot_info.commands.length;\r\n this.updateBotCommandsToggle(skipAnimation);\r\n }\r\n\r\n private updateBotCommandsToggle(skipAnimation?: boolean) {\r\n const {botCommandsToggle, hasBotCommands} = this;\r\n\r\n const show = !!hasBotCommands && this.isInputEmpty();\r\n if(!hasBotCommands) {\r\n if(!botCommandsToggle.parentElement) {\r\n return;\r\n }\r\n \r\n botCommandsToggle.remove();\r\n }\r\n \r\n const forwards = show;\r\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\r\n\r\n if(!botCommandsToggle.parentElement) {\r\n this.newMessageWrapper.prepend(botCommandsToggle);\r\n }\r\n\r\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\r\n }\r\n\r\n private updateSendAsButtons(peerIds: PeerId[]) {\r\n const buttons: ButtonMenuItemOptions[] = peerIds.map((sendAsPeerId, idx) => {\r\n const textElement = document.createElement('div');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('btn-menu-item-subtitle');\r\n if(sendAsPeerId.isUser()) {\r\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\r\n } else if(sendAsPeerId === this.chat.peerId) {\r\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\r\n } else {\r\n subtitle.append(this.appProfileManager.getChatMembersString(sendAsPeerId.toChatId()));\r\n }\r\n\r\n textElement.append(\r\n new PeerTitle({peerId: sendAsPeerId}).element,\r\n subtitle\r\n );\r\n\r\n return {\r\n onClick: idx ? () => {\r\n const currentPeerId = this.chat.peerId;\r\n if(currentPeerId.isChannel()) {\r\n const channelFull = this.appProfileManager.getCachedFullChat(currentPeerId.toChatId()) as ChatFull.channelFull;\r\n if(channelFull) {\r\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\r\n this.sendAsPeerId = sendAsPeerId;\r\n this.updateSendAsAvatar(sendAsPeerId);\r\n this.updateMessageInputPlaceholder();\r\n\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const executeButtonsUpdate = () => {\r\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\r\n const peerIds = this.sendAsPeerIds.slice();\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateSendAsButtons(peerIds);\r\n };\r\n \r\n if(rootScope.settings.animationsEnabled) {\r\n setTimeout(executeButtonsUpdate, 250);\r\n } else {\r\n executeButtonsUpdate();\r\n }\r\n }\r\n }\r\n\r\n // return;\r\n apiManager.invokeApi('messages.saveDefaultSendAs', {\r\n peer: this.appPeersManager.getInputPeerById(currentPeerId),\r\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\r\n });\r\n } : undefined,\r\n textElement\r\n };\r\n });\r\n\r\n const btnMenu = ButtonMenu(buttons/* , this.listenerSetter */);\r\n buttons.forEach((button, idx) => {\r\n const peerId = peerIds[idx];\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\r\n avatar.updateWithOptions({peerId});\r\n\r\n if(!idx) {\r\n avatar.classList.add('active');\r\n }\r\n \r\n button.element.prepend(avatar);\r\n });\r\n\r\n Array.from(this.sendAsBtnMenu.children).slice(1).forEach(node => node.remove());\r\n this.sendAsBtnMenu.append(...Array.from(btnMenu.children));\r\n }\r\n\r\n private updateSendAsAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n const previousAvatar = this.sendAsAvatar;\r\n if(previousAvatar) {\r\n if(previousAvatar.peerId === sendAsPeerId) {\r\n return;\r\n }\r\n }\r\n \r\n if(!previousAvatar) {\r\n skipAnimation = true;\r\n }\r\n \r\n let useRafs = skipAnimation ? 0 : 2;\r\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\r\n const avatar = this.sendAsAvatar = new AvatarElement();\r\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\r\n avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: sendAsPeerId\r\n });\r\n\r\n SetTransition(avatar, 'is-visible', true, duration, undefined, useRafs); \r\n if(previousAvatar) {\r\n SetTransition(previousAvatar, 'is-visible', false, duration, () => {\r\n previousAvatar.remove();\r\n }, useRafs);\r\n }\r\n \r\n this.sendAsContainer.append(avatar);\r\n }\r\n\r\n private getDefaultSendAs() {\r\n // return rootScope.myId;\r\n return callbackify(this.appProfileManager.getChannelFull(this.chat.peerId.toChatId()), (channelFull) => {\r\n return channelFull.default_send_as ? this.appPeersManager.getPeerId(channelFull.default_send_as) : undefined;\r\n });\r\n }\r\n\r\n private updateSendAs(skipAnimation?: boolean) {\r\n const peerId = this.chat.peerId;\r\n if(!peerId.isChannel() || this.updatingSendAsPromise) {\r\n return;\r\n }\r\n\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return !this.updatingSendAsPromise || this.updatingSendAsPromise === updatingSendAsPromise;\r\n });\r\n\r\n const {sendAsContainer} = this;\r\n const chatId = peerId.toChatId();\r\n const result = this.getDefaultSendAs();\r\n // const result = Promise.resolve(this.getDefaultSendAs());\r\n\r\n if(result instanceof Promise) {\r\n skipAnimation = undefined;\r\n }\r\n\r\n const updateSendAsResult = callbackify(result, (sendAsPeerId) => {\r\n if(!middleware() || sendAsPeerId === undefined) return;\r\n \r\n this.sendAsPeerId = sendAsPeerId;\r\n this.updateSendAsAvatar(sendAsPeerId, skipAnimation);\r\n this.updateMessageInputPlaceholder();\r\n\r\n this.appChatsManager.getSendAs(chatId).then(peers => {\r\n if(!middleware()) return;\r\n\r\n const peerIds = peers.map((peer) => this.appPeersManager.getPeerId(peer));\r\n this.sendAsPeerIds = peerIds.slice();\r\n\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateSendAsButtons(peerIds);\r\n });\r\n\r\n let useRafs = 0;\r\n if(!sendAsContainer.parentElement) {\r\n this.newMessageWrapper.prepend(sendAsContainer);\r\n useRafs = 2;\r\n }\r\n\r\n this.updateOffset('as', true, skipAnimation, useRafs);\r\n\r\n this.updatingSendAsPromise = undefined;\r\n });\r\n\r\n const updatingSendAsPromise = this.updatingSendAsPromise = Promise.resolve(updateSendAsResult);\r\n return updatingSendAsPromise;\r\n }\r\n\r\n private updateMessageInputPlaceholder() {\r\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\r\n if(i) {\r\n const {peerId, threadId} = this.chat;\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(this.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if((this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) || \r\n this.appMessagesManager.isAnonymousSending(peerId)) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n }\r\n\r\n public updateMessageInput() {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const canWrite = this.chat.canSend();\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canWrite;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canWrite);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n this.updateMessageInputPlaceholder();\r\n\r\n const visible = this.attachMenuButtons.filter(button => {\r\n const good = button.verify(peerId, threadId);\r\n button.element.classList.toggle('hide', !good);\r\n return good;\r\n });\r\n\r\n if(!canWrite) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const MONOSPACE_FONT = 'var(--font-monospace)';\r\n const SPOILER_FONT = 'spoiler';\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //const differentParents = !!nodes.find(node => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace' || type === 'spoiler') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(this.resetCurrentFormatting());\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private resetCurrentFormatting() {\r\n return document.execCommand('fontName', false, 'Roboto');\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = RichTextProcessor.parseEntities(value);\r\n const value = RichTextProcessor.parseMarkdown(richValue, markdownEntities, true);\r\n const entities = RichTextProcessor.mergeEntities(markdownEntities, RichTextProcessor.parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter(e => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.appWebPagesManager.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n },\r\n }).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n //console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n \r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n const isEmpty = !richValue.trim();\r\n if(isEmpty) {\r\n if(this.lastTimeType) {\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n\r\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\r\n // * so have to reset formatting\r\n if(document.activeElement === this.messageInput) {\r\n // document.execCommand('styleWithCSS', false, 'true');\r\n setTimeout(() => {\r\n if(document.activeElement === this.messageInput) {\r\n this.resetCurrentFormatting();\r\n }\r\n }, 0);\r\n // document.execCommand('styleWithCSS', false, 'false');\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n\r\n if(this.botCommands) {\r\n this.botCommands.toggle(true);\r\n }\r\n }\r\n\r\n if(this.botCommands) {\r\n this.updateBotCommandsToggle();\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = RichTextProcessor.parseEntities(fullValue);\r\n RichTextProcessor.mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach(entity => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n RichTextProcessor.mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = documentFragmentToHTML(RichTextProcessor.wrapDraftText(newValue, {entities}));\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, RichTextProcessor.wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, RichTextProcessor.getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = RichTextProcessor.parseMarkdown(value, entities, true);\r\n entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? this.appMessagesIdsManager.getServerMessageId(this.chat.threadId) : undefined;\r\n if(this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend('send_media')) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach(value => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = RichTextProcessor.parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const forwarding = copy(this.forwarding);\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(forwarding, () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach(i => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = RichTextProcessor.parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter(entity => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach(entity => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {peerId} = chat;\r\n const {noWebPage} = this;\r\n const sendingParams = this.chat.getMessageSendingParams();\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n ...sendingParams,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n ...sendingParams,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = this.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend(flag)) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n ...this.chat.getMessageSendingParams(),\r\n isMedia: true, \r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public initMessageEditing(mid: number) {\r\n const message: Message.message = this.chat.getMessage(mid);\r\n\r\n let input = documentFragmentToHTML(RichTextProcessor.wrapDraftText(message.message, {entities: message.totalEntities}));\r\n const f = () => {\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = () => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map(fromPeerId => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n fromPeerIds.forEach(fromPeerId => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n mids.forEach(mid => {\r\n const message: Message.message = this.appMessagesManager.getMessageByPeer(fromPeerId, mid);\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n length += mids.length;\r\n });\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map(smth => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = this.appMessagesManager.getMessageByPeer(fromPeerId, mids[0]);\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = this.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find(mid => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message: Message = this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(message._ === 'messageEmpty') { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(message._ === 'messageEmpty') {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const newReply = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(newReply);\r\n } else {\r\n replyParent.insertBefore(newReply, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n newReply.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return newReply;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport ripple from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Message } from \"../../layer\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n \r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n \r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n \r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then(needClose => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n \r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n \r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n \r\n // const active = classNames.filter(className => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n \r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n \r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public isVisible() {\r\n return !this.divAndCaption.container.classList.contains('hide');\r\n }\r\n\r\n public isFloating() {\r\n return this.divAndCaption.container.classList.contains('is-floating');\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport rootScope from \"../lib/rootScope\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport RangeSelector from \"./rangeSelector\";\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01, \n min: 0, \n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n //console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n },\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(rootScope)('media_playback_params', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach(icon => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController, { AppMediaPlaybackController } from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport ButtonIcon from \"../buttonIcon\";\nimport { DocumentAttribute } from \"../../layer\";\nimport MediaProgressLine from \"../mediaProgressLine\";\nimport VolumeSelector from \"../volumeSelector\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(rootScope)('media_play', this.onMediaPlay);\n this.topbar.listenerSetter.add(rootScope)('media_pause', this.onPause);\n this.topbar.listenerSetter.add(rootScope)('media_stop', this.onStop);\n this.topbar.listenerSetter.add(rootScope)('media_playback_params', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n \n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = RichTextProcessor.wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? RichTextProcessor.wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n \r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);//this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n //this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map(n => +n);\r\n const byDecimal = Array.from('' + number).map(n => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n //const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n //decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n //this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n private static LOAD_COUNT = 50;\r\n private static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n private pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n private pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n private wasPinnedIndex = 0;\r\n private wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n private waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n private mids: number[] = [];\r\n private offsetIndex = 0;\r\n\r\n private loading = false;\r\n private loadedBottom = false;\r\n private loadedTop = false;\r\n\r\n private animatedSubtitle: AnimatedSuper;\r\n private animatedMedia: AnimatedSuper;\r\n private animatedCounter: AnimatedCounter;\r\n\r\n private listenerSetter: ListenerSetter;\r\n private scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n private getCurrentIndexPromise: Promise = null;\r\n private btnOpen: HTMLButtonElement;\r\n \r\n private setPinnedMessage: () => void;\r\n\r\n private isStatic = false;\r\n\r\n private debug = false;\r\n \r\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private appMessagesManager: AppMessagesManager, private appPeersManager: AppPeersManager) {\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(appPeersManager.canPinMessage(this.topbar.peerId)) {\r\n new PopupPinMessage(this.topbar.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.topbar.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n // return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.chat.log('[PM]: setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.chat.log('[PM]: testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex(_mid => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.chat.log('[PM]: testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find(_mid => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n let gotRest = false;\r\n const promises = [\r\n this.appMessagesManager.getSearch({\r\n peerId: this.topbar.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then(r => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(p => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex(message => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map(message => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n this.debug && this.chat.log('[PM]: getCurrentIndex result:', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.chat.log.error('[PM]: getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.chat.log.error('[PM]: handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = this.chat.getMessage(mid);\r\n if(message && !message.deleted) {\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.chat.log('[PM]: setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: message.message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n //});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from \"../../helpers/tsNow\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport { MUTE_UNTIL } from \"../../lib/mtproto/mtproto_config\";\nimport RadioField from \"../radioField\";\nimport Row, { RadioFormFromRows } from \"../row\";\nimport { SettingSection } from \"../sidebarLeft\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n appMessagesManager.mutePeer(peerId, time === -1 ? MUTE_UNTIL : tsNow(true) + time);\n }\n }],\n body: true\n });\n\n const ONE_HOUR = 3600;\n const times: {time: number, langKey: LangPackKey}[] = [{\n time: ONE_HOUR, \n langKey: 'ChatList.Mute.1Hour'\n }, {\n time: ONE_HOUR * 4, \n langKey: 'ChatList.Mute.4Hours'\n }, {\n time: ONE_HOUR * 8, \n langKey: 'ChatList.Mute.8Hours'\n }, {\n time: ONE_HOUR * 24, \n langKey: 'ChatList.Mute.1Day'\n }, {\n time: ONE_HOUR * 24 * 3,\n langKey: 'ChatList.Mute.3Days'\n }, {\n time: -1,\n langKey: 'ChatList.Mute.Forever'\n }];\n \n const name = 'mute-time';\n const rows = times.map((time) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: time.langKey, \n name, \n value: '' + time.time\n })\n });\n\n return row;\n });\n\n let time: number;\n const radioForm = RadioFormFromRows(rows, (value) => {\n time = +value;\n });\n\n rows[rows.length - 1].radioField.checked = true;\n\n const section = new SettingSection({noShadow: true, noDelimiter: true});\n section.content.append(radioForm);\n this.body.append(section.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppGroupCallsManager, MyGroupCall } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull, Chat as MTChat, GroupCall } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport { CallType } from \"../../lib/calls/types\";\nimport PopupMute from \"../popups/mute\";\nimport generateTitleIcons from \"../generateTitleIcons\";\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n public peerId: PeerId;\n private wasPeerId: PeerId;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private appMessagesManager: AppMessagesManager, \n private appPeersManager: AppPeersManager, \n private appChatsManager: AppChatsManager, \n private appNotificationsManager: AppNotificationsManager,\n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager,\n private appGroupCallsManager: AppGroupCallsManager\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.appMessagesManager);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null, \n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null, \n this.btnJoin, \n this.btnPinned, \n this.btnCall, \n this.btnGroupCall, \n this.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n \n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n //if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n //}\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n //const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: () => boolean) {\n if(!element) {\n return;\n }\n \n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const verifyButtons = (buttons: ButtonToVerify[]) => {\n buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify());\n });\n };\n\n if(isMenuOpen) {\n verifyButtons(this.menuButtons);\n\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(this.appPeersManager.getDeleteButtonText(this.peerId)));\n }\n\n verifyButtons(this.buttonsToVerify);\n };\n\n private verifyVideoChatButton = (type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = this.appGroupCallsManager.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if((this.peerId.isBroadcast() && type === 'group') || \n (this.peerId.isAnyGroup() && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = this.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || this.appChatsManager.hasRights(chatId, 'manage_call');\n };\n\n private verifyCallButton = (type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = this.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.appMessagesManager.togglePeerMute(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.appProfileManager.getChannelFull(this.peerId.toChatId())).then(channelFull => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: () => {\n const chatFull = this.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n appStateManager.getState().then(state => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = (bubble) => {\n appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = new AppEditContactTab(this.appSidebarRight);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: () => this.peerId.isUser() && !this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: () => rootScope.myId !== this.peerId && this.peerId.isUser() && this.appPeersManager.isContact(this.peerId) && !!this.appUsersManager.getUser(this.peerId.toUserId()).phone\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.appUsersManager.toggleBlock(this.peerId, true).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: () => {\n if(!this.peerId.isUser()) return false;\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.appUsersManager.toggleBlock(this.peerId, false).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: () => {\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: () => this.chat.type === 'chat' && !!this.appMessagesManager.getDialogOnly(this.peerId)\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n public constructPeerHelpers() {\n this.avatarElement = new AvatarElement();\n this.avatarElement.isDialog = true;\n this.avatarElement.classList.add('avatar-42', 'person-avatar');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = this.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId, \n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, \n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n //this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n if(this.chatAudio) {\n this.chatAudio.destroy();\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public setPeer(peerId: PeerId) {\n this.wasPeerId = this.peerId;\n this.peerId = peerId;\n\n this.container.style.display = peerId ? '' : 'none';\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n const peerId = this.peerId;\n\n if(this.avatarElement) {\n this.avatarElement.updateWithOptions({peerId});\n }\n\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(this.appPeersManager.isAnyChat(peerId)) {\n const chatId = peerId.toChatId();\n replaceContent(this.btnJoin, i18n(this.appChatsManager.isBroadcast(chatId) ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !this.appChatsManager.getChat(chatId)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n const middleware = this.chat.bubbles.getMiddleware();\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.wasPeerId !== undefined) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n \n if(!isTarget) {\n this.pinnedMessage.setCorrectIndex(0);\n }\n });\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n fastRaf(() => {\n this.setTitle();\n this.setPeerStatus(true);\n this.setMutedState();\n });\n }\n\n public setTitle(count?: number) {\n let titleEl: HTMLElement;\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.appMessagesManager.getSearchCounters(this.peerId, [{_: 'inputMessagesFilterPinned'}], false).then(result => {\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(this.peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.appMessagesManager.getHistory(this.peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(() => {\n const count = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).count;\n if(count === null) {\n setTimeout(() => {\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n titleEl = new PeerTitle({\n peerId: this.peerId,\n dialog: true,\n }).element;\n }\n \n replaceContent(this.title, titleEl);\n\n if(this.chat.type === 'chat') {\n this.title.append(...generateTitleIcons(this.peerId));\n }\n }\n\n public setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(this.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatus = (needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n this.chat.appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, false, () => peerId === this.peerId);\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n new PopupDatePicker(new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport ripple from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n \r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n \r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.bubblesContainer.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n \r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n \r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n new PopupDatePicker(new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, 'LI');\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.bubblesContainer.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private img: HTMLImageElement;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise = \n // this.pattern = \n // this.exportCanvasPatternToImagePromise = \n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.img = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => img);\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n \n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n if(context.fillStyle instanceof CanvasPattern) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n // const perf = performance.now();\n const img = this.img;\n\n let imageWidth = img.width, imageHeight = img.height;\n // if(imageHeight < canvas.height) {\n const ratio = canvas.height / imageHeight;\n imageWidth *= ratio;\n imageHeight = canvas.height;\n // }\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, canvas.width, canvas.height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n for(let x = 0; x < canvas.width; x += imageWidth) {\n for(let y = 0; y < canvas.height; y += imageHeight) {\n context.drawImage(img, x, y, imageWidth, imageHeight);\n }\n }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, canvas.width, canvas.height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n canvas.width = this.options.width * devicePixelRatio;\n canvas.height = this.options.height * devicePixelRatio * (mediaSizes.activeScreen === ScreenSize.large ? 1.5 : 1);\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map(instance => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, ChatRights } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppDocsManager } from \"../../lib/appManagers/appDocsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\nimport type { ApiManagerProxy } from \"../../lib/mtproto/mtprotoworker\";\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\nimport type { ServerTimeManager } from \"../../lib/mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppReactionsManager } from \"../../lib/appManagers/appReactionsManager\";\nimport type stateStorage from '../../lib/stateStorage';\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport getAutoDownloadSettingsByPeerId, { ChatAutoDownloadSettings } from \"../../helpers/autoDownload\";\nimport ChatBackgroundGradientRenderer from \"./gradientRenderer\";\nimport ChatBackgroundPatternRenderer from \"./patternRenderer\";\nimport pause from \"../../helpers/schedulers/pause\";\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n // public renderDarkPattern: () => Promise;\n \n constructor(\n public appImManager: AppImManager, \n public appChatsManager: AppChatsManager, \n public appDocsManager: AppDocsManager, \n public appInlineBotsManager: AppInlineBotsManager, \n public appMessagesManager: AppMessagesManager, \n public appPeersManager: AppPeersManager, \n public appPhotosManager: AppPhotosManager, \n public appProfileManager: AppProfileManager, \n public appStickersManager: AppStickersManager, \n public appUsersManager: AppUsersManager, \n public appWebPagesManager: AppWebPagesManager, \n public appPollsManager: AppPollsManager, \n public apiManager: ApiManagerProxy, \n public appDraftsManager: AppDraftsManager, \n public serverTimeManager: ServerTimeManager, \n public storage: typeof stateStorage, \n public appNotificationsManager: AppNotificationsManager,\n public appEmojiManager: AppEmojiManager,\n public appMessagesIdsManager: AppMessagesIdsManager,\n public appGroupCallsManager: AppGroupCallsManager,\n public appReactionsManager: AppReactionsManager\n ) {\n super();\n\n this.type = 'chat';\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n //this.log.error('Chat construction');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = rootScope.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground && \n document.documentElement.style.cursor === 'grabbing' && \n this.gradientRenderer && \n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer = \n this.patternRenderer = \n this.gradientCanvas = \n this.patternCanvas = \n // this.renderDarkPattern = \n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n \n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then(url => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n \n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + Math.abs(intensity));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas, \n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition(item, 'is-visible', true, !skipAnimation ? 200 : 0, prev ? () => {\n if(previousPatternRenderer) {\n previousPatternRenderer.cleanup(previousPatternCanvas);\n }\n\n if(previousGradientRenderer) {\n previousGradientRenderer.cleanup();\n }\n\n prev.remove();\n } : null, 2);\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n promise = Promise.resolve();\n // }\n \n promise.then(cb);\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n\n if(this.type === 'scheduled') {\n this.getMessagesStorage = () => this.appMessagesManager.getScheduledMessagesStorage(this.peerId);\n //this.getMessage = (mid) => this.appMessagesManager.getMessageFromStorage(this.appMessagesManager.getScheduledMessagesStorage(this.peerId), mid);\n }\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.appMessagesManager, this.appPeersManager, this.appChatsManager, this.appNotificationsManager, this.appProfileManager, this.appUsersManager, this.appGroupCallsManager);\n this.bubbles = new ChatBubbles(this, this.appMessagesManager, this.appStickersManager, this.appUsersManager, this.appInlineBotsManager, this.appPhotosManager, this.appPeersManager, this.appProfileManager, this.appDraftsManager, this.appMessagesIdsManager, this.appChatsManager, this.appReactionsManager, this.appWebPagesManager);\n this.input = new ChatInput(this, this.appMessagesManager, this.appMessagesIdsManager, this.appDocsManager, this.appChatsManager, this.appPeersManager, this.appWebPagesManager, this.appImManager, this.appDraftsManager, this.serverTimeManager, this.appNotificationsManager, this.appEmojiManager, this.appUsersManager, this.appInlineBotsManager, this.appProfileManager);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.appMessagesManager);\n this.contextMenu = new ChatContextMenu(this.bubbles.bubblesContainer, this, this.appMessagesManager, this.appPeersManager, this.appPollsManager, this.appDocsManager, this.appMessagesIdsManager, this.appReactionsManager);\n\n if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n if(this.type !== 'scheduled' && !IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.bubblesContainer, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.selection.cleanup();\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n rootScope.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n } else if(this.setPeerPromise) {\n return;\n }\n\n //console.time('appImManager setPeer');\n //console.time('appImManager setPeer pre promise');\n ////console.time('appImManager: pre render start');\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.topbar.setPeer(peerId);\n this.bubbles.setPeer(peerId);\n rootScope.dispatchEvent('peer_changed', peerId);\n\n return;\n }\n\n // set new\n if(!samePeer) {\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n this.noForwards = this.appPeersManager.noForwards(peerId);\n this.isRestricted = this.appPeersManager.isRestricted(peerId);\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n appSidebarRight.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n this.setAutoDownloadMedia();\n }\n\n this.peerChanged = samePeer;\n\n if(startParam === undefined && this.isStartButtonNeeded()) {\n startParam = BOT_START_PARAM;\n }\n\n const result = this.bubbles.setPeer(peerId, lastMsgId, startParam);\n if(!result) {\n return;\n }\n\n const {promise} = result;\n\n //console.timeEnd('appImManager setPeer pre promise');\n \n const setPeerPromise = this.setPeerPromise = promise.finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n if(!samePeer) {\n appSidebarRight.sharedMediaTab.setLoadMutex(this.setPeerPromise);\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n }\n /* this.setPeerPromise.then(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n\n return result;\n }\n\n public setAutoDownloadMedia() {\n this.autoDownload = getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n let peerId = this.peerId;\n this.peerChanged = true;\n\n this.cleanup(false);\n\n this.topbar.setPeer(peerId);\n this.topbar.finishPeerChange(isTarget, isJump, lastMsgId);\n this.bubbles.finishPeerChange();\n this.input.finishPeerChange(startParam);\n\n appSidebarRight.sharedMediaTab.fillProfileElements();\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n rootScope.dispatchEvent('peer_changed', peerId);\n this.wasAlreadyUsed = true;\n }\n\n public getMessagesStorage() {\n return this.appMessagesManager.getMessagesStorage(this.peerId);\n }\n\n public getMessage(mid: number) {\n return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(), mid);\n //return this.appMessagesManager.getMessageByPeer(this.peerId, mid);\n }\n\n public getMidsByMid(mid: number) {\n return this.appMessagesManager.getMidsByMessage(this.getMessage(mid));\n }\n\n public isAnyGroup() {\n return this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || this.appPeersManager.isAnyGroup(this.peerId);\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = new AppPrivateSearchTab(appSidebarRight);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return this.appPeersManager.isBot(this.peerId) && \n !this.appMessagesManager.getDialogOnly(this.peerId) && \n !this.appMessagesManager.getHistoryStorage(this.peerId).history.length;\n }\n\n public getMessageSendingParams() {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n sendSilent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { State } from \"../lib/appManagers/appStateManager\";\nimport rootScope from \"../lib/rootScope\";\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default function getAutoDownloadSettingsByPeerId(peerId: PeerId): ChatAutoDownloadSettings {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(peerId.isContact()) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(peerId.isBroadcast()) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n \n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport clamp from \"../../helpers/number/clamp\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach(c => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !RichTextProcessor.matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach(node => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\r\n\r\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\r\n \r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n \r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n \r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n \r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n \r\n this.setTooltipPosition();\r\n \r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n \r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n //this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e?: Event) => {\r\n //this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n e && cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n //this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n //this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n const messageInput = this.appImManager.chat.input.messageInput;\r\n if(document.activeElement !== messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else if(this.container && this.container.classList.contains('is-visible')) {\r\n this.setTooltipPosition();\r\n } else if(messageInput.matches(':active')) {\r\n this.setMouseUpEvent();\r\n } else {\r\n this.show();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter(node => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach(el => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach(el => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n \n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n \n this.N = n;\n this.radius = new Array(n + 1);\n \n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n \n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n \n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n \n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n \n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n \n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n \n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n \n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n \n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n \n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n \n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n \n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n \n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n \n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n \n return gradient;\n }\n \n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n \n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n \n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n \n private mounted: boolean;\n private media: MediaQueryList;\n \n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n \n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n \n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n \n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)],\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n \n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n \n this.setSize();\n this.forceUpdate();\n \n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n \n this.draw();\n }\n \n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n \n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n \n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n \n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n \n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n \n this.forceUpdate();\n this.invokeDraw();\n }\n \n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n \n public handleBlur = () => {\n this.focused = false;\n }\n \n private invokeDraw = () => {\n if(this.raf) return;\n \n this.draw();\n }\n \n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n \n // console.log('[top] draw', [focused, resizing, this.mounted]);\n \n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n \n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n \n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n \n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n \n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n \n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n \n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n \n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n \n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n \n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n \n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n \n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n \n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n \n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n \n if(currentState?.stateId === stateId) {\n return;\n }\n \n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n \n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n \n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from \"../../lib/rootScope\";\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(let i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport rootScope from \"../rootScope\";\nimport lottieLoader, { LottieAssetName } from \"./lottieLoader\";\nimport type RLottiePlayer from \"./rlottiePlayer\";\nimport { RLottieColor } from \"./rlottiePlayer\";\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n \n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map(options => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then(player => {\n return lottieLoader.waitForFirstFrame(player);\n }).then(player => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find(part => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n \n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame, \n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n \n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../helpers/noop\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport { LottieAssetName } from \"../lib/rlottie/lottieLoader\";\nimport RLottieIcon, { RLottieIconItemPartOptions, RLottieIconItemPart } from \"../lib/rlottie/rlottieIcon\";\nimport { RLottieColor } from \"../lib/rlottie/rlottiePlayer\";\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map(item => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n \n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n \n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach(item => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RLottieIconItemPartOptions } from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_MICROPHONE_BUTTON_STATE } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, \n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from \"../popups\";\nimport { hexToRgb } from \"../../helpers/color\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport customProperties from \"../../helpers/dom/customProperties\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport { RLottieColor } from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIcon from \"./microphoneIcon\";\nimport GroupCallParticipantsElement from \"./participants\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\nimport PopupPeer from \"../popups/peer\";\nimport GroupCallDescriptionElement from \"./description\";\nimport GroupCallTitleElement from \"./title\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport Scrollable from \"../scrollable\";\nimport { MovableState } from \"../movableElement\";\nimport animationIntersector from \"../animationIntersector\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport makeButton from \"../call/button\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let color: RLottieColor, colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n color = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private appChatsManager: AppChatsManager;\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor(options: {\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n }) {\n super('popup-group-call', undefined, {\n body: true,\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = this.appGroupCallsManager.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n \n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n \n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n \n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n ...options\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n ...options\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') || \n findUpClassName(target, 'group-call-button') || \n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n \n private onLeaveClick = () => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(this.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true,\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach(element => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach(element => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { GROUP_CALL_PARTICIPANT_MUTED_STATE } from \".\";\nimport { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter(type => !!participant[type]).map(type => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, RichTextProcessor.wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n \n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } from \"../../lib/appManagers/appDialogsManager\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport type GroupCallInstance from \"../../lib/calls/groupCallInstance\";\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n participant: GroupCallParticipant,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 54;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: (element) => element.participant.date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: (element) => {\n const {participant} = element;\n\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const participant = instance.participants.get(base.id);\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n \n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n\n (base as SortedParticipant).dom = dom;\n (base as SortedParticipant).participant = participant;\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport EventListenerBase from \"../eventListenerBase\";\nimport ListenerSetter from \"../listenerSetter\";\nimport safeAssign from \"../object/safeAssign\";\nimport findUpClassName from \"./findUpClassName\";\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n \n public setup(options: {\n element: HTMLElement, \n listenerSetter: ListenerSetter, \n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n \n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n \n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n \n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n \n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport { i18n } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport callVideoCanvasBlur from \"../call/videoCanvasBlur\";\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private appPeersManager: AppPeersManager, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n \n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n \n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n \n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n \n this.container.append(this.header);\n // }\n \n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: this.appPeersManager.getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n \n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { AppGroupCallsManager, GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport GroupCallParticipantVideoElement, { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange']\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n \n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return; \n }\n \n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some(type => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach(type => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.appPeersManager, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n \n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n \n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public setInstance(instance: GroupCallInstance) {\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from \".\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, isFullScreen } from \"../../helpers/dom/fullScreen\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport { attachContextMenuListener, closeBtnMenu, openBtnMenu, positionMenu } from \"../misc\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport Scrollable from \"../scrollable\";\nimport GroupCallParticipantsList from \"./participantsList\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean})[];\n private element: HTMLDivElement;\n private appChatsManager: AppChatsManager;\n private appPeersManager: AppPeersManager;\n private appGroupCallsManager: AppGroupCallsManager;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n appChatsManager: AppChatsManager,\n appPeersManager: AppPeersManager,\n appGroupCallsManager: AppGroupCallsManager,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: () => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: this.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.appChatsManager = options.appChatsManager;\n this.appPeersManager = options.appPeersManager;\n this.appGroupCallsManager = options.appGroupCallsManager;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n \n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, (e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = this.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n this.buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify(peerId));\n });\n \n cancelEvent(e);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n closeBtnMenu();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? (PopupElement.getPopups(PopupGroupCall) as PopupGroupCall[])[0].getContainer(): document.body;\n\n if(!isFull) {\n closeBtnMenu();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n rootScope.dispatchEvent('history_focus', {\n peerId: this.targetPeerId\n });\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.appGroupCallsManager.editParticipant(this.instance.id, this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private appChatsManager: AppChatsManager;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n \n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach(participant => {\n this.updateParticipant(participant);\n });\n \n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n \n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport I18n, { LangPackKey, FormatterArguments } from \"../../lib/langPack\";\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, RichTextProcessor.wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n } \n }\n}\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport ripple from \"../ripple\";\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport clamp from \"../helpers/number/clamp\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport windowSize from \"../helpers/windowSize\";\nimport SwipeHandler from \"./swipeHandler\";\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n \n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n \n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach(handler => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map(side => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, { MovableElementOptions, MovableState } from \"../components/movableElement\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport ListenerSetter from \"./listenerSetter\";\nimport mediaSizes, { ScreenSize } from \"./mediaSizes\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n \n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n \n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport toHHMMSS from \"../../helpers/string/toHHMMSS\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = toHHMMSS(instance.duration, true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport { IS_MOBILE } from \"../../environment/userAgent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport { onMediaLoad } from \"../../helpers/files\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\nimport type { AppAvatarsManager } from \"../../lib/appManagers/appAvatarsManager\";\nimport type { AppCallsManager } from \"../../lib/appManagers/appCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport CallInstance from \"../../lib/calls/callInstance\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport AvatarElement from \"../avatar\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIconMini from \"../groupCall/microphoneIconMini\";\nimport { MovableState } from \"../movableElement\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport SetTransition from \"../singleTransition\";\nimport makeButton from \"./button\";\nimport CallDescriptionElement from \"./description\";\nimport callVideoCanvasBlur from \"./videoCanvasBlur\";\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private instance: CallInstance;\n private appCallsManager: AppCallsManager;\n private appAvatarsManager: AppAvatarsManager;\n private appPeersManager: AppPeersManager;\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n \n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(options: {\n appCallsManager: AppCallsManager,\n appAvatarsManager: AppAvatarsManager,\n appPeersManager: AppPeersManager,\n instance: CallInstance\n }) {\n super('popup-call', undefined, {\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videoContainers = {};\n\n const {container, listenerSetter, instance} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n \n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container, \n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') || \n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n \n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n \n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true,\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find(container => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition(this.partyMutedState, 'is-visible', !!outputState?.muted, 300);\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach(type => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then(emojis => {\n this.emojisSubtitle.append(RichTextProcessor.wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach(container => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n \n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \"../sdp\";\nimport { CallSignalingData, P2PVideoCodec } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n \n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n fingerprints: [info.fingerprint],\n ufrag: info.ufrag,\n pwd: info.pwd,\n audio: undefined,\n video: undefined,\n screencast: undefined\n };\n \n const convertNumber = (number: number) => '' + number;\n \n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n \n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n \n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map(sourceGroup => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n \n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n \n const payloadTypesMap: Map = new Map();\n \n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n \n return payloadType;\n };\n \n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n \n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n \n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n \n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n \n return data;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport CallInstance from \"./callInstance\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport { parseSdp } from \"./sdp/utils\";\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n \n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n \n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n \n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, //this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n \n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n \n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n \n return result;\n }\n \n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n \n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n \n return this.encryptPrepared(result);\n }\n \n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n \n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n \n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n \n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n \n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n \n return !msgKeyEquals;\n }\n \n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n \n const {isOutgoing, type} = this;\n \n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n \n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n \n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n \n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n \n return decryptionBuffer.slice(4);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0', \n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`, \n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2', \n 'a=extmap-allow-mixed', \n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux', \n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0',\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from \"../../environment/ctx\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport { GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update } from \"../../layer\";\nimport { emojiFromCodePoints } from \"../../vendor/emoji\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { AppCallsManager, CallId } from \"../appManagers/appCallsManager\";\nimport { logger } from \"../logger\";\nimport type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstance from \"./callConnectionInstance\";\nimport CallInstanceBase from \"./callInstanceBase\";\nimport CALL_STATE from \"./callState\";\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"./constants\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription, { ConferenceEntry, generateSsrc } from \"./localConferenceDescription\";\nimport getCallProtocol from \"./p2P/getCallProtocol\";\nimport getRtcConfiguration from \"./p2P/getRtcConfiguration\";\nimport P2PEncryptor from \"./p2P/p2PEncryptor\";\nimport { p2pParseCandidate, P2PSdpBuilder } from \"./p2P/p2PSdpBuilder\";\nimport { parseSdp } from \"./sdp/utils\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec } from \"./types\";\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n \n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private appCallsManager: AppCallsManager;\n private apiManager: ApiManagerProxy;\n private apiUpdatesManager: ApiUpdatesManager;\n \n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n \n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n appCallsManager: CallInstance['appCallsManager'],\n apiManager: CallInstance['apiManager'],\n apiUpdatesManager: CallInstance['apiUpdatesManager'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n \n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n type: 'input',\n lowBattery: false,\n muted: true,\n screencastState: 'inactive',\n videoRotation: 0,\n videoState: 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find(entry => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n \n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.appCallsManager.generateDh().then(dh => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p,\n };\n\n return this.apiManager.invokeApi('phone.acceptCall', {\n peer: this.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(phonePhoneCall => {\n this.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch(err => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n \n const {isOutgoing, encryptionKey, streamManager} = this;\n \n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection'),\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n \n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n \n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n \n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry; \n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n \n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n \n this.log('sendCallSignalingData', this.id, json);\n await this.apiManager.invokeApi('phone.sendSignalingData', {\n peer: this.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n \n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n \n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates', \n candidates: [parsed]\n });\n }\n\n public async confirmCall() {\n const {appCallsManager, apiManager, protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n \n const phonePhoneCall = await apiManager.invokeApi('phone.confirmCall', {\n peer: appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n \n this.encryptionKey = key;\n appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = this.apiManager.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then(codePoints => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map(codePoints => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter(transceiver => transceiver.direction === 'recvonly').forEach(transceiver => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n let bundle = description.entries.map(entry => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter(entry => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n \n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n \n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n \n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map(payloadType => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n \n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n \n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n pwd: data.pwd,\n ufrag: data.ufrag,\n fingerprints: data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach(codec => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex(payloadType => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex(payloadType => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n \n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map(ssrcGroup => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map(source => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n \n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n let bundle = description.entries.map(entry => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter(entry => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n \n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n \n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map(candidate => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n \n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n \n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n \n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(update: Update.updatePhoneCallSignalingData) {\n this.decryptQueue.push(update.data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCallProtocol } from \"../../../layer\";\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCall } from \"../../../layer\";\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n \n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n \n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport type { AppGroupCallsManager } from \"../lib/appManagers/appGroupCallsManager\";\nimport GROUP_CALL_STATE from \"../lib/calls/groupCallState\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonIcon from \"./buttonIcon\";\nimport TopbarWeave from \"./topbarWeave\";\nimport SetTransition from \"./singleTransition\";\nimport PopupGroupCall from \"./groupCall\";\nimport type { AppPeersManager } from \"../lib/appManagers/appPeersManager\";\nimport type { AppChatsManager } from \"../lib/appManagers/appChatsManager\";\nimport GroupCallDescriptionElement from \"./groupCall/description\";\nimport GroupCallTitleElement from \"./groupCall/title\";\nimport PopupElement from \"./popups\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport GroupCallInstance from \"../lib/calls/groupCallInstance\";\nimport CALL_STATE from \"../lib/calls/callState\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport CallDescriptionElement from \"./call/description\";\nimport PopupCall from \"./call\";\nimport type { AppAvatarsManager } from \"../lib/appManagers/appAvatarsManager\";\nimport GroupCallMicrophoneIconMini from \"./groupCall/microphoneIconMini\";\nimport CallInstance from \"../lib/calls/callInstance\";\nimport type { AppCallsManager } from \"../lib/appManagers/appCallsManager\";\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n \n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n \n constructor(\n private appGroupCallsManager: AppGroupCallsManager,\n private appPeersManager: AppPeersManager,\n private appChatsManager: AppChatsManager,\n private appAvatarsManager: AppAvatarsManager,\n private appCallsManager: AppCallsManager\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(rootScope)('call_instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('call_accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_instance', (instance) => {\n this.updateInstance(instance);\n });\n \n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = this.appGroupCallsManager.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n \n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n \n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n let state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n \n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\n }\n \n if(isClosed) {\n return;\n }\n \n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n \n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n \n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n \n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n \n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n \n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n \n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n \n const end = ButtonIcon('endcall_filled');\n right.append(end);\n \n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n \n new PopupGroupCall({\n appGroupCallsManager: this.appGroupCallsManager,\n appPeersManager: this.appPeersManager,\n appChatsManager: this.appChatsManager\n }).show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall) as PopupCall[];\n if(popups.find(popup => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall({\n appCallsManager: this.appCallsManager,\n appAvatarsManager: this.appAvatarsManager,\n appPeersManager: this.appPeersManager,\n instance: this.instance\n }).show();\n }\n }, {listenerSetter});\n \n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n \n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\nimport compareVersion from \"../../helpers/compareVersion\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall } from \"../../layer\";\nimport CallInstance from \"../calls/callInstance\";\nimport CALL_STATE from \"../calls/callState\";\nimport getCallProtocol from \"../calls/p2P/getCallProtocol\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appProfileManager from \"./appProfileManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport type CallAudioAssetName = \"call_busy.mp3\" | \"call_connect.mp3\" | \"call_end.mp3\" | \"call_incoming.mp3\" | \"call_outgoing.mp3\" | \"voip_failed.mp3\" | \"voip_connecting.mp3\";\n\nexport class AppCallsManager {\n private log: ReturnType;\n private calls: Map;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n private audioAsset: AudioAssetPlayer;\n \n constructor() {\n this.log = logger('CALLS');\n \n this.tempId = 0;\n this.calls = new Map();\n this.instances = new Map();\n this.sortedInstances = [];\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n \n rootScope.addMultipleEventsListeners({\n updatePhoneCall: async(update) => {\n const call = this.saveCall(update.phone_call);\n\n let instance = this.instances.get(call.id);\n \n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\n break;\n } */\n\n instance.confirmCall();\n }\n\n break;\n }\n \n case 'phoneCallRequested': {\n if(!instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\n break;\n } */\n\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n \n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n \n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManager.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint);\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n },\n \n updatePhoneCallSignalingData: (update) => {\n const instance = this.instances.get(update.phone_call_id);\n if(instance?.id !== update.phone_call_id) {\n return;\n }\n \n instance.onUpdatePhoneCallSignalingData(update);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\n ]);\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n public async computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return apiManager.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n \n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n \n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n return call;\n }\n \n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n \n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n \n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n appCallsManager: this,\n apiManager,\n apiUpdatesManager,\n ...options,\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n rootScope.dispatchEvent('call_instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then(async(dhConfig) => {\n return apiManager.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n \n public startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n \n const fullInfo = appProfileManager.getCachedFullUser(userId);\n if(!fullInfo) return;\n \n const {video_calls_available} = fullInfo.pFlags;\n \n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.generateDh().then(dh => {\n call.dh = dh;\n\n return apiManager.invokeApi('phone.requestCall', {\n user_id: appUsersManager.getUserInput(userId),\n protocol: call.protocol,\n video: isVideo && video_calls_available,\n random_id: nextRandomUint(32),\n g_a_hash: call.dh.g_a_hash\n });\n }).then(result => {\n const phoneCall = this.savePhonePhoneCall(result);\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n\n private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n const my = getCallProtocol();\n const myVersion = my.library_versions[0];\n return !protocol.library_versions.find(version => {\n return compareVersion(myVersion, version) > 0;\n });\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n\nconst appCallsManager = new AppCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appCallsManager = appCallsManager);\nexport default appCallsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport apiUpdatesManager from './apiUpdatesManager';\nimport appUsersManager from \"./appUsersManager\";\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport appChatsManager from './appChatsManager';\nimport appDocsManager from './appDocsManager';\nimport appInlineBotsManager from './appInlineBotsManager';\nimport appMessagesManager from './appMessagesManager';\nimport appPeersManager from './appPeersManager';\nimport appPhotosManager from './appPhotosManager';\nimport appProfileManager from './appProfileManager';\nimport appStickersManager from './appStickersManager';\nimport appWebPagesManager from './appWebPagesManager';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport { IS_TOUCH_SUPPORTED } from '../../environment/touchSupport';\nimport appPollsManager from './appPollsManager';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport appDraftsManager from './appDraftsManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport stateStorage from '../stateStorage';\nimport appDownloadManager from './appDownloadManager';\nimport appStateManager, { AppStateManager, STATE_INIT } from './appStateManager';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport appNotificationsManager from './appNotificationsManager';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatInvite, Dialog, Message, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport { getFilesFromEvent } from '../../helpers/files';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport { SliceEnd } from '../../helpers/slicedArray';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport appEmojiManager from './appEmojiManager';\nimport PopupElement from '../../components/popups';\nimport singleInstance from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport appMessagesIdsManager from './appMessagesIdsManager';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport RichTextProcessor from '../richtextprocessor';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport appGroupCallsManager, { GroupCallId, MyGroupCall } from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport appAvatarsManager from './appAvatarsManager';\nimport appCallsManager from './appCallsManager';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport { CallType } from '../calls/types';\nimport { Modify, SendMessageEmojiInteractionData } from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport { simulateClickEvent } from '../../helpers/dom/clickEvent';\nimport appReactionsManager from './appReactionsManager';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\n\n//console.log('appImManager included33!');\n\nappSidebarLeft; // just to include\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId?: PeerId, \n lastMsgId?: number, \n threadId?: number,\n startParam?: string\n};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n \n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n constructor() {\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n appNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach(theme => {\n if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\n \n window.addEventListener('blur', () => {\n animationIntersector.checkAnimations(true);\n \n this.offline = rootScope.idle.isIDLE = true;\n this.updateStatus();\n clearInterval(this.updateStatusInterval);\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n \n window.addEventListener('focus', () => {\n this.offline = rootScope.idle.isIDLE = false;\n this.updateStatus();\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n \n // в обратном порядке\n animationIntersector.checkAnimations(false);\n\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n this.updateStatus();\n\n this.offline = rootScope.idle.isIDLE = false;\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true, passive: true});\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n if(IS_FIREFOX && appStateManager.oldVersion && compareVersion(appStateManager.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) \n && document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n rootScope.addEventListener('history_focus', (e) => {\n let {peerId, threadId, mid, startParam} = e;\n if(threadId) threadId = appMessagesIdsManager.generateMessageId(threadId);\n if(mid) mid = appMessagesIdsManager.generateMessageId(mid); // because mid can come from notification, i.e. server message id\n \n this.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId,\n startParam\n });\n });\n\n rootScope.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat || \n chat.peerId !== peerId || \n rootScope.overlaysActive || (\n mediaSizes.activeScreen === ScreenSize.mobile && \n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find(typing => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[appMessagesIdsManager.generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && bubble.classList.contains('sticker') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach(a => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n \n appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n rootScope.addEventListener('instance_deactivated', () => {\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n('Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n('Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n popup.addEventListener('close', () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n });\n\n popup.show();\n });\n\n // remove scroll listener when setting chat to tray\n rootScope.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: RichTextProcessor.wrapRichText(update.message)\n });\n });\n\n stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', c || {});\n });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(appGroupCallsManager, appPeersManager, appChatsManager, appAvatarsManager, appCallsManager);\n }\n\n if(IS_CALL_SUPPORTED) {\n rootScope.addEventListener('call_instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n \n const popup = new PopupCall({\n appCallsManager,\n appAvatarsManager,\n appPeersManager,\n instance\n });\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n rootScope.dispatchEvent('call_accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = appCallsManager.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n rootScope.addEventListener('call_incompatible', (userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible', \n langPackArguments: [\n new PeerTitle({peerId: userId.toPeerId()}).element\n ]\n });\n });\n }\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then(peerId => {\n appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n this.addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n if(RichTextProcessor.PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string,\n phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach(name => {\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange();\n this.attachKeydownListener();\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return appDownloadManager.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach(chat => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(rootScope.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(rootScope.filterId, true);\n let nextDialog: Dialog.dialog;\n if(!rootScope.peerId) {\n if(key === 'ArrowDown') {\n nextDialog = folder[0];\n }\n } else {\n const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);\n if(idx !== -1) {\n const nextIndex = key === 'ArrowUp' ? idx - 1 : idx + 1;\n nextDialog = folder[nextIndex];\n }\n }\n \n if(nextDialog) {\n this.setPeer({peerId: nextDialog.peerId});\n }\n } else if(key === 'ArrowUp') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMid: number;\n for(const mid of slice) {\n const message = chat.getMessage(mid);\n const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;\n\n if(good) {\n if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {\n goodMid = mid;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n \n if(goodMid) {\n chat.input.initMessageEditing(goodMid);\n cancelEvent(e); // * prevent from scrolling\n }\n }\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? appMessagesIdsManager.generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? appMessagesIdsManager.generateMessageId(+link.comment) : undefined;\n\n this.openUsername({\n userName: link.domain, \n lastMsgId: postId, \n commentId,\n startParam: link.start\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = appMessagesIdsManager.generateMessageId(+link.post);\n const threadId = link.thread ? appMessagesIdsManager.generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n apiManager.invokeApi('messages.checkChatInvite', {\n hash: link.invite\n }).then(chatInvite => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite).show();\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n \n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n appUsersManager.resolvePhone(link.phone).then(user => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch(err => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = RichTextProcessor.wrapUrl(url);\n const a = document.createElement('a');\n a.href = wrappedUrl;\n \n (window as any)[onclick](a);\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach(item => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = () => {\n const hash = location.hash;\n const splitted = hash.split('?');\n\n const params = this.parseUriParams(hash, splitted);\n\n this.log('hashchange', hash, splitted[0], params);\n\n if(params.tgaddr) {\n appNavigationController.replaceState();\n const {onclick} = RichTextProcessor.wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? appMessagesIdsManager.generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p, \n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(), \n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(options: {\n userName: string, \n lastMsgId?: number, \n threadId?: number, \n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return appUsersManager.resolveUsername(userName).then(peer => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n \n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return appMessagesManager.wrapSingleMessage(peerId, threadId).then(() => {\n const message: Message = appMessagesManager.getMessageByPeer(peerId, threadId);\n if(message._ === 'messageEmpty') {\n lastMsgId = undefined;\n } else {\n appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return appMessagesManager.getDiscussionMessage(peerId, msgId).then(message => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = appCallsManager.getCallByUserId(userId);\n if(call) {\n return;\n }\n \n const userFull = await appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n appCallsManager.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(appGroupCallsManager.groupCall && appGroupCallsManager.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(appCallsManager.currentCall && appCallsManager.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = appCallsManager.currentCall;\n if(currentCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = appGroupCallsManager.groupCall;\n if(currentGroupCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appGroupCallsManager.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n \n call = await appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = appGroupCallsManager.saveGroupCall(chatFull.call, chatId);\n }\n \n appGroupCallsManager.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = rootScope.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = AppStateManager.STATE_INIT.settings.themes.find(t => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = appDownloadManager.cacheStorage.getFile('backgrounds/' + slug).then(blob => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map(chat => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n //const bubble = chat.bubbles.getBubbleByPoint('top');\n //if(bubble) {\n //const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n \n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter(mid => !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = rootScope.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n rootScope.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n this.applyHighlightningColor();\n\n rootScope.setTheme();\n\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом \n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) { \n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat', \n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!isFiles || (!this.canDrag() && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const types: string[] = await getFilesFromEvent(e, true);\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter(t => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach(drop => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach(drop => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || rootScope.isOverlayActive || !chat.canSend('send_media'));\n }\n\n private onDocumentPaste = (e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!this.canDrag() && !newMediaPopup) return;\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n getFilesFromEvent(e).then((files: File[]) => {\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n new PopupNewMedia(this.chat, files, chatInput.willAttachType);\n }\n });\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n rootScope.dispatchEvent('im_tab_change', id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n if(!this.myId) return Promise.resolve();\n \n appUsersManager.setUserStatus(this.myId, this.offline);\n return apiManager.invokeApiSingle('account.updateStatus', {offline: this.offline});\n }\n\n private createNewChat() {\n const chat = new Chat(this, \n appChatsManager, \n appDocsManager, \n appInlineBotsManager, \n appMessagesManager, \n appPeersManager, \n appPhotosManager, \n appProfileManager, \n appStickersManager, \n appUsersManager, \n appWebPagesManager, \n appPollsManager, \n apiManager, \n appDraftsManager, \n serverTimeManager, \n stateStorage, \n appNotificationsManager, \n appEmojiManager,\n appMessagesIdsManager,\n appGroupCallsManager,\n appReactionsManager\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n rootScope.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n rootScope.dispatchEvent('chat_changing', {from: chatFrom, to: this.chat});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach(chat => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(this.chat.container, animate);\n\n if(justReturn) {\n rootScope.dispatchEvent('peer_changed', this.chat.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n \n const isSet = appSidebarRight.sharedMediaTab.setPeer(this.chat.peerId, this.chat.threadId);\n if(isSet) {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n appSidebarRight.sharedMediaTab.fillProfileElements();\n }\n \n /* setTimeout(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n }\n\n spliced.forEach(chat => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach(chat => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public setPeer(options: ChatSetPeerOptions = {}, animate?: boolean): boolean {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && chat.peerId !== peerId) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = chat.setPeer(peerId, lastMsgId, options.startParam);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n //window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex(chat => chat.peerId === peerId && chat.type === type);\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\n }\n\n rootScope.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n //this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId, \n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n //default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n if(!appUsersManager.isBot(peerId)) {\n const typings = appProfileManager.getPeerTypings(peerId);\n if(!typings || !typings.length) {\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = peerId.isUser() ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach(typing => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n return;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n let args: any[];\n if(peerId.isAnyChat()) {\n args = [\n new PeerTitle({peerId: typing.userId.toPeerId(false), onlyFirstName: true}).element,\n typings.length - 1\n ];\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(RichTextProcessor.wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n return container;\n }\n }\n\n public async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean) {\n let subtitle: HTMLElement;\n if(!peerId) return;\n\n if(peerId.isAnyChat()) { // not human\n let span = this.getPeerTyping(peerId);\n if(span) {\n return span;\n }\n\n const chatId = peerId.toChatId();\n const chatInfo = await appProfileManager.getChatFull(chatId) as any;\n this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = chatInfo.participants_count || (chatInfo.participants && chatInfo.participants.participants && chatInfo.participants.participants.length) || 1;\n //if(participants_count) {\n subtitle = appProfileManager.getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n } else { // user\n const user = appUsersManager.getUser(peerId);\n \n if(rootScope.myId === peerId && !ignoreSelf) {\n return;\n } else if(user) {\n subtitle = appUsersManager.getUserStatusString(user.id);\n\n if(!appUsersManager.isBot(peerId)) {\n let span = this.getPeerTyping(peerId);\n if(!span && user.status?._ === 'userStatusOnline') {\n span = document.createElement('span');\n span.classList.add('online');\n span.append(subtitle);\n }\n\n if(span) {\n return span;\n }\n }\n \n return subtitle;\n }\n }\n }\n\n public setPeerStatus(peerId: PeerId, element: HTMLElement, needClear: boolean, useWhitespace: boolean, middleware: () => boolean, ignoreSelf?: boolean) {\n if(needClear) {\n element.innerHTML = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n }\n\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && this.getPeerTyping(peerId, typingContainer)) {\n return;\n }\n\n this.getPeerStatus(peerId, ignoreSelf).then((subtitle) => {\n if(!middleware()) {\n return;\n }\n\n replaceContent(element, subtitle || (useWhitespace ? '‎' : ''));\n });\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE, IS_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\nimport MediaProgressLine from \"../components/mediaProgressLine\";\nimport VolumeSelector from \"../components/volumeSelector\";\nimport debounce from \"../helpers/schedulers/debounce\";\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement, \n play?: boolean, \n streamable?: boolean, \n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper, \n listenerSetter: this.listenerSetter, \n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n \n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n \n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = toHHMMSS(video.duration | 0);\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n if(this.pipButton) {\n listenerSetter.add(this.pipButton)('click', () => {\n this.video.requestPictureInPicture();\n });\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('click', () => {\n this.togglePlay();\n });\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n listenerSetter.add(fullScreenButton)('click', () => {\n this.toggleFullScreen();\n });\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(rootScope)('media_playback_params', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.innerHTML = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return { \n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x', \n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(\n this.playbackRateButton, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined, \n undefined, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n );\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n \n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n \n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n \n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n \n cancelFullScreen();\n }\n }\n \n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController, { AppMediaPlaybackController } from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport { LazyLoadQueueBase } from \"./lazyLoadQueue\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport createVideo from \"../helpers/dom/createVideo\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach(name => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP, \n min: ZOOM_MIN_VALUE, \n max: ZOOM_MAX_VALUE, \n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n \n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach(el => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv, \n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n //console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n //console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n rootScope.isOverlayActive = active;\n animationIntersector.checkAnimations(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find(s => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(rootScope.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n \n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n \n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map(r => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n //let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map(v => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.toggleWholeActive(false);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map(v => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map(v => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n\n const isPeerId = fromId.isPeerId();\n let title: HTMLElement;\n if(isPeerId) {\n title = new PeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n } else {\n title = document.createElement('span');\n title.append(RichTextProcessor.wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n replaceContent(this.author.nameEl, title);\n\n let oldAvatar = this.author.avatarEl;\n this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n // @ts-ignore\n peerId: fromId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n });\n\n oldAvatar.parentElement.replaceChild(this.author.avatarEl, oldAvatar);\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n //if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n //if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n \n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n \n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n //const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */createVideo({pip: useController});\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n \n // if(!video.parentElement) {\n div.append(video);\n // }\n \n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n \n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n \n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video, \n play, \n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = () => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const cacheContext = appDownloadManager.getCacheContext(media);\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDocsManager.downloadDoc(media);\n \n if(!supportsStreaming) {\n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = cacheContext.url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = () => {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n const cancellablePromise = isDocument ? appDocsManager.downloadDoc(media) : appPhotosManager.preloadPhoto(media, size);\n \n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach(img => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch(err => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = appMessagesManager.getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n detachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\n }\n };\n\n attachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = (e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId\n });\n });\n }\n };\n\n onDownloadClick = () => {\n const {peerId, mid} = this.target;\n const message = this.getMessageByPeer(peerId, mid);\n if(message.media.photo) {\n appPhotosManager.savePhotoFile(message.media.photo, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n } else {\n let document: MyDocument = null;\n\n if(message.media.webpage) document = message.media.webpage.document;\n else document = message.media.document;\n\n if(document) {\n //console.log('will save document:', document);\n appDocsManager.saveDocFile(document, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n }\n }\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = RichTextProcessor.wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const cantForwardMessage = message._ === 'messageService' || !appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach(button => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n \n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach(button => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach(button => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../layer\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then(value => {\n const items = value.photos.map(photoId => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = () => {\n appPhotosManager.savePhotoFile(appPhotosManager.getPhoto(this.target.photoId), appImManager.chat.bubbles.lazyLoadQueue.queueId);\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport isObject from \"../helpers/object/isObject\";\r\nimport { ArgumentTypes } from \"../types\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n appAvatarsManager.removeFromAvatarsCache(peerId);\r\n (Array.from(document.querySelectorAll('avatar-element[data-peer-id=\"' + peerId + '\"]')) as AvatarElement[]).forEach(elem => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n if(!appAvatarsManager.isAvatarCached(peerId)) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find(img => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then(value => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(photo.id, getTarget(), undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n public peerId: PeerId;\r\n public isDialog: boolean;\r\n public peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n public isBig: boolean;\r\n private addedToQueue = false;\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n public attachClickEvent() {\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n //console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n\r\n public updateOptions(options: Partial[0]>) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n public updateWithOptions(options: {\r\n peerId: PeerId,\r\n isDialog?: boolean,\r\n isBig?: boolean,\r\n peerTitle?: string,\r\n lazyLoadQueue?: LazyLoadQueueIntersector,\r\n loadPromises?: Promise[]\r\n }) {\r\n const wasPeerId = this.peerId;\r\n this.updateOptions(options);\r\n const newPeerId = this.peerId;\r\n\r\n if(wasPeerId === newPeerId) {\r\n return;\r\n }\r\n\r\n this.peerId = appPeersManager.getPeerMigratedTo(newPeerId) || newPeerId;\r\n this.dataset.peerId = '' + newPeerId;\r\n\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n return this.update();\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const res = appAvatarsManager.putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb, this.isBig);\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n if(this.loadPromises) {\r\n if(res && res.cached) {\r\n this.loadPromises.push(promise);\r\n }\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.r(true);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return;\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const res = this.r();\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, {Dialog} from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { positionMenu, openBtnMenu } from \"./misc\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\nimport PopupMute from \"./popups/mute\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: () => !appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && !appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = () => {\n let dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(err => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n new AppChatFoldersTab(appSidebarLeft).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [rootScope.config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n appMessagesManager.togglePeerMute(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n new PopupMute(this.selectedId);\n };\n\n private onUnreadClick = () => {\n const dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n appMessagesManager.readHistory(this.selectedId, dialog.top_message);\n appMessagesManager.markDialogUnread(this.selectedId, true);\n } else {\n appMessagesManager.markDialogUnread(this.selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, 'LI');\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.filterId = appDialogsManager.filterId;\n\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = appMessagesManager.getDialogOnly(this.selectedId);\n\n this.buttons.forEach(button => {\n const good = button.verify();\n\n button.element.classList.toggle('hide', !good);\n });\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport apiUpdatesManager from \"../lib/appManagers/apiUpdatesManager\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n sessionStorage.get('dc').then(baseDcId => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = rootScope.connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n attachClickEvent(a, (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => apiManager.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => apiManager.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","export default function roundRect(\n ctx: CanvasRenderingContext2D, \n x: number, \n y: number, \n width: number, \n height: number, \n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number, \n fill?: boolean, \n stroke?: boolean\n) {\n if(typeof(radius) === 'number') {\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../helpers/animation\";\nimport customProperties from \"../helpers/dom/customProperties\";\nimport easeInOutSine from \"../helpers/easing/easeInOutSine\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport roundRect from \"../helpers/roundRect\";\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n \n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n \n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n \n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n \n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n \n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n \n height *= DPR;\n const y = (SIZE - height) / 2;\n \n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine (t: number, b: number, c: number, d: number) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type DialogsStorage from \"../storages/dialogs\";\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from \"../storages/filters\";\nimport type { LazyLoadQueueIntersector } from \"../../components/lazyLoadQueue\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport { attachContextMenuListener, putPreloader } from \"../../components/misc\";\nimport ripple from \"../../components/ripple\";\n//import Scrollable from \"../../components/scrollable\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appPeersManager from './appPeersManager';\nimport appImManager from \"./appImManager\";\nimport appMessagesManager, { Dialog, MyMessage } from \"./appMessagesManager\";\nimport appStateManager, { State } from \"./appStateManager\";\nimport appUsersManager, { User } from \"./appUsersManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../rlottie/lottieLoader\";\nimport { wrapLocalSticker, wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport appChatsManager from \"./appChatsManager\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport groupCallActiveIcon from \"../../components/groupCallActiveIcon\";\nimport { Chat, NotifyPeer } from \"../../layer\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport appNavigationController, { NavigationItem } from \"../../components/appNavigationController\";\nimport assumeType from \"../../helpers/assumeType\";\nimport generateTitleIcons from \"../../components/generateTitleIcons\";\nimport appMediaPlaybackController from \"../../components/appMediaPlaybackController\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLLIElement,\n subtitleEl: HTMLElement\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => appMessagesManager.getDialogOnly(element.id)[this.indexKey],\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({dialog: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n private chatsPreloader: HTMLElement;\n\n private loadDialogsPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu = new DialogsContextMenu();\n\n public sortedList: SortedDialogList;\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n constructor() {\n this.chatsPreloader = putPreloader(null, true);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n this.setFilterId(0);\n this.addFilter({\n id: this.filterId,\n title: '',\n titleEl: this.allChatsIntlElement.element,\n orderIndex: 0\n });\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n appStateManager.getState().then((state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n appUsersManager.clear();\n appChatsManager.clear();\n \n const filtersStorage = appMessagesManager.filtersStorage;\n const filters = filtersStorage.filters;\n for(const filterId in filters) { // delete filters\n rootScope.dispatchEvent('updateDialogFilter', {\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n\n appMessagesManager.clear();\n\n /* const clearPromises: Promise[] = [];\n for(const name in appStateManager.storagesResults) {\n const results = appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(!IS_MOBILE_SAFARI) {\n if(id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n \n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n this.setFilterId(id);\n this.onTabChange();\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n appMessagesManager.construct();\n appStateManager.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n rootScope.addEventListener('media_playback_params', (params) => {\n appStateManager.pushToState('playbackParams', params);\n });\n \n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number) {\n this.filterId = filterId;\n this.indexKey = appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId) : 'index';\n rootScope.filterId = filterId;\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', (userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && !appUsersManager.isBot(userId) && peerId !== rootScope.myId) {\n const user = appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n /* rootScope.$on('dialog_top', (e) => {\n const dialog = e;\n\n this.setLastMessage(dialog);\n this.setDialogPosition(dialog);\n\n this.setFiltersUnreadCount();\n }); */\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setLastMessage(dialog, undefined, undefined, undefined, undefined, undefined, true);\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n }\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setUnreadMessages(dialog);\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.validateDialogForFilter(dialog);\n this.setUnreadMessages(dialog); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] li[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach(element => {\n this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', (filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = appMessagesManager.dialogsStorage.getCachedDialogs(true);\n this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, RichTextProcessor.wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n });\n\n rootScope.addEventListener('filter_order', (order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n order.forEach((filterId) => {\n const filter = appMessagesManager.filtersStorage.getFilter(filterId);\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(filterId);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType>(key);\n appNotificationsManager.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n\n appNotificationsManager.getNotifyPeerTypeSettings();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n \n const renderFiltersPromise = appMessagesManager.filtersStorage.getDialogFilters().then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(state.filters && Object.keys(state.filters).length) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(appStateManager.storagesResults.dialogs.length) {\n appDraftsManager.addMissedDialogs();\n }\n\n return this.onChatsScroll().then(() => {\n appMessagesManager.fillConversations();\n });\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = dialog[this.indexKey];\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessage(dialog, undefined, dom, undefined, undefined, undefined, true);\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n this.onChatsScroll();\n };\n\n private setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const folder = appMessagesManager.dialogsStorage.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find(dialog => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n \n const sum = folder.unreadDialogsCount;\n unreadSpan.innerText = sum ? '' + sum : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private validateListForFilter() {\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId) || null;\n this.sortedList.getAll().forEach((element) => {\n const dialog = appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog, filter?: MyDialogFilter) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog, filter = appMessagesManager.filtersStorage.getFilter(this.filterId)) {\n if(!dialog || \n (filter && !appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) || \n (!filter && this.filterId !== dialog.folder_id)) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filterId: number) {\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n list, \n appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(filterId) : 'index',\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick & Partial<{titleEl: HTMLElement}>) {\n if(this.filtersRendered[filter.id]) return;\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.titleEl) titleSpan.append(filter.titleEl);\n else setInnerHTML(titleSpan, RichTextProcessor.wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter.id);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n \n if(this.loadDialogsPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n\n const promise = new Promise(async(resolve) => {\n const {chatList, filterId, indexKey} = this;\n\n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = appMessagesManager.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex(dialog => dialog[indexKey] <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = storage[needIndex][indexKey] + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n try {\n //console.time('getDialogs time');\n \n const getConversationsResult = appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(!getConversationsResult.cached && !chatList.childElementCount) {\n const container = chatList.parentElement;\n container.append(this.chatsPreloader);\n }\n \n const result = await getConversationsResult.promise;\n \n if(this.loadDialogsPromise !== promise) {\n return;\n }\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n const isBuggedDialog = !appMessagesManager.getDialogOnly(dialog.peerId);\n if(isBuggedDialog) {\n return;\n }\n\n const element = this.sortedList.add(dialog.peerId, true, cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n await Promise.all(loadPromises).finally();\n\n callbacks.forEach(callback => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = offsetDialog[indexKey];\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(this.chatsPreloader.parentElement) {\n this.chatsPreloader.remove();\n }\n \n resolve();\n }).finally(() => {\n this.loadDialogsPromise = undefined;\n });\n\n return this.loadDialogsPromise = promise;\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find(el => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n \n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n placeholderContainer.prepend(wrapLocalSticker({\n emoji: '📂',\n width: 128,\n height: 128\n }).container)\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, () => {\n new AppEditFolderTab(appSidebarLeft).open(appMessagesManager.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\n return this.updateContactsLengthPromise = appUsersManager.getContacts().then(users => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n \n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n \n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then(contacts => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false, \n onListLengthChange\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = (peerId: PeerId) => {\n return peerId.isContact() && !appMessagesManager.getDialogOnly(peerId);\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach(el => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach(el => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private setOffsets() {\n const chatList = this.chatList;\n const firstDialog = this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = firstDialog[indexKey];\n this.offsets.bottom = lastDialog[indexKey];\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n\n return Promise.resolve();\n } else if(this.loadDialogsPromise) return this.loadDialogsPromise;\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n //cancelEvent(e);\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, 'LI');\n\n if(!elem) {\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* , \n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessage(\n dialog: Dialog, \n lastMessage?: any, \n dom?: DialogDom, \n highlightWord?: string, \n loadPromises?: Promise[],\n isBatch = false,\n setUnread = false\n ) {\n ///////console.log('setlastMessage:', lastMessage);\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n //this.log.error('no dom for dialog:', dialog, lastMessage, dom, highlightWord);\n return;\n }\n }\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft && dialog.draft._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n \n lastMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n if(lastMessage._ === 'messageEmpty'/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.innerHTML = '';\n dom.lastTimeSpan.innerHTML = '';\n delete dom.listEl.dataset.mid;\n\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n }\n\n return;\n }\n\n const peerId = dialog.peerId;\n const isRestricted = lastMessage && appMessagesManager.isRestricted(lastMessage);\n //let peerId = appMessagesManager.getMessagePeer(lastMessage);\n\n //console.log('setting last message:', lastMessage);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n\n let mediaContainer: HTMLElement;\n if(!lastMessage.deleted && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = appMessagesManager.getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = appPhotosManager.choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n \n wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size,\n loadPromises\n });\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n const withoutMediaType = !!mediaContainer && !!lastMessage?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && lastMessage.message) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType);\n } else if(draftMessage) {\n fragment = appMessagesManager.wrapMessageForReply(draftMessage);\n } else if(!lastMessage.deleted) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType);\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(mediaContainer) {\n fragment.prepend(mediaContainer);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n \n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n dom.lastMessageSpan.prepend(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !lastMessage.action) {\n const sender = appPeersManager.getPeer(lastMessage.fromId);\n if(sender && sender.id) {\n const senderBold = document.createElement('b');\n\n if(sender.id === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n senderBold.append(new PeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n }).element);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n } //////// else console.log('no sender', lastMessage, peerId);\n }\n }\n\n if(!lastMessage.deleted || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null) {\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n } else { // means search\n dom.listEl.dataset.mid = lastMessage.mid;\n }\n }\n }\n\n private setUnreadMessages(dialog: Dialog, dom = this.getDialogDom(dialog.peerId), isBatch = false) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n if(!isBatch) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, 200);\n }\n }\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!lastMessage.deleted && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = appMessagesManager.isDialogUnread(dialog);\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private getDialog(dialog: Dialog | PeerId): Dialog {\n if(typeof(dialog) !== 'object') {\n const originalDialog = appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n const dialog = this.getDialog(options.dialog);\n\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = dialog;\n const isMuted = appNotificationsManager.isPeerLocalMuted(peerId, true);\n if(isMuted) {\n ret.dom.listEl.classList.add('is-muted');\n }\n\n if(!peerId.isUser()) {\n this.processDialogForCallStatus(dialog, ret.dom);\n }\n\n this.setLastMessage(dialog, undefined, ret.dom, undefined, options.loadPromises, options.isBatch, true);\n }\n\n return ret;\n }\n\n private processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage, \n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = appDialogsManager.addDialogNew({\n ...options,\n ...appMessagesManager.getMessageSenderPeerIdOrName(message),\n dialog: this.getDialog(peerId),\n });\n\n this.setLastMessage(ret.dialog, message, ret.dom, query);\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n dialog: Parameters[0],\n container?: Parameters[1],\n drawStatus?: boolean,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n }) {\n return this.addDialog(options.dialog, options.container, options.drawStatus, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName);\n }\n\n public addDialog(\n _dialog: Parameters[0], \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n drawStatus = true, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n ) {\n const dialog = this.getDialog(_dialog);\n const peerId = dialog.peerId;\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n if(drawStatus && peerId !== rootScope.myId && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(avatarEl, true);\n }\n }\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n titleSpanContainer.append(...generateTitleIcons(peerId));\n //}\n \n const span = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n\n const li = document.createElement('li');\n li.classList.add('chatlist-chat');\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom, dialog};\n }\n\n public setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessage(dialog, null, dom, undefined, undefined, undefined, null);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n \r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport ripple from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\nimport randomize from '../../helpers/array/randomize';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/139.f4fd38bb6b1d4da6c306.chunk.js b/public/139.f4fd38bb6b1d4da6c306.chunk.js new file mode 100644 index 000000000..b3671dac0 --- /dev/null +++ b/public/139.f4fd38bb6b1d4da6c306.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[139,813],{4494:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2325),s=n(1405);const a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),(0,s.Z)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append((0,i.ag)(t.text)),n}},279:(e,t,n)=>{function i(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function s(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,i(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}n.d(t,{p:()=>s,y:()=>i}),n(410).GO.putPreloader=i},1405:(e,t,n)=>{n.d(t,{Z:()=>d});var i=n(8497),s=n(9674),a=n(5432),r=n(3512),o=n(5975);let l=0;function d(e,t=(()=>Promise.resolve()),n=null,d=!1,c=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u,p=document.createElement("div");p.classList.add("c-ripple"),e.classList.contains("rp-square")&&p.classList.add("is-square"),e[d?"prepend":"append"](p);const h=(e,i)=>{const r=Date.now(),o=document.createElement("div"),d=l++,c=1e3*+window.getComputedStyle(p).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let e=Date.now()-r;const t=()=>{s.Z.mutate((()=>{o.remove()})),n&&n(d)};if(eo.classList.add("hiding")),Math.max(n-c/2,0)),setTimeout(t,n)}else o.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",u),u=null,v=!1},t&&t(d),window.requestAnimationFrame((()=>{const t=p.getBoundingClientRect();o.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,a=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),r=n-a/2,l=s-a/2;o.style.width=o.style.height=a+"px",o.style.left=r+"px",o.style.top=l+"px",p.append(o)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,i.Z)(t.target,"c-ripple")!==p)&&(c===e||!(0,o.Z)(t.target,c));let v=!1;if(a.Z){let e=()=>{u&&u()};c.addEventListener("touchstart",(t=>{if(!r.Z.settings.animationsEnabled)return;if(t.touches.length>1||v||m(t))return;v=!0;let{clientX:n,clientY:i}=t.touches[0];h(n,i),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!r.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||m(e))return;if(v)return void(v=!1);let{clientX:t,clientY:n}=e;h(t,n),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})}),{passive:!0})}},2738:(e,t,n)=>{n.d(t,{EN:()=>o,fc:()=>r,pf:()=>a,tH:()=>l});var i=n(5432),s=n(6669);const a=i.Z?"mousedown":"click";function r(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(a,t,n)}function o(e,t,n){e.removeEventListener(a,t,n)}function l(e){(0,s.Z)(e,a)}},9674:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(3035),s=n(3725),a=n(410),r=n(8487);const o=new class{constructor(){this.promises={},this.raf=i.T2.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=(0,s.Z)()),void 0!==t&&n.then((()=>t())),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=(0,r.Z)(e),i=n?this.mutate():Promise.resolve();return void 0!==t&&(n?t():i.then((()=>t()))),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=o);const l=o},2582:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(2325);class s{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,i.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,i.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,n)=>{n.r(t),n.d(t,{default:()=>g});var i=n(4494),s=n(503),a=n(279),r=n(6765),o=n(2325),l=n(2582),d=n(4874),c=n(8799),u=n(5565),p=n(1168),h=n(8115),m=n(3512);let v=null;const g=new d.Z("page-signUp",!0,(()=>{const e=new l.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const d=document.createElement("span");let g;d.className="tgico tgico-cameraadd",e.imageDiv.append(t,d),e.imageDiv.addEventListener("click",(()=>{p.Z.createPopup(r.Z).open(t,(e=>{g=e}))}));const w=t=>{const n=b.value||"",i=L.value||"",s=n||i?(n+" "+i).trim():"";s?(0,u.Z)(e.title,(0,h.Z)(s)):(0,u.Z)(e.title,(0,o.ag)("YourName"))},b=new s.Z({label:"FirstName",maxLength:70}),L=new s.Z({label:"LastName",maxLength:64}),f=(0,i.Z)("btn-primary btn-color-primary"),Z=new o.ZP.IntlElement({key:"StartMessaging"});return f.append(Z.element),e.inputWrapper.append(b.container,L.container,f),b.input.addEventListener("input",w),L.input.addEventListener("input",w),f.addEventListener("click",(function(e){if(b.input.classList.contains("error")||L.input.classList.contains("error"))return!1;if(!b.value.length)return b.input.classList.add("error"),!1;this.disabled=!0;const t=b.value.trim(),i=L.value.trim(),s={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:t,last_name:i};Z.update({key:"PleaseWait"});const r=(0,a.y)(this);m.Z.managers.apiManager.invokeApi("auth.signUp",s).then((e=>{"auth.authorization"===e._?(m.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!g)return e();g().then((n=>{m.Z.managers.appProfileManager.uploadProfilePhoto(n).then(e,t)}),t)})).finally((()=>{n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()}))}))):(Z.update({key:e._}),this.removeAttribute("disabled"),r.remove())})).catch((e=>{this.removeAttribute("disabled"),r.remove(),e.type,Z.update({key:e.type})}))})),(0,c.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}),(e=>{v=e,m.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); +//# sourceMappingURL=139.f4fd38bb6b1d4da6c306.chunk.js.map \ No newline at end of file diff --git a/public/139.f4fd38bb6b1d4da6c306.chunk.js.map b/public/139.f4fd38bb6b1d4da6c306.chunk.js.map new file mode 100644 index 000000000..b9e47d5b4 --- /dev/null +++ b/public/139.f4fd38bb6b1d4da6c306.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"139.f4fd38bb6b1d4da6c306.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, { i18n } from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","rippleClickId","ripple","callback","Promise","resolve","onEnd","prepend","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","touches","length","once","cancelBubble","stopPropagation","passive","dataset","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","sequentialDom","promises","raf","scheduled","do","kind","promise","this","scheduleFlush","undefined","then","measure","mutate","mutateElement","element","isConnected","read","write","LoginPage","constructor","body","container","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","avatarPreview","id","addIco","uploadAvatar","open","_uploadAvatar","handleInput","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","response","_","user","reject","inputFile","finally","m","default","mount","catch","err","type","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/14.45fb90c7c021f37182ff.chunk.js b/public/14.45fb90c7c021f37182ff.chunk.js deleted file mode 100644 index fe4c11c21..000000000 --- a/public/14.45fb90c7c021f37182ff.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[14,16,17,18],{118:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},119:function(e,t,n){"use strict";function i(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie.suggested_lang_code!==s.c.lastRequestedLangCode?Promise.all([e,s.c.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),s.c.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=s.c.strings.get(e.key);t&&(r.push(t),s.c.strings.set(e.key,e))});const u="Login.ContinueOnLanguage",p=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:u});p.lastElementChild.classList.remove("i18n"),Object(o.a)({text:[s.c.format(u,!0)]}).then(()=>{window.requestAnimationFrame(()=>{e.append(p)})}),l.a.addEventListener("language_change",()=>{p.remove()},{once:!0}),r.forEach(e=>{s.c.strings.set(e.key,e)}),Object(a.b)(p,e=>{Object(i.a)(e),h=!0,p.disabled=!0,Object(d.f)(p),s.c.getLangPack(t.suggested_lang_code)})})}},131:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(71);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},132:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(65);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},165:function(e,t,n){"use strict";n.r(t);var i=n(8),a=n(90),o=n(87),s=n(5),r=n(58),l=n(7),c=n(35),d=n(0),u=n(61),h=n(125),p=n(16),m=n(118),g=n(119);function f(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var y=function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function s(e){try{l(i.next(e))}catch(e){o(e)}}function r(e){try{l(i.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,r)}l((i=i.apply(e,t||[])).next())}))};let v,b=()=>y(void 0,void 0,void 0,(function*(){const e=E.pageEl.querySelector(".auth-image");let t=Object(u.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const c=Object(r.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(c),Object(h.a)(a);const b=e.parentElement,_=document.createElement("h4");Object(l.b)(_,"Login.QR.Title");const w=document.createElement("ol");w.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.d)(e)),w.append(t)}),b.append(_,w,a),c.addEventListener("click",()=>{Promise.all([n.e(2),n.e(4)]).then(n.bind(null,168)).then(e=>e.default.mount()),S=!0});const O=(yield Promise.all([n.e(10).then(n.t.bind(null,199,7))]))[0].default;let S=!1;d.a.addEventListener("user_auth",()=>{S=!0,v=null},{once:!0});let L,k={ignoreErrors:!0};const A=a=>y(void 0,void 0,void 0,(function*(){try{let r=yield i.a.invokeApi("auth.exportLoginToken",{api_id:s.a.id,api_hash:s.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(k.dcId||(k.dcId=r.dc_id,i.a.setBaseDcId(r.dc_id)),r=yield i.a.invokeApi("auth.importLoginToken",{token:r.token},k)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return i.a.setUser(e.user),n.e(3).then(n.bind(null,110)).then(e=>e.default.mount()),!0}if(!L||!Object(g.a)(L,r.token)){L=r.token;let n=function(e){let t,n="";for(let i=e.length,a=0,o=0;o>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(f(a>>>18&63),f(a>>>12&63),f(a>>>6&63),f(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token),i="tg://login?token="+Object(m.a)(n,!0);const a=window.getComputedStyle(document.documentElement),o=a.getPropertyValue("--surface-color").trim(),s=a.getPropertyValue("--primary-text-color").trim(),l=a.getPropertyValue("--primary-color").trim(),c=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new O({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:c,dotsOptions:{color:s,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:o},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(p.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(a){let e=Date.now()/1e3,t=r.expires-e-o.a.serverTimeOffset;yield Object(p.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(12).then(n.bind(null,142)).then(e=>e.default.mount()),S=!0,v=null;break;default:console.error("pageSignQR: default error:",e),S=!0}return!0}return!1}));return()=>y(void 0,void 0,void 0,(function*(){for(S=!1;;){if(S)break;if(yield A(!0))break}}))}));const E=new a.a("page-signQR",!0,()=>v,()=>{v||(v=b()),v.then(e=>{e()}),c.c.pushToState("authState",{_:"authStateSignQr"})});t.default=E},170:function(e,t,n){"use strict";n.r(t);var i=n(62),a=n(35),o=n(8),s=n(90),r=n(168),l=n(131),c=n(132),d=n(7),u=n(21),h=n(59),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function s(e){try{l(i.next(e))}catch(e){o(e)}}function r(e){try{l(i.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,r)}l((i=i.apply(e,t||[])).next())}))};let m,g=null,f=null,y=null;const v=new s.a("page-authCode",!0,()=>{const e=g.type.length,t=new c.a({label:"Code",name:Object(u.b)(),length:e,onFill:e=>{s(e)}});m=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container);v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return r.default.mount()}));const a=()=>{setTimeout(()=>{b.remove()},300)},s=e=>{m.setAttribute("disabled","true");const i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,phone_code:e};o.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":o.a.setUser(e.user),n.e(3).then(n.bind(null,110)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(20)]).then(n.bind(null,155)).then(e=>{e.default.mount({phone_number:g.phone_number,phone_code_hash:g.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(15).then(n.bind(null,142))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(h.a)(t.label,Object(d.d)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(h.a)(t.label,Object(d.d)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},f=v.pageEl.querySelector(".auth-image"),y=i.b.isMobile?100:166,b=new l.a(t,y);return f.append(b.container),b.load()},e=>{if(g=e,f){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else f=v.pageEl.getElementsByClassName("phone")[0],y=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(f.innerText=g.phone_number,g.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[g.type._]}Object(h.a)(y,Object(d.d)(t,n)),a.c.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=v},87:function(e,t,n){"use strict";var i=n(1),a=n(6),o=n(8);const s=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),o.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=s),t.a=s}}]); -//# sourceMappingURL=14.45fb90c7c021f37182ff.chunk.js.map \ No newline at end of file diff --git a/public/14.45fb90c7c021f37182ff.chunk.js.map b/public/14.45fb90c7c021f37182ff.chunk.js.map deleted file mode 100644 index a1638c771..000000000 --- a/public/14.45fb90c7c021f37182ff.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/components/languageChangeButton.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/helpers/bytes/bytesToBase64.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/pages/pageAuthCode.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts"],"names":["fixBase64String","str","toUrl","replace","bytesCmp","bytes1","bytes2","len","length","i","cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","format","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","TrackingMonkey","inputField","size","max","needFrame","this","container","document","createElement","add","input","playAnimation","value","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","waitForFirstFrame","_animation","currentFrame","pause","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","slice","setValueSilently","onFill","uint6ToBase64","nUint6","onFirstMount","imageDiv","pageEl","querySelector","preloader","inputWrapper","btnBack","parentElement","h4","helpList","li","m","default","mount","QRCodeStyling","rootScope","prevToken","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","resolve","reader","FileReader","onload","target","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","_canvas","_image","c","children","setTimeout","undefined","Array","from","el","timestamp","Date","now","diff","expires","serverTimeManager","serverTimeOffset","err","console","warn","handled","error","func","appStateManager","pushToState","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","cleanup","monkey","params","phone_number","phone_code_hash","phone_code","response","catch","good","innerText","select","removeAttribute","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","focus","to","addTaskListener","task","payload"],"mappings":"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","file":"14.45fb90c7c021f37182ff.chunk.js","sourcesContent":["export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/15.198a32297d624a4ee6ed.chunk.js b/public/15.198a32297d624a4ee6ed.chunk.js deleted file mode 100644 index 4c763800e..000000000 --- a/public/15.198a32297d624a4ee6ed.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[15],{108:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var s=i(27),n=i(65);class a extends n.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(s.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},109:function(t,e,i){"use strict";function s(t){const e=document.createElement("span");return"string"==typeof t?e.innerHTML=t:e.append(t),e}i.d(e,"a",(function(){return s}))},122:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(71);class n{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},142:function(t,e,i){"use strict";i.r(e);var s=i(61),n=i(62),a=i(35),r=i(94),o=i(90),c=i(58),l=i(108),d=i(122),p=i(28),u=i(7),h=i(97),m=i(27),w=i(57),b=i(109),g=i(59),y=i(77);let v;const k=new o.a("page-password",!0,()=>{const t=new h.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(c.a)("btn-primary btn-color-primary"),a=new u.c.IntlElement({key:"Login.Next"});e.append(a.element);const o=new l.a({label:"LoginPassword",name:"password"});let k;v=o.input,t.inputWrapper.append(o.container,e);let P,f=()=>(k||(k=window.setInterval(f,1e4)),r.a.getState().then(t=>{P=t,P.hint?Object(g.a)(o.label,Object(b.a)(p.b.wrapEmojiText(P.hint))):o.setLabel()}));const E=t=>{if(t&&Object(m.a)(t),!v.value.length)return void v.classList.add("error");const n=Object(y.a)([v,e],!0);let c=v.value;a.update({key:"PleaseWait"});const l=Object(s.f)(e);o.setValueSilently(""+Math.random()),o.setValueSilently(c),r.a.check(c,P).then(t=>{switch(t._){case"auth.authorization":clearInterval(k),i.e(3).then(i.bind(null,110)).then(t=>{t.default.mount()}),S&&S.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),l.remove()}}).catch(t=>{n(),o.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),v.select(),l.remove(),f()})};Object(w.b)(e,E),v.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return E()}));const L=n.b.isMobile?100:166,S=new d.a(o,L);return t.imageDiv.append(S.container),Promise.all([S.load(),f()])},null,()=>{v.focus(),a.c.pushToState("authState",{_:"authStatePassword"})});e.default=k},94:function(t,e,i){"use strict";var s=i(1),n=i(8);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,s;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?n.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=e.new_algo,o=new Uint8Array(r.salt1.length+32);return function(t){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");crypto.getRandomValues(t)}(o),o.set(r.salt1,0),r.salt1=o,s=t.newPassword?n.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,s]).then(t=>(a.password=t[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=t[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return n.a.invokeCrypto("computeSRP",t,e,!1).then(t=>n.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&n.a.setUser(t.user),t)))}confirmPasswordEmail(t){return n.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};s.a.passwordManager=a;e.a=a},97:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(7);class n{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(s.d)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(s.d)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=15.198a32297d624a4ee6ed.chunk.js.map \ No newline at end of file diff --git a/public/15.198a32297d624a4ee6ed.chunk.js.map b/public/15.198a32297d624a4ee6ed.chunk.js.map deleted file mode 100644 index 56f0818d6..000000000 --- a/public/15.198a32297d624a4ee6ed.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/array/randomize.ts","webpack:///./src/pages/loginPage.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","htmlToSpan","html","span","innerHTML","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","element","label","getStateInterval","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","passwordManager","invokeApi","result","settings","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","arr","crypto","Error","getRandomValues","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","LoginPage","body","querySelector","title","subtitle"],"mappings":"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","file":"15.198a32297d624a4ee6ed.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\nimport randomize from '../../helpers/array/randomize';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/16.f1dde01b3fecd34c349b.chunk.js b/public/16.f1dde01b3fecd34c349b.chunk.js deleted file mode 100644 index 52f818f57..000000000 --- a/public/16.f1dde01b3fecd34c349b.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[16,17],{118:function(e,t,n){"use strict";function r(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return r}))},119:function(e,t,n){"use strict";function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;re.suggested_lang_code!==o.c.lastRequestedLangCode?Promise.all([e,o.c.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.c.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const s=[];n.forEach(e=>{const t=o.c.strings.get(e.key);t&&(s.push(t),o.c.strings.set(e.key,e))});const u="Login.ContinueOnLanguage",p=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:u});p.lastElementChild.classList.remove("i18n"),Object(i.a)({text:[o.c.format(u,!0)]}).then(()=>{window.requestAnimationFrame(()=>{e.append(p)})}),c.a.addEventListener("language_change",()=>{p.remove()},{once:!0}),s.forEach(e=>{o.c.strings.set(e.key,e)}),Object(a.b)(p,e=>{Object(r.a)(e),g=!0,p.disabled=!0,Object(d.f)(p),o.c.getLangPack(t.suggested_lang_code)})})}},165:function(e,t,n){"use strict";n.r(t);var r=n(8),a=n(90),i=n(87),o=n(5),s=n(58),c=n(7),l=n(35),d=n(0),u=n(61),g=n(125),p=n(16),f=n(118),m=n(119);function h(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var y=function(e,t,n,r){return new(n||(n=Promise))((function(a,i){function o(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}c((r=r.apply(e,t||[])).next())}))};let v,b=()=>y(void 0,void 0,void 0,(function*(){const e=w.pageEl.querySelector(".auth-image");let t=Object(u.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const l=Object(s.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(l),Object(g.a)(a);const b=e.parentElement,O=document.createElement("h4");Object(c.b)(O,"Login.QR.Title");const _=document.createElement("ol");_.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(c.d)(e)),_.append(t)}),b.append(O,_,a),l.addEventListener("click",()=>{Promise.all([n.e(2),n.e(4)]).then(n.bind(null,168)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,199,7))]))[0].default;let L=!1;d.a.addEventListener("user_auth",()=>{L=!0,v=null},{once:!0});let k,S={ignoreErrors:!0};const P=a=>y(void 0,void 0,void 0,(function*(){try{let s=yield r.a.invokeApi("auth.exportLoginToken",{api_id:o.a.id,api_hash:o.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===s._&&(S.dcId||(S.dcId=s.dc_id,r.a.setBaseDcId(s.dc_id)),s=yield r.a.invokeApi("auth.importLoginToken",{token:s.token},S)),"auth.loginTokenSuccess"===s._){const e=s.authorization;return r.a.setUser(e.user),n.e(3).then(n.bind(null,110)).then(e=>e.default.mount()),!0}if(!k||!Object(m.a)(k,s.token)){k=s.token;let n=function(e){let t,n="";for(let r=e.length,a=0,i=0;i>>t&24),2!==t&&r-i!=1||(n+=String.fromCharCode(h(a>>>18&63),h(a>>>12&63),h(a>>>6&63),h(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}(s.token),r="tg://login?token="+Object(f.a)(n,!0);const a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),c=a.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${c}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new E({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:r,image:l,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(p.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(a){let e=Date.now()/1e3,t=s.expires-e-i.a.serverTimeOffset;yield Object(p.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(12).then(n.bind(null,142)).then(e=>e.default.mount()),L=!0,v=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>y(void 0,void 0,void 0,(function*(){for(L=!1;;){if(L)break;if(yield P(!0))break}}))}));const w=new a.a("page-signQR",!0,()=>v,()=>{v||(v=b()),v.then(e=>{e()}),l.c.pushToState("authState",{_:"authStateSignQr"})});t.default=w},87:function(e,t,n){"use strict";var r=n(1),a=n(6),i=n(8);const o=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),i.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};r.a&&(r.a.serverTimeManager=o),t.a=o}}]); -//# sourceMappingURL=16.f1dde01b3fecd34c349b.chunk.js.map \ No newline at end of file diff --git a/public/16.f1dde01b3fecd34c349b.chunk.js.map b/public/16.f1dde01b3fecd34c349b.chunk.js.map deleted file mode 100644 index 5a4a0c8c8..000000000 --- a/public/16.f1dde01b3fecd34c349b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/bytes/bytesToBase64.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts"],"names":["fixBase64String","str","toUrl","replace","bytesCmp","bytes1","bytes2","len","length","i","cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","format","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","uint6ToBase64","nUint6","onFirstMount","imageDiv","pageEl","querySelector","preloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","resolve","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","serverTimeManager","serverTimeOffset","err","console","warn","handled","error","func","appStateManager","pushToState","this","to","addTaskListener","task","payload"],"mappings":"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","file":"16.f1dde01b3fecd34c349b.chunk.js","sourcesContent":["export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/17.72126c110cfedf3298a9.chunk.js b/public/17.72126c110cfedf3298a9.chunk.js deleted file mode 100644 index a556f2d41..000000000 --- a/public/17.72126c110cfedf3298a9.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[17,16],{118:function(e,t,n){"use strict";function r(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return r}))},119:function(e,t,n){"use strict";function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;re.suggested_lang_code!==o.c.lastRequestedLangCode?Promise.all([e,o.c.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.c.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const s=[];n.forEach(e=>{const t=o.c.strings.get(e.key);t&&(s.push(t),o.c.strings.set(e.key,e))});const u="Login.ContinueOnLanguage",p=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:u});p.lastElementChild.classList.remove("i18n"),Object(i.a)({text:[o.c.format(u,!0)]}).then(()=>{window.requestAnimationFrame(()=>{e.append(p)})}),c.a.addEventListener("language_change",()=>{p.remove()},{once:!0}),s.forEach(e=>{o.c.strings.set(e.key,e)}),Object(a.b)(p,e=>{Object(r.a)(e),g=!0,p.disabled=!0,Object(d.f)(p),o.c.getLangPack(t.suggested_lang_code)})})}},165:function(e,t,n){"use strict";n.r(t);var r=n(8),a=n(90),i=n(87),o=n(5),s=n(58),c=n(7),l=n(35),d=n(0),u=n(61),g=n(125),p=n(16),f=n(118),m=n(119);function h(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var y=function(e,t,n,r){return new(n||(n=Promise))((function(a,i){function o(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}c((r=r.apply(e,t||[])).next())}))};let v,b=()=>y(void 0,void 0,void 0,(function*(){const e=w.pageEl.querySelector(".auth-image");let t=Object(u.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const l=Object(s.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(l),Object(g.a)(a);const b=e.parentElement,O=document.createElement("h4");Object(c.b)(O,"Login.QR.Title");const _=document.createElement("ol");_.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(c.d)(e)),_.append(t)}),b.append(O,_,a),l.addEventListener("click",()=>{Promise.all([n.e(2),n.e(4)]).then(n.bind(null,168)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,199,7))]))[0].default;let L=!1;d.a.addEventListener("user_auth",()=>{L=!0,v=null},{once:!0});let k,S={ignoreErrors:!0};const P=a=>y(void 0,void 0,void 0,(function*(){try{let s=yield r.a.invokeApi("auth.exportLoginToken",{api_id:o.a.id,api_hash:o.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===s._&&(S.dcId||(S.dcId=s.dc_id,r.a.setBaseDcId(s.dc_id)),s=yield r.a.invokeApi("auth.importLoginToken",{token:s.token},S)),"auth.loginTokenSuccess"===s._){const e=s.authorization;return r.a.setUser(e.user),n.e(3).then(n.bind(null,110)).then(e=>e.default.mount()),!0}if(!k||!Object(m.a)(k,s.token)){k=s.token;let n=function(e){let t,n="";for(let r=e.length,a=0,i=0;i>>t&24),2!==t&&r-i!=1||(n+=String.fromCharCode(h(a>>>18&63),h(a>>>12&63),h(a>>>6&63),h(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}(s.token),r="tg://login?token="+Object(f.a)(n,!0);const a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),c=a.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${c}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new E({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:r,image:l,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(p.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(a){let e=Date.now()/1e3,t=s.expires-e-i.a.serverTimeOffset;yield Object(p.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(12).then(n.bind(null,142)).then(e=>e.default.mount()),L=!0,v=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>y(void 0,void 0,void 0,(function*(){for(L=!1;;){if(L)break;if(yield P(!0))break}}))}));const w=new a.a("page-signQR",!0,()=>v,()=>{v||(v=b()),v.then(e=>{e()}),l.c.pushToState("authState",{_:"authStateSignQr"})});t.default=w},87:function(e,t,n){"use strict";var r=n(1),a=n(6),i=n(8);const o=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),i.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};r.a&&(r.a.serverTimeManager=o),t.a=o}}]); -//# sourceMappingURL=17.72126c110cfedf3298a9.chunk.js.map \ No newline at end of file diff --git a/public/17.72126c110cfedf3298a9.chunk.js.map b/public/17.72126c110cfedf3298a9.chunk.js.map deleted file mode 100644 index 027817e98..000000000 --- a/public/17.72126c110cfedf3298a9.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/bytes/bytesToBase64.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts"],"names":["fixBase64String","str","toUrl","replace","bytesCmp","bytes1","bytes2","len","length","i","cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","format","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","uint6ToBase64","nUint6","onFirstMount","imageDiv","pageEl","querySelector","preloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","resolve","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","serverTimeManager","serverTimeOffset","err","console","warn","handled","error","func","appStateManager","pushToState","this","to","addTaskListener","task","payload"],"mappings":"0FAAe,SAASA,EAAgBC,EAAaC,GACnD,OAAGA,EACMD,EAAIE,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,OAAQ,IAE5DF,EAAIE,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAJhD,mC,iCCAe,SAASC,EAASC,EAA+BC,GAC9D,MAAMC,EAAMF,EAAOG,OACnB,GAAGD,IAAQD,EAAOE,OAChB,OAAO,EAGT,IAAI,IAAIC,EAAI,EAAGA,EAAIF,IAAOE,EACxB,GAAGJ,EAAOI,KAAOH,EAAOG,GACtB,OAAO,EAIX,OAAO,EAZT,mC,iCCAA,mGAgBA,IAmBIC,EAnBAC,GAAM,EAqBK,SAASC,EAAwBC,GAC3CF,IAnBAD,IACIA,EAAgB,IAAWI,YAAYC,KAAKC,GAC9CA,EAAOC,sBAAwB,IAAKC,sBAG9BC,QAAQC,IAAI,CACjBJ,EACA,IAAKK,WAAWL,EAAOC,oBAAqB,CAAC,6BAC7C,IAAKK,qBAGA,MASDP,KAAK,EAAEC,EAAQO,MACvB,IAAIP,EACF,OAGF,MAAMQ,EAA2B,GACjCD,EAAQE,QAAQC,IACd,MAAMC,EAAe,IAAKJ,QAAQK,IAAIF,EAAOG,KACzCF,IAIJH,EAAOM,KAAKH,GACZ,IAAKJ,QAAQZ,IAAIe,EAAOG,IAAoBH,MAG9C,MAAMG,EAAmB,2BACnBE,EAAoB,YAAO,4DAA6D,CAACC,KAAMH,IACrGE,EAAkBE,iBAAiBC,UAAUC,OAAO,QACpD,YAAU,CAACH,KAAM,CAAC,IAAKI,OAAOP,GAAK,MAASd,KAAK,KAC/CsB,OAAOC,sBAAsB,KAC3BzB,EAAS0B,OAAOR,OAIpB,IAAUS,iBAAiB,kBAAmB,KAC5CT,EAAkBI,UACjB,CAACM,MAAM,IAEVjB,EAAOC,QAAQC,IACb,IAAKH,QAAQZ,IAAIe,EAAOG,IAAoBH,KAG9C,YAAiBK,EAAoBW,IACnC,YAAYA,GAEZ/B,GAAM,EAENoB,EAAkBY,UAAW,EAC7B,YAAaZ,GAEb,IAAKa,YAAY5B,EAAOC,2B,mJC3DvB,SAAS4B,EAAcC,GAC5B,OAAOA,EAAS,GACZA,EAAS,GACTA,EAAS,GACPA,EAAS,GACTA,EAAS,GACPA,EAAS,EACE,KAAXA,EACE,GACW,KAAXA,EACE,GACA,G,0SCNd,IAyNIpC,EAzNAqC,EAAe,IAAW,OAAD,6BAC3B,MACMC,EADc,EAAKC,OACIC,cAAc,eAE3C,IAAIC,EAAY,YAAaH,GAAU,GAEvC,MAAMI,EAAeC,SAASC,cAAc,OAC5CF,EAAalB,UAAUqB,IAAI,iBAE3B,MAAMC,EAAU,YAAO,4DAA6D,CAACxB,KAAM,oBAC3FoB,EAAab,OAAOiB,GAEpB,YAAwBJ,GAExB,MAAMK,EAAYT,EAASU,cAErBC,EAAKN,SAASC,cAAc,MAClC,YAAMK,EAAI,kBAEV,MAAMC,EAAWP,SAASC,cAAc,MACxCM,EAAS1B,UAAUqB,IAAI,kBACtB,CAAC,iBAAkB,iBAAkB,kBAAoC9B,QAASI,IACjF,MAAMgC,EAAKR,SAASC,cAAc,MAClCO,EAAGtB,OAAO,YAAKV,IACf+B,EAASrB,OAAOsB,KAGlBJ,EAAUlB,OAAOoB,EAAIC,EAAUR,GAE/BI,EAAQhB,iBAAiB,QAAS,KAChC,oDAAuBzB,KAAK+C,GAAKA,EAAEC,QAAQC,SAC3CC,GAAO,IAGT,MAGMC,SAHgB/C,QAAQC,IAAI,CAChC,sCAE4B,GAAG2C,QAEjC,IAAIE,GAAO,EACXE,EAAA,EAAU3B,iBAAiB,YAAa,KACtCyB,GAAO,EACPvD,EAAgB,MACf,CAAC+B,MAAM,IAEV,IACI2B,EADAC,EAA6C,CAACC,cAAc,GAGhE,MAAMC,EAAgBC,GAAoB,OAAD,6BACvC,IACE,IAAIC,QAAmB,IAAWC,UAAU,wBAAyB,CACnEC,OAAQ,IAAIC,GACZC,SAAU,IAAIC,KACdC,WAAY,IACX,CAACT,cAAc,IAclB,GAZoB,6BAAjBG,EAAWO,IACRX,EAAQY,OACVZ,EAAQY,KAAOR,EAAWS,MAC1B,IAAWC,YAAYV,EAAWS,QAIpCT,QAAmB,IAAWC,UAAU,wBAAyB,CAC/DU,MAAOX,EAAWW,OACjBf,IAGe,2BAAjBI,EAAWO,EAAgC,CAC5C,MAAMK,EAAgBZ,EAAWY,cAGjC,OAFA,IAAWC,QAAQD,EAAcE,MACjC,8BAAmBxE,KAAK+C,GAAKA,EAAEC,QAAQC,UAChC,EAOT,IAAII,IAAc,OAAAhE,EAAA,GAASgE,EAAWK,EAAWW,OAAQ,CACvDhB,EAAYK,EAAWW,MAEvB,IAAII,ED5GG,SAAuBC,GACpC,IAAIC,EACAC,EAAS,GAEb,IAAI,IAAIC,EAAOH,EAAMjF,OAAQqF,EAAU,EAAGC,EAAO,EAAGA,EAAOF,IAAQE,EACjEJ,EAAOI,EAAO,EACdD,GAAWJ,EAAMK,KAAU,KAAOJ,EAAO,IAC7B,IAATA,GAAcE,EAAOE,GAAS,IAC/BH,GAAUI,OAAOC,aACfnD,EAAcgD,IAAY,GAAK,IAC/BhD,EAAcgD,IAAY,GAAK,IAC/BhD,EAAcgD,IAAY,EAAI,IAC9BhD,EAAwB,GAAVgD,IAEhBA,EAAU,GAId,OAAOF,EAAOxF,QAAQ,aAAc,KC0FhB8F,CAAcxB,EAAWW,OACnCc,EAAM,oBAAsB,OAAAlG,EAAA,GAAgBwF,GAAS,GAEzD,MAAMW,EAAQ9D,OAAO+D,iBAAiB/C,SAASgD,iBACzCC,EAAeH,EAAMI,iBAAiB,mBAAmBC,OACzDC,EAAYN,EAAMI,iBAAiB,wBAAwBC,OAC3DE,EAAeP,EAAMI,iBAAiB,mBAAmBC,OAEzDG,QAAgBC,MAAM,8BAC3B7F,KAAK8F,GAAOA,EAAI7E,QAChBjB,KAAKiB,IACJA,EAAOA,EAAK7B,QAAQ,gBAAiB,KAAKuG,OAC1C,MAAMI,EAAO,IAAIC,KAAK,CAAC/E,GAAO,CAACgF,KAAM,gCAGrC,OAAO,IAAI7F,QAAiB8F,IAC1B,MAAMC,EAAS,IAAIC,WACnBD,EAAOE,OAAU1E,IACfuE,EAAQvE,EAAE2E,OAAO1B,SAEnBuB,EAAOI,cAAcR,OAKnBS,EAAS,IAAIrD,EAAc,CAC/BsD,MAAO,IAAMnF,OAAOoF,iBACpBC,OAAQ,IAAMrF,OAAOoF,iBACrBE,KAAMzB,EACN0B,MAAOjB,EACPkB,YAAa,CACXC,MAAOrB,EACPO,KAAM,WAERe,qBAAsB,CACpBf,KAAM,iBAERgB,aAAc,CACZC,UAAW,EACXC,OAAQ,GAEVC,kBAAmB,CACjBL,MAAOxB,GAET8B,UAAW,CACTC,qBAAsB,OAO1B,IAAIC,EAHJf,EAAOhF,OAAOS,GACbA,EAASuF,UAAgCrG,UAAUqB,IAAI,aAItD+E,EADCf,EAAOiB,gBACEjB,EAAOiB,gBAEPrH,QAAQsH,KAAK,CACrB,OAAAC,EAAA,GAAM,KACN,IAAIvH,QAAe8F,IACjBM,EAAOoB,QAAQC,OAAOpG,iBAAiB,OAAQ,KAC7CH,OAAOC,sBAAsB,IAAM2E,MAClC,CAACxE,MAAM,cAMV6F,EAAQvH,KAAK,KACjB,GAAGoC,EAAW,CACZA,EAAUgD,MAAM0C,UAAY,yBAE5B,MAAMC,EAAI9F,EAAS+F,SAAS,GAC5BD,EAAE3C,MAAM6C,QAAU,OAClBF,EAAE3C,MAAM0C,UAAY,yBACpBI,WAAW,KACTH,EAAE3C,MAAM6C,QAAU,IACjB,KAEHC,WAAW,KACTH,EAAE3C,MAAM0C,UAAY,IACnB,KACH1F,OAAY+F,OAEZC,MAAMC,KAAKpG,EAAS+F,UAAUM,MAAM,GAAI,GAAG5H,QAAQ6H,IACjDA,EAAGnH,aAMX,GAAGqC,EAAQ,CACT,IAAI+E,EAAYC,KAAKC,MAAQ,IACzBC,EAAOjF,EAAWkF,QAAUJ,EAAYK,EAAA,EAAkBC,uBAExD,OAAAnB,EAAA,GAAMgB,EAlLG,EAkLqB,IAAuB,IAAMA,EAAO,IAE1E,MAAMI,GACN,OAAQA,EAAiB9C,MACvB,IAAK,0BACH+C,QAAQC,KAAK,uCACZF,EAAiBG,SAAU,EAC5B,+BAAyBlJ,KAAK+C,GAAKA,EAAEC,QAAQC,SAC7CC,GAAO,EACPvD,EAAgB,KAChB,MACF,QACEqJ,QAAQG,MAAM,6BAA8BJ,GAC5C7F,GAAO,EAIX,OAAO,EAGT,OAAO,KAKT,MAAO,IAAW,OAAD,6BAGf,IAFAA,GAAO,IAEJ,CACD,GAAGA,EACD,MAIF,SADwBM,GAAQ,GAE9B,aAOR,MAAM,EAAO,IAAI,IAAK,eAAe,EAAM,IAClC7D,EACN,KAEGA,IAAeA,EAAgBqC,KACnCrC,EAAcK,KAAKoJ,IACjBA,MAGFC,EAAA,EAAgBC,YAAY,YAAa,CAACrF,EAAG,sBAGhC,a,gCChQf,yBAwDA,MAAM4E,EAAoB,IAvCnB,MAYL,cAQEU,KAAKT,iBAAmB,EAMxB,IAAejI,IAAI,sBAAsBb,KAAMwJ,IAC1CA,IACDD,KAAKT,iBAAmBU,KAK5B,IAAWC,gBAAgB,wBAA0BC,IACnDH,KAAKT,iBAAmBY,EAAKC,YAMnC,MAAmB,IAAed,kBAAoBA,GACvC","file":"17.72126c110cfedf3298a9.chunk.js","sourcesContent":["export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/18.19abbab9479978924d76.chunk.js b/public/18.19abbab9479978924d76.chunk.js deleted file mode 100644 index fc8733a44..000000000 --- a/public/18.19abbab9479978924d76.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[18],{131:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(71);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},132:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(65);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},170:function(e,t,n){"use strict";n.r(t);var i=n(62),a=n(35),s=n(8),o=n(90),l=n(168),r=n(131),h=n(132),u=n(7),d=n(21),c=n(59),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{r(i.next(e))}catch(e){s(e)}}function l(e){try{r(i.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,l)}r((i=i.apply(e,t||[])).next())}))};let m,y=null,b=null,v=null;const E=new o.a("page-authCode",!0,()=>{const e=y.type.length,t=new h.a({label:"Code",name:Object(d.b)(),length:e,onFill:e=>{o(e)}});m=t.input,E.pageEl.querySelector(".input-wrapper").append(t.container);E.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return l.default.mount()}));const a=()=>{setTimeout(()=>{_.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:y.phone_number,phone_code_hash:y.phone_code_hash,phone_code:e};s.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":s.a.setUser(e.user),n.e(3).then(n.bind(null,110)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(20)]).then(n.bind(null,155)).then(e=>{e.default.mount({phone_number:y.phone_number,phone_code_hash:y.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(15).then(n.bind(null,142))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(c.a)(t.label,Object(u.d)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(c.a)(t.label,Object(u.d)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},b=E.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,_=new r.a(t,v);return b.append(_.container),_.load()},e=>{if(y=e,b){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else b=E.pageEl.getElementsByClassName("phone")[0],v=E.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(b.innerText=y.phone_number,y.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[y.type._]}Object(c.a)(v,Object(u.d)(t,n)),a.c.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=E}}]); -//# sourceMappingURL=18.19abbab9479978924d76.chunk.js.map \ No newline at end of file diff --git a/public/18.19abbab9479978924d76.chunk.js.map b/public/18.19abbab9479978924d76.chunk.js.map deleted file mode 100644 index 7b79f41af..000000000 --- a/public/18.19abbab9479978924d76.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/pages/pageAuthCode.ts"],"names":["TrackingMonkey","inputField","size","max","needFrame","this","container","document","createElement","classList","add","input","addEventListener","playAnimation","e","value","length","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","loadPromise","Promise","all","loadAnimationAsAsset","loop","autoplay","width","height","then","waitForFirstFrame","_animation","currentFrame","pause","remove","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","mount","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","invokeApi","ignoreErrors","response","_","setUser","user","m","default","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","pushToState","sentCode","focus"],"mappings":"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","file":"18.19abbab9479978924d76.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/19.1037e823e8c755fdccf9.chunk.js b/public/19.1037e823e8c755fdccf9.chunk.js deleted file mode 100644 index 2b9a4829e..000000000 --- a/public/19.1037e823e8c755fdccf9.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[19,20],{155:function(e,t,a){"use strict";a.r(t);var n=a(58),i=a(65),s=a(61),r=a(152),c=a(35),l=a(7),u=a(8),o=a(28),p=a(97),d=a(90),m=a(38),h=a(59);let b=null;const v=new d.a("page-signUp",!0,()=>a.e(6).then(a.bind(null,75)).then(e=>{const t=new p.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const c=document.createElement("canvas");c.id="canvas-avatar",c.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(c,d);const v=e.default;let g;t.imageDiv.addEventListener("click",()=>{(new r.a).open(c,e=>{g=e})});const L=e=>{const a=w.value||"",n=y.value||"",i=a||n?(a+" "+n).trim():"";i?Object(h.a)(t.title,o.b.wrapEmojiText(i)):Object(h.a)(t.title,Object(l.d)("YourName"))};const w=new i.b({label:"FirstName",maxLength:70}),y=new i.b({label:"LastName",maxLength:64}),f=Object(n.a)("btn-primary btn-color-primary"),E=new l.c.IntlElement({key:"StartMessaging"});return f.append(E.element),t.inputWrapper.append(w.container,y.container,f),w.input.addEventListener("input",L),y.input.addEventListener("input",L),f.addEventListener("click",(function(e){if(w.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const t=w.value.trim(),n=y.value.trim(),i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=Object(s.f)(this);u.a.invokeApi("auth.signUp",i).then(e=>{switch(e._){case"auth.authorization":u.a.setUser(e.user),new Promise((e,t)=>{if(!g)return e();g().then(a=>{v.uploadProfilePhoto(a).then(e,t)},t)}).finally(()=>{a.e(3).then(a.bind(null,110)).then(e=>{e.default.mount()})});break;default:E.update({key:e._}),this.removeAttribute("disabled"),r.remove()}}).catch(e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})})})),Object(m.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{b=e,c.c.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=v},97:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(7);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(n.d)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(n.d)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=19.1037e823e8c755fdccf9.chunk.js.map \ No newline at end of file diff --git a/public/19.1037e823e8c755fdccf9.chunk.js.map b/public/19.1037e823e8c755fdccf9.chunk.js.map deleted file mode 100644 index da06e60cf..000000000 --- a/public/19.1037e823e8c755fdccf9.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/loginPage.ts"],"names":["authCode","page","then","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","classList","add","title","avatarPreview","document","createElement","id","addIco","append","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","contains","length","this","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","_","setUser","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode","pushToState","LoginPage","options","body","querySelector","subtitle"],"mappings":"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","file":"19.1037e823e8c755fdccf9.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/2.68e2ce68d7ded3346526.chunk.js b/public/2.68e2ce68d7ded3346526.chunk.js deleted file mode 100644 index bbb0e69ca..000000000 --- a/public/2.68e2ce68d7ded3346526.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[2],{105:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(31);function s(t){return Array.from(t.childNodes).map(t=>3===t.nodeType?Object(i.a)(t.textContent):t.outerHTML).join("")}},106:function(t,e,n){"use strict";function i(t,e){return t.closest(`[${e}]`)}n.d(e,"a",(function(){return i}))},107:function(t,e,n){"use strict";n.d(e,"b",(function(){return i})),n.d(e,"a",(function(){return a}));const i={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,n,o,r,l,u={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?n.push(e.substr(0,r)+""+e.substr(r)):n.push(e),l&&e.length&&t.parentNode){const n=t.parentElement;for(const t in i){const s=i[t],a=n.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:u.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:u.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:u.offset,length:e.length}))}}return void(u.offset+=e.length)}if(1!==t.nodeType)return;const c=o===t,h=s.has(t.tagName);if(h&&n.length)e.push(n.join("")),n.splice(0,n.length),++u.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(n.push(e),u.offset+=e.length)}c&&!r&&n.push("");const d=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,n,o,r,l,u),m=m.nextSibling;if(c&&r&&n.push(""),d&&t.nextSibling&&(n.push(" "),++u.offset,void 0!==p))for(let t=p,e=l.length;ta(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;i.set(t,e)})),truncate:()=>{i=new Uint8Array},trim:t=>{i=i.slice(0,t)},finalize:(e=!0)=>{const a=Object(s.a)(i,t);return e&&n&&n(a),a},getParts:()=>i,replaceParts:t=>{i=t}}}},r=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function r(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,r)}l((i=i.apply(t,e||[])).next())}))};class l{constructor(t){this.dbName=t,this.useStorage=!0,i.a.test&&(this.dbName+="_test"),l.STORAGES.length&&(this.useStorage=l.STORAGES[0].useStorage),this.openDatabase(),l.STORAGES.push(this)}openDatabase(){var t;return null!==(t=this.openDbPromise)&&void 0!==t?t:this.openDbPromise=caches.open(this.dbName)}delete(t){return this.timeoutOperation(e=>e.delete("/"+t))}deleteAll(){return caches.delete(this.dbName)}get(t){return this.timeoutOperation(e=>e.match("/"+t))}save(t,e){return this.timeoutOperation(n=>n.put("/"+t,e))}getFile(t,e="blob"){return this.get(t).then(t=>{if(!t)throw"NO_ENTRY_FOUND";return t[e]()})}saveFile(t,e){e instanceof Blob||(e=Object(s.a)(e));const n=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,n).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,n)=>r(this,void 0,void 0,(function*(){let i=!1;const s=setTimeout(()=>{n(),i=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(n);if(i)return;e(s)}catch(t){n(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e,n){const i=o.getFakeFileWriter(n,e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(i)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}l.STORAGES=[]},59:function(t,e,n){"use strict";function i(t,e){if("string"==typeof e)return void(t.innerHTML=e);const n=t.firstChild;n?t.lastChild===n?n.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}n.d(e,"a",(function(){return i}))},65:function(t,e,n){"use strict";n.d(e,"a",(function(){return p}));var i=n(114),s=n(105),a=n(106),o=n(96),r=n(117);var l=n(66),u=n(7),c=n(28),h=n(74);let d=()=>{document.addEventListener("paste",t=>{if(!Object(a.a)(t.target,'contenteditable="true"'))return;let e,n;t.preventDefault();let i=(t.originalEvent||t).clipboardData.getData("text/plain"),r=!0,l=(t.originalEvent||t).clipboardData.getData("text/html");if(l.trim()){l=l.replace(//,""),l=l.replace(//,"");const t=l.match(/([\s\S]*)<\/body>/);t&&(l=t[1].trim());let s=document.createElement("span");s.innerHTML=l;let a=s.firstChild;for(;a;){let t=a.nextSibling;3===a.nodeType&&(a.nodeValue.trim()||a.remove()),a=t}const u=Object(o.a)(s,!0);if(u.value.replace(/\s/g,"").length===i.replace(/\s/g,"").length){e=u.value,n=u.entities,r=!1;let t=c.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),c.b.mergeEntities(n,t)}}r&&(e=i,n=c.b.parseEntities(e),n=n.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._));const u=c.b.wrapDraftText(e,{entities:n});e=Object(s.a)(u),window.document.execCommand("insertHTML",!1,e)}),d=null};var p;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(p||(p={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:n,showLengthOn:i,name:s,plainText:a,canBeEdited:l=!0}=t;let c,h,p=t.label||t.labelText;if(a)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{d&&d(),this.container.innerHTML=`\n
\n `,c=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});c.addEventListener("input",()=>{Object(r.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(u.b)(c,e,void 0,"placeholder"),this.inputFake&&Object(u.b)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const t=this.container.lastElementChild;let e=!1;h=()=>{const s=c.classList.contains("error"),r=a?c.value.length:[...Object(o.a)(c,!1).value].length,l=n-r,u=l<0;c.classList.toggle("error",u),u||l<=i?(this.setLabel(),t.append(` (${n-r})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",h)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const n=window.getSelection();n.removeAllRanges(),n.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?Object(l.a)(this.label,this.options.labelText):this.label.append(Object(u.d)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,n=+this.input.style.height.replace("px","");if(n===e)return;const i=Math.round(50*Math.log(Math.abs(e-n)));this.input.style.transitionDuration=i+"ms",t&&(this.input.style.height=e?e+"px":"");Object(h.a)(this.input,"is-changing-height",!0,i,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(o.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(i.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(r.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=Object(s.a)(c.b.wrapDraftText(t))),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(u.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&p.Error)),this.input.classList.toggle("valid",!!(t&p.Valid))}setError(t){this.setState(p.Error,t)}}},66:function(t,e,n){"use strict";function i(t,e){t.setAttribute("dir","auto"),"string"==typeof e?e?t.innerHTML=e:t.textContent="":(t.textContent="",t.append(e))}n.d(e,"a",(function(){return i}))},74:function(t,e,n){"use strict";var i=n(0);const s=(t,e,n,a,o,r)=>{const{timeout:l,raf:u}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==u&&(window.cancelAnimationFrame(+u),r||delete t.dataset.raf),r&&i.a.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,n,a,o,r-1)}));n&&e&&t.classList.add(e);const c=()=>{delete t.dataset.timeout,!n&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!i.a.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void c();t.classList.add("animating"),t.classList.toggle("backwards",!n),t.dataset.timeout=""+setTimeout(c,a)};e.a=s},96:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var i=n(1),s=n(28),a=n(107);function o(t,e=!0){const n=[],i=[],o=e?[]:void 0;Object(a.a)(t,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}i.a.getRichValue=o}}]); -//# sourceMappingURL=2.68e2ce68d7ded3346526.chunk.js.map \ No newline at end of file diff --git a/public/2.68e2ce68d7ded3346526.chunk.js.map b/public/2.68e2ce68d7ded3346526.chunk.js.map deleted file mode 100644 index 22abd12d9..000000000 --- a/public/2.68e2ce68d7ded3346526.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/documentFragmentToHTML.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/getRichValue.ts"],"names":["documentFragmentToHTML","fragment","Array","from","childNodes","map","node","nodeType","textContent","outerHTML","join","findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","entities","offset","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","curChild","firstChild","nextSibling","undefined","i","wasLength","isInputEmpty","element","hasAttribute","value","trim","blobSupported","blobConstruct","e","this","mimeType","size","saveFileCallback","bytes","Uint8Array","write","part","set","truncate","slice","finalize","saveToStorage","blob","getParts","replaceParts","parts","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","response","put","fileName","method","get","then","Blob","Response","headers","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","res","err","clearTimeout","fileSize","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","storage","deleteAll","replaceContent","elem","innerHTML","lastChild","replaceWith","append","init","document","addEventListener","target","text","preventDefault","plainText","originalEvent","clipboardData","getData","usePlainText","html","replace","span","createElement","remove","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","window","execCommand","InputState","options","container","classList","add","required","validate","maxLength","showLengthOn","Math","min","round","placeholder","name","canBeEdited","input","processInput","label","labelText","firstElementChild","String","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","setLabel","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","height","transitionDuration","log","abs","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","state","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","field","withEntities","combineSameEntities","sortEntities"],"mappings":"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","file":"2.68e2ce68d7ded3346526.chunk.js","sourcesContent":["import encodeEntities from \"../string/encodeEntities\";\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport documentFragmentToHTML from \"../helpers/dom/documentFragmentToHTML\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n const fragment = RichTextProcessor.wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(RichTextProcessor.wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/20.96e8eeb627066b5094ac.chunk.js b/public/20.96e8eeb627066b5094ac.chunk.js deleted file mode 100644 index c291383ba..000000000 --- a/public/20.96e8eeb627066b5094ac.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[20,19],{155:function(e,t,a){"use strict";a.r(t);var n=a(58),i=a(65),s=a(61),r=a(152),c=a(35),l=a(7),u=a(8),o=a(28),p=a(97),d=a(90),m=a(38),h=a(59);let b=null;const v=new d.a("page-signUp",!0,()=>a.e(6).then(a.bind(null,75)).then(e=>{const t=new p.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const c=document.createElement("canvas");c.id="canvas-avatar",c.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(c,d);const v=e.default;let g;t.imageDiv.addEventListener("click",()=>{(new r.a).open(c,e=>{g=e})});const L=e=>{const a=w.value||"",n=y.value||"",i=a||n?(a+" "+n).trim():"";i?Object(h.a)(t.title,o.b.wrapEmojiText(i)):Object(h.a)(t.title,Object(l.d)("YourName"))};const w=new i.b({label:"FirstName",maxLength:70}),y=new i.b({label:"LastName",maxLength:64}),f=Object(n.a)("btn-primary btn-color-primary"),E=new l.c.IntlElement({key:"StartMessaging"});return f.append(E.element),t.inputWrapper.append(w.container,y.container,f),w.input.addEventListener("input",L),y.input.addEventListener("input",L),f.addEventListener("click",(function(e){if(w.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const t=w.value.trim(),n=y.value.trim(),i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=Object(s.f)(this);u.a.invokeApi("auth.signUp",i).then(e=>{switch(e._){case"auth.authorization":u.a.setUser(e.user),new Promise((e,t)=>{if(!g)return e();g().then(a=>{v.uploadProfilePhoto(a).then(e,t)},t)}).finally(()=>{a.e(3).then(a.bind(null,110)).then(e=>{e.default.mount()})});break;default:E.update({key:e._}),this.removeAttribute("disabled"),r.remove()}}).catch(e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})})})),Object(m.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{b=e,c.c.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=v},97:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(7);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(n.d)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(n.d)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=20.96e8eeb627066b5094ac.chunk.js.map \ No newline at end of file diff --git a/public/20.96e8eeb627066b5094ac.chunk.js.map b/public/20.96e8eeb627066b5094ac.chunk.js.map deleted file mode 100644 index 39750a216..000000000 --- a/public/20.96e8eeb627066b5094ac.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/loginPage.ts"],"names":["authCode","page","then","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","classList","add","title","avatarPreview","document","createElement","id","addIco","append","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","contains","length","this","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","_","setUser","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode","pushToState","LoginPage","options","body","querySelector","subtitle"],"mappings":"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","file":"20.96e8eeb627066b5094ac.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/21.01da4c39b75c80344eb7.chunk.js b/public/21.01da4c39b75c80344eb7.chunk.js deleted file mode 100644 index cd0087fb7..000000000 --- a/public/21.01da4c39b75c80344eb7.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[21],{197:function(X,e,o){"use strict";o.r(e);e.default={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); -//# sourceMappingURL=21.01da4c39b75c80344eb7.chunk.js.map \ No newline at end of file diff --git a/public/21.01da4c39b75c80344eb7.chunk.js.map b/public/21.01da4c39b75c80344eb7.chunk.js.map deleted file mode 100644 index c16497b1c..000000000 --- a/public/21.01da4c39b75c80344eb7.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/countries.ts"],"names":["_","countries","hash"],"mappings":"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","file":"21.01da4c39b75c80344eb7.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { HelpCountriesList } from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"X XXXXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d'Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\"}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"country_code\":\"961\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"country_code\":\"60\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\",\"97 XXXX XXXXX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"country_code\":\"378\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"country_code\":\"685\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find(c => c.name === 'United States'),\n '44': Countries.find(c => c.name === 'United Kingdom'),\n '61': Countries.find(c => c.name === 'Australia'),\n '64': Countries.find(c => c.name === 'New Zealand'),\n '246': Countries.find(c => c.name === 'Diego Garcia'),\n '255': Countries.find(c => c.name === 'Tanzania'),\n '262': Countries.find(c => c.name === 'Reunion'),\n '500': Countries.find(c => c.name === 'Falkland Islands'),\n '590': Countries.find(c => c.name === 'Guadeloupe'),\n '672': Countries.find(c => c.name === 'Norfolk Island'),\n '1 268': Countries.find(c => c.name === 'Antigua & Barbuda'),\n}; */\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/216.4397eec2983565f6f071.chunk.js b/public/216.4397eec2983565f6f071.chunk.js new file mode 100644 index 000000000..1c391d122 --- /dev/null +++ b/public/216.4397eec2983565f6f071.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[216],{7625:(e,t,n)=>{function i(e,t){for(let n=e.length-1;n>=0;--n)t(e[n],n,e)}n.d(t,{Z:()=>i})},2202:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(2219);let a=0;function o(e){let t;const n=null==e?void 0:e.type;if(n){const e=`${i.Z}_${a++}.mimeType.split('/')[1]`;t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t=`upload-${i.Z}_${a++}`;return t}},6658:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(7562);function a(e,t,n,a){const o=(0,i.Z)(e,null==t?void 0:t.type);let s;return s=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:o,size:t?t.size:e.size,mimeType:s,fileName:e.file_name,queueId:n,onlyCache:a}}},7562:(e,t,n)=>{function i(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}n.d(t,{Z:()=>i})},7086:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(8801);function a(e){return(0,i.P)(e.location,{fileName:e.fileName})}},4211:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(6658),a=n(7667),o=n(7086);function s(e){const{media:t,thumb:n,queueId:s,onlyCache:r}=e,c="document"===t._?(0,i.Z)(t,n,s,r):(0,a.Z)(t,n,s,r);return{fileName:(0,o.Z)(c),downloadOptions:c}}},3781:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(7082);function a(e){const t=i.t;return e>=t?e:t+e*i.o}},2790:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(7082);function a(e){return function(e,t){const n=i.t;if(e{n.d(t,{o:()=>i,t:()=>a});const i=65536,a=4294967295},7667:(e,t,n)=>{function i(e,t,n,i){const a="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const o=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,s={_:a?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:s,size:o?t.size:void 0,queueId:n,onlyCache:i}}n.d(t,{Z:()=>i})},1379:(e,t,n)=>{function i(e,t){const n=e.slice(0,t.offset),i=function(e){const t="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",n=t.length,i=[];for(let a=0;ai})},6535:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(2423);const a=["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"];function o(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}var s=n(3447),r=n(671);function c(e){let t=(0,r.N0)(e).replace(/-?fe0f/g,"");if(s.Z.hasOwnProperty(t))return t}function l(e){let t,n=e;const s=[];let r,l=0;for(i.$2.lastIndex=0;t=n.match(i.$2);){if(r=l+t.index,t[3])s.push({_:"messageEntityMention",offset:r+t[1].length,length:t[2].length+t[3].length});else if(t[4])if(i.E.test(t[4]))s.push({_:"messageEntityEmail",offset:r,length:t[4].length});else{let e,n=t[5];const i=t[6];if(i){if(n||"xn--"!==i.substr(0,4)&&-1===a.indexOf(i.toLowerCase())||(n="http://"),n){const i=o(t[4]);i.length!==t[4].length&&(t[4]=i),e=(t[5]?"":n)+t[4]}}else e=(t[5]?"":"http://")+t[4];e&&s.push({_:"messageEntityUrl",offset:r,length:t[4].length})}else if(t[7])s.push({_:"messageEntityLinebreak",offset:r,length:1});else if(t[8]){const e=c(t[8]);e&&s.push({_:"messageEntityEmoji",offset:r,length:t[8].length,unicode:e})}else t[11]?s.push({_:"messageEntityHashtag",offset:r+(t[10]?t[10].length:0),length:t[11].length}):t[13]&&s.push({_:"messageEntityBotCommand",offset:r+(t[11]?t[11].length:0)+(t[12]?t[12].length:0),length:1+t[13].length+(t[14]?1+t[14].length:0),unsafe:!0});n=n.substr(t.index+t[0].length),l+=t.index+t[0].length}return s}}}]); +//# sourceMappingURL=216.4397eec2983565f6f071.chunk.js.map \ No newline at end of file diff --git a/public/216.4397eec2983565f6f071.chunk.js.map b/public/216.4397eec2983565f6f071.chunk.js.map new file mode 100644 index 000000000..e7af6ff13 --- /dev/null +++ b/public/216.4397eec2983565f6f071.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"216.4397eec2983565f6f071.chunk.js","mappings":"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","sources":["webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/getFileNameForUpload.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/generateMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","webpack://tweb/./src/lib/richTextProcessor/encodeSpoiler.ts","webpack://tweb/./src/lib/richTextProcessor/spoiler.ts","webpack://tweb/./src/config/tld.ts","webpack://tweb/./src/lib/richTextProcessor/checkBrackets.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiUnified.ts","webpack://tweb/./src/lib/richTextProcessor/parseEntities.ts"],"sourcesContent":["export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport tabId from \"../config/tabId\";\r\n\r\nlet uploadId = 0;\r\nexport default function getFileNameForUpload(file: File | Blob) {\r\n let fileName: string;\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = `${tabId}_${uploadId++}.mimeType.split('/')[1]`;\r\n\r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n } else {\r\n fileName = `upload-${tabId}_${uploadId++}`;\r\n }\r\n\r\n return fileName;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Document, PhotoSize } from \"../../../../layer\";\r\nimport type { DownloadOptions } from \"../../../mtproto/apiFileManager\";\r\nimport getDocumentInput from \"./getDocumentInput\";\r\n\r\nexport default function getDocumentDownloadOptions(doc: Document.document, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\r\n const inputFileLocation = getDocumentInput(doc, thumb?.type);\r\n\r\n let mimeType: string;\r\n if(thumb) {\r\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\r\n } else {\r\n mimeType = doc.mime_type || 'application/octet-stream';\r\n }\r\n\r\n return {\r\n dcId: doc.dc_id, \r\n location: inputFileLocation, \r\n size: thumb ? thumb.size : doc.size, \r\n mimeType,\r\n fileName: doc.file_name,\r\n queueId,\r\n onlyCache\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Document, InputFileLocation } from \"../../../../layer\";\r\n\r\nexport default function getInput(doc: Document.document, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\r\n return {\r\n _: 'inputDocumentFileLocation',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference,\r\n thumb_size: thumbSize\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getFileNameByLocation } from \"../../../../helpers/fileName\";\r\nimport { DownloadOptions } from \"../../../mtproto/apiFileManager\";\r\n\r\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\r\n return getFileNameByLocation(options.location, {fileName: options.fileName});\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadMediaOptions } from \"../../../mtproto/apiFileManager\";\r\nimport getDocumentDownloadOptions from \"../docs/getDocumentDownloadOptions\";\r\nimport getPhotoDownloadOptions from \"../photos/getPhotoDownloadOptions\";\r\nimport getDownloadFileNameFromOptions from \"./getDownloadFileNameFromOptions\";\r\n\r\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\r\n const {media, thumb, queueId, onlyCache} = options;\r\n const downloadOptions = media._ === 'document' ? getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache) : getPhotoDownloadOptions(media as any, thumb, queueId, onlyCache);\r\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\r\n return {fileName, downloadOptions};\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT } from \".\";\n\nexport default function generateMessageId(messageId: number) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId >= q) {\n return messageId;\n }\n\n return q + (messageId * MESSAGE_ID_INCREMENT);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clearMessageId from \"./clearMessageId\";\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT } from \".\";\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { PhotoSize, InputFileLocation } from \"../../../../layer\";\nimport type { DownloadOptions } from \"../../../mtproto/apiFileManager\";\nimport type { MyDocument } from \"../../appDocsManager\";\nimport type { MyPhoto } from \"../../appPhotosManager\";\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\nimport spoiler from \"./spoiler\";\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\n};\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from \"../../config/emoji\";\nimport { encodeEmoji } from \"../../vendor/emoji\";\n\nexport default function getEmojiUnified(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return;\n }\n\n return unified;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { EMAIL_REG_EXP, FULL_REG_EXP } from \".\";\nimport TLD from \"../../config/tld\";\nimport { MessageEntity } from \"../../layer\";\nimport checkBrackets from \"./checkBrackets\";\nimport getEmojiUnified from \"./getEmojiUnified\";\n\nexport default function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while((match = raw.match(FULL_REG_EXP))) {\n matchIndex = rawOffset + match.index;\n\n //console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n}\n"],"names":["forEachReverse","array","callback","i","length","uploadId","getFileNameForUpload","file","fileName","mimeType","type","ext","indexOf","getDocumentDownloadOptions","doc","thumb","queueId","onlyCache","inputFileLocation","sticker","mime_type","dcId","dc_id","location","size","file_name","getInput","thumbSize","_","id","access_hash","file_reference","thumb_size","getDownloadFileNameFromOptions","options","getDownloadMediaDetails","media","downloadOptions","generateMessageId","messageId","q","getServerMessageId","toServer","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","getPhotoDownloadOptions","photo","photoSize","isDocument","Error","isPhoto","undefined","encodeSpoiler","text","entity","before","slice","offset","spoilerAfter","chars","charsLength","out","char","charCodeAt","push","join","spoiler","after","entityText","checkBrackets","url","urlLength","urlOpenBrackets","split","urlCloseBrackets","charAt","substr","replace","getEmojiUnified","emojiCode","unified","parseEntities","match","raw","entities","matchIndex","rawOffset","index","E","protocol","tld","toLowerCase","balanced","unicode","unsafe"],"sourceRoot":""} \ No newline at end of file diff --git a/public/22.0a628e2d4248ba9d2bc6.chunk.js b/public/22.0a628e2d4248ba9d2bc6.chunk.js deleted file mode 100644 index b765db41f..000000000 --- a/public/22.0a628e2d4248ba9d2bc6.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[22],{198:function(e,a,s){"use strict";s.r(a);function c(e,a){switch(e){case 27764:if(a%10==1&&(a%100<11||a%100>19))return"one";if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return"few";break;case 27766:if(0==a)return"zero";if(a%10==1&&a%100!=11)return"one";break;case 25465:if(2==a)return"two";if(3==a)return"few";if(0==a)return"zero";if(1==a)return"one";if(6==a)return"many";break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return"many";break;case 7041896:if(0==a)return"zero";if(1==a)return"one";break;case 7563369:if(a>=2&&a<=10)return"few";if(a>=0&&a<=1)return"one";break;case 26725:if(2==a)return"two";if(1==a)return"one";if(0!=a&&a%10==0)return"many";break;case 25459:case 29547:if(1==a)return"one";if(a>=2&&a<=4)return"few";break;case 25202:if(0!=a&&a%1e6==0)return"many";if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return"one";if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return"two";if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return"few";break;case 29548:if(a%100==2)return"two";if(a%100==1)return"one";if(a%100>=3&&a%100<=4)return"few";break;case 7102823:if(0==a)return"zero";if(a>=0&&a<=2&&0!=a&&2!=a)return"one";break;case 28780:if(1==a)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return"many";break;case 26468:if(2==a||12==a)return"two";if(1==a||11==a)return"one";if(a>=3&&a<=10||a>=13&&a<=19)return"few";break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return"one";break;case 28011:if(a%10==1&&11!=a)return"one";break;case 28020:if(1==a)return"one";if(a%100>=11&&a%100<=19)return"many";if(0==a||a%100>=2&&a%100<=10)return"few";break;case 28015:case 29295:if(1==a)return"one";if(0==a||1!=a&&a%100>=1&&a%100<=19)return"few";break;case 26465:if(2==a)return"two";if(1==a)return"one";if(a>=3&&a<=6)return"few";if(a>=7&&a<=10)return"many";break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return"one";break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return"two";if(1==a)return"one";break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return"one";break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return"one";break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return"one";break;case 24946:if(2==a)return"two";if(1==a)return"one";if(0==a)return"zero";if(a%100>=3&&a%100<=10)return"few";if(a%100>=11&&a%100<=99)return"many"}return"other"}const r={PluralRules:class{constructor(e){this.select=c.bind(null,function(e){let a=0;for(let s=0;s 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set2\r\n case 0x6c76: // lv\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set3\r\n case 0x6379: // cy\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set5\r\n case 0x6b7368: // ksh\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set6\r\n case 0x736869: // shi\r\n if ((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if ((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set7\r\n case 0x6865: // he\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set9\r\n case 0x6272: // br\r\n if ((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if (((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if (((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if ((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set10\r\n case 0x736c: // sl\r\n if ((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if ((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set11\r\n case 0x6c6167: // lag\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set12\r\n case 0x706c: // pl\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set13\r\n case 0x6764: // gd\r\n if ((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if ((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set14\r\n case 0x6776: // gv\r\n if ((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set15\r\n case 0x6d6b: // mk\r\n if (((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set16\r\n case 0x6d74: // mt\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if ((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set18\r\n case 0x6761: // ga\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if ((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if (((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if ((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set22\r\n case 0x747a6d: // tzm\r\n if (((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set24\r\n case 0x6172: // ar\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if (((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n \r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/23.6be0d0c4a28ca0d0952b.chunk.js b/public/23.6be0d0c4a28ca0d0952b.chunk.js deleted file mode 100644 index 1ee913c46..000000000 --- a/public/23.6be0d0c4a28ca0d0952b.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[23,3],{110:function(e,t,a){"use strict";a.r(t);var n=a(38),c=a(42),s=a(35),l=a(7);const u=new(a(90).a)("page-chats",!1,()=>(s.c.pushToState("authState",{_:"authStateSignedIn"}),l.c.requestedServerLanguage||l.c.getCacheLangPack().then(e=>{e.local&&l.c.getLangPack(e.lang_code)}),u.pageEl.style.display="",Object(n.a)(),Promise.all([Object(c.a)(),Promise.all([a.e(1),a.e(2),a.e(5),a.e(6),a.e(13)]).then(a.bind(null,184))]).then(()=>{setTimeout(()=>{document.getElementById("auth-pages").remove()},1e3)})));t.default=u}}]); -//# sourceMappingURL=23.6be0d0c4a28ca0d0952b.chunk.js.map \ No newline at end of file diff --git a/public/23.6be0d0c4a28ca0d0952b.chunk.js.map b/public/23.6be0d0c4a28ca0d0952b.chunk.js.map deleted file mode 100644 index becd6abf5..000000000 --- a/public/23.6be0d0c4a28ca0d0952b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","requestedServerLanguage","getCacheLangPack","then","langPack","local","getLangPack","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"mappings":"yFAAA,0CAoDA,MAAMA,EAAO,IApDb,MAoDiB,GAAK,cAAc,EAxCjB,KACjB,IAAgBC,YAAY,YAAa,CAACC,EAAG,sBAIzC,IAAKC,yBACP,IAAKC,mBAAmBC,KAAKC,IACxBA,EAASC,OACV,IAAKC,YAAYF,EAASG,aAKhCT,EAAKU,OAAOC,MAAMC,QAAU,GAe5B,cAEOC,QAAQC,IAAI,CACjB,cACA,4EACCT,KAAK,KACNU,WAAW,KACTC,SAASC,eAAe,cAAcC,UACrC,SAKQ","file":"23.6be0d0c4a28ca0d0952b.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then(langPack => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/24.3dbb6c36f540f3e15be0.chunk.js b/public/24.3dbb6c36f540f3e15be0.chunk.js deleted file mode 100644 index bb261dd10..000000000 --- a/public/24.3dbb6c36f540f3e15be0.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[24],{200:function(t,r,o){"use strict";o.r(r),o.d(r,"default",(function(){return f}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],e=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function f(t,r,o,f,n,s,u){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(u)&&(u=1),(u|=0)>3&&(u=3),u<1&&(u=1);const i=t.getImageData(r,o,f,n),c=i.data;let p,N,b,m,d,g,h,k,l,w,D,I,J=f-1,j=n-1,q=s+1,v=[],x=[],y=[],z=a[s],A=e[s],B=[],C=[];for(;u-- >0;){for(I=D=0,d=0;dJ?J:g)<<2),p+=c[h++],N+=c[h++],b+=c[h++];for(m=0;m0?h<<2:0),k=I+B[m],l=I+C[m],p+=c[k++]-c[l++],N+=c[k++]-c[l++],b+=c[k++]-c[l++],D++;I+=f<<2}for(m=0;mj?0:f,p+=v[w],N+=x[w],b+=y[w];for(D=m<<2,d=0;d>>A,c[D+1]=N*z>>>A,c[D+2]=b*z>>>A,0==m&&(B[d]=((h=d+q)0?h*f:0),k=m+B[d],l=m+C[d],p+=v[k]-v[l],N+=x[k]-x[l],b+=y[k]-y[l],D+=f<<2}}t.putImageData(i,r,o)}}}]); -//# sourceMappingURL=24.3dbb6c36f540f3e15be0.chunk.js.map \ No newline at end of file diff --git a/public/3.fd4a457d3edbe045f3c5.chunk.js b/public/3.fd4a457d3edbe045f3c5.chunk.js deleted file mode 100644 index c27c81a1c..000000000 --- a/public/3.fd4a457d3edbe045f3c5.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[3,23],{110:function(e,t,a){"use strict";a.r(t);var n=a(38),c=a(42),s=a(35),l=a(7);const u=new(a(90).a)("page-chats",!1,()=>(s.c.pushToState("authState",{_:"authStateSignedIn"}),l.c.requestedServerLanguage||l.c.getCacheLangPack().then(e=>{e.local&&l.c.getLangPack(e.lang_code)}),u.pageEl.style.display="",Object(n.a)(),Promise.all([Object(c.a)(),Promise.all([a.e(1),a.e(2),a.e(5),a.e(6),a.e(13)]).then(a.bind(null,184))]).then(()=>{setTimeout(()=>{document.getElementById("auth-pages").remove()},1e3)})));t.default=u}}]); -//# sourceMappingURL=3.fd4a457d3edbe045f3c5.chunk.js.map \ No newline at end of file diff --git a/public/3.fd4a457d3edbe045f3c5.chunk.js.map b/public/3.fd4a457d3edbe045f3c5.chunk.js.map deleted file mode 100644 index 511804f65..000000000 --- a/public/3.fd4a457d3edbe045f3c5.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","requestedServerLanguage","getCacheLangPack","then","langPack","local","getLangPack","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"mappings":"yFAAA,0CAoDA,MAAMA,EAAO,IApDb,MAoDiB,GAAK,cAAc,EAxCjB,KACjB,IAAgBC,YAAY,YAAa,CAACC,EAAG,sBAIzC,IAAKC,yBACP,IAAKC,mBAAmBC,KAAKC,IACxBA,EAASC,OACV,IAAKC,YAAYF,EAASG,aAKhCT,EAAKU,OAAOC,MAAMC,QAAU,GAe5B,cAEOC,QAAQC,IAAI,CACjB,cACA,4EACCT,KAAK,KACNU,WAAW,KACTC,SAASC,eAAe,cAAcC,UACrC,SAKQ","file":"3.fd4a457d3edbe045f3c5.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then(langPack => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/301.eb31c208f76e9dc623ec.chunk.js b/public/301.eb31c208f76e9dc623ec.chunk.js new file mode 100644 index 000000000..3b9dfecfc --- /dev/null +++ b/public/301.eb31c208f76e9dc623ec.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[301],{9301:(e,n,o)=>{o.r(n),o.d(n,{default:()=>i});const i={"Login.Title":"Sign in to Telegram","Login.CountrySelectorLabel":"Country","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Link Desktop Device**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); +//# sourceMappingURL=301.eb31c208f76e9dc623ec.chunk.js.map \ No newline at end of file diff --git a/public/301.eb31c208f76e9dc623ec.chunk.js.map b/public/301.eb31c208f76e9dc623ec.chunk.js.map new file mode 100644 index 000000000..590315c67 --- /dev/null +++ b/public/301.eb31c208f76e9dc623ec.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"301.eb31c208f76e9dc623ec.chunk.js","mappings":"yHAAA,MAuCA,EAvCa,CACX,cAAe,sBACf,6BAA8B,UAC9B,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAGlB,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","sources":["webpack://tweb/./src/langSign.ts"],"sourcesContent":["const lang = {\r\n \"Login.Title\": \"Sign in to Telegram\",\r\n \"Login.CountrySelectorLabel\": \"Country\",\r\n \"Login.PhoneLabel\": \"Phone Number\",\r\n \"Login.PhoneLabelInvalid\": \"Phone Number Invalid\",\r\n \"Login.KeepSigned\": \"Keep me signed in\",\r\n \"Login.StartText\": \"Please confirm your country and\\nenter your phone number.\",\r\n \"Login.Code.SentSms\": \"We have sent you an SMS\\nwith the code.\",\r\n \"Login.Code.SentInApp\": \"We have sent you a message in Telegram\\nwith the code.\",\r\n \"Login.Code.SentCall\": \"We will call you and voice\\nthe code.\",\r\n \"Login.Code.SentUnknown\": \"Please check everything\\nfor a code (type: %s)\",\r\n \"Login.Password.Title\": \"Enter Your Password\",\r\n \"Login.Password.Subtitle\": \"Your account is protected with\\nan additional password\",\r\n \"Login.Register.Subtitle\": \"Enter your name and add\\na profile picture\",\r\n \"PleaseWait\": \"Please wait...\",\r\n\r\n // * android\r\n \"Code\": \"Code\",\r\n \"LoginPassword\": \"Password\",\r\n \"YourName\": \"Your Name\",\r\n \"FirstName\": \"First name (required)\",\r\n \"LastName\": \"Last name (optional)\",\r\n \"StartMessaging\": \"Start Messaging\",\r\n\r\n // * macos\r\n \"Contacts.PhoneNumber.Placeholder\": \"Phone Number\",\r\n \"Login.Next\": \"Next\",\r\n \"Login.ContinueOnLanguage\": \"Continue in English\",\r\n \"Login.QR.Title\": \"Log in to Telegram by QR Code\",\r\n \"Login.QR.Help1\": \"Open Telegram on your phone\",\r\n \"Login.QR.Help2\": \"Go to **Settings** > **Devices** > **Link Desktop Device**\",\r\n \"Login.QR.Help3\": \"Point your phone at this screen to confirm login\",\r\n \"Login.QR.Cancel\": \"Log in by phone Number\",\r\n \"Login.QR.Login\": \"Log in by QR Code\",\r\n \"PHONE_CODE_INVALID\": \"Invalid code\",\r\n \"PHONE_CODE_EXPIRED\": \"Code expired\",\r\n \"PASSWORD_HASH_INVALID\": \"Incorrect password\"\r\n};\r\n\r\nexport default lang;\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/339.702eead422c6af883b39.chunk.js b/public/339.702eead422c6af883b39.chunk.js new file mode 100644 index 000000000..8864f1531 --- /dev/null +++ b/public/339.702eead422c6af883b39.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[339],{4421:(e,t,s)=>{s.d(t,{Z:()=>r});var n=s(1655),i=s(6724),o=s(5003);class r{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=(0,o.kg)("LL",o.v9.Error),this.processQueue=(0,i.Z)((()=>this._processQueue()),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise(((e,t)=>{this.unlockResolve=e})))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return t=this,s=void 0,i=function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}},new((n=void 0)||(n=Promise))((function(e,o){function r(e){try{c(i.next(e))}catch(e){o(e)}}function l(e){try{c(i.throw(e))}catch(e){o(e)}}function c(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,l)}c((i=i.apply(t,s||[])).next())}));var t,s,n,i}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit))do{if(e?(0,n.Z)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.size{s.d(t,{Z:()=>n});const n={Á:"A",Ă:"A",Ắ:"A",Ặ:"A",Ằ:"A",Ẳ:"A",Ẵ:"A",Ǎ:"A",Â:"A",Ấ:"A",Ậ:"A",Ầ:"A",Ẩ:"A",Ẫ:"A",Ä:"A",Ǟ:"A",Ȧ:"A",Ǡ:"A",Ạ:"A",Ȁ:"A",À:"A",Ả:"A",Ȃ:"A",Ā:"A",Ą:"A",Å:"A",Ǻ:"A",Ḁ:"A",Ⱥ:"A",Ã:"A",Ꜳ:"AA",Æ:"AE",Ǽ:"AE",Ǣ:"AE",Ꜵ:"AO",Ꜷ:"AU",Ꜹ:"AV",Ꜻ:"AV",Ꜽ:"AY",Ḃ:"B",Ḅ:"B",Ɓ:"B",Ḇ:"B",Ƀ:"B",Ƃ:"B",Ć:"C",Č:"C",Ç:"C",Ḉ:"C",Ĉ:"C",Ċ:"C",Ƈ:"C",Ȼ:"C",Ď:"D",Ḑ:"D",Ḓ:"D",Ḋ:"D",Ḍ:"D",Ɗ:"D",Ḏ:"D",Dz:"D",Dž:"D",Đ:"D",Ƌ:"D",DZ:"DZ",DŽ:"DZ",É:"E",Ĕ:"E",Ě:"E",Ȩ:"E",Ḝ:"E",Ê:"E",Ế:"E",Ệ:"E",Ề:"E",Ể:"E",Ễ:"E",Ḙ:"E",Ë:"E",Ė:"E",Ẹ:"E",Ȅ:"E",È:"E",Ẻ:"E",Ȇ:"E",Ē:"E",Ḗ:"E",Ḕ:"E",Ę:"E",Ɇ:"E",Ẽ:"E",Ḛ:"E",Ꝫ:"ET",Ḟ:"F",Ƒ:"F",Ǵ:"G",Ğ:"G",Ǧ:"G",Ģ:"G",Ĝ:"G",Ġ:"G",Ɠ:"G",Ḡ:"G",Ǥ:"G",Ḫ:"H",Ȟ:"H",Ḩ:"H",Ĥ:"H",Ⱨ:"H",Ḧ:"H",Ḣ:"H",Ḥ:"H",Ħ:"H",Í:"I",Ĭ:"I",Ǐ:"I",Î:"I",Ï:"I",Ḯ:"I",İ:"I",Ị:"I",Ȉ:"I",Ì:"I",Ỉ:"I",Ȋ:"I",Ī:"I",Į:"I",Ɨ:"I",Ĩ:"I",Ḭ:"I",Ꝺ:"D",Ꝼ:"F",Ᵹ:"G",Ꞃ:"R",Ꞅ:"S",Ꞇ:"T",Ꝭ:"IS",Ĵ:"J",Ɉ:"J",Ḱ:"K",Ǩ:"K",Ķ:"K",Ⱪ:"K",Ꝃ:"K",Ḳ:"K",Ƙ:"K",Ḵ:"K",Ꝁ:"K",Ꝅ:"K",Ĺ:"L",Ƚ:"L",Ľ:"L",Ļ:"L",Ḽ:"L",Ḷ:"L",Ḹ:"L",Ⱡ:"L",Ꝉ:"L",Ḻ:"L",Ŀ:"L",Ɫ:"L",Lj:"L",Ł:"L",LJ:"LJ",Ḿ:"M",Ṁ:"M",Ṃ:"M",Ɱ:"M",Ń:"N",Ň:"N",Ņ:"N",Ṋ:"N",Ṅ:"N",Ṇ:"N",Ǹ:"N",Ɲ:"N",Ṉ:"N",Ƞ:"N",Nj:"N",Ñ:"N",NJ:"NJ",Ó:"O",Ŏ:"O",Ǒ:"O",Ô:"O",Ố:"O",Ộ:"O",Ồ:"O",Ổ:"O",Ỗ:"O",Ö:"O",Ȫ:"O",Ȯ:"O",Ȱ:"O",Ọ:"O",Ő:"O",Ȍ:"O",Ò:"O",Ỏ:"O",Ơ:"O",Ớ:"O",Ợ:"O",Ờ:"O",Ở:"O",Ỡ:"O",Ȏ:"O",Ꝋ:"O",Ꝍ:"O",Ō:"O",Ṓ:"O",Ṑ:"O",Ɵ:"O",Ǫ:"O",Ǭ:"O",Ø:"O",Ǿ:"O",Õ:"O",Ṍ:"O",Ṏ:"O",Ȭ:"O",Ƣ:"OI",Ꝏ:"OO",Ɛ:"E",Ɔ:"O",Ȣ:"OU",Ṕ:"P",Ṗ:"P",Ꝓ:"P",Ƥ:"P",Ꝕ:"P",Ᵽ:"P",Ꝑ:"P",Ꝙ:"Q",Ꝗ:"Q",Ŕ:"R",Ř:"R",Ŗ:"R",Ṙ:"R",Ṛ:"R",Ṝ:"R",Ȑ:"R",Ȓ:"R",Ṟ:"R",Ɍ:"R",Ɽ:"R",Ꜿ:"C",Ǝ:"E",Ś:"S",Ṥ:"S",Š:"S",Ṧ:"S",Ş:"S",Ŝ:"S",Ș:"S",Ṡ:"S",Ṣ:"S",Ṩ:"S",ẞ:"SS",Ť:"T",Ţ:"T",Ṱ:"T",Ț:"T",Ⱦ:"T",Ṫ:"T",Ṭ:"T",Ƭ:"T",Ṯ:"T",Ʈ:"T",Ŧ:"T",Ɐ:"A",Ꞁ:"L",Ɯ:"M",Ʌ:"V",Ꜩ:"TZ",Ú:"U",Ŭ:"U",Ǔ:"U",Û:"U",Ṷ:"U",Ü:"U",Ǘ:"U",Ǚ:"U",Ǜ:"U",Ǖ:"U",Ṳ:"U",Ụ:"U",Ű:"U",Ȕ:"U",Ù:"U",Ủ:"U",Ư:"U",Ứ:"U",Ự:"U",Ừ:"U",Ử:"U",Ữ:"U",Ȗ:"U",Ū:"U",Ṻ:"U",Ų:"U",Ů:"U",Ũ:"U",Ṹ:"U",Ṵ:"U",Ꝟ:"V",Ṿ:"V",Ʋ:"V",Ṽ:"V",Ꝡ:"VY",Ẃ:"W",Ŵ:"W",Ẅ:"W",Ẇ:"W",Ẉ:"W",Ẁ:"W",Ⱳ:"W",Ẍ:"X",Ẋ:"X",Ý:"Y",Ŷ:"Y",Ÿ:"Y",Ẏ:"Y",Ỵ:"Y",Ỳ:"Y",Ƴ:"Y",Ỷ:"Y",Ỿ:"Y",Ȳ:"Y",Ɏ:"Y",Ỹ:"Y",Ź:"Z",Ž:"Z",Ẑ:"Z",Ⱬ:"Z",Ż:"Z",Ẓ:"Z",Ȥ:"Z",Ẕ:"Z",Ƶ:"Z",IJ:"IJ",Œ:"OE",ᴀ:"A",ᴁ:"AE",ʙ:"B",ᴃ:"B",ᴄ:"C",ᴅ:"D",ᴇ:"E",ꜰ:"F",ɢ:"G",ʛ:"G",ʜ:"H",ɪ:"I",ʁ:"R",ᴊ:"J",ᴋ:"K",ʟ:"L",ᴌ:"L",ᴍ:"M",ɴ:"N",ᴏ:"O",ɶ:"OE",ᴐ:"O",ᴕ:"OU",ᴘ:"P",ʀ:"R",ᴎ:"N",ᴙ:"R",ꜱ:"S",ᴛ:"T",ⱻ:"E",ᴚ:"R",ᴜ:"U",ᴠ:"V",ᴡ:"W",ʏ:"Y",ᴢ:"Z",á:"a",ă:"a",ắ:"a",ặ:"a",ằ:"a",ẳ:"a",ẵ:"a",ǎ:"a",â:"a",ấ:"a",ậ:"a",ầ:"a",ẩ:"a",ẫ:"a",ä:"a",ǟ:"a",ȧ:"a",ǡ:"a",ạ:"a",ȁ:"a",à:"a",ả:"a",ȃ:"a",ā:"a",ą:"a",ᶏ:"a",ẚ:"a",å:"a",ǻ:"a",ḁ:"a",ⱥ:"a",ã:"a",ꜳ:"aa",æ:"ae",ǽ:"ae",ǣ:"ae",ꜵ:"ao",ꜷ:"au",ꜹ:"av",ꜻ:"av",ꜽ:"ay",ḃ:"b",ḅ:"b",ɓ:"b",ḇ:"b",ᵬ:"b",ᶀ:"b",ƀ:"b",ƃ:"b",ɵ:"o",ć:"c",č:"c",ç:"c",ḉ:"c",ĉ:"c",ɕ:"c",ċ:"c",ƈ:"c",ȼ:"c",ď:"d",ḑ:"d",ḓ:"d",ȡ:"d",ḋ:"d",ḍ:"d",ɗ:"d",ᶑ:"d",ḏ:"d",ᵭ:"d",ᶁ:"d",đ:"d",ɖ:"d",ƌ:"d",ı:"i",ȷ:"j",ɟ:"j",ʄ:"j",dz:"dz",dž:"dz",é:"e",ĕ:"e",ě:"e",ȩ:"e",ḝ:"e",ê:"e",ế:"e",ệ:"e",ề:"e",ể:"e",ễ:"e",ḙ:"e",ë:"e",ė:"e",ẹ:"e",ȅ:"e",è:"e",ẻ:"e",ȇ:"e",ē:"e",ḗ:"e",ḕ:"e",ⱸ:"e",ę:"e",ᶒ:"e",ɇ:"e",ẽ:"e",ḛ:"e",ꝫ:"et",ḟ:"f",ƒ:"f",ᵮ:"f",ᶂ:"f",ǵ:"g",ğ:"g",ǧ:"g",ģ:"g",ĝ:"g",ġ:"g",ɠ:"g",ḡ:"g",ᶃ:"g",ǥ:"g",ḫ:"h",ȟ:"h",ḩ:"h",ĥ:"h",ⱨ:"h",ḧ:"h",ḣ:"h",ḥ:"h",ɦ:"h",ẖ:"h",ħ:"h",ƕ:"hv",í:"i",ĭ:"i",ǐ:"i",î:"i",ï:"i",ḯ:"i",ị:"i",ȉ:"i",ì:"i",ỉ:"i",ȋ:"i",ī:"i",į:"i",ᶖ:"i",ɨ:"i",ĩ:"i",ḭ:"i",ꝺ:"d",ꝼ:"f",ᵹ:"g",ꞃ:"r",ꞅ:"s",ꞇ:"t",ꝭ:"is",ǰ:"j",ĵ:"j",ʝ:"j",ɉ:"j",ḱ:"k",ǩ:"k",ķ:"k",ⱪ:"k",ꝃ:"k",ḳ:"k",ƙ:"k",ḵ:"k",ᶄ:"k",ꝁ:"k",ꝅ:"k",ĺ:"l",ƚ:"l",ɬ:"l",ľ:"l",ļ:"l",ḽ:"l",ȴ:"l",ḷ:"l",ḹ:"l",ⱡ:"l",ꝉ:"l",ḻ:"l",ŀ:"l",ɫ:"l",ᶅ:"l",ɭ:"l",ł:"l",lj:"lj",ſ:"s",ẜ:"s",ẛ:"s",ẝ:"s",ḿ:"m",ṁ:"m",ṃ:"m",ɱ:"m",ᵯ:"m",ᶆ:"m",ń:"n",ň:"n",ņ:"n",ṋ:"n",ȵ:"n",ṅ:"n",ṇ:"n",ǹ:"n",ɲ:"n",ṉ:"n",ƞ:"n",ᵰ:"n",ᶇ:"n",ɳ:"n",ñ:"n",nj:"nj",ó:"o",ŏ:"o",ǒ:"o",ô:"o",ố:"o",ộ:"o",ồ:"o",ổ:"o",ỗ:"o",ö:"o",ȫ:"o",ȯ:"o",ȱ:"o",ọ:"o",ő:"o",ȍ:"o",ò:"o",ỏ:"o",ơ:"o",ớ:"o",ợ:"o",ờ:"o",ở:"o",ỡ:"o",ȏ:"o",ꝋ:"o",ꝍ:"o",ⱺ:"o",ō:"o",ṓ:"o",ṑ:"o",ǫ:"o",ǭ:"o",ø:"o",ǿ:"o",õ:"o",ṍ:"o",ṏ:"o",ȭ:"o",ƣ:"oi",ꝏ:"oo",ɛ:"e",ᶓ:"e",ɔ:"o",ᶗ:"o",ȣ:"ou",ṕ:"p",ṗ:"p",ꝓ:"p",ƥ:"p",ᵱ:"p",ᶈ:"p",ꝕ:"p",ᵽ:"p",ꝑ:"p",ꝙ:"q",ʠ:"q",ɋ:"q",ꝗ:"q",ŕ:"r",ř:"r",ŗ:"r",ṙ:"r",ṛ:"r",ṝ:"r",ȑ:"r",ɾ:"r",ᵳ:"r",ȓ:"r",ṟ:"r",ɼ:"r",ᵲ:"r",ᶉ:"r",ɍ:"r",ɽ:"r",ↄ:"c",ꜿ:"c",ɘ:"e",ɿ:"r",ś:"s",ṥ:"s",š:"s",ṧ:"s",ş:"s",ŝ:"s",ș:"s",ṡ:"s",ṣ:"s",ṩ:"s",ʂ:"s",ᵴ:"s",ᶊ:"s",ȿ:"s",ɡ:"g",ß:"ss",ᴑ:"o",ᴓ:"o",ᴝ:"u",ť:"t",ţ:"t",ṱ:"t",ț:"t",ȶ:"t",ẗ:"t",ⱦ:"t",ṫ:"t",ṭ:"t",ƭ:"t",ṯ:"t",ᵵ:"t",ƫ:"t",ʈ:"t",ŧ:"t",ᵺ:"th",ɐ:"a",ᴂ:"ae",ǝ:"e",ᵷ:"g",ɥ:"h",ʮ:"h",ʯ:"h",ᴉ:"i",ʞ:"k",ꞁ:"l",ɯ:"m",ɰ:"m",ᴔ:"oe",ɹ:"r",ɻ:"r",ɺ:"r",ⱹ:"r",ʇ:"t",ʌ:"v",ʍ:"w",ʎ:"y",ꜩ:"tz",ú:"u",ŭ:"u",ǔ:"u",û:"u",ṷ:"u",ü:"u",ǘ:"u",ǚ:"u",ǜ:"u",ǖ:"u",ṳ:"u",ụ:"u",ű:"u",ȕ:"u",ù:"u",ủ:"u",ư:"u",ứ:"u",ự:"u",ừ:"u",ử:"u",ữ:"u",ȗ:"u",ū:"u",ṻ:"u",ų:"u",ᶙ:"u",ů:"u",ũ:"u",ṹ:"u",ṵ:"u",ᵫ:"ue",ꝸ:"um",ⱴ:"v",ꝟ:"v",ṿ:"v",ʋ:"v",ᶌ:"v",ⱱ:"v",ṽ:"v",ꝡ:"vy",ẃ:"w",ŵ:"w",ẅ:"w",ẇ:"w",ẉ:"w",ẁ:"w",ⱳ:"w",ẘ:"w",ẍ:"x",ẋ:"x",ᶍ:"x",ý:"y",ŷ:"y",ÿ:"y",ẏ:"y",ỵ:"y",ỳ:"y",ƴ:"y",ỷ:"y",ỿ:"y",ȳ:"y",ẙ:"y",ɏ:"y",ỹ:"y",ź:"z",ž:"z",ẑ:"z",ʑ:"z",ⱬ:"z",ż:"z",ẓ:"z",ȥ:"z",ẕ:"z",ᵶ:"z",ᶎ:"z",ʐ:"z",ƶ:"z",ɀ:"z",ff:"ff",ffi:"ffi",ffl:"ffl",fi:"fi",fl:"fl",ij:"ij",œ:"oe",st:"st",ₐ:"a",ₑ:"e",ᵢ:"i",ⱼ:"j",ₒ:"o",ᵣ:"r",ᵤ:"u",ᵥ:"v",ₓ:"x",Ё:"YO",Й:"I",Ц:"TS",У:"U",К:"K",Е:"E",Н:"N",Г:"G",Ш:"SH",Щ:"SCH",З:"Z",Х:"H",Ъ:"",ё:"yo",й:"i",ц:"ts",у:"u",к:"k",е:"e",н:"n",г:"g",ш:"sh",щ:"sch",з:"z",х:"h",ъ:"",Ф:"F",Ы:"I",В:"V",А:"A",П:"P",Р:"R",О:"O",Л:"L",Д:"D",Ж:"ZH",Э:"E",ф:"f",ы:"i",в:"v",а:"a",п:"p",р:"r",о:"o",л:"l",д:"d",ж:"zh",э:"e",Я:"Ya",Ч:"CH",С:"S",М:"M",И:"I",Т:"T",Ь:"",Б:"B",Ю:"YU",я:"ya",ч:"ch",с:"s",м:"m",и:"i",т:"t",ь:"",б:"b",ю:"yu"}},6690:(e,t,s)=>{function n(e){return[...new Set(e)]}s.d(t,{Z:()=>n})},6519:(e,t,s)=>{function n(e,t,s,n){if("function"!=typeof s){const e=s;s=t=>t[e]}const i=s(t);if(void 0===n&&-1!==(n=e.indexOf(t))){const t=e[n-1],o=e[n+1];if((!t||s(t)>=i)&&(!o||s(o)<=i))return n;e.splice(n,1)}const o=e.length;if(!o||i<=s(e[o-1]))return e.push(t)-1;if(i>=s(e[0]))return e.unshift(t),0;for(let n=0;ns(e[n]))return e.splice(n,0,t),n;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,{Z:()=>n})},8938:(e,t,s)=>{function n(e){}s.d(t,{Z:()=>n})},4484:(e,t,s)=>{function n(e,t){const s=e.length;if(s!==t.length)return!1;for(let n=0;nn})},3306:(e,t,s)=>{function n(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(s[n++]=parseInt(e.charAt(0),16));for(let i=n;in})},3692:(e,t,s)=>{function n(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}s.d(t,{Z:()=>n})},6654:(e,t,s)=>{function n(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,{Z:()=>n})},3624:(e,t,s)=>{s.d(t,{k:()=>n});const n=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const s=e;return()=>!s.cleaned&&(!t||t())}}}},7401:(e,t,s)=>{function n(e,t="asc"){if(!e)return[];const s=e instanceof Map?[...e.keys()]:Object.keys(e).map((e=>+e));return"asc"===t?s.sort(((e,t)=>e-t)):s.sort(((e,t)=>t-e))}s.d(t,{Z:()=>n})},5701:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(6761),i=s(319);function o(e,t,s=!0,o=!0){let r,l,c,u,a=!1;const h=t=>{const s=c,n=u;try{s(e.apply(null,t))}catch(e){console.error("debounce error",e),n(e)}},d=(...e)=>{l||(l=new Promise(((e,t)=>(c=e,u=t)))),r?(clearTimeout(r),a=!0,u(),l=new Promise(((e,t)=>(c=e,u=t)))):s&&(h(e),a=!1);const d=n.Z.setTimeout((()=>{!o||s&&!a||h(e),r===d&&(r=l=c=u=void 0,a=!1)}),t);return r=d,l.catch(i.Z),l};return d.clearTimeout=()=>{r&&(n.Z.clearTimeout(r),u(),r=l=c=u=void 0,a=!1)},d}},252:(e,t,s)=>{s.d(t,{D:()=>n,Z:()=>l});var n,i=s(410),o=s(1655);function r(e,t){if(e.toExponential){const s=e-t;return s<0?-1:s>0?1:0}return function(e,t){const s=e.length;if(s!==t.length){const e=s-t.length;return e<0?-1:e>0?1:0}for(let n=0;n=2)for(let t=0,s=this.slices.length;t=0)return{slice:t,offset:e===t[n]?n:n-1}}if(t&&t.isEnd(n.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let i=this.slice,o=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;i=t.slice,o=r=t.offset,i.includes(e)&&(r+=1)}let l=Math.max(r+t,0),c=r+t+s;const u=i.slice(l,c),a=t<0?s+t:s,h=Math.abs(t),d=i.length-r>=a||!!i.isEnd(n.Top)&&(u.setEnd(n.Top),!0),f=r-h>=0||!!i.isEnd(n.Bottom)&&(u.setEnd(n.Bottom),!0);return{slice:u,offsetIdOffset:o,fulfilled:n.None|(d&&f?n.Both:(d?n.Top:n.None)|(f?n.Bottom:n.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(n.Bottom)||(t=this.constructSlice(),t.setEnd(n.Bottom),this.slices.unshift(t)):t.setEnd(n.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(n.Top)||(t=this.constructSlice(),t.setEnd(n.Top),this.slices.push(t)):t.setEnd(n.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}deleteSlice(e){(0,o.Z)(this.slices,e)}toJSON(){const e={slices:this.slices.map((e=>({values:e.slice(),isEnd:e.getEnds()})))};return JSON.stringify(e)}static fromJSON(e){const t=JSON.parse(e),s=new l;return t.slices.forEach((e=>{const t=s.insertSlice(e.values)||s.first;e.isEnd.top&&t.setEnd(n.Top),e.isEnd.bottom&&t.setEnd(n.Bottom)})),s}}i.GO&&(i.GO.SlicedArray=l)},2566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2946);function i(e){return e.peer?(0,n.Z)(e.peer):e.user_id.toPeerId()}},7120:(e,t,s)=>{function n(e,t,s,n){if("chatEmpty"===e._)return!1;if(e.pFlags.deactivated&&"view_messages"!==t)return!1;const i=void 0===s;if(e.pFlags.creator&&i)return!0;if("chatForbidden"===e._||"channelForbidden"===e._||e.pFlags.left&&!e.pFlags.megagroup)return!1;if(!s&&!(s=e.admin_rights||e.banned_rights||e.default_banned_rights))return!1;let o={};switch(s&&(o=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!n&&e.pFlags.left)return!1;if("chatBannedRights"===s._&&o[t])return!1;if("channel"===e._&&!e.pFlags.megagroup&&!o.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!o[t];case"pin_messages":return"chatAdminRights"===s._?o[t]||!!o.post_messages:!o[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?o[t]:!o[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!o.ban_users;case"view_participants":return!("chat"!==e._&&e.pFlags.broadcast&&!e.pFlags.creator&&!e.admin_rights)}return!0}s.d(t,{Z:()=>n})},8050:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(3385);function i(e,t=(0,n.Z)(e.folder_id)){return e&&e[t]}},3385:(e,t,s)=>{function n(e){return`index_${e}`}s.d(t,{Z:()=>n})},515:(e,t,s)=>{function n(e,t){return e+"_"+t}s.d(t,{Z:()=>n})},6566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2342);function i(e,t,s){if("inputMessagesFilterEmpty"===e)return t;const i=[];if(!t.length)return i;let o=!0;const r={},l=[],c=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,l.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,l.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,l.push(void 0,"photo","pdf");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,l.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,l.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,l.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,l.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:o=!1}if(!o)return i;for(let e=0,o=t.length;ee.includes(t._)))||(0,n.Z)(o.message))&&(u=!0)}}else r.avatar&&o.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(o.action._)&&(u=!0);if(u&&(i.push(o),i.length>=s))break}return i}},2946:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(5880),i=s(1507);function o(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,n.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const s=e.channel_id||e.chat_id;return void 0!==s?s.toPeerId(!0):i.NM}if(!e)return i.NM;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}},8493:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1507);function i(e){return!e.pFlags.deleted&&e.id.toPeerId()!==n.hj}},9174:(e,t,s)=>{var n;s.d(t,{Q:()=>n}),function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(n||(n={}))},7746:(e,t,s)=>{function n(e,t){return e.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,((e,s,n)=>{if(t){const n=e.length;s+=n,t.forEach((e=>{const t=e.offset+e.length;t===s?e.length+=n:t>s&&(e.offset+=n)}))}return e+"️"}))}s.d(t,{Z:()=>n})},2342:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2423);function i(e){return e?e.match(n.it):null}},2821:(e,t,s)=>{s.d(t,{Z:()=>l});var n=s(2423),i=s(6875),o=s(8859),r=s(6241);function l(e,t,s){const l=[];let c=!1;const u=e=>(0,o.Z)(t,e)?c=!1:(l.push(e),c=!0),a=[];let h,d=0;for(;h=e.match(n.QB);){const t=d+h.index;a.push(e.substr(0,h.index));const s=h[3]||h[8]||h[11]||h[13];let i;if(d-=s.length,d+=s.length,c=!1,s.match(/^`*$/))a.push(h[0]);else if(h[3])i={_:"messageEntityPre",language:"",offset:t+h[1].length,length:s.length},u(i)&&("\n"===h[5]&&(h[5]="",d-=1),a.push(h[1]+s+h[5]),d-=h[2].length+h[4].length);else if(h[7]){const e=""===h[6];i={_:n.SC[h[7]],offset:t+(e?0:h[6].length),length:s.length},u(i)&&(e?a.push(s):a.push(h[6]+s+h[9]),d-=2*h[7].length+(e?2:0))}else h[11]?(i={_:"messageEntityMentionName",user_id:h[10].toUserId(),offset:t,length:s.length},u(i)&&(a.push(s),d-=h[0].length-s.length)):h[12]&&(i={_:"messageEntityTextUrl",url:h[14],offset:t,length:s.length},u(i)&&(a.push(s),d-=h[12].length-s.length));c||a.push(h[0]),e=e.substr(h.index+h[0].length),d+=h.index+h[0].length}a.push(e);let f=a.join("");f.replace(/\s+/g,"").length||(f=e,l.splice(0,l.length)),(0,r.Z)(t,l),(0,i.Z)(t);let g=f.length;if(!s){f=f.replace(/^\s*/,"");let e=g-f.length;e&&t.forEach((t=>{t.offset=Math.max(0,t.offset-e)})),f=f.replace(/\s*$/,""),e=g-f.length,g=f.length,e&&t.forEach((e=>{e.offset+e.length>g&&(e.length=g-e.offset)}))}return f}},2491:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1379);function i(e,t=[]){return t.forEach((t=>{"messageEntitySpoiler"===t._&&(e=(0,n.Z)(e,t).text)})),e}},5082:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(467);class i{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=(0,n.gV)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}_search(e){const t=[],s=this.fullTexts,n=e.split(" "),i=n.length;return s.forEach(((e,s)=>{let o=!0,r=0;for(let t=0;tthis._search(e))).reduce(((e,t)=>(e.push(...t),e)),[]);return t.sort(((e,t)=>e.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars)),new Set(t.map((e=>e.what)))}}}}]); +//# sourceMappingURL=339.702eead422c6af883b39.chunk.js.map \ No newline at end of file diff --git a/public/339.702eead422c6af883b39.chunk.js.map b/public/339.702eead422c6af883b39.chunk.js.map new file mode 100644 index 000000000..d6fc542d6 --- /dev/null +++ b/public/339.702eead422c6af883b39.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"339.702eead422c6af883b39.chunk.js","mappings":"8IAgBe,MAAMA,EAWnBC,YAAsBC,EAjBD,GAiBC,KAAAA,cAAAA,EAVf,KAAAC,QAAU,EACP,KAAAC,MAAoC,GACpC,KAAAC,UAAsC,IAAIC,IAE1C,KAAAC,YAA6B,KAC7B,KAAAC,cAA4B,KAE5B,KAAAC,KAAM,QAAO,KAAM,YAI3BC,KAAKC,cAAe,QAAS,IAAMD,KAAKE,iBAAiB,IAAI,GAGxDC,QACLH,KAAKL,UAAUQ,QAEfH,KAAKN,MAAMU,OAAS,EAOfC,OACFL,KAAKH,cAGRG,KAAKH,YAAc,IAAIS,SAAQ,CAACC,EAASC,KACvCR,KAAKF,cAAgBS,MAUlBE,SACDT,KAAKF,gBAETE,KAAKF,gBACLE,KAAKF,cAAgBE,KAAKH,YAAc,KAExCG,KAAKC,gBAGSS,YAAYC,G,qCAC1B,IAAGX,KAAKH,YAAR,CAIAG,KAAKL,UAAUiB,IAAID,GAMnB,UAIQX,KAAKa,SAASF,GACpB,MAAMG,GACF,CAAC,iBAAkB,mBAAmBC,SAASD,IACjDd,KAAKD,IAAIiB,MAAM,wBAAyBF,GAI5Cd,KAAKL,UAAUsB,OAAON,GAMtBX,KAAKC,iB,+RAGGY,SAASF,GACjB,OAAOA,EAAKO,OAGJC,UACR,OAAOnB,KAAKN,MAAM0B,QAGVC,WAAWC,EAA4BC,GAC/CvB,KAAKN,MAAM4B,GAAQC,GACnBvB,KAAKC,eAGGC,cAAcS,GACtB,MAAIX,KAAKN,MAAMU,QAAUJ,KAAKH,aAAgBG,KAAKR,cAAgB,GAAKQ,KAAKL,UAAU6B,MAAQxB,KAAKR,eAIpG,EAAG,CAOD,GANGmB,GACD,OAAiBX,KAAKN,MAAOiB,GAE7BA,EAAOX,KAAKmB,WAGXR,EAGD,MAFAX,KAAKU,YAAYC,GAKnBA,EAAO,WAEDX,KAAKL,UAAU6B,KAAOxB,KAAKR,eAAiBQ,KAAKN,MAAMU,QAI1DqB,KAAKF,GACVvB,KAAKqB,WAAW,OAAQE,GAGnBG,QAAQH,GACbvB,KAAKqB,WAAW,UAAWE,M,gCC9H/B,MAEA,EAF2C,CAAC,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,MAAM,EAAK,MAAM,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,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","sources":["webpack://tweb/./src/components/lazyLoadQueueBase.ts","webpack://tweb/./src/config/latinizeMap.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/compareValue.ts","webpack://tweb/./src/helpers/long/compareLong.ts","webpack://tweb/./src/lib/appManagers/utils/chats/getParticipantPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/chats/hasRights.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndex.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndexKey.ts","webpack://tweb/./src/lib/appManagers/utils/inlineBots/generateQId.ts","webpack://tweb/./src/lib/appManagers/utils/messages/filterMessagesByInputFilter.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/users/canSendToUser.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/richTextProcessor/fixEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrl.ts","webpack://tweb/./src/lib/richTextProcessor/parseMarkdown.ts","webpack://tweb/./src/lib/richTextProcessor/wrapPlainText.ts","webpack://tweb/./src/lib/searchIndex.ts","webpack://tweb/./src/helpers/array/flatten.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport { logger, LogTypes } from \"../lib/logger\";\n\nconst PARALLEL_LIMIT = 8;\n\nexport type LazyLoadElementBase = {\n load: () => Promise\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n protected lockPromise: Promise = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 20, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) { \n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n //const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n //await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n //console.log('_processQueue start');\n let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n \n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n //console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function insertInDescendSortedArray(array: Array, element: T, getProperty: K, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: (element: T) => number, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: K | ((element: T) => T[K]), pos?: number): number {\n if(typeof(getProperty) !== 'function') {\n const property = getProperty;\n getProperty = (element) => element[property];\n }\n\n const sortProperty: number = getProperty(element);\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || getProperty(prev) >= sortProperty) && (!next || getProperty(next) <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n \n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= getProperty(array[len - 1])) {\n return array.push(element) - 1;\n } else if(sortProperty >= getProperty(array[0])) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > getProperty(array[i])) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Awaited } from '../types';\n\nexport default function callbackify, R>(\n smth: T, \n callback: (result: Awaited) => R\n): R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","export default function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from \"../../environment/ctx\";\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\nimport noop from \"../noop\";\r\n\r\nexport type DebounceReturnType = { \r\n (...args: Parameters): Promise>>; \r\n clearTimeout(): void; \r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n \r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport indexOfAndSplice from \"./array/indexOfAndSplice\";\r\nimport compareValue from \"./compareValue\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number | string;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n getEnds: () => {top: boolean, bottom: boolean, both: boolean};\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n // new(...items: T[]): Slice;\r\n new(length: number): Slice;\r\n}\r\n\r\nexport type SliceSerialized = {\r\n values: Slice,\r\n isEnd: {\r\n top: boolean,\r\n bottom: boolean,\r\n both: boolean\r\n }\r\n};\r\n\r\nexport type SlicedArraySerialized = {\r\n slices: SliceSerialized[]\r\n};\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n\r\n getEnds() {\r\n return {\r\n top: this.isEnd(SliceEnd.Top),\r\n bottom: this.isEnd(SliceEnd.Bottom),\r\n both: this.isEnd(SliceEnd.Both)\r\n };\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as ItemType[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: T[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: T[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(compareValue(slice[0], s[0]) === 1) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: T) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: T) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; ++offset) {\r\n if(compareValue(maxId, slice[offset]) >= 0) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n // if(topFulfilled) sliced.isEnd(SliceEnd.Top);\r\n // if(bottomFulfilled) sliced.isEnd(SliceEnd.Bottom);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: T[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: T[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: T) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public deleteSlice(slice: Slice) {\r\n indexOfAndSplice(this.slices, slice);\r\n }\r\n\r\n public toJSON() {\r\n const slices: SlicedArraySerialized['slices'] = this.slices.map((slice) => {\r\n return {\r\n values: slice.slice(),\r\n isEnd: slice.getEnds()\r\n };\r\n });\r\n\r\n const serialized: SlicedArraySerialized = {\r\n slices\r\n };\r\n\r\n return JSON.stringify(serialized);\r\n }\r\n\r\n public static fromJSON(json: string) {\r\n const parsed: SlicedArraySerialized = JSON.parse(json);\r\n const sliced = new SlicedArray();\r\n parsed.slices.forEach((slice) => {\r\n const inserted = sliced.insertSlice(slice.values) || sliced.first;\r\n if(slice.isEnd.top) inserted.setEnd(SliceEnd.Top);\r\n if(slice.isEnd.bottom) inserted.setEnd(SliceEnd.Bottom);\r\n });\r\n\r\n return sliced;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","import compareLong from \"./long/compareLong\";\n\nexport default function compareValue(val1: string | number, val2: typeof val1) {\n if((val1 as number).toExponential) {\n const diff = (val1 as number) - (val2 as number);\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n return compareLong(val1 as string, val2 as string);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function compareLong(str1: string, str2: string) {\n const str1Length = str1.length;\n if(str1Length !== str2.length) {\n const diff = str1Length - str2.length;\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n const maxPartLength = 15;\n for(let i = 0; i < str1Length; i += maxPartLength) {\n const v1 = +str1.slice(i, i + maxPartLength);\n const v2 = +str2.slice(i, i + maxPartLength);\n const diff = v1 - v2;\n if(diff) {\n return diff;\n }\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ChannelParticipant, ChatParticipant } from \"../../../../layer\";\nimport getPeerId from \"../peers/getPeerId\";\n\nexport default function getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Chat, ChatAdminRights, ChatBannedRights } from \"../../../../layer\";\nimport { ChatRights } from \"../../appChatsManager\";\n\n/**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\nexport default function hasRights(chat: Chat, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Dialog } from \"../../../../layer\";\nimport getDialogIndexKey from \"./getDialogIndexKey\";\n\nexport default function getDialogIndex(\n dialog: Dialog.dialog, \n indexKey: ReturnType = getDialogIndexKey(dialog.folder_id)\n) {\n return dialog && dialog[indexKey];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { DialogFilter } from \"../../../../layer\";\n\nexport default function getDialogIndexKey(orderIndex?: DialogFilter.dialogFilter['orderIndex']) {\n return `index_${orderIndex}` as const;\n // return filterId !== undefined && filterId > 1 ? `filter_${filterId}` as const : 'main' as const;\n // const indexStr = filterId > 1 ? \n // `index_${filterId}` as const : \n // 'index' as const;\n\n // return indexStr;\n}\n","import { MessagesBotResults } from \"../../../../layer\";\n\nexport default function generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\n return queryId + '_' + resultId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message, MessageMedia, MessageEntity, MessageAction } from \"../../../../layer\";\nimport matchUrl from \"../../../richTextProcessor/matchUrl\";\nimport type { MyDocument } from \"../../appDocsManager\";\nimport type { MyInputMessagesFilter, MyMessage } from \"../../appMessagesManager\";\n\nexport default function filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n\n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n\n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && \n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) || \n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n\n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find((e) => goodEntities.includes(e._)) || matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find((flag) => message.pFlags[flag])) {\n found = true;\n } */\n\n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n}\n","import isObject from \"../../../../helpers/object/isObject\";\nimport { InputPeer, Peer } from \"../../../../layer\";\nimport { NULL_PEER_ID } from \"../../../mtproto/mtproto_config\";\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n \n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { User } from \"../../../../layer\";\nimport { REPLIES_PEER_ID } from \"../../../mtproto/mtproto_config\";\n\nexport default function canSendToUser(user: User.user) {\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\n\nexport default function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach((entity) => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n}\n","import { URL_REG_EXP } from \".\";\n\nexport default function matchUrl(text: string) {\n return !text ? null : text.match(URL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MARKDOWN_ENTITIES, MARKDOWN_REG_EXP } from \".\";\nimport { MessageEntity } from \"../../layer\";\nimport combineSameEntities from \"./combineSameEntities\";\nimport findConflictingEntity from \"./findConflictingEntity\";\nimport mergeEntities from \"./mergeEntities\";\n\nexport default function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n  /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(MARKDOWN_REG_EXP)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n\n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: MARKDOWN_ENTITIES[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n\n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\nimport encodeSpoiler from \"./encodeSpoiler\";\n\n/**\n * ! This function is still unsafe to use with .innerHTML\n */\nexport default function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n entities.forEach((entity) => {\n if(entity._ === 'messageEntitySpoiler') {\n text = encodeSpoiler(text, entity).text;\n }\n });\n\n return text;\n // if(entities?.length) {\n // entities = entities.filter((entity) => entity._ === 'messageEntitySpoiler');\n // }\n\n // return wrapRichText(text, {\n // entities, \n // noEncoding: true,\n // noTextFormat: true,\n // noLinebreaks: true,\n // noLinks: true\n // }).textContent;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map((query) => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map((o) => o.what));\n\n return newFoundObjs2;\n }\n}\n","export default function flatten(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n"],"names":["LazyLoadQueueBase","constructor","parallelLimit","queueId","queue","inProcess","Set","lockPromise","unlockResolve","log","this","processQueue","_processQueue","clear","length","lock","Promise","resolve","reject","unlock","processItem","item","add","loadItem","err","includes","error","delete","load","getItem","shift","addElement","method","el","size","push","unshift","filterUnique","arr","insertInDescendSortedArray","array","element","getProperty","pos","property","sortProperty","undefined","indexOf","prev","next","splice","len","i","console","assumeType","x","bytesCmp","bytes1","bytes2","bytesFromHex","hexString","bytes","Uint8Array","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","callbackify","smth","callback","then","getMiddleware","cleanupObj","cleaned","clean","get","additionalCallback","_cleanupObj","getObjectKeysAndSort","object","sort","ids","Map","keys","Object","map","a","b","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","args","_resolve","_reject","apply","clearTimeout","_waitingTimeout","catch","SliceEnd","compareValue","val1","val2","toExponential","diff","str1","str2","str1Length","slice","compareLong","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","Array","end","None","isEnd","side","Top","last","Bottom","Both","setEnd","getEnds","top","bottom","both","unsetEnd","deleteCount","items","ret","super","idx","insertSlice","flatten","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","s","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","max","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","deleteSlice","indexOfAndSplice","toJSON","serialized","values","JSON","stringify","json","parsed","parse","forEach","inserted","getParticipantPeerId","participant","peer","user_id","toPeerId","hasRights","chat","action","rights","isThread","_","pFlags","deactivated","isCheckingRightsForSelf","creator","left","megagroup","admin_rights","banned_rights","default_banned_rights","myFlags","post_messages","broadcast","getDialogIndex","dialog","indexKey","folder_id","getDialogIndexKey","orderIndex","generateQId","queryId","resultId","filterMessagesByInputFilter","inputFilter","history","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","message","media","doc","document","type","goodEntities","totalEntities","find","e","getPeerId","peerId","isPeerId","userId","chatId","channel_id","chat_id","isUser","peerParams","split","canSendToUser","user","deleted","id","ConnectionStatus","fixEmoji","text","entities","replace","match","string","entity","matchUrl","parseMarkdown","raw","currentEntities","noTrim","pushedEntity","pushEntity","newTextParts","rawOffset","matchIndex","language","isSOH","toUserId","url","newText","join","wrapPlainText","SearchIndex","options","minChars","fullTexts","indexObject","searchText","trim","set","_search","query","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","search","reduce","acc","val","o"],"sourceRoot":""} \ No newline at end of file diff --git a/public/392.a0ad16f0908b02621678.chunk.js b/public/392.a0ad16f0908b02621678.chunk.js new file mode 100644 index 000000000..37aefd29c --- /dev/null +++ b/public/392.a0ad16f0908b02621678.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[392],{4489:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(503);class a extends i.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a}))}}},3083:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2384);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.Z.waitForFirstFrame(e)))),i.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),i.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>g});var i=n(4755),a=n(4874),s=n(810),o=n(3083),l=n(4489),h=n(2325),r=n(144),d=n(5565),u=n(3512);let c,p=null,m=null,y=null;const v=new a.Z("page-authCode",!0,(()=>{const e=p.type.length,t=new l.Z({label:"Code",name:(0,r.a)(),length:e,onFill:e=>{m(e)}});c=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container),v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return s.default.mount()}));const a=()=>{setTimeout((()=>{E.remove()}),300)},m=e=>{c.setAttribute("disabled","true");const i={phone_number:p.phone_number,phone_code_hash:p.phone_code_hash,phone_code:e};u.Z.managers.apiManager.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":u.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(813)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:p.phone_number,phone_code_hash:p.phone_code_hash})})),a()}})).catch((e=>{return i=void 0,a=void 0,o=function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{c.value=""}),300);break;case"PHONE_CODE_EXPIRED":c.classList.add("error"),(0,d.Z)(t.label,(0,h.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":c.classList.add("error"),(0,d.Z)(t.label,(0,h.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),c.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{h(o.next(e))}catch(e){t(e)}}function l(e){try{h(o.throw(e))}catch(e){t(e)}}function h(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(n,l)}h((o=o.apply(i,a||[])).next())}));var i,a,s,o}))},y=v.pageEl.querySelector(".auth-image"),g=i.Z.isMobile?100:166,E=new o.Z(t,g);return y.append(E.container),E.load()}),(e=>{if(p=e,m){c.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),c.dispatchEvent(e)}else m=v.pageEl.getElementsByClassName("phone")[0],y=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(m.innerText=p.phone_number,p.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[p.type._]}(0,d.Z)(y,(0,h.ag)(t,n)),u.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{c.focus()})),g=v}}]); +//# sourceMappingURL=392.a0ad16f0908b02621678.chunk.js.map \ No newline at end of file diff --git a/public/392.a0ad16f0908b02621678.chunk.js.map b/public/392.a0ad16f0908b02621678.chunk.js.map new file mode 100644 index 000000000..27e7b001c --- /dev/null +++ b/public/392.a0ad16f0908b02621678.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"392.a0ad16f0908b02621678.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/pages/pageAuthCode.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","Promise","all","loop","autoplay","width","height","then","_animation","currentFrame","pause","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/4.f9a995960e4699c2de34.chunk.js b/public/4.f9a995960e4699c2de34.chunk.js deleted file mode 100644 index 9be03a753..000000000 --- a/public/4.f9a995960e4699c2de34.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[4],{120:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var s=n(14);function i(e,t=!1){if(!s.a||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var n=document.createRange();n.selectNodeContents(e),n.collapse(!1);var i=window.getSelection();i.removeAllRanges(),i.addRange(n)}else if(void 0!==document.body.createTextRange){var o=document.body.createTextRange();o.moveToElementText(e),o.collapse(!1),o.select()}}},121:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var s=n(7);const i=new Map;let o=0;const c=(e,t,n="")=>{n=t.country_code+n,o=Math.max(o,n.length),i.set(n,{country:e,code:t})};function a(e){e=e||"",i.size||s.c.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{c(e,t,n)}):c(e,t)})});let t,n=e.replace(/\D/g,""),a=n.slice(0,o);for(let e=a.length-1;e>=0&&(t=i.get(a.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const r=t.country,l=t.code.patterns||[],d=n.slice(t.code.country_code.length);let h="",u=0,p="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let n=0;for(let e=0,s=Math.min(d.length,t.length);eu&&(u=n,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=t.code.country_code+" "+h,h.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let m=h&&h.length>n.length?h.slice(n.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:n,country:r,code:t.code,leftPattern:m}}},154:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var s=n(120),i=n(121),o=n(2),c=n(65);class a extends c.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let n;o.b?n=-.16*e:o.a&&(n=0),t.style.setProperty("--letter-spacing",n+"px")}const n=this.setValueSilently.bind(this);this.setValueSilently=e=>{n(e),Object(s.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const n=this.value;let s;Math.abs(n.length-this.lastValue.length)>1&&!this.pasted&&o.c&&this.setValueSilently(this.lastValue+n),this.pasted=!1,this.setLabel();let c,a,r,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=Object(i.a)(this.value),c=s.formatted,a=s.country,l=s.leftPattern,r=s.code,this.setValueSilently(this.lastValue=c?"+"+c:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(s)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},168:function(e,t,n){"use strict";n.r(t);var s=n(61),i=n(67),o=n(35),c=n(8),a=n(28),r=n(90),l=n(65),d=n(70),h=n(58),u=n(102),p=n(14),m=n(5),g=n(7),f=n(71),b=n(79),v=n(85),L=n(34),y=n(21),S=n(12),E=n(187),w=n(165),k=n(125),x=n(27),O=n(57),j=n(59),A=n(77),T=n(6),_=n(120),P=n(29),C=n(114),N=n(11),V=n(0),H=n(154),M=n(23),D=n(66),I=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function c(e){try{r(s.next(e))}catch(e){o(e)}}function a(e){try{r(s.throw(e))}catch(e){o(e)}}function r(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(c,a)}r((s=s.apply(e,t||[])).next())}))};let R,B=null;const K=new r.a("page-sign",!0,()=>{const e=()=>{t=g.c.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),V.a.addEventListener("language_change",()=>{e()});const r=new Map;let b,F;const U=document.createElement("div");U.classList.add("input-wrapper");const W=new l.b({label:"Login.CountrySelectorLabel",name:Object(y.b)()});W.container.classList.add("input-select");const z=W.input,X=document.createElement("div");X.classList.add("select-wrapper","z-depth-3","hide");const q=document.createElement("span");q.classList.add("arrow","arrow-down"),W.container.append(q);const J=document.createElement("ul");X.appendChild(J);new i.b(X);let Q=()=>{Q=null,t.forEach(e=>{const t=Object(P.c)(e.iso2),n=[];e.country_codes.forEach(s=>{const i=document.createElement("li");let o=a.a.wrapEmojiText(t);if(M.a){const e=document.createElement("span");Object(D.a)(e,o),i.append(e)}else Object(D.a)(i,o);const c=Object(g.d)(e.default_name);c.dataset.defaultName=e.default_name,i.append(c);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+s.country_code,i.appendChild(r),n.push(i),J.append(i)}),r.set(e.iso2,n)}),J.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");Y(t)}),W.container.appendChild(X)};const Y=e=>{const n=e.childNodes[1].dataset.defaultName,s=e.querySelector(".phone-code").innerText,i=s.replace(/\D/g,"");Object(j.a)(z,Object(g.d)(n)),Object(C.a)(z,"input"),b=t.find(e=>e.default_name===n),F=b.country_codes.find(e=>e.country_code===i),te.value=te.lastValue=s,ee(),setTimeout(()=>{ne.focus(),Object(_.a)(ne,!0)},0)};let $;Q(),z.addEventListener("focus",(function(e){Q?Q():t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout($),$=void 0,X.classList.remove("hide"),X.offsetWidth,X.classList.add("active"),W.select(),Object(u.b)({container:K.pageEl.parentElement.parentElement,element:z,position:"start",margin:4}),setTimeout(()=>{G||(document.addEventListener("mousedown",Z,{capture:!0}),G=!0)},0)}));let G=!1;const Z=e=>{Object(L.a)(e.target,"input-select")||e.target!==z&&(ee(),document.removeEventListener("mousedown",Z,{capture:!0}),G=!1)},ee=()=>{void 0===$&&(X.classList.remove("active"),$=window.setTimeout(()=>{X.classList.add("hide"),$=void 0},200))};z.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let s=W.value.toLowerCase(),i=[];t.forEach(e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach(e=>{const n=e.split(" ").filter(e=>/\w/.test(e)).map(e=>e[0]).join("");n.length>1&&t.push(n)});let n=!!t.filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(s));r.get(e.iso2).forEach(e=>e.style.display=n?"":"none"),n&&i.push(e)}),0===i.length?t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}):1===i.length&&"Enter"===n&&Y(r.get(i[0].iso2)[0])}),q.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),z.matches(":focus")?z.blur():z.focus()}));const te=new H.a({onInput:e=>{f.a.loadLottieWorkers();const{country:t,code:n}=e||{};let s=t?t.name||t.default_name:"";s===W.value||b&&t&&n&&(b===t||F.country_code===n.country_code)||(Object(j.a)(z,t?Object(g.d)(t.default_name):s),b=t,F=n),t||te.value.length-1>1?B.style.visibility="":B.style.visibility="hidden"}}),ne=te.input;ne.addEventListener("keypress",e=>{if(!B.style.visibility&&"Enter"===e.key)return ie()});const se=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});se.input.addEventListener("change",()=>{const e=se.checked;o.c.pushToState("keepSigned",e),S.a.toggleStorage(e),E.a.toggleStorage(e),c.a.toggleStorage(e),T.a.toggleStorage(e)}),o.c.getState().then(e=>{o.c.storage.isAvailable()?se.checked=e.keepSigned:(se.checked=!1,se.label.classList.add("checkbox-disabled"))}),B=Object(h.a)("btn-primary btn-color-primary",{text:"Login.Next"}),B.style.visibility="hidden";const ie=e=>{e&&Object(x.a)(e);const t=Object(A.a)([B,R],!0);Object(j.a)(B,Object(g.d)("PleaseWait")),Object(s.f)(B);let i=te.value;c.a.invokeApi("auth.sendCode",{phone_number:i,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(18).then(n.bind(null,170)).then(t=>t.default.mount(Object.assign(e,{phone_number:i})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":te.setError(),Object(j.a)(te.label,Object(g.d)("Login.PhoneLabelInvalid")),ne.classList.add("error"),Object(j.a)(B,Object(g.d)("Login.Next"));break;default:console.error("auth.sendCode error:",e),B.innerText=e.type}})};Object(O.b)(B,ie),R=Object(h.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});R.addEventListener("click",()=>{w.default.mount()}),U.append(W.container,te.container,se.label,B,R);const oe=document.createElement("h4");oe.classList.add("text-center"),Object(g.b)(oe,"Login.Title");const ce=document.createElement("div");ce.classList.add("subtitle","text-center"),Object(g.b)(ce,"Login.StartText"),K.pageEl.querySelector(".container").append(oe,ce,U);p.a||setTimeout(()=>{ne.focus()},0),Object(k.a)(U),c.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=N.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.c.getLangPack(n.lang_code).then(()=>{Object(C.a)(ne,"input")});const s=new Set([1,2,3,4,5]),i=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=c.a.getNetworker(e.nearest_dc).then(()=>{i.push(e.nearest_dc)})),(o||Promise.resolve()).then(()=>{i.forEach(e=>{s.delete(e)});const e=[...s],t=()=>I(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const s=`dc${n}_auth_key`;if(yield T.a.get(s))return t();setTimeout(()=>{c.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{W.value.length||te.value.length||Y(r.get(e.country)[0])})},()=>{B&&(Object(j.a)(B,Object(g.d)("Login.Next")),Object(b.a)(B,void 0,void 0,!0),B.removeAttribute("disabled")),R&&R.removeAttribute("disabled"),o.c.pushToState("authState",{_:"authStateSignIn"})});t.default=K},67:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var s=n(14),i=n(4),o=n(102),c=n(93),a=n(27);class r{constructor(e,t="",n=document.createElement("div")){this.el=e,this.container=n,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e)),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=Object(c.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)}))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(o.b)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=0)}}class l extends r{constructor(e,t="",n=300,s){super(e,t),this.onScrollOffset=n,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,n=this.lastScrollPosition;this.onScrolledTop&&n<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-n<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",e=>{Object(a.a)(e),this.addScrollListener()},{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class d extends r{constructor(e,t="",n=300,i=15,o=document.createElement("div")){if(super(e,t,o),this.onScrollOffset=n,this.splitCount=i,this.container=o,this.container.classList.add("scrollable-x"),!s.a){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(a.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},70:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var s=n(35),i=n(79),o=n(7),c=n(45);class a{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const n=this.input=document.createElement("input");let a;if(n.classList.add("checkbox-field-input"),n.type="checkbox",e.name&&(n.id="input-"+e.name),e.checked&&(n.checked=!0),e.stateKey&&s.c.getState().then(t=>{const i=Object(c.a)(t,e.stateKey);let o;o=e.stateValues?1===e.stateValues.indexOf(i):i,this.setValueSilently(o),n.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[n.checked?1:0]:n.checked,s.c.setByKey(e.stateKey,t)})}),e.text?(a=this.span=document.createElement("span"),a.classList.add("checkbox-caption"),Object(o.b)(a,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(n),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.classList.add("checkbox-box-check"),n.setAttributeNS(null,"viewBox","0 0 24 24");const s=document.createElementNS("http://www.w3.org/2000/svg","use");s.setAttributeNS(null,"href","#check"),s.setAttributeNS(null,"x","-1"),n.append(s);const i=document.createElement("div");i.classList.add("checkbox-box-background");const o=document.createElement("div");o.classList.add("checkbox-box-border"),e.append(o,i,n),t.append(e)}a&&t.append(a),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(i.a)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},77:function(e,t,n){"use strict";function s(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>s(e,!t)}n.d(t,"a",(function(){return s}))},85:function(e,t,n){"use strict";function s(e,t){return e.closest(t)}n.d(t,"a",(function(){return s}))}}]); -//# sourceMappingURL=4.f9a995960e4699c2de34.chunk.js.map \ No newline at end of file diff --git a/public/4.f9a995960e4699c2de34.chunk.js.map b/public/4.f9a995960e4699c2de34.chunk.js.map deleted file mode 100644 index 6cc1491fc..000000000 --- a/public/4.f9a995960e4699c2de34.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/findUpTag.ts"],"names":["placeCaretAtEnd","el","ignoreTouchCheck","document","activeElement","focus","window","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","prefixes","Map","maxPrefixLength","setPrefix","country","code","prefix","country_code","Math","max","length","set","formatPhoneNumber","originalStr","size","countriesList","forEach","country_codes","prefixCountry","str","replace","phoneCode","slice","i","get","formatted","undefined","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx","TelInputField","options","super","label","name","pasted","lastValue","this","container","classList","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","addEventListener","remove","formattedPhoneNumber","abs","setLabel","countryCode","dataset","onInput","e","key","test","metaKey","ctrlKey","shiftKey","preventDefault","btnQr","btnNext","page","setCountries","countries","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","lastCountrySelected","lastCountryCodeSelected","inputWrapper","createElement","countryInputField","countryInput","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","c","emoji","iso2","liArr","li","wrapped","wrapEmojiText","spanEmoji","defaultName","span","innerText","push","button","target","selectCountryByTarget","childNodes","querySelector","find","_countryCode","telInputField","hidePicker","setTimeout","hideTimeout","display","clearTimeout","offsetWidth","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","_value","toLowerCase","matches","names","Boolean","abbr","word","map","join","good","indexOf","cancelBubble","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","then","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","settings","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","log","Error","Array","from","children","addedScrollListener","passive","removeHeavyAnimationListener","addScrollListener","removeScrollListener","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setListeners","elements","padding","prepend","round","offsetHeight","getDistanceToEnd","y","ignoreNextScrollEvent","once","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","disabled","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","setAttribute","findUpTag","tag","closest"],"mappings":"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","file":"4.f9a995960e4699c2de34.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n setInnerHTML(spanEmoji, wrapped);\r\n li.append(spanEmoji);\r\n } else {\r\n setInnerHTML(li, wrapped);\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n \r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport ripple from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/434.e06fcbee4a8ac273c78c.bundle.js b/public/434.e06fcbee4a8ac273c78c.bundle.js new file mode 100644 index 000000000..8c59ba2f6 --- /dev/null +++ b/public/434.e06fcbee4a8ac273c78c.bundle.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[434],{4159:(d,e,u)=>{u.d(e,{Z:()=>c});const t="web.telegram.org",f={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.5.0",versionFull:"1.5.0 (178)",build:178,langPackVersion:"0.4.1",langPack:"macos",langPackCode:"en",domains:[t],baseDcId:2,isMainDomain:location.hostname===t,suffix:"K"};f.isMainDomain&&(f.id=2496,f.hash="8da85b0d5bfe62527e5b244c209159c3");const c=f},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},2219:(d,e,u)=>{u.d(e,{Z:()=>t});const t=Date.now()%Math.random()*1e8|0},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){let u;Array.isArray(d)||(d=[d]);const f=(0,t.Z)(e);try{u=new Blob(d,{type:f})}catch(e){let t=new BlobBuilder;d.forEach((d=>{t.append(d)})),u=t.getBlob(f)}return u}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){let d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));let e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(let u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>c});var t=u(8479),f=u(5880);function c(d,e,u,r){for(const o in d)typeof e[o]!=typeof d[o]?(e[o]=(0,t.Z)(d[o]),u&&u(r||o)):(0,f.Z)(d[o])&&c(d[o],e[o],u,r||o)}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>c,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function c(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,c=null;return(...r)=>{t=!0,f=r,c||(u&&(t=!1,d(...f)),c=setInterval((()=>{if(!t)return clearInterval(c),void(c=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>o});var t=u(8576),f=u(3989),c=u(7487),r=u(319);function o(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),c.Z.toggleStorage(d,e)]).then(r.Z,r.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8576:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(1267),f=u(8975),c=u(2328);class r{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),r.STORAGES.length&&(this.useStorage=r.STORAGES[0].useStorage),this.openDatabase(),r.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw"NO_ENTRY_FOUND";return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,r=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((c=void 0)||(c=Promise))((function(d,e){function u(d){try{s(r.next(d))}catch(d){e(d)}}function o(d){try{s(r.throw(d))}catch(d){e(d)}}function s(e){var t;e.done?d(e.value):(t=e.value,t instanceof c?t:new c((function(d){d(t)}))).then(u,o)}s((r=r.apply(t,f||[])).next())}));var t,f,c,r})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(d,e,u){const t=c.Z.getFakeFileWriter(u,e,(e=>this.saveFile(d,e).catch((()=>e))));return Promise.resolve(t)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}r.STORAGES=[]},2328:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);const f=new class{constructor(){this.blobSupported=!0;try{(0,t.Z)([],"")}catch(d){this.blobSupported=!1}}isAvailable(){return this.blobSupported}getFakeFileWriter(d,e,u){let f=new Uint8Array(e);const c={write:(d,e)=>{return u=this,t=void 0,r=function*(){if(!this.blobSupported)throw!1;f.set(d,e)},new((c=void 0)||(c=Promise))((function(d,e){function f(d){try{s(r.next(d))}catch(d){e(d)}}function o(d){try{s(r.throw(d))}catch(d){e(d)}}function s(e){var u;e.done?d(e.value):(u=e.value,u instanceof c?u:new c((function(d){d(u)}))).then(f,o)}s((r=r.apply(u,t||[])).next())}));var u,t,c,r},truncate:()=>{f=new Uint8Array},trim:d=>{f=f.slice(0,d)},finalize:(e=!0)=>{const c=(0,t.Z)(f,d);return e&&u&&u(c),c},getParts:()=>f,replaceParts:d=>{f=d}};return c}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),c=u(4762),r=u(1352),o=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const s=[t.None,t.Error,t.Warn,t.Log,t.Debug],n=!(c.IS_SAFARI||c.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,c=""){let b;f.ZP||u||(e=t.Error),n?c||(r.SU?c=i:r.N5&&(c=a)):c="";let g=c;c=c?`%s ${c}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(c,(0,o.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](c,(0,o.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=s.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>c});var t=u(410),f=u(153);class c extends f.Z{constructor(){super(),c.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3591:(d,e,u)=>{u.d(e,{Z:()=>c});var t=u(2423),f=u(6637);function c(d,e){let u,c,r,o;if((0,f.Z)(d)||(d="https://"+d),u=d.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=u[1];if(/^\W/.test(e)&&!t.kO.test(e))return o="joinchat",{url:d,onclick:o};const f=e.split("/");switch(f[0]){case"joinchat":case"addstickers":case"voicechat":o=f[0];break;default:if(f[1]&&f[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===f.length){o="im";break}}}else(c=d.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?o="im":(r=d.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(o="tg_"+r[1]);return window[o]||(o=void 0),{url:d,onclick:o}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),c=u(1352),r=u(3206);class o{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(let e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class s{constructor(){s.STORAGES.push(this),c.kC||(this.storage=new o)}proxy(d,...e){return u=this,t=void 0,o=function*(){return c.kC?r.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{s(o.next(d))}catch(d){e(d)}}function r(d){try{s(o.throw(d))}catch(d){e(d)}}function s(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,r)}s((o=o.apply(u,t||[])).next())}));var u,t,f,o}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}s.STORAGES=[];const n=new s;t.GO.appStorage=n;const i=n},7922:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(410),f=u(3989),c=u(3127);class r extends f.Z{constructor(){super(c.Z,"session")}}const o=new r;t.GO.stateStorage=o;const s=o},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),c=u(1352),r=u(6724),o=u(1962),s=function(d,e,u,t){return new(u||(u=Promise))((function(f,c){function r(d){try{s(t.next(d))}catch(d){c(d)}}function o(d){try{s(t.throw(d))}catch(d){c(d)}}function s(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(r,o)}s((t=t.apply(d,e||[])).next())}))};function n(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new o.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,r.Z)((()=>s(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,r.Z)((()=>s(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,r.Z)((()=>s(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(u)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return s(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(n)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,c.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(n)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️)"}}]); +//# sourceMappingURL=434.e06fcbee4a8ac273c78c.bundle.js.map \ No newline at end of file diff --git a/public/434.e06fcbee4a8ac273c78c.bundle.js.map b/public/434.e06fcbee4a8ac273c78c.bundle.js.map new file mode 100644 index 000000000..f2e848983 --- /dev/null +++ b/public/434.e06fcbee4a8ac273c78c.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"434.e06fcbee4a8ac273c78c.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/config/tabId.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/fileManager.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.1',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Database } from '.';\r\nimport type { IDBIndex } from '../../lib/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs',\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","const tabId = Date.now() % Math.random() * 100000000 | 0;\nexport default tabId;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","export default function noop() {}\r\n","export default function copy(obj: T): T {\n //in case of premitives\n if(obj === null || typeof(obj) !== \"object\") {\n return obj;\n }\n \n //date objects should be \n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n \n //handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n \n //lastly, handle objects\n // @ts-ignore\n let clonedObj = new obj.constructor();\n for(var prop in obj){\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from \"../lib/appManagers/utils/peers/isAnyChat\";\nimport isUser from \"../lib/appManagers/utils/peers/isUser\";\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat],\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import { logger } from \"../lib/logger\";\nimport dT from \"./dT\";\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CacheStorageController from \"../lib/cacheStorage\";\nimport AppStorage from \"../lib/storage\";\nimport sessionStorage from \"../lib/sessionStorage\";\nimport noop from \"./noop\";\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\nimport dT from \"../helpers/dT\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n [\"group\", LogTypes.Log],\n [\"groupCollapsed\", LogTypes.Log],\n [\"groupEnd\", LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport type { getEnvironment } from \"../../environment/utils\";\nimport type loadState from \"../appManagers/utils/state/loadState\";\nimport type { StoragesResults } from \"../appManagers/utils/storages/loadStorages\";\nimport type { LocalStorageProxyTask } from \"../localStorage\";\nimport type { Awaited } from \"../../types\";\nimport type { Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState } from \"./mtprotoworker\";\nimport type toggleStorages from \"../../helpers/toggleStorages\";\nimport SuperMessagePort from \"./superMessagePort\";\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super();\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\n }\n}\n","import { URL_ANY_PROTOCOL_REG_EXP } from \".\";\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PHONE_NUMBER_REG_EXP } from \".\";\nimport matchUrlProtocol from \"./matchUrlProtocol\";\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n // second regexp is for phone numbers (t.me/+38050...)\n if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n return {url, onclick};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach((key) => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\r\n if(IS_WORKER) {\r\n const port = MTProtoMessagePort.getInstance();\r\n return port.invoke('localStorageProxy', {type, args});\r\n }\r\n \r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n return this.storage[type].apply(this.storage, args as any);\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return this.proxy('toggleStorage', enabled, clearWrite);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n },\r\n k_build: number\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport type { State } from '../config/state';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nclass StateStorage extends AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE> {\r\n constructor() {\r\n super(DATABASE_STATE, 'session');\r\n }\r\n}\r\n\r\nconst stateStorage = new StateStorage();\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../config/databases\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_WORKER } from \"../helpers/context\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nconst THROTTLE_TIME = 16;\r\n\r\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\r\nexport default class AppStorage<\r\n Storage extends Record, \r\n T extends Database\r\n> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n const values = keys.map((key) => this.cache[key]);\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys, values);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then((values) => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, THROTTLE_TIME, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n \r\n if(!IS_WORKER || !clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {\r\n console.error('freezeSaving callback error:', err);\r\n }\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\r\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = \"((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n"],"names":["MAIN_DOMAIN","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","name","stores","Date","now","Math","random","blobConstruct","blobParts","mimeType","blob","Array","isArray","safeMimeType","Blob","type","e","bb","BlobBuilder","forEach","blobPart","append","getBlob","blobSafeMimeType","indexOf","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","length","cancel","Object","assign","noop","copy","obj","getTime","map","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint8Array","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","console","warn","then","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","slice","toggleStorages","enabled","clearWrite","all","tsNow","seconds","t","isAnyChat","peerId","isUser","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","method","saveFile","Response","headers","size","rejected","timeout","res","err","clearTimeout","getFileWriter","fileSize","fakeWriter","static","storage","blobSupported","isAvailable","getFakeFileWriter","saveFileCallback","bytes","fakeFileWriter","write","part","offset","set","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","MTProtoMessagePort","super","INSTANCE","matchUrlProtocol","text","wrapUrl","url","unsafe","tgMeMatch","telescoPeMatch","tgMatch","onclick","fullPath","path","split","window","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","invoke","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","error","deleteThrottled","getThrottled","includes","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/436.10206c22b0e2f40d8f22.chunk.js b/public/436.10206c22b0e2f40d8f22.chunk.js new file mode 100644 index 000000000..d5f707d55 --- /dev/null +++ b/public/436.10206c22b0e2f40d8f22.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[436,781],{5436:(e,a,t)=>{t.r(a),t.d(a,{default:()=>l});var n=t(8799),s=t(4541),g=t(2325),h=t(3512);const u=new(t(4874).Z)("page-chats",!1,(()=>(h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),g.ZP.requestedServerLanguage||g.ZP.getCacheLangPack().then((e=>{e.local&&g.ZP.getLangPack(e.lang_code)})),u.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.all([t.e(458),t.e(445),t.e(765),t.e(339),t.e(853)]).then(t.bind(t,7853))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),l=u}}]); +//# sourceMappingURL=436.10206c22b0e2f40d8f22.chunk.js.map \ No newline at end of file diff --git a/public/436.10206c22b0e2f40d8f22.chunk.js.map b/public/436.10206c22b0e2f40d8f22.chunk.js.map new file mode 100644 index 000000000..ab59b4935 --- /dev/null +++ b/public/436.10206c22b0e2f40d8f22.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"436.10206c22b0e2f40d8f22.chunk.js","mappings":"yKAoDA,MAAMA,EAAO,I,QAAI,GAAK,cAAc,GAxCjB,KACjB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,mFACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/437.3a0fbb3b8364085ec2f3.chunk.js b/public/437.3a0fbb3b8364085ec2f3.chunk.js new file mode 100644 index 000000000..3a1a523f5 --- /dev/null +++ b/public/437.3a0fbb3b8364085ec2f3.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[437,442,774],{4494:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);const a=(e,t={})=>{const i=document.createElement(t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},4425:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2384);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},279:(e,t,i)=>{function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1405:(e,t,i)=>{i.d(t,{Z:()=>l});var s=i(8497),n=i(9674),a=i(5432),r=i(3512),o=i(5975);let d=0;function l(e,t=(()=>Promise.resolve()),i=null,l=!1,c=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let p,u=document.createElement("div");u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[l?"prepend":"append"](u);const h=(e,s)=>{const r=Date.now(),o=document.createElement("div"),l=d++,c=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");p=()=>{let e=Date.now()-r;const t=()=>{n.Z.mutate((()=>{o.remove()})),i&&i(l)};if(eo.classList.add("hiding")),Math.max(i-c/2,0)),setTimeout(t,i)}else o.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",p),p=null,w=!1},t&&t(l),window.requestAnimationFrame((()=>{const t=u.getBoundingClientRect();o.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),r=i-a/2,d=n-a/2;o.style.width=o.style.height=a+"px",o.style.left=r+"px",o.style.top=d+"px",u.append(o)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(c===e||!(0,o.Z)(t.target,c));let w=!1;if(a.Z){let e=()=>{p&&p()};c.addEventListener("touchstart",(t=>{if(!r.Z.settings.animationsEnabled)return;if(t.touches.length>1||w||m(t))return;w=!0;let{clientX:i,clientY:s}=t.touches[0];h(i,s),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!r.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||m(e))return;if(w)return void(w=!1);let{clientX:t,clientY:i}=e;h(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},2738:(e,t,i)=>{i.d(t,{EN:()=>o,fc:()=>r,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function r(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e);i.touchMouseDown=!0,s(a,t,i)}function o(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},9674:(e,t,i)=>{i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),r=i(8487);const o=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,r.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?t():s.then((()=>t()))),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=o);const d=o},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2325);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>L});var s=i(279),n=i(4755),a=i(4874),r=i(4494),o=i(6830),d=i(4425),l=i(2325),c=i(2582),p=i(3910),u=i(2738),h=i(2614),m=i(5565),w=i(1656),v=i(8115),g=i(3512);let b;const L=new a.Z("page-password",!0,(()=>{const e=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),a=new l.ZP.IntlElement({key:"Login.Next"});t.append(a.element);const L=new o.Z({label:"LoginPassword",name:"password"});let y;b=L.input,e.inputWrapper.append(L.container,t);let f,Z=()=>(y||(y=window.setInterval(Z,1e4)),g.Z.managers.passwordManager.getState().then((e=>{f=e,f.hint?(0,m.Z)(L.label,(0,h.Z)((0,v.Z)(f.hint))):L.setLabel()})));const E=e=>{if(e&&(0,p.Z)(e),!b.value.length)return void b.classList.add("error");const n=(0,w.Z)([b,t],!0);let r=b.value;a.update({key:"PleaseWait"});const o=(0,s.y)(t);L.setValueSilently(""+Math.random()),L.setValueSilently(r),g.Z.managers.passwordManager.check(r,f).then((e=>{"auth.authorization"===e._?(clearInterval(y),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),S&&S.remove()):(t.removeAttribute("disabled"),a.update({key:e._}),o.remove())})).catch((e=>{n(),L.input.classList.add("error"),e.type,a.update({key:"PASSWORD_HASH_INVALID"}),b.select(),o.remove(),Z()}))};(0,u.fc)(t,E),b.addEventListener("keypress",(function(e){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const k=n.Z.isMobile?100:166,S=new d.Z(L,k);return e.imageDiv.append(S.container),Promise.all([S.load(),Z()])}),null,(()=>{b.focus(),g.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); +//# sourceMappingURL=437.3a0fbb3b8364085ec2f3.chunk.js.map \ No newline at end of file diff --git a/public/437.3a0fbb3b8364085ec2f3.chunk.js.map b/public/437.3a0fbb3b8364085ec2f3.chunk.js.map new file mode 100644 index 000000000..82f122c2a --- /dev/null +++ b/public/437.3a0fbb3b8364085ec2f3.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"437.3a0fbb3b8364085ec2f3.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","Promise","resolve","onEnd","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","touches","length","once","cancelBubble","stopPropagation","passive","dataset","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","htmlToSpan","span","toggleDisability","elements","disable","forEach","el","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","LoginPage","body","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","state","getState","setInterval","_state","hint","setLabel","onSubmit","value","update","preloader","setValueSilently","random","response","_","clearInterval","m","default","mount","monkey","catch","err","select","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/442.7c20450a077c518900a1.chunk.js b/public/442.7c20450a077c518900a1.chunk.js new file mode 100644 index 000000000..834925020 --- /dev/null +++ b/public/442.7c20450a077c518900a1.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[442,774],{4425:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2384);class a{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(3910),a=i(503);class n extends a.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const a=this.toggleVisible=document.createElement("span");a.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(a),a.addEventListener("click",this.onVisibilityClick),a.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2582:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325);class a{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var s=i(279),a=i(4755),n=i(4874),r=i(4494),o=i(6830),l=i(4425),d=i(2325),c=i(2582),p=i(3910),h=i(2738),u=i(2614),m=i(5565),b=i(1656),g=i(8115),w=i(3512);let y;const v=new n.Z("page-password",!0,(()=>{const e=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),n=new d.ZP.IntlElement({key:"Login.Next"});t.append(n.element);const v=new o.Z({label:"LoginPassword",name:"password"});let L;y=v.input,e.inputWrapper.append(v.container,t);let Z,k=()=>(L||(L=window.setInterval(k,1e4)),w.Z.managers.passwordManager.getState().then((e=>{Z=e,Z.hint?(0,m.Z)(v.label,(0,u.Z)((0,g.Z)(Z.hint))):v.setLabel()})));const E=e=>{if(e&&(0,p.Z)(e),!y.value.length)return void y.classList.add("error");const a=(0,b.Z)([y,t],!0);let r=y.value;n.update({key:"PleaseWait"});const o=(0,s.y)(t);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,Z).then((e=>{"auth.authorization"===e._?(clearInterval(L),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),f&&f.remove()):(t.removeAttribute("disabled"),n.update({key:e._}),o.remove())})).catch((e=>{a(),v.input.classList.add("error"),e.type,n.update({key:"PASSWORD_HASH_INVALID"}),y.select(),o.remove(),k()}))};(0,h.fc)(t,E),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),n.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const V=a.Z.isMobile?100:166,f=new l.Z(v,V);return e.imageDiv.append(f.container),Promise.all([f.load(),k()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); +//# sourceMappingURL=442.7c20450a077c518900a1.chunk.js.map \ No newline at end of file diff --git a/public/442.7c20450a077c518900a1.chunk.js.map b/public/442.7c20450a077c518900a1.chunk.js.map new file mode 100644 index 000000000..091def7fd --- /dev/null +++ b/public/442.7c20450a077c518900a1.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"442.7c20450a077c518900a1.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","toggleDisability","elements","disable","forEach","el","removeAttribute","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","state","getState","window","setInterval","_state","hint","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","catch","err","select","Promise","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/445.8b680d12416f728f8b70.chunk.js b/public/445.8b680d12416f728f8b70.chunk.js new file mode 100644 index 000000000..c3f27a7fb --- /dev/null +++ b/public/445.8b680d12416f728f8b70.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[445],{9807:(e,t,s)=>{s.d(t,{Z:()=>c});var i=s(1405),n=s(2325),o=s(9750),l=s(3512),r=s(3789);class c{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const s=this.input=document.createElement("input");let c;if(s.classList.add("checkbox-field-input"),s.type="checkbox",e.name&&(s.id="input-"+e.name),e.checked&&(s.checked=!0),e.stateKey&&r.Z.getState().then((t=>{const i=(0,o.Z)(t,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(i):i,this.setValueSilently(n),s.addEventListener("change",(()=>{let t;t=e.stateValues?e.stateValues[s.checked?1:0]:s.checked,l.Z.managers.appStateManager.setByKey(e.stateKey,t)}))})),e.text?(c=this.span=document.createElement("span"),c.classList.add("checkbox-caption"),(0,n.$d)(c,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(s),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("checkbox-box-check"),s.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),s.append(i);const n=document.createElement("div");n.classList.add("checkbox-box-background");const o=document.createElement("div");o.classList.add("checkbox-box-border"),e.append(o,n,s),t.append(e)}c&&t.append(c),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,i.Z)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},8805:(e,t,s)=>{s.d(t,{ZP:()=>a,v7:()=>h});var i=s(5432),n=s(5003),o=s(4789),l=s(8594),r=s(3910);class c{constructor(e,t="",s=document.createElement("div")){this.el=e,this.container=s,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.requestAnimationFrame((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,l.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}append(e){this.container.append(e)}scrollIntoViewNew(e){return(0,o.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=0)}}class a extends c{constructor(e,t="",s=300,i){super(e,t),this.onScrollOffset=s,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,s=this.lastScrollPosition;this.onScrolledTop&&s<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-s<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class h extends c{constructor(e,t="",s=300,n=15,o=document.createElement("div")){if(super(e,t,o),this.onScrollOffset=s,this.splitCount=n,this.container=o,this.container.classList.add("scrollable-x"),!i.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},709:(e,t,s)=>{s.d(t,{Z:()=>r});var i=s(2398),n=s(6272),o=s(4762),l=s(503);class r extends l.Z{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let s;o.IS_APPLE?s=-.16*e:o.IS_ANDROID&&(s=0),t.style.setProperty("--letter-spacing",s+"px")}const s=this.setValueSilently.bind(this);this.setValueSilently=e=>{s(e),(0,i.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const s=this.value;let i;Math.abs(s.length-this.lastValue.length)>1&&!this.pasted&&o.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+s),this.pasted=!1,this.setLabel();let l,r,c,a="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=(0,n.u)(this.value),l=i.formatted,r=i.country,a=i.leftPattern,c=i.code,this.setValueSilently(this.lastValue=l?"+"+l:"")),t.dataset.leftPattern=a,e.onInput&&e.onInput(i)})),t.addEventListener("paste",(()=>{this.pasted=!0})),t.addEventListener("keypress",(e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1}))}}},4668:(e,t,s)=>{function i(e,t){return e.closest(t)}s.d(t,{Z:()=>i})},2398:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(5432);function n(e,t=!1){if(!i.Z||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var s=document.createRange();s.selectNodeContents(e),s.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(s)}else if(void 0!==document.body.createTextRange){var o=document.body.createTextRange();o.moveToElementText(e),o.collapse(!1),o.select()}}},1656:(e,t,s)=>{function i(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>i(e,!t)}s.d(t,{Z:()=>i})},6272:(e,t,s)=>{s.d(t,{u:()=>r});var i=s(2325);const n=new Map;let o=0;const l=(e,t,s="")=>{s=t.country_code+s,o=Math.max(o,s.length),n.set(s,{country:e,code:t})};function r(e){e=e||"",n.size||i.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((s=>{l(e,t,s)})):l(e,t)}))}));let t,s=e.replace(/\D/g,""),r=s.slice(0,o);for(let e=r.length-1;e>=0&&(t=n.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:s,country:void 0,code:void 0,leftPattern:""};const c=t.country,a=t.code.patterns||[],h=s.slice(t.code.country_code.length);let d="",u=0,p="";for(let e=a.length-1;e>=0;--e){d=a[e];const t=d.replace(/ /g,"");let s=0;for(let e=0,i=Math.min(h.length,t.length);eu&&(u=s,p=d)}d=p||d,d=d.replace(/\d/g,"X"),d=t.code.country_code+" "+d,d.split("").forEach(((e,t)=>{" "===e&&" "!==s[t]&&s.length>t&&(s=s.slice(0,t)+" "+s.slice(t))}));let m=d&&d.length>s.length?d.slice(s.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:s,country:c,code:t.code,leftPattern:m}}},9750:(e,t,s)=>{function i(e,t){const s=t.split(".");let i=e;return s.forEach((e=>{e&&(i=i[e])})),i}s.d(t,{Z:()=>i})}}]); +//# sourceMappingURL=445.8b680d12416f728f8b70.chunk.js.map \ No newline at end of file diff --git a/public/445.8b680d12416f728f8b70.chunk.js.map b/public/445.8b680d12416f728f8b70.chunk.js.map new file mode 100644 index 000000000..0d9509099 --- /dev/null +++ b/public/445.8b680d12416f728f8b70.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"445.8b680d12416f728f8b70.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ripple from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n apiManagerProxy.getState().then((state) => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver((entries) => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach((c) => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n \r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach((country) => {\n country.country_codes.forEach((code) => {\n if(code.prefixes) {\n code.prefixes.forEach((prefix) => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n"],"names":["CheckboxField","constructor","options","label","this","document","createElement","classList","add","restriction","round","disabled","toggleDisability","input","span","type","name","id","checked","stateKey","then","state","stateValue","stateValues","indexOf","setValueSilently","addEventListener","value","text","textArgs","append","toggle","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withRipple","undefined","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","ScrollableBase","el","logPrefix","container","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","window","requestAnimationFrame","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","forEach","c","addScrollListener","addedScrollListener","passive","capture","removeScrollListener","removeEventListener","setListeners","removeHeavyAnimationListener","removeListeners","element","scrollIntoViewNew","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","super","loadedAll","top","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","prepend","elements","padding","getDistanceToEnd","Math","offsetHeight","isScrolledDown","y","setScrollTopSilently","ignoreNextScrollEvent","e","once","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","TelInputField","pasted","lastValue","telEl","HTMLInputElement","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","IS_APPLE","IS_ANDROID","style","setProperty","originalFunc","bind","remove","formattedPhoneNumber","abs","length","IS_APPLE_MOBILE","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","test","metaKey","ctrlKey","shiftKey","preventDefault","findUpTag","tag","closest","placeCaretAtEnd","ignoreTouchCheck","activeElement","focus","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","setAttribute","removeAttribute","prefixes","Map","maxPrefixLength","setPrefix","prefix","country_code","max","set","formatPhoneNumber","originalStr","size","country_codes","prefixCountry","str","phoneCode","slice","i","get","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx","getDeepProperty","object","splitted","o"],"sourceRoot":""} \ No newline at end of file diff --git a/public/458.b69e387d025f91cf03db.chunk.js b/public/458.b69e387d025f91cf03db.chunk.js new file mode 100644 index 000000000..9cb76d65e --- /dev/null +++ b/public/458.b69e387d025f91cf03db.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[458],{503:(t,e,n)=>{n.d(e,{I:()=>g,Z:()=>m});var i=n(6669),s=n(1544),a=n(8763),l=n(3735),o=n(1293),r=n(130),h=n(2325),u=n(6241),d=n(6535),c=n(3066),p=n(9099);let f=()=>{document.addEventListener("paste",(t=>{if(!(0,a.Z)(t.target,'contenteditable="true"'))return;let e,n;t.preventDefault();let i=(t.originalEvent||t).clipboardData.getData("text/plain"),o=!0,r=(t.originalEvent||t).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const t=r.match(/([\s\S]*)<\/body>/);t&&(r=t[1].trim());let s=document.createElement("span");s.innerHTML=r;let a=s.firstChild;for(;a;){let t=a.nextSibling;3===a.nodeType&&(a.nodeValue.trim()||a.remove()),a=t}const h=(0,l.Z)(s,!0);if(h.value.replace(/\s/g,"").length===i.replace(/\s/g,"").length){e=h.value,n=h.entities,o=!1;let t=(0,d.Z)(e);t=t.filter((t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),(0,u.Z)(n,t)}}o&&(e=i,n=(0,d.Z)(e),n=n.filter((t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)));const h=(0,c.Z)(e,{entities:n});e=(0,s.Z)(h),window.document.execCommand("insertHTML",!1,e)})),f=null};var g;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(g||(g={}));const m=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:n,showLengthOn:i,name:s,plainText:a,canBeEdited:r=!0}=t;let u,d,c=t.label||t.labelText;if(a)this.container.innerHTML=`\n \n `,u=this.container.firstElementChild;else{f&&f(),this.container.innerHTML=`\n
\n `,u=this.container.firstElementChild;const e=new MutationObserver((()=>{d&&d()}));u.addEventListener("input",(()=>{(0,o.Z)(u)&&(u.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=u.innerHTML,this.onFakeInput())})),e.observe(u,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(u.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=u.className+" input-field-input-fake")}if(u.setAttribute("dir","auto"),e&&((0,h.$d)(u,e,void 0,"placeholder"),this.inputFake&&(0,h.$d)(this.inputFake,e,void 0,"placeholder")),c||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(c&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=u.classList.contains("error"),o=a?u.value.length:[...(0,l.Z)(u,!1).value].length,r=n-o,h=r<0;u.classList.toggle("error",h),h||r<=i?(this.setLabel(),t.append(` (${n-o})`),e||(e=!0)):(s&&!h||e)&&(this.setLabel(),e=!1)},u.addEventListener("input",d)}this.input=u}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const n=window.getSelection();n.removeAllRanges(),n.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,r.Z)(this.label,this.options.labelText):this.label.append((0,h.ag)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,n=+this.input.style.height.replace("px","");if(n===e)return;const i=Math.round(50*Math.log(Math.abs(e-n)));this.input.style.transitionDuration=`${i}ms`,t&&(this.input.style.height=e?e+"px":"");const s="is-changing-height";(0,p.Z)(this.input,s,!0,i,(()=>{this.input.classList.remove(s)}))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),(0,i.Z)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,o.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=(0,s.Z)((0,c.Z)(t))),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append((0,h.ag)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&g.Error)),this.input.classList.toggle("valid",!!(t&g.Valid))}setError(t){this.setState(g.Error,t)}}},9099:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(3512);const s=(t,e,n,a,l,o)=>{const{timeout:r,raf:h}=t.dataset;if(void 0!==r&&clearTimeout(+r),void 0!==h&&(window.cancelAnimationFrame(+h),o||delete t.dataset.raf),o&&i.Z.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,s(t,e,n,a,l,o-1)})));n&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!n&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),l&&l()};if(!i.Z.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!n),t.dataset.timeout=""+setTimeout(u,a)},a=s},1544:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(4056);function s(t){return Array.from(t.childNodes).map((t=>3===t.nodeType?(0,i.Z)(t.textContent):t.outerHTML)).join("")}},8763:(t,e,n)=>{function i(t,e){return t.closest(`[${e}]`)}n.d(e,{Z:()=>i})},9041:(t,e,n)=>{n.d(e,{Z:()=>a,o:()=>i});const i={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,n,l,o,r,h={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(l===t?n.push(e.substr(0,o)+""+e.substr(o)):n.push(e),r&&e.length&&t.parentNode){const n=t.parentElement;for(const t in i){const s=i[t],a=n.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:a.href,offset:h.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:h.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:h.offset,length:e.length}))}}return void(h.offset+=e.length)}if(1!==t.nodeType)return;const u=l===t,d=s.has(t.tagName);if(d&&n.length)e.push(n.join("")),n.splice(0,n.length),++h.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(n.push(e),h.offset+=e.length)}u&&!o&&n.push("");const c=t.matches('[style*="table-cell"], th, td'),p=null==r?void 0:r.length;let f=t.firstChild;for(;f;)a(f,e,n,l,o,r,h),f=f.nextSibling;if(u&&o&&n.push(""),c&&t.nextSibling&&(n.push(" "),++h.offset,void 0!==p))for(let t=p,e=r.length;t{n.d(e,{Z:()=>o});var i=n(410),s=n(6875),a=n(1346),l=n(9041);function o(t,e=!0){const n=[],i=[],o=e?[]:void 0;(0,l.Z)(t,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&((0,s.Z)(o),(0,a.Z)(o)),{value:r,entities:o}}i.GO.getRichValue=o},1293:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(3735);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!(0,i.Z)(t,!1).value.trim():!t.value.trim()}},5565:(t,e,n)=>{function i(t,e){if("string"==typeof e)return void(t.innerHTML=e);const n=t.firstChild;n?t.lastChild===n?n.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}n.d(e,{Z:()=>i})},130:(t,e,n)=>{function i(t,e){t.setAttribute("dir","auto"),"string"==typeof e?e?t.innerHTML=e:t.textContent="":(t.textContent="",t.append(e))}n.d(e,{Z:()=>i})},6875:(t,e,n)=>{n.d(e,{Z:()=>s});const i=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function s(t){for(let e=0;ei.has(t._)&&s!==e&&t._===n._&&t.offset-n.length===n.offset)),-1!==s){const e=t[s];n.length+=e.length,t.splice(s,1)}}while(-1!==s)}}},8859:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(2423);function s(t,e){return t.find((t=>(e._===t._||!i.tY.has(e._)&&!i.tY.has(t._))&&(e.offset>=t.offset&&e.length+e.offset<=t.length+t.offset)))}},6241:(t,e,n)=>{n.d(e,{Z:()=>a});var i=n(8859),s=n(1346);function a(t,e){const n=e.filter((e=>!(0,i.Z)(t,e)));t.push(...n),(0,s.Z)(t);for(let e=0;e{function i(t){t.sort(((t,e)=>t.offset-e.offset||e.length-t.length))}n.d(e,{Z:()=>i})},3066:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(5159);function s(t,e={}){return t?(0,i.Z)(t,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):(0,i.Z)("")}}}]); +//# sourceMappingURL=458.b69e387d025f91cf03db.chunk.js.map \ No newline at end of file diff --git a/public/458.b69e387d025f91cf03db.chunk.js.map b/public/458.b69e387d025f91cf03db.chunk.js.map new file mode 100644 index 000000000..fcc6b071e --- /dev/null +++ b/public/458.b69e387d025f91cf03db.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"458.b69e387d025f91cf03db.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValue.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport documentFragmentToHTML from \"../helpers/dom/documentFragmentToHTML\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport mergeEntities from \"../lib/richTextProcessor/mergeEntities\";\r\nimport parseEntities from \"../lib/richTextProcessor/parseEntities\";\r\nimport wrapDraftText from \"../lib/richTextProcessor/wrapDraftText\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = parseEntities(text);\r\n entities2 = entities2.filter((e) => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = parseEntities(text);\r\n entities = entities.filter((e) => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n const fragment = wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","import encodeEntities from \"../string/encodeEntities\";\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport combineSameEntities from \"../../lib/richTextProcessor/combineSameEntities\";\r\nimport sortEntities from \"../../lib/richTextProcessor/sortEntities\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n combineSameEntities(entities);\r\n sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PASS_CONFLICTING_ENTITIES } from \".\";\nimport { MessageEntity } from \"../../layer\";\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find((currentEntity) => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\nimport findConflictingEntity from \"./findConflictingEntity\";\nimport sortEntities from \"./sortEntities\";\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","import { MessageEntity } from \"../../layer\";\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\nimport wrapRichText from \"./wrapRichText\";\n\nexport default function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n}> = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n}\n"],"names":["init","document","addEventListener","e","findUpAttribute","target","text","entities","preventDefault","plainText","originalEvent","clipboardData","getData","usePlainText","html","trim","replace","match","span","createElement","innerHTML","curChild","firstChild","nextSibling","nodeType","nodeValue","remove","richValue","getRichValue","value","length","entities2","parseEntities","filter","_","mergeEntities","fragment","wrapDraftText","documentFragmentToHTML","window","execCommand","InputState","constructor","options","this","container","classList","add","required","validate","undefined","maxLength","showLengthOn","Math","min","round","placeholder","name","canBeEdited","input","processInput","label","labelText","firstElementChild","String","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","append","setLabel","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","textContent","setInnerHTML","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","height","transitionDuration","log","abs","setValueSilently","fireFakeInput","isChanged","originalValue","isValid","isValidToChange","setDraftValue","silent","setOriginalValue","setState","state","Error","Valid","setError","SetTransition","element","forwards","duration","onTransitionEnd","useRafs","timeout","raf","dataset","clearTimeout","cancelAnimationFrame","requestAnimationFrame","afterTimeout","setTimeout","Array","from","childNodes","map","node","outerHTML","join","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","offset","push","substr","parentNode","parentElement","type","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","field","withEntities","hasAttribute","replaceContent","elem","lastChild","replaceWith","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","findConflictingEntity","currentEntities","newEntity","find","currentEntity","newEntities","filtered","sortEntities","sort","a","b","noLinks","wrappingDraft","passEntities","messageEntityTextUrl","messageEntityMentionName"],"sourceRoot":""} \ No newline at end of file diff --git a/public/5.eeac423212e8b7acbb73.chunk.js b/public/5.eeac423212e8b7acbb73.chunk.js deleted file mode 100644 index 88ac3d11c..000000000 --- a/public/5.eeac423212e8b7acbb73.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[5],{126:function(e,t,n){"use strict";function o(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function i(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function s(e,t,n){const o=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{o(e,t,!1)})}function r(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function a(){return!!r()}n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return a}))},143:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i}));function o(e,t){const n=""["".length-1]||"";let o;switch(e._){case"inputPhotoFileLocation":o=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":o=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":o=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":o=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":o=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":o=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),o=""}return o+(n?"."+n:n)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},152:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(91);var i=function(e,t){let n,o,i,s={},r=0,a=0,c=0,l=0,d=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,i=new Image,i.src=e.src,i.draggable=!1,i.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),o=document.createElement("div"),o.classList.add("crop-overlay");const s=document.createElement("div");s.classList.add("crop-overlay-color"),n.appendChild(o);e.parentNode.appendChild(n),n.appendChild(i),n.appendChild(e),n.appendChild(s),o.appendChild(i),i.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const r=e.offsetWidth/2-100,a=e.offsetHeight/2-100;u(200,200),m(r,a),p(r,a),o.addEventListener("mousedown",g,!1),o.addEventListener("touchstart",g,!1),o.addEventListener("wheel",b,!1),document.addEventListener("keypress",v,!1)}function u(e,t){c=e*d,l=t*d,o.style.width=e+"px",o.style.height=t+"px"}function m(e,t){a=t*d,r=e*d,i.style.top=-t+"px",i.style.left=-e+"px"}function p(e,t){o.style.top=t+"px",o.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,s,r,a=Math.floor(o.clientWidth+e),c=Math.floor(o.clientHeight+e),l=i.clientWidth,d=i.clientHeight;a<50||a>l||(t=o.offsetLeft-e/2,n=o.offsetTop-e/2,s=t+a,r=n+c,t<0&&(t=0),n<0&&(n=0),s>l||r>d||(u(a,a),m(t,n),p(t,n)))}function v(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function b(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){s.container_width=o.offsetWidth,s.container_height=o.offsetHeight,s.container_left=o.offsetLeft,s.container_top=o.offsetTop,s.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,s.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",y),document.addEventListener("touchmove",y),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y)}function y(e){let t,n,r,a,c={x:0,y:0};e.preventDefault(),e.stopPropagation(),c.x=e.pageX||e.touches&&e.touches[0].pageX,c.y=e.pageY||e.touches&&e.touches[0].pageY,t=c.x-(s.mouse_x-s.container_left),n=c.y-(s.mouse_y-s.container_top),r=o.offsetWidth,a=o.offsetHeight,t<0?t=0:t>i.offsetWidth-r&&(t=i.offsetWidth-r),n<0?n=0:n>i.offsetHeight-a&&(n=i.offsetHeight-a),m(t,n),p(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=c,t.height=l,t.getContext("2d").drawImage(e,r,a,c,l,0,0,c,l)},removeHandlers:function(){o.removeEventListener("mousedown",g),o.removeEventListener("touchstart",g),o.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y),document.removeEventListener("keypress",v),n.remove(),o.remove(),i.remove()}}},s=n(73),r=n(7),a=n(57),c=n(189);class l extends s.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(r.b)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(c.a)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=i(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(a.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>o.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},171:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var o=n(0),i=n(2);function s(e){if("Enter"===e.key&&!i.e&&!e.isComposing){if("enter"===o.a.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=i.b?e.metaKey:e.ctrlKey;if(e.shiftKey||(i.b?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},189:function(e,t,n){"use strict";function o(e){return function(e,t){return new Promise(n=>{const o=new FileReader;o.addEventListener("loadend",e=>{n(e.target.result)}),o[t](e)})}(e,"readAsDataURL")}n.d(t,"a",(function(){return o}))},73:function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"a",(function(){return E}));var o=n(0),i=n(79),s=n(82),r=n(86),a=n(7),c=n(34),l=n(38),d=n(83),h=n(57),u=n(171),m=n(27),p=n(15),f=n(126),v=n(76);const b=document.body;let g=b;const w=()=>{g=Object(f.c)()||b,y.reAppend()};Object(f.a)(b,w);class y extends p.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{r.a.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(h.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&Object(h.b)(this.element,e=>{Object(c.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(a.d)(n.withConfirm)),this.header.append(this.btnConfirm),Object(i.a)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let o=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(i.a)(t),e.text?t.innerHTML=e.text:t.append(Object(a.d)(e.langKey,e.langArgs)),Object(h.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!o&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(o=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=o,this.element.append(this.container),y.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},r.a.pushItem(this.navigationItem),Object(l.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(o.a.isOverlayActive=!0,s.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(u.a)(e):"Enter"===e.key)&&(Object(h.d)(this.btnConfirmOnEnter),Object(m.a)(e))})},0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(o.a.isOverlayActive=!1),r.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(v.a)(y.POPUPS,this),w(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.a.checkAnimations(!1)},150)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,o=t.parentElement;o&&o!==g&&g!==n&&g.append(t)})}static getPopups(e){return this.POPUPS.filter(t=>t instanceof e)}}y.POPUPS=[];const E=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},83:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));class o{constructor(){this.listeners=new Set}add(e){return(t,n,o)=>{const i={element:e,event:t,callback:n,options:o};return this.addManual(i),i}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,o){let i;for(const s of this.listeners)if(s.element===e&&s.event===t&&s.callback===n&&s.options===o){i=s;break}i&&this.remove(i)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}},91:function(e,t,n){"use strict";var o=n(0),i=n(8),s=n(10),r=n(143),a=n(187),c=n(1);const l=new class{constructor(){this.cacheStorage=new a.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},o.a.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const o=this.downloads[t.fileName];o&&o.notifyAll(t)})}getNewDeferred(e){const t=Object(s.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",i.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(r.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),o=e=>{n.reject(e)};return(()=>{if(!i.a.worker||e.onlyCache){const s=this.cacheStorage.getFile(t).then(t=>{if(t.sizei.a.downloadFile(e).then(n.resolve,o))}i.a.downloadFile(e).then(n.resolve,o)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return i.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const o=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),o&&t(o)}createDownloadAnchor(e,t,n){const o=document.createElement("a");o.href=e,o.download=t,o.target="_blank",o.style.position="absolute",o.style.top="1px",o.style.left="1px",document.body.append(o);try{var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(i)}catch(t){console.error("Download click error",t);try{o.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{o.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,o;const i=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(o=i[t])&&void 0!==o?o:i[t]={downloaded:0,url:""}}};c.a&&(c.a.appDownloadManager=l),t.a=l}}]); -//# sourceMappingURL=5.eeac423212e8b7acbb73.chunk.js.map \ No newline at end of file diff --git a/public/5.eeac423212e8b7acbb73.chunk.js.map b/public/5.eeac423212e8b7acbb73.chunk.js.map deleted file mode 100644 index aec4fdf54..000000000 --- a/public/5.eeac423212e8b7acbb73.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/helpers/blob/readBlobAsDataURL.ts","webpack:///./src/helpers/blob/readBlobAs.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/helpers/listenerSetter.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","e","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","file","target","files","readBlobAsDataURL","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","isSendShortcutPressed","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","method","Promise","reader","FileReader","result","readBlobAs","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","title","onEscape","backByItem","navigationItem","confirmShortcutIsSendShortcut","prepend","once","withoutOverlay","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","destroy","find","isCancel","POPUPS","push","onPop","pushItem","isOverlayActive","checkAnimations","setTimeout","dispatchEvent","removeAll","removeItem","undefined","cleanup","popup","parentElement","popupConstructor","addCancelButton","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","_listener","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","deferred","cancel","Error","name","cancelDownload","reject","finally","catch","clearDownload","getNewDeferred","fetch","response","hasOwnProperty","onError","err","worker","onlyCache","promise","getFile","size","downloadFile","tryDownload","mimeType","indexOf","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","open","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded"],"mappings":"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","file":"5.eeac423212e8b7acbb73.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ripple from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\r\nimport { addFullScreenListener, getFullScreenElement } from \"../../helpers/dom/fullScreen\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: () => this.destroy(),\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n protected destroy() {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/53.71a42ea94f0ddd5cd1f3.chunk.js b/public/53.71a42ea94f0ddd5cd1f3.chunk.js new file mode 100644 index 000000000..5cf1333f2 --- /dev/null +++ b/public/53.71a42ea94f0ddd5cd1f3.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[53,810],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>O});var a=n(279),o=n(8805),s=n(4874),i=n(503),r=n(9807),c=n(4494),d=n(4789),l=n(5432),u=n(4159),p=n(2325),h=n(2384),m=n(1405),g=n(4668),f=n(8497),v=n(144),y=n(9709),Z=n(9638),L=n(3910),E=n(2738),b=n(5565),w=n(1656),_=n(7487),k=n(2398),S=n(671),x=n(6669),C=n(7922),T=n(3512),N=n(709),P=n(9976),M=n(130),A=n(8115),I=n(3789);let B,D=null;const V=new s.Z("page-sign",!0,(()=>{const e=()=>{t=p.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let t;e(),T.Z.addEventListener("language_change",(()=>{e()}));const s=new Map;let m,O;const R=document.createElement("div");R.classList.add("input-wrapper");const W=new i.Z({label:"Login.CountrySelectorLabel",name:(0,v.a)()});W.container.classList.add("input-select");const $=W.input,j=document.createElement("div");j.classList.add("select-wrapper","z-depth-3","hide");const q=document.createElement("span");q.classList.add("arrow","arrow-down"),W.container.append(q);const F=document.createElement("ul");j.appendChild(F),new o.ZP(j);let K=()=>{K=null,t.forEach((e=>{const t=(0,S.Ml)(e.iso2),n=[];e.country_codes.forEach((a=>{const o=document.createElement("li");let s=(0,A.Z)(t);if(P.Z){const e=document.createElement("span");(0,M.Z)(e,s),o.append(e)}else(0,M.Z)(o,s);const i=(0,p.ag)(e.default_name);i.dataset.defaultName=e.default_name,o.append(i);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+a.country_code,o.appendChild(r),n.push(o),F.append(o)})),s.set(e.iso2,n)})),F.addEventListener("mousedown",(e=>{if(0!==e.button)return;const t=(0,g.Z)(e.target,"LI");z(t)})),W.container.appendChild(j)};const z=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,o=a.replace(/\D/g,"");(0,b.Z)($,(0,p.ag)(n)),(0,x.Z)($,"input"),m=t.find((e=>e.default_name===n)),O=m.country_codes.find((e=>e.country_code===o)),J.value=J.lastValue=a,G(),setTimeout((()=>{X.focus(),(0,k.Z)(X,!0)}),0)};let H;K(),$.addEventListener("focus",(function(e){K?K():t.forEach((e=>{s.get(e.iso2).forEach((e=>e.style.display=""))})),clearTimeout(H),H=void 0,j.classList.remove("hide"),j.offsetWidth,j.classList.add("active"),W.select(),(0,d.Z)({container:V.pageEl.parentElement.parentElement,element:$,position:"start",margin:4}),setTimeout((()=>{Q||(document.addEventListener("mousedown",U,{capture:!0}),Q=!0)}),0)}));let Q=!1;const U=e=>{(0,f.Z)(e.target,"input-select")||e.target!==$&&(G(),document.removeEventListener("mousedown",U,{capture:!0}),Q=!1)},G=()=>{void 0===H&&(j.classList.remove("active"),H=window.setTimeout((()=>{j.classList.add("hide"),H=void 0}),200))};$.addEventListener("keyup",(e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=W.value.toLowerCase(),o=[];t.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const n=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");n.length>1&&t.push(n)}));let n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(a)));s.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&o.push(e)})),0===o.length?t.forEach((e=>{s.get(e.iso2).forEach((e=>e.style.display=""))})):1===o.length&&"Enter"===n&&z(s.get(o[0].iso2)[0])})),q.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),$.matches(":focus")?$.blur():$.focus()}));const J=new N.Z({onInput:e=>{h.Z.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===W.value||m&&t&&n&&(m===t||O.country_code===n.country_code)||((0,b.Z)($,t?(0,p.ag)(t.default_name):a),m=t,O=n),t||J.value.length-1>1?D.style.visibility="":D.style.visibility="hidden"}}),X=J.input;X.addEventListener("keypress",(e=>{if(!D.style.visibility&&"Enter"===e.key)return ee()}));const Y=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});Y.input.addEventListener("change",(()=>{const e=Y.checked;T.Z.managers.appStateManager.pushToState("keepSigned",e),I.Z.toggleStorages(e,!0)})),I.Z.getState().then((e=>{C.Z.isAvailable()?Y.checked=e.keepSigned:(Y.checked=!1,Y.label.classList.add("checkbox-disabled"))})),D=(0,c.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),D.style.visibility="hidden";const ee=e=>{e&&(0,L.Z)(e);const t=(0,w.Z)([D,B],!0);(0,b.Z)(D,(0,p.ag)("PleaseWait")),(0,a.y)(D);let o=J.value;T.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:o,api_id:u.Z.id,api_hash:u.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:o}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(J.setError(),(0,b.Z)(J.label,(0,p.ag)("Login.PhoneLabelInvalid")),X.classList.add("error"),(0,b.Z)(D,(0,p.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),D.innerText=e.type)}))};(0,E.fc)(D,ee),B=(0,c.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),B.addEventListener("click",(()=>{y.default.mount()})),R.append(W.container,J.container,Y.label,D,B);const te=document.createElement("h4");te.classList.add("text-center"),(0,p.$d)(te,"Login.Title");const ne=document.createElement("div");ne.classList.add("subtitle","text-center"),(0,p.$d)(ne,"Login.StartText"),V.pageEl.querySelector(".container").append(te,ne,R),l.Z||setTimeout((()=>{X.focus()}),0),(0,Z.Z)(R),T.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=C.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&p.ZP.getLangPack(n.lang_code).then((()=>{(0,x.Z)(X,"input")}));const a=new Set([1,2,3,4,5]),o=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=T.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{o.push(e.nearest_dc)}))),(s||Promise.resolve()).then((()=>{o.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,s=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield _.Z.get(a))return t();setTimeout((()=>{T.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{c(s.next(e))}catch(e){t(e)}}function r(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,r)}c((s=s.apply(n,a||[])).next())}));var n,a,o,s};t()})),e})).then((e=>{W.value.length||J.value.length||z(s.get(e.country)[0])}))}),(()=>{D&&((0,b.Z)(D,(0,p.ag)("Login.Next")),(0,m.Z)(D,void 0,void 0,!0),D.removeAttribute("disabled")),B&&B.removeAttribute("disabled"),T.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),O=V}}]); +//# sourceMappingURL=53.71a42ea94f0ddd5cd1f3.chunk.js.map \ No newline at end of file diff --git a/public/53.71a42ea94f0ddd5cd1f3.chunk.js.map b/public/53.71a42ea94f0ddd5cd1f3.chunk.js.map new file mode 100644 index 000000000..e2c36e409 --- /dev/null +++ b/public/53.71a42ea94f0ddd5cd1f3.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"53.71a42ea94f0ddd5cd1f3.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/putPreloader\";\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter((country) => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n setInnerHTML(spanEmoji, wrapped);\r\n li.append(spanEmoji);\r\n } else {\r\n setInnerHTML(li, wrapped);\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find((c) => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach((li) => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach((name) => {\r\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach((li) => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach((li) => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","setCountries","countries","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","document","createElement","classList","add","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","spanEmoji","el","dataset","defaultName","span","innerText","country_code","push","set","addEventListener","e","button","target","selectCountryByTarget","childNodes","phoneCode","querySelector","replace","find","_countryCode","telInputField","value","lastValue","hidePicker","setTimeout","telEl","focus","hideTimeout","get","style","display","clearTimeout","undefined","remove","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","window","key","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","length","good","str","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","subtitle","nearestDcResult","langPack","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/591.8250ea4e75a163191f15.chunk.js b/public/591.8250ea4e75a163191f15.chunk.js new file mode 100644 index 000000000..8b3af260b --- /dev/null +++ b/public/591.8250ea4e75a163191f15.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[591],{5814:(f,e,d)=>{d.d(e,{Z:()=>b});var t=d(3512),a=d(4762),i=d(410),s=d(8487),n=d(3772),c=d(1655),r=d(7625),o=d(2586),h=d(3013);const l=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver((f=>{for(const e of f){const f=e.target;for(const d in this.byGroups){if(this.intersectionLockedGroups[d])continue;const t=this.byGroups[d].find((e=>e.el===f));if(t){if(e.isIntersecting)this.visible.add(t),this.checkAnimation(t,!1);else{this.visible.delete(t),this.checkAnimation(t,!0);const f=t.animation;f instanceof n.Z&&f.clearCache()}break}}}})),this.overrideIdleGroups=new Set,h.Z.addEventListener("play",(({doc:f})=>{"round"===f.type&&(this.videosLocked=!0,this.checkAnimations())})),h.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})),o.Z.addEventListener("change",(f=>{this.checkAnimations(f)}))}setOverrideIdleGroup(f,e){e?this.overrideIdleGroups.add(f):this.overrideIdleGroups.delete(f)}getAnimations(f){const e=[];for(const d in this.byGroups)for(const t of this.byGroups[d])t.el===f&&e.push(t);return e}removeAnimation(f){const{el:e,animation:d}=f;d.remove(),d instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{d.src="",d.load()}),1e3);const t=this.byGroups[f.group];t&&((0,c.Z)(t,f),t.length||delete this.byGroups[f.group]),this.observer.unobserve(e),this.visible.delete(f)}addAnimation(f,e=""){var d;const a={el:f instanceof n.Z?f.el:f,animation:f,group:e};f instanceof n.Z&&!t.Z.settings.stickers.loop&&f.loop&&(f.loop=t.Z.settings.stickers.loop),(null!==(d=this.byGroups[e])&&void 0!==d?d:this.byGroups[e]=[]).push(a),this.observer.observe(a.el)}checkAnimations(f,e,d=!1){if(void 0!==e&&!this.byGroups[e])return;const t=void 0!==e?[e]:Object.keys(this.byGroups);for(const e of t){const t=this.byGroups[e];(0,r.Z)(t,(e=>{this.checkAnimation(e,f,d)}))}}checkAnimation(f,e=!1,d=!1){const{el:t,animation:a,group:i}=f;d||!(0,s.Z)(t)&&!this.lockedGroups[i]?this.removeAnimation(f):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==i||a instanceof HTMLVideoElement&&this.videosLocked?a.paused||a.pause():!(a.paused&&this.visible.has(f)&&a.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==i||o.Z.isIdle&&!this.overrideIdleGroups.has(f.group)||a.play()}setOnlyOnePlayableGroup(f){this.onlyOnePlayableGroup=f}lockGroup(f){this.lockedGroups[f]=!0}unlockGroup(f){delete this.lockedGroups[f],this.checkAnimations(void 0,f)}refreshGroup(f){const e=this.byGroups[f];e&&e.length&&(e.forEach((f=>{this.observer.unobserve(f.el)})),window.requestAnimationFrame((()=>{e.forEach((f=>{this.observer.observe(f.el)}))})))}lockIntersectionGroup(f){this.intersectionLockedGroups[f]=!0}unlockIntersectionGroup(f){delete this.intersectionLockedGroups[f],this.refreshGroup(f)}};i.GO&&(i.GO.animationIntersector=l);const b=l},3013:(f,e,d)=>{d.d(e,{Z:()=>M});var t=d(3512),a=d(3725),i=d(4762),s=d(410),n=d(6669),c=d(5432),r=d(2325),o=d(3719),h=d(8479),l=d(6848),b=d(3699),u=d(7530),p=d(493),m=d(2312),g=d(925),v=d(3241),y=function(f,e,d,t){return new(d||(d=Promise))((function(a,i){function s(f){try{c(t.next(f))}catch(f){i(f)}}function n(f){try{c(t.throw(f))}catch(f){i(f)}}function c(f){var e;f.done?a(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(s,n)}c((t=t.apply(f,e||[])).next())}))};const w=(()=>{try{return i.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(f){return!1}})();class k extends v.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(f,e=this.playingMedia)=>{e&&(e.currentTime=Math.max(0,e.currentTime-(f.seekOffset||10)))},this.seekForward=(f,e=this.playingMedia)=>{e&&(e.currentTime=Math.min(e.duration,e.currentTime+(f.seekOffset||10)))},this.seekTo=(f,e=this.playingMedia)=>{e&&(e.currentTime=f.seekTime)},this.onMediaDocumentLoad=f=>y(this,void 0,void 0,(function*(){const e=this.mediaDetails.get(f),d=yield this.managers.appDocsManager.getDoc(e.docId);"audio"===d.type&&d.supportsStreaming&&w&&this.handleSafariStreamable(f);const t=yield this.managers.thumbsStorage.getCacheContext(d);f.src=t.url,this.playingMedia===f&&(f.playbackRate=this.playbackRate,"audio"===d.type&&(f.loop=this.loop));const a=this.waitingDocumentsForLoad[d.id];a&&(a.delete(f),a.size||delete this.waitingDocumentsForLoad[d.id])})),this.onPlay=f=>{const e=f.target,d=this.mediaDetails.get(e),{peerId:t,mid:a}=d,i=this.pip;i&&i.pause();const s=this.getMessageByMedia(e);if(this.playingMedia!==e){this.stop(),this.setMedia(e,s);const f=f=>f.mid===a&&f.peerId===t,d=this.listLoader,i=d.getCurrent();if(!i||!f(i)){const e=d.getPrevious();let i,s=e.findIndex(f);-1!==s?i=-(e.length-s):(s=d.getNext().findIndex(f),-1!==s&&(i=s+1)),-1!==s?i&&this.go(i,!1):this.setTargets({peerId:t,mid:a})}}setTimeout((()=>{this.playingMedia===e&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=f=>{this.dispatchEvent("pause")},this.onEnded=f=>{if(!f.isTrusted)return;this.onPause(f);const e=this.listLoader;!this.lockedSwitchers&&(this.round||!e.current||e.next.length)&&e.getNext().length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(f=this.playingMedia)=>{if(!f)return!1;if(f.paused||f.pause(),f.currentTime=0,(0,n.Z)(f,"ended"),f===this.playingMedia){const e=this.mediaDetails.get(f);if(null==e?void 0:e.clean){f.src="";const d=e.peerId,t=e.isScheduled?this.scheduled:this.media,a=t.get(d);a&&(a.delete(e.mid),a.size||t.delete(d)),f.remove(),this.mediaDetails.delete(f)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=f=>{const{peerId:e,mid:d}=f,t=this.searchContext.isScheduled;this.getMedia(e,d,t).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(e,d,t)}),0)},this.go=(f,e)=>{const d=this.listLoader;if(!this.lockedSwitchers&&d)return"audio"===this.playingMediaType?d.goRound(f,e):d.go(f,e)},this.browserPlay=this.bindBrowserCallback((f=>this.toggle(!0,f))),this.browserPause=this.bindBrowserCallback((f=>this.toggle(!1,f))),this.browserStop=this.bindBrowserCallback((f=>this.stop(f))),this.browserSeekBackward=this.bindBrowserCallback(((f,e)=>this.seekBackward(e,f))),this.browserSeekForward=this.bindBrowserCallback(((f,e)=>this.seekForward(e,f))),this.browserSeekTo=this.bindBrowserCallback(((f,e)=>this.seekTo(e,f))),this.browserNext=this.bindBrowserCallback((f=>f||this.next())),this.browserPrevious=this.bindBrowserCallback((f=>f?this.seekToStart(f):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(f){if(this.managers=f,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const f={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const e in f)try{navigator.mediaSession.setActionHandler(e,f[e])}catch(f){console.warn("MediaSession action is not supported:",e)}}t.Z.addEventListener("document_downloaded",(f=>{const e=this.waitingDocumentsForLoad[f];if(e)for(const f of e)this.onMediaDocumentLoad(f)})),t.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const e={};["volume","muted","playbackRate","loop","round"].forEach((f=>{const d="_"+f;e[f]={get:()=>this[d],set:e=>{this[d]!==e&&(this[d]=e,!this.playingMedia||"loop"===f&&"audio"!==this.playingMediaType||"round"===f||(this.playingMedia[f]=e),"playbackRate"===f&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=e),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,e)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:f,muted:e,playbackRate:d,playbackRates:t,loop:a,round:i}=this;return{volume:f,muted:e,playbackRate:d,playbackRates:t,loop:a,round:i}}setPlaybackParams(f){this.playbackRates=f.playbackRates,this._volume=f.volume,this._muted=f.muted,this._playbackRate=f.playbackRate,this._loop=f.loop,this._round=f.round}addMedia(f,e,d){const{peerId:i,mid:s}=f,n=f.pFlags.is_scheduled?this.scheduled:this.media;let c=n.get(f.peerId);c||n.set(f.peerId,c=new Map);let r=c.get(s);if(r)return r;const o=(0,u.Z)(f);c.set(s,r=document.createElement("round"===o.type||"video"===o.type?"video":"audio")),"round"===o.type&&r.setAttribute("playsinline","true");const h={peerId:i,mid:s,docId:o.id,doc:o,message:f,clean:d,isScheduled:f.pFlags.is_scheduled};this.mediaDetails.set(r,h),r.volume=1,this.container.append(r),r.addEventListener("play",this.onPlay),r.addEventListener("pause",this.onPause),r.addEventListener("ended",this.onEnded),"audio"!==o.type&&(null==f?void 0:f.pFlags.media_unread)&&f.fromId!==t.Z.myId&&r.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(i,[s])}),{once:!0});const l=(0,a.Z)();if(e)l.resolve();else{const e=f.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let d=e.get(i);d||e.set(i,d=new Map),d.set(s,l)}return l.then((()=>y(this,void 0,void 0,(function*(){if(o.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(o)).url)this.onMediaDocumentLoad(r);else{let f=this.waitingDocumentsForLoad[o.id];f||(f=this.waitingDocumentsForLoad[o.id]=new Set),f.add(r),m.Z.downloadMediaURL({media:o})}})))),r}getMedia(f,e,d){const t=(d?this.scheduled:this.media).get(f);return null==t?void 0:t.get(e)}handleSafariStreamable(f){f.addEventListener("play",(()=>{const e=f.currentTime;f.addEventListener("progress",(()=>{f.currentTime=f.duration-1,f.addEventListener("progress",(()=>{f.currentTime=e,f.paused||f.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(f,e,d){const t=d?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,a=t.get(f);if(!a)return;const i=a.get(e);i&&(i.resolve(),a.delete(e),a.size||t.delete(f))}isSafariBuffering(f){return!!f.safariBuffering}setSafariBuffering(f,e){f.safariBuffering=e}setNewMediadata(f,e=this.playingMedia){var d,t;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,g.Z)(e,void 0,!1);const a=(0,u.Z)(f),s=[],n="voice"===a.type||"round"===a.type;let o="",h="";if(null===(d=a.thumbs)||void 0===d?void 0:d.length){const d=a.thumbs[a.thumbs.length-1];if(!d.bytes){const t=yield this.managers.thumbsStorage.getCacheContext(a,d.type);t.url?s.push({src:t.url,sizes:`${d.w}x${d.h}`,type:"image/jpeg"}):m.Z.downloadMediaURL({media:a,thumb:d}).then((()=>{this.playingMedia===e&&t.url&&this.setNewMediadata(f)}))}}else if(n){const e=f.fromId||f.peerId;yield this.managers.appPeersManager.getPeerPhoto(e),o=yield(0,p.Z)(e,!0,!1),h=r.ZP.format("voice"===a.type?"AttachAudio":"AttachRound",!0)}if(!n){const f=a.attributes.find((f=>"documentAttributeAudio"===f._));o=null!==(t=null==f?void 0:f.title)&&void 0!==t?t:a.file_name,h=null==f?void 0:f.performer}s.length||(i.IS_APPLE?c.Z?s.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):s.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((f=>{const e=`${f}x${f}`;s.push({src:`assets/img/android-chrome-${e}.png`,sizes:e,type:"image/png"})})));const l=new MediaMetadata({title:o,artist:h,artwork:s});navigator.mediaSession.metadata=l}))}setCurrentMediadata(){const{playingMedia:f}=this;if(!f)return;const e=this.getMessageByMedia(f);this.setNewMediadata(e,f)}getMessageByMedia(f){return this.mediaDetails.get(f).message}getPlayingDetails(){const{playingMedia:f}=this;if(!f)return;const e=this.getMessageByMedia(f);return{doc:(0,u.Z)(e),message:e,media:f,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,t.Z.dispatchEvent("media_play")}toggle(f,e=this.playingMedia){return!!e&&(void 0===f&&(f=e.paused),e.paused===f&&(f?e.play():e.pause(),!0))}bindBrowserCallback(f){return e=>{f(this.pip,e)}}seekToStart(f){return(null==f?void 0:f.currentTime)>5&&(f.currentTime=0,this.toggle(!0,f),!0)}willBePlayed(f){this.willBePlayedMedia=f}setSearchContext(f){return!(0,l.Z)(this.searchContext,f)&&(this.searchContext=(0,h.Z)(f),!0)}getSearchContext(){return this.searchContext}setTargets(f,e,d){let t=this.listLoader;t?t.reset():t=this.listLoader=new o.Z({loadCount:10,loadWhenLeft:5,processItem:f=>(this.addMedia(f,!1),{peerId:f.peerId,mid:f.mid}),onJump:(f,e)=>{this.playItem(f)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const a=void 0===this.searchContext.folderId;e?t.setTargets(e,d,a):t.reverse=a,t.setSearchContext(this.searchContext),t.current=f,t.load(!0),t.load(!1)}getPlaybackMediaTypeFromMessage(f){const e=(0,u.Z)(f);let d="audio";return(null==e?void 0:e.type)&&("voice"===e.type||"round"===e.type?d="voice":"video"===e.type&&(d="video")),d}setMedia(f,e){const d=this.getPlaybackMediaTypeFromMessage(e);this._playbackRate=this.playbackRates[d],this.playingMedia=f,this.playingMediaType=d,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===d&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(e)}setSingleMedia(f,e){const d=this.playingMedia,t=this.pause();let a;return f?(a=()=>{const f=this.pip;f&&f.pause(),this.pauseMediaInOtherTabs()},f.paused||a(),f.addEventListener("play",a)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),f?this.setMedia(f,e):this.playingMedia=void 0,this.toggleSwitchers(!1),(e=t)=>{this.toggleSwitchers(!0),d&&(this.mediaDetails.get(d)?this.setMedia(d,this.getMessageByMedia(d)):this.next()||this.previous()),this.playingMedia===f&&(this.playingMedia=void 0,this.playingMediaType=void 0),f&&f.removeEventListener("play",a),e&&this.play()}}toggleSwitchers(f){this.lockedSwitchers=!f}setPictureInPicture(f){this.pip=f;const e=new b.Z;e.add(f)("leavepictureinpicture",(()=>{this.pip===f&&(this.pip=void 0,e.removeAll())}),{once:!0}),e.add(f)("play",(e=>{this.playingMedia!==f&&this.pause(),this.pauseMediaInOtherTabs()}))}}const L=new k;s.GO.appMediaPlaybackController=L;const M=L},6008:(f,e,d)=>{d.d(e,{X:()=>r});var t=d(426),a=d(3512),i=d(3035),s=d(4789),n=d(5975),c=d(2648);function r(f,e,d,r,o=250,h){const l=(0,t.v)(e,f||"tabs"===e.dataset.animation?"tabs":"navigation",o,r);if(!f)return l;const b=new Proxy(l,{apply:(e,d,t)=>{const a=+t[0],i=void 0===t[1]||t[1],s=f.querySelector(`[data-tab="${a}"]`)||f.children[a];u(s,a,i)}}),u=(t,n,c=!0)=>{return r=this,b=void 0,g=function*(){const r=e.children[n];if(d){const f=yield d(n,r,c);if(void 0!==f&&!f)return}h&&h.scrollIntoViewNew({element:t.parentElement.children[n],position:"center",forceDirection:c?void 0:s.f.Static,forceDuration:o,axis:"x"}),a.Z.settings.animationsEnabled||(c=!1);const b=l.prevId();if(t.classList.contains("active")||n===b)return!1;const u=c?i.T2:f=>f(),g=f.querySelector(m.toLowerCase()+".active");g&&u((()=>{g.classList.remove("active")})),p&&-1!==b&&c&&u((()=>{const f=t.querySelector("i"),e=t.parentElement.children[b].querySelector("i");e.classList.remove("animate"),f.classList.remove("animate");const d=e.parentElement.parentElement.offsetLeft-f.parentElement.parentElement.offsetLeft,a=e.clientWidth/f.clientWidth;f.style.transform=`translate3d(${d}px, 0, 0) scale3d(${a}, 1, 1)`,(0,i.T2)((()=>{f.classList.add("animate"),f.style.transform="none"}))})),u((()=>{t.classList.add("active")})),l(n,c)},new((u=void 0)||(u=Promise))((function(f,e){function d(f){try{a(g.next(f))}catch(f){e(f)}}function t(f){try{a(g.throw(f))}catch(f){e(f)}}function a(e){var a;e.done?f(e.value):(a=e.value,a instanceof u?a:new u((function(f){f(a)}))).then(d,t)}a((g=g.apply(r,b||[])).next())}));var r,b,u,g},p=!f.classList.contains("no-stripe"),m=f.firstElementChild.tagName;return f.addEventListener("click",(function(e){let d,t=e.target;if(t=(0,n.Z)(t,f),!t)return!1;if(t.dataset.tab){if(d=+t.dataset.tab,-1===d)return!1}else d=(0,c.Z)(t);u(t,d)})),b}},426:(f,e,d)=>{d.d(e,{v:()=>o});var t=d(3512),a=d(3725),i=d(8594),s=d(2648),n=d(3910);function c(f,e,d){const t=e.getBoundingClientRect().width,a=[f,e];return d&&a.reverse(),a[0].style.filter="brightness(80%)",a[0].style.transform=`translate3d(${.25*-t}px, 0, 0)`,a[1].style.transform=`translate3d(${t}px, 0, 0)`,f.classList.add("active"),f.offsetWidth,f.style.transform="",f.style.filter="",()=>{e.style.transform=e.style.filter=""}}function r(f,e,d){const t=e.getBoundingClientRect().width,a=[f,e];return d&&a.reverse(),a[0].style.transform=`translate3d(${-t}px, 0, 0)`,a[1].style.transform=`translate3d(${t}px, 0, 0)`,f.classList.add("active"),f.offsetWidth,f.style.transform="",()=>{e.style.transform=""}}const o=(f,e,d,t,a=!0)=>{let i=null;switch(e){case"tabs":i=r;break;case"navigation":i=c}return f.dataset.animation=e,h(f,i,d,t,a)},h=(f,e,d,c,r=!0,o=!1,h=!0)=>{const l=new Map;let b,u=null;if(h){const d=e?"transitionend":"animationend",t=e=>{if((0,n.Z)(e),e.target.parentElement!==f)return;const a=l.get(e.target);a&&a(),e.target===u&&(!b&&r||(b&&(b.resolve(),b=void 0),c&&c(p.prevId()),f.classList.remove("animating","backwards","disable-hover"),o&&(f.removeEventListener(d,t),u=b=void 0,l.clear())))};f.addEventListener(d,t)}function p(n,o=!0,m){m&&(u=m),n instanceof HTMLElement&&(n=(0,s.Z)(n));const g=p.prevId();if(n===g)return!1;const v=f.children[n];if(t.Z.settings.animationsEnabled&&-1!==g||(o=!1),!h){const e=f.dataset.timeout;void 0!==e&&clearTimeout(+e),delete f.dataset.timeout}if(!o){if(u)u.classList.remove("active","to","from");else if(v){const f=l.get(v);f&&f()}return v&&(v.classList.remove("to","from"),v.classList.add("active")),f.classList.remove("animating","backwards","disable-hover"),u=v,void(c&&c(n))}h||(f.dataset.timeout=""+window.setTimeout((()=>{v.classList.remove("to"),u&&u.classList.remove("from"),f.classList.remove("animating","backwards","disable-hover"),delete f.dataset.timeout}),d)),u&&(u.classList.remove("to"),u.classList.add("from")),f.classList.add("animating");const y=g{v.classList.remove("to"),l.delete(v)})),u){const f=u,e=()=>{f.classList.remove("active","from"),w&&w(),l.delete(f)};if(v)l.set(f,e);else{const t=window.setTimeout(e,d);l.set(f,(()=>{clearTimeout(t),l.delete(f)}))}r&&(b||(b=(0,a.Z)()),(0,i.YW)(b,2*d))}u=v}return p.prevId=()=>u?(0,s.Z)(u):-1,p}},493:(f,e,d)=>{d.d(e,{Z:()=>n});var t=d(8456),a=d(2325),i=d(8115),s=d(3512);function n(f,e=!1,d=!1,n,c=s.Z.managers){return r=this,o=void 0,l=function*(){f||(f=s.Z.myId);let r="";if(f.isUser()){const e=yield c.appUsersManager.getUser(f.toUserId());e.first_name&&(r+=e.first_name),!e.last_name||d&&r||(r+=" "+e.last_name),r=r?r.trim():e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):e.username}else r=(yield c.appChatsManager.getChat(f.toChatId())).title,d&&(r=r.split(" ")[0]);return void 0!==n&&(r=(0,t.Z)(r,n,n)),e?r:(0,i.Z)(r)},new((h=void 0)||(h=Promise))((function(f,e){function d(f){try{a(l.next(f))}catch(f){e(f)}}function t(f){try{a(l.throw(f))}catch(f){e(f)}}function a(e){var a;e.done?f(e.value):(a=e.value,a instanceof h?a:new h((function(f){f(a)}))).then(d,t)}a((l=l.apply(r,o||[])).next())}));var r,o,h,l}},3447:(f,e,d)=>{d.d(e,{Z:()=>i,i:()=>t});const t={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},a=t[""];for(const f in t)f&&Object.assign(a,t[f]);const i=a},5296:(f,e,d)=>{d.d(e,{Kx:()=>s,cK:()=>n,jt:()=>c});var t=d(3035),a=d(3725);const i=new Map;function s(f){const e=function(f){return i.get(f)}(f);e&&(e.isCancelled=!0,e.deferred.resolve())}function n(f,e,d){return d||(d=function(f){s(f);const e={isCancelled:!1,deferred:(0,a.Z)()};return i.set(f,e),e.deferred.then((()=>{i.delete(f)})),e}(e)),(0,t.T2)((()=>{d.isCancelled||(f()?n(f,e,d):d.deferred.resolve())})),d.deferred}function c(f){(0,t.T2)((()=>{f()&&c(f)}))}},9897:(f,e,d)=>{d.d(e,{Z:()=>i});var t=d(410),a=d(9405);function i(f,e,d,t,i=!0){if(fd/t?n=e*d/f|0:(s=f*t/e|0,s>d&&(n=n*d/s|0,s=d)),i&&s>=f&&n>=e&&(s=f,n=e),(0,a.C)(s,n)}t.GO.calcImageInBox=i},6669:(f,e,d)=>{function t(f,e){const d=new Event(e,{bubbles:!0,cancelable:!0});f.dispatchEvent(d)}d.d(e,{Z:()=>t})},5975:(f,e,d)=>{function t(f,e){if(f.parentElement===e)return f;for(;f.parentElement;)if((f=f.parentElement).parentElement===e)return f;return null}d.d(e,{Z:()=>t})},8487:(f,e,d)=>{function t(f){return null==f?void 0:f.isConnected}d.d(e,{Z:()=>t})},2648:(f,e,d)=>{function t(f){if(!f.parentNode)return-1;let e=0;for(;null!==(f=f.previousElementSibling);)++e;return e}d.d(e,{Z:()=>t})},4789:(f,e,d)=>{d.d(e,{Z:()=>r,f:()=>t});var t,a=d(8594),i=d(3035),s=d(5296),n=d(3512),c=d(8487);function r(f){if(void 0===f.margin&&(f.margin=0),void 0===f.maxDistance&&(f.maxDistance=1500),void 0===f.axis&&(f.axis="y"),n.Z.settings.animationsEnabled||(f.forceDirection=t.Static),f.forceDirection===t.Static)return f.forceDuration=0,o(f);const e=(0,i.AD)().then((()=>o(f)));return"y"===f.axis?(0,a.YW)(e):e}function o(f){const{element:e,container:d,getNormalSize:t,axis:a,margin:i,position:n,forceDirection:r,maxDistance:b,forceDuration:u}=f;if(!(0,c.Z)(e))return(0,s.Kx)(d),Promise.resolve();const p="y"===a?"top":"left",m="y"===a?"bottom":"right",g="y"===a?"height":"width",v="y"===a?"scrollHeight":"scrollWidth",y="y"===a?"scrollTop":"scrollLeft",w=e.getBoundingClientRect(),k=d.getBoundingClientRect?d.getBoundingClientRect():document.body.getBoundingClientRect(),L=w[p]-k[p],M=e[v],E=t?t({rect:k}):k[g];let x=d[y];const F=d[v];let C;switch(n){case"start":C=L-i;break;case"end":C=w[m]-k[m]+i;break;case"nearest":case"center":if(Mb?(x=d.scrollTop+=C-b,C=b):C<-b&&(x=d.scrollTop+=C+b,C=-b)),C<0){const f=-x;C=Math.max(C,f)}else if(C>0){const f=F-(x+E);C=Math.min(C,f)}const S=d[y]+C,I=Math.abs(C),P=null!=u?u:250+I/1500*350,Z=Date.now(),D=I<500?l:h,A=()=>{const f=P?Math.min((Date.now()-Z)/P,1):1,e=C*(1-D(f));return d[y]=Math.round(S-e),f<1};if(!P||!C)return(0,s.Kx)(d),A(),Promise.resolve();if(f.startCallback){const e=F-Math.round(S+d["y"===a?"offsetHeight":"offsetWidth"]);f.startCallback({scrollSize:F,scrollPosition:x,distanceToEnd:e,path:C,duration:P,containerRect:k,elementRect:w})}return(0,s.cK)(A,d)}function h(f){return 1-Math.pow(1-f,5)}function l(f){return 1-Math.pow(1-f,3.5)}!function(f){f[f.Up=0]="Up",f[f.Down=1]="Down",f[f.Static=2]="Static"}(t||(t={}))},8801:(f,e,d)=>{d.d(e,{P:()=>a});const t="_";function a(f,e){const d=""["".length-1]||"";let a;switch(f._){case"inputPhotoFileLocation":a=["photo",""[0],f.id,f.thumb_size].filter(Boolean).join(t);break;case"inputDocumentFileLocation":a=["document",""[0],f.id,f.thumb_size].filter(Boolean).join(t);break;case"inputPeerPhotoFileLocation":a=["peerPhoto",f.photo_id,f.pFlags.big?"big":"small"].join(t);break;case"inputStickerSetThumb":a=["stickerSetThumb",f.stickerset.id||f.stickerset.short_name||f.stickerset.emoticon||f.stickerset._,f.thumb_version].join(t);break;case"inputFileLocation":a=f.volume_id+"_"+f.local_id;break;case"inputWebFileLocation":a=["webFile",f.url].join(t);break;default:console.error("Unrecognized location:",f),a=""}return a+(d?"."+d:d)}},1708:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(7625);function a(f){(0,t.Z)(f.history,((e,d,t)=>{e.action.photo||(t.splice(d,1),void 0!==f.count&&--f.count)}))}},6074:(f,e,d)=>{d.d(e,{Z:()=>i});var t=d(7625),a=d(5953);class i{constructor(f){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,a.Z)(this,f)}setTargets(f,e,d){this.previous=f,this.next=e,this.reverse=d}get index(){return void 0!==this.count?this.previous.length:-1}reset(f=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,f),this.setLoaded(!1,f)}go(f,e=!0){let d,t;if(f>0){if(d=this.next.splice(0,f),t=d.pop(),!t)return;void 0!==this.current&&d.unshift(this.current),this.previous.push(...d)}else{if(d=this.previous.splice(Math.max(0,this.previous.length+f),-f),t=d.shift(),!t)return;void 0!==this.current&&d.push(this.current),this.next.unshift(...d)}return this.next.length0),this.current}unsetCurrent(f){f?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(f,e){const d=f>0?Math.max(0,f-this.next.length):Math.min(0,f+this.previous.length),t=this.go(f,!d&&e);return{item:d?void 0:t,leftLength:d}}setLoaded(f,e){return(f?this.loadedAllDown:this.loadedAllUp)!==e&&(f?this.loadedAllDown=e:this.loadedAllUp=e,e||(f?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(f){if(f?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let e,d=f?this.loadPromiseDown:this.loadPromiseUp;return d||(e=f?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=e||(e=this.current),d=this.loadMore(e,f,this.loadCount).then((e=>{return a=this,i=void 0,n=function*(){if((f?this.loadPromiseDown:this.loadPromiseUp)!==d)return;e.items.length{const e=this.processItem?this.processItem(f):f;e&&a.push(e)}));const i=yield Promise.all(a);f?this.reverse?this.previous.unshift(...i):this.next.push(...i):this.reverse?this.next.push(...i):this.previous.unshift(...i),this.onLoadedMore&&this.onLoadedMore()},new((s=void 0)||(s=Promise))((function(f,e){function d(f){try{c(n.next(f))}catch(f){e(f)}}function t(f){try{c(n.throw(f))}catch(f){e(f)}}function c(e){var a;e.done?f(e.value):(a=e.value,a instanceof s?a:new s((function(f){f(a)}))).then(d,t)}c((n=n.apply(a,i||[])).next())}));var a,i,s,n}),(()=>{})).then((()=>{f?this.loadPromiseDown=null:this.loadPromiseUp=null})),f?this.loadPromiseDown=d:this.loadPromiseUp=d,d)}}},3699:(f,e,d)=>{d.d(e,{Z:()=>t});class t{constructor(){this.listeners=new Set}add(f){return(e,d,t)=>{const a={element:f,event:e,callback:d,options:t};return this.addManual(a),a}}addManual(f){var e;f.element.addEventListener(f.event,f.callback,f.options),(null===(e=f.options)||void 0===e?void 0:e.once)&&(f.onceCallback=()=>{this.remove(f),f.onceFired=!0},f.element.addEventListener(f.event,f.onceCallback,f.options)),this.listeners.add(f)}remove(f){f.onceFired||(f.element.removeEventListener(f.event,f.callback,f.options),f.onceCallback&&f.element.removeEventListener(f.event,f.onceCallback,f.options)),this.listeners.delete(f)}removeManual(f,e,d,t){let a;for(const i of this.listeners)if(i.element===f&&i.event===e&&i.callback===d&&i.options===t){a=i;break}a&&this.remove(a)}removeAll(){this.listeners.forEach((f=>{this.remove(f)}))}}},9405:(f,e,d)=>{d.d(e,{C:()=>i,c:()=>a});var t=d(9897);class a{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return(0,t.Z)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function i(f,e){return new a(f,e)}},4755:(f,e,d)=>{d.d(e,{Z:()=>r,_:()=>t});var t,a=d(410),i=d(3241),s=d(9405);!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class n extends i.Z{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:(0,s.C)(270,270),webpage:(0,s.C)(270,200),album:(0,s.C)(270,0),esgSticker:(0,s.C)(68,68),animatedSticker:(0,s.C)(180,180),staticSticker:(0,s.C)(180,180),emojiSticker:(0,s.C)(112,112),poll:(0,s.C)(240,0),round:(0,s.C)(200,200),documentName:(0,s.C)(200,0)},desktop:{regular:(0,s.C)(420,340),webpage:(0,s.C)(420,340),album:(0,s.C)(420,0),esgSticker:(0,s.C)(80,80),animatedSticker:(0,s.C)(200,200),staticSticker:(0,s.C)(200,200),emojiSticker:(0,s.C)(112,112),poll:(0,s.C)(330,0),round:(0,s.C)(280,280),documentName:(0,s.C)(240,0)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const c=new n;a.GO.mediaSizes=c;const r=c},3228:(f,e,d)=>{function t(f,e,d){return fd?d:f}d.d(e,{Z:()=>t})},925:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(4762);function a(f,e=f.HAVE_METADATA,d){return new Promise((a=>{f.readyState>=e?a():f.addEventListener(t.IS_APPLE_MOBILE&&!d?"loadeddata":"canplay",(()=>a()),{once:!0})}))}},3719:(f,e,d)=>{d.d(e,{Z:()=>o});var t=d(3781),a=d(2790),i=d(3512),s=d(7625),n=d(1708),c=d(6074),r=function(f,e,d,t){return new(d||(d=Promise))((function(a,i){function s(f){try{c(t.next(f))}catch(f){i(f)}}function n(f){try{c(t.throw(f))}catch(f){i(f)}}function c(f){var e;f.done?a(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(s,n)}c((t=t.apply(f,e||[])).next())}))};class o extends c.Z{constructor(f={}){var e;super(Object.assign(Object.assign({},f),{loadMore:(f,e,d)=>{const i=e?0:d;let s=null==f?void 0:f.mid;var c;return void 0===s&&(s=this.searchContext.maxId),e||(c=s,1,s=(0,t.Z)((0,a.Z)(c)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==f?void 0:f.peerId),maxId:s,limit:i?0:d,backLimit:i})).then((f=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,n.Z)(f),f.next_rate&&(this.searchContext.nextRate=f.next_rate),{count:f.count,items:f.history})))},processItem:e=>r(this,void 0,void 0,(function*(){if((yield this.filterMids([e.mid])).length)return f.processItem(e)}))})),this.onHistoryDelete=({peerId:f,msgs:e})=>{const d=d=>d.peerId===f&&e.has(d.mid),t=(f,e,t)=>{d(f)&&t.splice(e,1)};(0,s.Z)(this.previous,t),(0,s.Z)(this.next,t),this.current&&d(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=f=>r(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const e=f[this.searchContext.peerId];if(!e)return;const d=Array.from(e).sort(((f,e)=>f-e)),t=yield this.filterMids(d),a=(yield Promise.all(t.map((f=>this.processItem(f))))).filter(Boolean);a.length&&(this.current?this.next.push(...a):this.previous.push(...a))})),this.onMessageSent=({message:f})=>{this.onHistoryMultiappend({[f.peerId]:new Set([f.mid])})},null!==(e=this.managers)&&void 0!==e||(this.managers=i.Z.managers),i.Z.addEventListener("history_delete",this.onHistoryDelete),i.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),i.Z.addEventListener("message_sent",this.onMessageSent),f.isInner||(this.otherSideLoader=new o(Object.assign(Object.assign({},f),{isInner:!0})))}filterMids(f){return r(this,void 0,void 0,(function*(){const e=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,f,e,f.length)}))}setSearchContext(f){this.searchContext=f,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(f)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(){let f=this.previous;return this.otherSideLoader&&(f=f.concat(this.otherSideLoader.previous)),f}getNext(){let f=this.next;return this.otherSideLoader&&(f=f.concat(this.otherSideLoader.next)),f}getCurrent(){var f;return this.current||(null===(f=this.otherSideLoader)||void 0===f?void 0:f.current)}goToOtherEnd(f){return f>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(f,e){var d;let t;if(null===(d=this.otherSideLoader)||void 0===d?void 0:d.current){if(t=this.otherSideLoader.goUnsafe(f,e),t.item)return t.item;if(!((f=t.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(f>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(f>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||f<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(f);this.otherSideLoader.unsetCurrent(f>0)}}if(t=this.goUnsafe(f,e),!t.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(f);this.otherSideLoader&&(f=t.leftLength,t=this.otherSideLoader.goUnsafe(f,e),t.item&&this.unsetCurrent(f>0))}return null==t?void 0:t.item}setLoaded(f,e){var d;const t=super.setLoaded(f,e);if(t&&this.otherSideLoader&&e&&!1!==(null===(d=this.searchContext)||void 0===d?void 0:d.useSearch)){const f=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:f?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(f,!0),this.otherSideLoader.load(!f)}return t}cleanup(){this.reset(),i.Z.removeEventListener("history_delete",this.onHistoryDelete),i.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),i.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},4056:(f,e,d)=>{function t(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(f=>"&#"+f.charCodeAt(0)+";")).replace(//g,">")}d.d(e,{Z:()=>t})},8456:(f,e,d)=>{function t(f,e,d=e+10){return(f=f.trim()).length>d&&(f=f.slice(0,e)+"..."),f}d.d(e,{Z:()=>t})},8594:(f,e,d)=>{d.d(e,{YW:()=>b,ZP:()=>g,e9:()=>m,gp:()=>p});var t=d(3725),a=d(410),i=d(5418);const s=new(d(3241).Z),n="start",c="end";let r=!1,o=(0,t.Z)(),h=0;o.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function b(f,e){r||(o=(0,t.Z)(),s.dispatchEvent(n),r=!0,a.ZP&&l("start")),++h,a.ZP&&l("attach promise, length:",h,e);const d=[void 0!==e?(0,i.Z)(e):void 0,f.finally((()=>{}))].filter(Boolean),c=performance.now(),b=o;return Promise.race(d).then((()=>{o!==b||o.isFulfilled||(--h,a.ZP&&l("promise end, length:",h,performance.now()-c),h<=0&&u())})),o}function u(){o.isFulfilled||(r=!1,h=0,s.dispatchEvent(c),o.resolve(),a.ZP&&l("end"))}function p(){u()}function m(){return o}function g(f,e,d){r&&f();const t=d?d.add(s):s.addEventListener.bind(s),a=d?d.removeManual.bind(d,s):s.removeEventListener.bind(s);return t(n,f),t(c,e),()=>{a(c,e),a(n,f)}}},2312:(f,e,d)=>{d.d(e,{Z:()=>u});var t=d(3725),a=d(8801),i=d(2202),s=d(3512),n=d(410),c=d(6658),r=d(7667),o=d(319),h=d(4211),l=d(7086);const b=new class{constructor(){this.downloads={},this.progress={}}construct(f){this.managers=f,s.Z.addEventListener("download_progress",(f=>{this.progress[f.fileName]=f;const e=this.downloads[f.fileName];e&&e.main.notifyAll(f)}))}getNewDeferred(f,e){const d=(0,t.Z)();let a=this.downloads[f];if(a){const f=a.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((e=>{f[e]&&(d[e]=f[e].bind(f))}))}else a=this.downloads[f]={main:d},d.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",this.managers.apiFileManager.cancelDownload(f),d.reject(e),d.cancel=()=>{}},d.catch((()=>{this.clearDownload(f)})).finally((()=>{delete this.progress[f]}));return a[e]=d}getNewDeferredForUpload(f,e){const d=this.getNewDeferred(f);return e.then(d.resolve,d.reject),d.finally((()=>{this.clearDownload(f)})),d}clearDownload(f){delete this.downloads[f]}getUpload(f){let e=this.getDownload(f);return e||(e=this.getNewDeferred(f),this.managers.appMessagesManager.getUploadPromise(f).then(e.resolve,e.reject),e)}d(f,e,d){let t=this.getDownload(f,d);return t||(t=this.getNewDeferred(f,d),e().then(t.resolve,t.reject),t)}download(f){const e=(0,l.Z)(f);return this.d(e,(()=>this.managers.apiFileManager.download(f)),"blob")}downloadMedia(f,e="blob"){const{downloadOptions:d,fileName:t}=(0,h.Z)(f);return this.d(t,(()=>("url"===e?this.managers.apiFileManager.downloadMediaURL:"void"===e?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia)(f)),e)}downloadMediaURL(f){return this.downloadMedia(f,"url")}downloadMediaVoid(f){return this.downloadMedia(f,"void")}upload(f,e,d){return e||(e=(0,i.Z)(f)),d||(d=this.managers.apiFileManager.upload({file:f,fileName:e})),this.getNewDeferredForUpload(e,d)}getDownload(f,e){const d=this.downloads[f];return d&&d[e]}downloadToDisc(f){const e=f.media,d="document"===e._;d||f.thumb||(f.thumb=e.sizes.slice().pop());const t=this.downloadMedia(f);return t.then((t=>{const i=URL.createObjectURL(t),s=d?(0,c.Z)(e):(0,r.Z)(e,f.thumb),n=f.media.file_name||(0,a.P)(s.location);!function(f,e,d){const t=document.createElement("a");t.href=f,t.download=e,t.target="_blank",t.style.position="absolute",t.style.top="1px",t.style.left="1px",document.body.append(t);try{const f=document.createEvent("MouseEvents");f.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),t.dispatchEvent(f)}catch(e){console.error("Download click error",e);try{t.click()}catch(e){window.open(f,"_blank")}}setTimeout((()=>{t.remove(),d&&d()}),100)}(i,n,(()=>{URL.revokeObjectURL(i)}))}),o.Z),t}};n.GO&&(n.GO.appDownloadManager=b);const u=b},7530:(f,e,d)=>{function t(f){if(f)return f.action?f.action.photo:f.media&&(f.media.photo||f.media.document||f.media.webpage&&(f.media.webpage.document||f.media.webpage.photo))}d.d(e,{Z:()=>t})},8115:(f,e,d)=>{d.d(e,{Z:()=>i});var t=d(6535),a=d(5159);function i(f,e=!1){if(!f)return(0,a.Z)("");let d=(0,t.Z)(f).filter((f=>"messageEntityEmoji"===f._));return(0,a.Z)(f,{entities:d,wrappingDraft:e})}},5159:(f,e,d)=>{d.d(e,{Z:()=>b});var t=d(2423),a=d(3447),i=d(9976),s=d(4762),n=d(8479),c=d(4056),r=d(1379),o=d(6535);function h(f){return f.target="_blank",f.rel="noopener noreferrer",f}var l=d(3591);function b(f,e={}){var d,u,p,m,g;const v=document.createDocumentFragment();if(!f)return v;const y=null!==(d=e.nasty)&&void 0!==d?d:e.nasty={i:0,usedLength:0,text:f},w=null!==(u=e.entities)&&void 0!==u?u:e.entities=(0,o.Z)(y.text),k=null!==(p=e.passEntities)&&void 0!==p?p:e.passEntities={},L=null!==(m=e.contextSite)&&void 0!==m?m:e.contextSite="Telegram",M="Telegram"!==L,E=y.text.length,x=w.length;let F;for(;y.i=E){if("messageEntityCaret"!==f._)continue}else f.offset+f.length>E&&(f=(0,n.Z)(f),f.length=f.offset+f.length-E);f.length&&(y.lastEntity=f);let d=w[y.i+1];const o=f.offset,u=o+f.length,p=Math.min(u,null!==(g=null==d?void 0:d.offset)&&void 0!==g?g:65535),m=y.text.slice(o,u);let x=y.text.slice(o,p);y.usedLengthx.length&&S?S:v,e.voodoo)return v}var C;return y.lastEntity&&(y.usedLength=y.lastEntity.offset+y.lastEntity.length),y.usedLength{d.d(e,{Z:()=>u});var t=d(5814),a=d(410),i=d(5418),s=d(5003),n=d(3772),c=d(4762),r=d(3241);class o extends r.Z{constructor(f){super(),this.worker=f,this.worker.onerror=f=>{try{this.dispatchEvent("workerError",f),this.cleanup(),this.terminate()}catch(f){}},this.worker.onmessage=f=>{this.dispatchEvent(f.data.queryMethodListener,...f.data.queryMethodArguments)}}postMessage(f){this.worker.postMessage(f)}terminate(){this.worker.terminate()}sendQuery(f,...e){if(c.IS_SAFARI)this.worker.postMessage({queryMethod:f,queryMethodArguments:e});else{const d=[];e.forEach((f=>{f instanceof ArrayBuffer&&d.push(f),"object"==typeof f&&f.buffer instanceof ArrayBuffer&&d.push(f.buffer)})),this.worker.postMessage({queryMethod:f,queryMethodArguments:e},d)}}}var h=d(8975),l=d(3789);const b=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=(0,s.kg)("LOTTIE",s.v9.Error),this.onPlayerLoaded=(f,e,d)=>{const t=this.players[f];t?(this.log.debug("onPlayerLoaded"),t.onLoad(e,d)):this.log.warn("onPlayerLoaded on destroyed player:",f,e)},this.onFrame=(f,e,d)=>{const t=this.players[f];t?(void 0!==t.clamped&&(t.clamped=d),t.renderFrame(d,e)):this.log.warn("onFrame on destroyed player:",f,e)},this.onPlayerError=(f,e)=>{const d=this.players[f];d&&t.Z.getAnimations(d.el).forEach((f=>{t.Z.checkAnimation(f,!0,!0)}))}}getAnimation(f){for(const e in this.players)if(this.players[e].el===f)return this.players[e];return null}setLoop(f){for(const e in this.players){const d=this.players[e];d.loop=f,d.autoplay=d._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((f,e)=>{let t=this.workersLimit;for(let a=0;a{this.log("worker #"+a+" ready"),s.addEventListener("frame",this.onFrame),s.addEventListener("loaded",this.onPlayerLoaded),s.addEventListener("error",this.onPlayerError),--t,t||(this.log("workers ready"),f(),this.loaded=!0)}),{once:!0}),s.addEventListener("workerError",(f=>{e("rlottie load error: "+f.message),this.loaded=!1}),{once:!0})}}))}loadAnimationAsAsset(f,e){return f.name=e,this.loadAnimationFromURL(f,"assets/tgs/"+e+".json")}loadAnimationFromURL(f,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then((f=>f.headers&&"application/octet-stream"!==f.headers.get("content-type")?f.blob():f.arrayBuffer().then((f=>l.Z.invokeCrypto("gzipUncompress",f))).then((f=>(0,h.Z)(f,""))))).then((d=>{const t=Object.assign(f,{animationData:d,needUpscale:!0});return t.name||(t.name=e),this.loadAnimationWorker(t)}))):this.loadPromise}waitForFirstFrame(f){return Promise.race([new Promise((e=>{f.addEventListener("firstFrame",e,{once:!0})})),(0,i.Z)(2500)]).then((()=>f))}loadAnimationWorker(f,e=f.group||"",d){return a=this,i=void 0,n=function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),d&&!d())throw new Error("middleware");if(f.width&&f.height||(f.width=parseInt(f.container.style.width),f.height=parseInt(f.container.style.height)),!f.width||!f.height)throw new Error("No size for sticker!");f.group=e;const a=this.initPlayer(f.container,f);return"none"!==e&&t.Z.addAnimation(a,e),a},new((s=void 0)||(s=Promise))((function(f,e){function d(f){try{c(n.next(f))}catch(f){e(f)}}function t(f){try{c(n.throw(f))}catch(f){e(f)}}function c(e){var a;e.done?f(e.value):(a=e.value,a instanceof s?a:new s((function(f){f(a)}))).then(d,t)}c((n=n.apply(a,i||[])).next())}));var a,i,s,n}onDestroy(f){delete this.players[f]}destroyWorkers(){this.workers.forEach(((f,e)=>{f.terminate(),this.log("worker #"+e+" terminated")})),this.log("workers destroyed"),this.workers.length=0}initPlayer(f,e){const d=new n.Z({el:f,worker:this.workers[this.curWorkerNum++],options:e});return this.players[d.reqId]=d,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),d.loadFromData(e.animationData),d}};a.GO.lottieLoader=b;const u=b},3772:(f,e,d)=>{d.d(e,{Z:()=>o});var t=d(7328),a=d(4762),i=d(3241),s=d(4755),n=d(3228),c=d(2384);const r=new class{constructor(){this.cache=new Map}getCache(f){let e=this.cache.get(f);return e||this.cache.set(f,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(f){const e=this.cache.get(f);e&&!--e.counter&&this.cache.delete(f)}getCacheCounter(f){const e=this.cache.get(f);return null==e?void 0:e.counter}generateName(f,e,d,t,a){return[f,e,d,t?"colored":"",a||""].filter(Boolean).join("-")}};class o extends i.Z{constructor({el:f,worker:e,options:d}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.reqId=++o.reqId,this.el=f,this.worker=e;for(let f in d)this.hasOwnProperty(f)&&(this[f]=d[f]);let i;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=d.initFrame,this.color=d.color,this.inverseColor=d.inverseColor,this.name=d.name,this.skipFirstFrameRendering=d.skipFirstFrameRendering,this.toneIndex=d.toneIndex,void 0!==d.skipRatio?i=d.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI)&&this.width<100&&this.height<100&&!d.needUpscale&&(i=.5),this.skipDelta=void 0!==i?1/i|0:1;const c=(0,n.Z)(window.devicePixelRatio,1,2);c>1&&(d.needUpscale?(this.width=Math.round(this.width*c),this.height=Math.round(this.height*c)):c>1&&(this.width>100&&this.height>100?a.IS_APPLE||!s.Z.isMobile?(this.width=Math.round(this.width*c),this.height=Math.round(this.height*c)):c>2.5&&(this.width=Math.round(this.width*(c-1.5)),this.height=Math.round(this.height*(c-1.5))):(this.width=Math.round(this.width*Math.max(1.5,c-1.5)),this.height=Math.round(this.height*Math.max(1.5,c-1.5))))),this.width=Math.round(this.width),this.height=Math.round(this.height),d.noCache||(a.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),t.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=r.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=r.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&r.getCacheCounter(this.cacheName)>1||this.frames.clear())}sendQuery(f,...e){this.worker.sendQuery(f,this.reqId,...e)}loadFromData(f){this.sendQuery("loadFromData",f,this.width,this.height,this.toneIndex)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(f=!0){this.paused||(this.paused=!0,f&&clearTimeout(this.rafId))}resetCurrentFrame(){var f;return this.curFrame=null!==(f=this.initFrame)&&void 0!==f?f:1===this.direction?this.minFrame:this.maxFrame}stop(f=!0){this.pause();const e=this.resetCurrentFrame();f&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(f){this.speed!==f&&(this.speed=f,this.paused||this.setMainLoop())}setDirection(f){this.direction!==f&&(this.direction=f,this.paused||this.setMainLoop())}remove(){c.Z.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&r.releaseCache(this.cacheName),this.cleanup()}applyColor(f){const[e,d,t]=this.color;for(let a=0,i=f.length;a{this.renderFrame2(f,e)}),this.frInterval>-d?-d%this.frInterval:this.frInterval)}this.renderFrame2(f,e)}requestFrame(f){const e=this.frames.get(f);e?this.renderFrame(e,f):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",f,this.clamped))}onLap(){return!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:f,maxFrame:e}=this,d=this.curFrame+f>e?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=f;return this.requestFrame(d),!(d+f>e)||this.onLap()}mainLoopBackwards(){const{skipDelta:f,minFrame:e}=this,d=this.curFrame-fe?1:-1,callback:t})}playToFrame(f){this.pause();const{frame:e,speed:d,callback:t,direction:a}=f;this.setDirection(void 0===a?this.curFrame>e?-1:1:a),void 0!==d&&this.setSpeed(d);const i=[this.curFrame,e];-1===this.direction&&i.reverse(),this.loop=!1,this.setMinMax(i[0],i[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),t&&(this.playToFrameOnFrameCallback=f=>{f===e&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),t())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(f,e){this.color=f,e&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(f){this.inverseColor=f}setMinMax(f=0,e=this.frameCount-1){this.minFrame=f,this.maxFrame=e}onLoad(f,e){return d=this,t=void 0,i=function*(){this.frameCount=f,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,n.Z)(this.initFrame,this.minFrame,this.maxFrame));const d=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const f=60/e;this.skipDelta=this.skipDelta/f|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(d),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const f=Date.now();this.frThen=f+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((a=void 0)||(a=Promise))((function(f,e){function s(f){try{c(i.next(f))}catch(f){e(f)}}function n(f){try{c(i.throw(f))}catch(f){e(f)}}function c(e){var d;e.done?f(e.value):(d=e.value,d instanceof a?d:new a((function(f){f(d)}))).then(s,n)}c((i=i.apply(d,t||[])).next())}));var d,t,a,i}}o.reqId=0},4874:(f,e,d)=>{d.d(e,{Z:()=>o});var t=d(2384),a=d(6008),i=d(410),s=d(4789),n=d(2648);const c=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,a.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var f;(null===(f=this.page)||void 0===f?void 0:f.onShown)&&this.page.onShown()}))}setPage(f){if(f.isAuthPage){this.pagesDiv.style.display="";let e=(0,n.Z)(f.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&t.Z.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&(0,s.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",f.pageEl.style.display="",this.pageId=-1;this.page=f}};i.GO.pagesManager=c;const r=c;class o{constructor(f,e,d,t,a){this.isAuthPage=e,this.onFirstMount=d,this.onMount=t,this.onShown=a,this.installed=!1,this.pageEl=document.body.querySelector("."+f)}mount(...f){return e=this,d=void 0,a=function*(){if(this.onMount&&this.onMount(...f),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...f);e instanceof Promise&&(yield e)}catch(f){console.error("PAGE MOUNT ERROR:",f)}this.installed=!0}r.setPage(this)},new((t=void 0)||(t=Promise))((function(f,i){function s(f){try{c(a.next(f))}catch(f){i(f)}}function n(f){try{c(a.throw(f))}catch(f){i(f)}}function c(e){var d;e.done?f(e.value):(d=e.value,d instanceof t?d:new t((function(f){f(d)}))).then(s,n)}c((a=a.apply(e,d||[])).next())}));var e,d,t,a}}},671:(f,e,d)=>{function t(f){return n(s(f)).join("-")}d.d(e,{Ml:()=>r,N0:()=>t,tB:()=>c,w1:()=>n,zu:()=>o});const a=/\uFE0F/g,i=String.fromCharCode(8205),s=f=>f.indexOf(i)<0?f.replace(a,""):f;function n(f){const e=[];let d=0,t=0,a=0;for(;a55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function c(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function r(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function o(f){return f.split("-").reduce(((f,e)=>f+String.fromCodePoint(parseInt(e,16))),"")}}}]); +//# sourceMappingURL=591.8250ea4e75a163191f15.chunk.js.map \ No newline at end of file diff --git a/public/591.8250ea4e75a163191f15.chunk.js.map b/public/591.8250ea4e75a163191f15.chunk.js.map new file mode 100644 index 000000000..d562bc6a5 --- /dev/null +++ b/public/591.8250ea4e75a163191f15.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"591.8250ea4e75a163191f15.chunk.js","mappings":"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CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAw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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport forEachReverse from \"../helpers/array/forEachReverse\";\r\nimport idleController from \"../helpers/idleController\";\r\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private overrideIdleGroups: Set;\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find((p) => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n \r\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\r\n animation.src = animation.dataset.src;\r\n animation.load();\r\n } */\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n \r\n const animation = player.animation;\r\n if(animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n animation.clearCache();\r\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\r\n animation.dataset.src = animation.src;\r\n animation.src = '';\r\n animation.load();\r\n } */\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n appMediaPlaybackController.addEventListener('pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n idleController.addEventListener('change', (idle) => {\r\n this.checkAnimations(idle);\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n return;\r\n }\r\n \r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (player) => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach((animation) => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach((animation) => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { Document, DocumentAttribute, Message, PhotoSize } from \"../layer\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport copy from \"../helpers/object/copy\";\r\nimport deepEqual from \"../helpers/object/deepEqual\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport getMediaFromMessage from \"../lib/appManagers/utils/messages/getMediaFromMessage\";\r\nimport getPeerTitle from \"./wrappers/getPeerTitle\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport onMediaLoad from \"../helpers/onMediaLoad\";\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n doc: MyDocument,\r\n message: Message.message,\r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\r\n\r\nexport class AppMediaPlaybackController extends EventListenerBase<{\r\n play: (details: ReturnType) => void,\r\n pause: () => void,\r\n playbackParams: (params: ReturnType) => void,\r\n stop: () => void,\r\n}> {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n private playingMediaType: PlaybackMediaType;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n \r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n public loop: boolean;\r\n public round: boolean;\r\n private _volume: number;\r\n private _muted: boolean;\r\n private _playbackRate: number;\r\n private _loop: boolean;\r\n private _round: boolean;\r\n private lockedSwitchers: boolean;\r\n private playbackRates: Record = {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n };\r\n\r\n private pip: HTMLVideoElement;\r\n private managers: AppManagers;\r\n private skipMediaPlayEvent: boolean;\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.browserPlay,\r\n pause: this.browserPause,\r\n stop: this.browserStop,\r\n seekbackward: this.browserSeekBackward,\r\n seekforward: this.browserSeekForward,\r\n seekto: this.browserSeekTo,\r\n previoustrack: this.browserPrevious,\r\n nexttrack: this.browserNext\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (docId) => {\r\n const set = this.waitingDocumentsForLoad[docId];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', () => {\r\n if(this.skipMediaPlayEvent) {\r\n this.skipMediaPlayEvent = false;\r\n return;\r\n }\r\n\r\n if(!this.pause() && this.pip) {\r\n this.pip.pause();\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const,\r\n 'loop' as const,\r\n 'round' as const\r\n ];\r\n keys.forEach((key) => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\r\n this.playbackRates[this.playingMediaType] = value as number;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\r\n }\r\n\r\n public getPlaybackParams() {\r\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\r\n return {\r\n volume, \r\n muted, \r\n playbackRate,\r\n playbackRates,\r\n loop,\r\n round\r\n };\r\n }\r\n\r\n public setPlaybackParams(params: ReturnType) {\r\n this.playbackRates = params.playbackRates;\r\n this._volume = params.volume;\r\n this._muted = params.muted;\r\n this._playbackRate = params.playbackRate;\r\n this._loop = params.loop;\r\n this._round = params.round;\r\n }\r\n \r\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc = getMediaFromMessage(message) as Document.document;\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n doc,\r\n message,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(async() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDownloadManager.downloadMediaURL({media: doc});\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n\r\n if(this.playingMedia === media) {\r\n media.playbackRate = this.playbackRate;\r\n\r\n if(doc.type === 'audio') {\r\n media.loop = this.loop;\r\n }\r\n }\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n if(document.pictureInPictureElement) {\r\n return;\r\n }\r\n\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n // if(result.cached) {\r\n // const url = await result.loadPromise;\r\n // artwork.push({\r\n // src: url,\r\n // sizes: '160x160',\r\n // type: 'image/jpeg'\r\n // });\r\n // } else {\r\n // result.loadPromise.then((url) => {\r\n // if(this.playingMedia !== playingMedia || !url) {\r\n // return;\r\n // }\r\n \r\n // this.setNewMediadata(message);\r\n // });\r\n // }\r\n }\r\n\r\n title = await getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute?.title ?? doc.file_name;\r\n artist = attribute?.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n public setCurrentMediadata() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) return;\r\n const message = this.getMessageByMedia(playingMedia);\r\n this.setNewMediadata(message, playingMedia);\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\r\n const details = this.mediaDetails.get(media);\r\n return details.message;\r\n // const {peerId, mid} = details;\r\n // const message = details.isScheduled ? \r\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : \r\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\r\n // return message;\r\n }\r\n\r\n public getPlayingDetails() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) {\r\n return;\r\n }\r\n\r\n const message = this.getMessageByMedia(playingMedia);\r\n return {\r\n doc: getMediaFromMessage(message) as MyDocument,\r\n message,\r\n media: playingMedia,\r\n playbackParams: this.getPlaybackParams()\r\n };\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n this.setMedia(media, message);\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n const listLoader = this.listLoader;\r\n const current = listLoader.getCurrent();\r\n if(!current || !verify(current)) {\r\n const previous = listLoader.getPrevious();\r\n\r\n let idx = previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(previous.length - idx);\r\n } else {\r\n idx = listLoader.getNext().findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n if(this.playingMedia !== media) {\r\n return;\r\n }\r\n\r\n this.dispatchEvent('play', this.getPlayingDetails());\r\n this.pauseMediaInOtherTabs();\r\n }, 0);\r\n };\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n // if(this.pip) {\r\n // this.pip.play();\r\n // }\r\n\r\n this.dispatchEvent('pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || \r\n (!this.round && listLoader.current && !listLoader.next.length) || \r\n !listLoader.getNext().length || \r\n !this.next()) {\r\n this.stop();\r\n this.dispatchEvent('stop');\r\n }\r\n };\r\n\r\n public pauseMediaInOtherTabs() {\r\n this.skipMediaPlayEvent = true;\r\n rootScope.dispatchEvent('media_play');\r\n }\r\n\r\n // public get pip() {\r\n // return document.pictureInPictureElement as HTMLVideoElement;\r\n // }\r\n\r\n public toggle(play?: boolean, media = this.playingMedia) {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = media.paused;\r\n }\r\n\r\n if(media.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n media.play();\r\n } else {\r\n media.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = (media = this.playingMedia) => {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n if(media === this.playingMedia) {\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n \r\n this.mediaDetails.delete(media);\r\n }\r\n \r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n \r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public go = (length: number, dispatchJump?: boolean) => {\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || !listLoader) {\r\n return;\r\n }\r\n\r\n if(this.playingMediaType === 'audio') {\r\n return listLoader.goRound(length, dispatchJump);\r\n } else {\r\n return listLoader.go(length, dispatchJump);\r\n }\r\n };\r\n\r\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\r\n const handler: MediaSessionActionHandler = (details) => {\r\n cb(this.pip, details);\r\n };\r\n\r\n return handler;\r\n }\r\n\r\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\r\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\r\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\r\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\r\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\r\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\r\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\r\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\r\n\r\n public next = () => {\r\n return this.go(1);\r\n };\r\n\r\n public previous = () => {\r\n if(this.seekToStart(this.playingMedia)) {\r\n return;\r\n }\r\n\r\n return this.go(-1);\r\n };\r\n\r\n public seekToStart(media: HTMLMediaElement) {\r\n if(media?.currentTime > 5) {\r\n media.currentTime = 0;\r\n this.toggle(true, media);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n let listLoader = this.listLoader;\r\n if(!listLoader) {\r\n listLoader = this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n this.dispatchEvent('stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n listLoader.reverse = reverse;\r\n }\r\n\r\n listLoader.setSearchContext(this.searchContext);\r\n listLoader.current = current;\r\n\r\n listLoader.load(true);\r\n listLoader.load(false);\r\n }\r\n\r\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n let mediaType: PlaybackMediaType = 'audio';\r\n if(doc?.type) {\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n mediaType = 'voice';\r\n } else if(doc.type === 'video') {\r\n mediaType = 'video';\r\n }\r\n }\r\n\r\n return mediaType;\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\r\n\r\n this._playbackRate = this.playbackRates[mediaType];\r\n\r\n this.playingMedia = media;\r\n this.playingMediaType = mediaType;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if(mediaType === 'audio') {\r\n this.playingMedia.loop = this.loop;\r\n }\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n let onPlay: () => void;\r\n if(media) {\r\n onPlay = () => {\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n };\r\n \r\n if(!media.paused) {\r\n onPlay();\r\n }\r\n \r\n media.addEventListener('play', onPlay);\r\n } else { // maybe it's voice recording\r\n this.pauseMediaInOtherTabs();\r\n }\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return (playPaused = wasPlaying) => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n \r\n // If it's still not cleaned\r\n if(this.playingMedia === media) {\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n if(media) {\r\n media.removeEventListener('play', onPlay);\r\n }\r\n\r\n // I don't remember what it was for\r\n // if(media && this.playingMedia === media) {\r\n // this.stop();\r\n // }\r\n\r\n if(playPaused) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n\r\n public setPictureInPicture(video: HTMLVideoElement) {\r\n this.pip = video;\r\n\r\n // let wasPlaying = this.pause();\r\n\r\n const listenerSetter = new ListenerSetter();\r\n listenerSetter.add(video)('leavepictureinpicture', () => {\r\n if(this.pip !== video) {\r\n return;\r\n }\r\n\r\n this.pip = undefined;\r\n // if(wasPlaying) {\r\n // this.play();\r\n // }\r\n\r\n listenerSetter.removeAll();\r\n }, {once: true});\r\n\r\n listenerSetter.add(video)('play', (e) => {\r\n if(this.playingMedia !== video) {\r\n this.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n // if(this.pause()) {\r\n // listenerSetter.add(video)('pause', () => {\r\n // this.play();\r\n // }, {once: true});\r\n // }\r\n });\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement, \r\n content: HTMLElement, \r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise, \r\n onTransitionEnd?: () => void, \r\n transitionTime = 250, \r\n scrollableX?: ScrollableX\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(!tabs) {\r\n return selectTab;\r\n }\r\n\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n\r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = await onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n if(prev) {\r\n mutateCallback(() => {\r\n prev.classList.remove('active');\r\n });\r\n }\r\n \r\n // a great stripe from Jolly Cobra\r\n if(useStripe && prevId !== -1 && animate) {\r\n mutateCallback(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n\r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n fastRaf(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n\r\n mutateCallback(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport { Chat } from \"../../layer\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport I18n from \"../../lib/langPack\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport rootScope from \"../../lib/rootScope\";\n\nexport default async function getPeerTitle(peerId: PeerId, plainText: true, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText?: false, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText: boolean, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false, _limitSymbols?: number, managers: AppManagers = rootScope.managers): Promise {\n if(!peerId) {\n peerId = rootScope.myId;\n }\n \n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n\n if(!title) title = user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : user.username;\n else title = title.trim();\n } else {\n const chat: Chat.chat = await managers.appChatsManager.getChat(peerId.toChatId());\n title = chat.title;\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(_limitSymbols !== undefined) {\n title = limitSymbols(title, _limitSymbols, _limitSymbols);\n }\n \n return plainText ? title : wrapEmojiText(title);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport const EmojiVersions: {[version: string]: {[emoji: string]: number}} = {\"14\":{\"1f6dd\":4867,\"1f6de\":4916,\"1f6df\":4923,\"1f7f0\":62832,\"1f979\":183,\"1f9cc\":1557,\"1fa7b\":61332,\"1fa7c\":61330,\"1faa9\":51093,\"1faaa\":61364,\"1faab\":61189,\"1faac\":51085,\"1fab7\":2651,\"1fab8\":2631,\"1fab9\":2672,\"1faba\":2673,\"1fac3\":1520,\"1fac4\":1521,\"1fac5\":1505,\"1fad7\":3793,\"1fad8\":3707,\"1fad9\":3804,\"1fae0\":111,\"1fae1\":136,\"1fae2\":132,\"1fae3\":133,\"1fae4\":174,\"1fae5\":142,\"1fae6\":1385,\"1fae7\":61353,\"1faf0\":1341,\"1faf1\":1332,\"1faf2\":1333,\"1faf3\":1334,\"1faf4\":1335,\"1faf5\":1351,\"1faf6\":1360,\"1faf1-1f3fb-200d-1faf2-1f3fc\":0,\"1faf1-1f3fb-200d-1faf2-1f3fd\":0,\"1faf1-1f3fb-200d-1faf2-1f3fe\":0,\"1faf1-1f3fb-200d-1faf2-1f3ff\":0,\"1faf1-1f3fc-200d-1faf2-1f3fb\":0,\"1faf1-1f3fc-200d-1faf2-1f3fd\":0,\"1faf1-1f3fc-200d-1faf2-1f3fe\":0,\"1faf1-1f3fc-200d-1faf2-1f3ff\":0,\"1faf1-1f3fd-200d-1faf2-1f3fb\":0,\"1faf1-1f3fd-200d-1faf2-1f3fc\":0,\"1faf1-1f3fd-200d-1faf2-1f3fe\":0,\"1faf1-1f3fd-200d-1faf2-1f3ff\":0,\"1faf1-1f3fe-200d-1faf2-1f3fb\":0,\"1faf1-1f3fe-200d-1faf2-1f3fc\":0,\"1faf1-1f3fe-200d-1faf2-1f3fd\":0,\"1faf1-1f3fe-200d-1faf2-1f3ff\":0,\"1faf1-1f3ff-200d-1faf2-1f3fb\":0,\"1faf1-1f3ff-200d-1faf2-1f3fc\":0,\"1faf1-1f3ff-200d-1faf2-1f3fd\":0,\"1faf1-1f3ff-200d-1faf2-1f3fe\":0,\"1fac3-1f3fb\":0,\"1fac3-1f3fc\":0,\"1fac3-1f3fd\":0,\"1fac3-1f3fe\":0,\"1fac3-1f3ff\":0,\"1fac4-1f3fb\":0,\"1fac4-1f3fc\":0,\"1fac4-1f3fd\":0,\"1fac4-1f3fe\":0,\"1fac4-1f3ff\":0,\"1fac5-1f3fb\":0,\"1fac5-1f3fc\":0,\"1fac5-1f3fd\":0,\"1fac5-1f3fe\":0,\"1fac5-1f3ff\":0,\"1faf0-1f3fb\":0,\"1faf0-1f3fc\":0,\"1faf0-1f3fd\":0,\"1faf0-1f3fe\":0,\"1faf0-1f3ff\":0,\"1faf1-1f3fb\":0,\"1faf1-1f3fc\":0,\"1faf1-1f3fd\":0,\"1faf1-1f3fe\":0,\"1faf1-1f3ff\":0,\"1faf2-1f3fb\":0,\"1faf2-1f3fc\":0,\"1faf2-1f3fd\":0,\"1faf2-1f3fe\":0,\"1faf2-1f3ff\":0,\"1faf3-1f3fb\":0,\"1faf3-1f3fc\":0,\"1faf3-1f3fd\":0,\"1faf3-1f3fe\":0,\"1faf3-1f3ff\":0,\"1faf4-1f3fb\":0,\"1faf4-1f3fc\":0,\"1faf4-1f3fd\":0,\"1faf4-1f3fe\":0,\"1faf4-1f3ff\":0,\"1faf5-1f3fb\":0,\"1faf5-1f3fc\":0,\"1faf5-1f3fd\":0,\"1faf5-1f3fe\":0,\"1faf5-1f3ff\":0,\"1faf6-1f3fb\":0,\"1faf6-1f3fc\":0,\"1faf6-1f3fd\":0,\"1faf6-1f3fe\":0,\"1faf6-1f3ff\":0},\"\":{\"2049\":62835,\"2122\":62863,\"2139\":62888,\"2194\":62764,\"2195\":62763,\"2196\":62762,\"2197\":62756,\"2198\":62758,\"2199\":62760,\"2328\":61194,\"2600\":4990,\"2601\":4998,\"2602\":41013,\"2603\":41018,\"2604\":41020,\"2611\":62851,\"2614\":41014,\"2615\":3781,\"2618\":2667,\"2620\":1106,\"2622\":62753,\"2623\":62754,\"2626\":62783,\"2638\":62780,\"2639\":177,\"2648\":62788,\"2649\":62789,\"2650\":62796,\"2651\":62797,\"2652\":62798,\"2653\":62799,\"2660\":51095,\"2663\":51098,\"2665\":51096,\"2666\":51097,\"2668\":4865,\"2692\":61297,\"2693\":4922,\"2694\":61300,\"2696\":61311,\"2697\":61319,\"2699\":61309,\"2702\":61284,\"2705\":62850,\"2708\":4931,\"2709\":61245,\"2712\":61259,\"2714\":62852,\"2716\":62828,\"2721\":62779,\"2728\":51029,\"2733\":62858,\"2734\":62859,\"2744\":41017,\"2747\":62860,\"2753\":62836,\"2754\":62837,\"2755\":62838,\"2757\":62839,\"2763\":1137,\"2764\":1141,\"2795\":62829,\"2796\":62830,\"2797\":62831,\"2934\":62767,\"2935\":62768,\"3030\":62840,\"3297\":62912,\"3299\":62913,\"0023-20e3\":62864,\"002a-20e3\":62865,\"0030-20e3\":62866,\"0031-20e3\":62867,\"0032-20e3\":62868,\"0033-20e3\":62869,\"0034-20e3\":62870,\"0035-20e3\":62871,\"0036-20e3\":62872,\"0037-20e3\":62873,\"0038-20e3\":62874,\"0039-20e3\":62875,\"00a9\":62861,\"00ae\":62862,\"1f004\":51101,\"1f0cf\":51100,\"1f170\":62882,\"1f171\":62884,\"1f17e\":62893,\"1f17f\":62895,\"1f18e\":62883,\"1f191\":62885,\"1f192\":62886,\"1f193\":62887,\"1f194\":62889,\"1f195\":62891,\"1f196\":62892,\"1f197\":62894,\"1f198\":62896,\"1f199\":62897,\"1f19a\":62898,\"1f1e6-1f1e8\":71594,\"1f1e6-1f1e9\":71595,\"1f1e6-1f1ea\":71596,\"1f1e6-1f1eb\":71597,\"1f1e6-1f1ec\":71598,\"1f1e6-1f1ee\":71599,\"1f1e6-1f1f1\":71600,\"1f1e6-1f1f2\":71601,\"1f1e6-1f1f4\":71602,\"1f1e6-1f1f6\":71603,\"1f1e6-1f1f7\":71604,\"1f1e6-1f1f8\":71605,\"1f1e6-1f1f9\":71606,\"1f1e6-1f1fa\":71607,\"1f1e6-1f1fc\":71608,\"1f1e6-1f1fd\":71609,\"1f1e6-1f1ff\":71610,\"1f1e7-1f1e6\":71611,\"1f1e7-1f1e7\":71612,\"1f1e7-1f1e9\":71613,\"1f1e7-1f1ea\":71614,\"1f1e7-1f1eb\":71615,\"1f1e7-1f1ec\":71616,\"1f1e7-1f1ed\":71617,\"1f1e7-1f1ee\":71618,\"1f1e7-1f1ef\":71619,\"1f1e7-1f1f1\":71620,\"1f1e7-1f1f2\":71621,\"1f1e7-1f1f3\":71622,\"1f1e7-1f1f4\":71623,\"1f1e7-1f1f6\":71624,\"1f1e7-1f1f7\":71625,\"1f1e7-1f1f8\":71626,\"1f1e7-1f1f9\":71627,\"1f1e7-1f1fb\":71628,\"1f1e7-1f1fc\":71629,\"1f1e7-1f1fe\":71630,\"1f1e7-1f1ff\":71631,\"1f1e8-1f1e6\":71632,\"1f1e8-1f1e8\":71633,\"1f1e8-1f1e9\":71634,\"1f1e8-1f1eb\":71635,\"1f1e8-1f1ec\":71636,\"1f1e8-1f1ed\":71637,\"1f1e8-1f1ee\":71638,\"1f1e8-1f1f0\":71639,\"1f1e8-1f1f1\":71640,\"1f1e8-1f1f2\":71641,\"1f1e8-1f1f3\":71642,\"1f1e8-1f1f4\":71643,\"1f1e8-1f1f5\":71644,\"1f1e8-1f1f7\":71645,\"1f1e8-1f1fa\":71646,\"1f1e8-1f1fb\":71647,\"1f1e8-1f1fc\":71648,\"1f1e8-1f1fd\":71649,\"1f1e8-1f1fe\":71650,\"1f1e8-1f1ff\":71651,\"1f1e9-1f1ea\":71652,\"1f1e9-1f1ec\":71653,\"1f1e9-1f1ef\":71654,\"1f1e9-1f1f0\":71655,\"1f1e9-1f1f2\":71656,\"1f1e9-1f1f4\":71657,\"1f1e9-1f1ff\":71658,\"1f1ea-1f1e6\":71659,\"1f1ea-1f1e8\":71660,\"1f1ea-1f1ea\":71661,\"1f1ea-1f1ec\":71662,\"1f1ea-1f1ed\":71663,\"1f1ea-1f1f7\":71664,\"1f1ea-1f1f8\":71665,\"1f1ea-1f1f9\":71666,\"1f1ea-1f1fa\":71667,\"1f1eb-1f1ee\":71668,\"1f1eb-1f1ef\":71669,\"1f1eb-1f1f0\":71670,\"1f1eb-1f1f2\":71671,\"1f1eb-1f1f4\":71672,\"1f1eb-1f1f7\":71673,\"1f1ec-1f1e6\":71674,\"1f1ec-1f1e7\":71675,\"1f1ec-1f1e9\":71676,\"1f1ec-1f1ea\":71677,\"1f1ec-1f1eb\":71678,\"1f1ec-1f1ec\":71679,\"1f1ec-1f1ed\":71680,\"1f1ec-1f1ee\":71681,\"1f1ec-1f1f1\":71682,\"1f1ec-1f1f2\":71683,\"1f1ec-1f1f3\":71684,\"1f1ec-1f1f5\":71685,\"1f1ec-1f1f6\":71686,\"1f1ec-1f1f7\":71687,\"1f1ec-1f1f8\":71688,\"1f1ec-1f1f9\":71689,\"1f1ec-1f1fa\":71690,\"1f1ec-1f1fc\":71691,\"1f1ec-1f1fe\":71692,\"1f1ed-1f1f0\":71693,\"1f1ed-1f1f2\":71694,\"1f1ed-1f1f3\":71695,\"1f1ed-1f1f7\":71696,\"1f1ed-1f1f9\":71697,\"1f1ed-1f1fa\":71698,\"1f1ee-1f1e8\":71699,\"1f1ee-1f1e9\":71700,\"1f1ee-1f1ea\":71701,\"1f1ee-1f1f1\":71702,\"1f1ee-1f1f2\":71703,\"1f1ee-1f1f3\":71704,\"1f1ee-1f1f4\":71705,\"1f1ee-1f1f6\":71706,\"1f1ee-1f1f7\":71707,\"1f1ee-1f1f8\":71708,\"1f1ee-1f1f9\":71709,\"1f1ef-1f1ea\":71710,\"1f1ef-1f1f2\":71711,\"1f1ef-1f1f4\":71712,\"1f1ef-1f1f5\":71713,\"1f1f0-1f1ea\":71714,\"1f1f0-1f1ec\":71715,\"1f1f0-1f1ed\":71716,\"1f1f0-1f1ee\":71717,\"1f1f0-1f1f2\":71718,\"1f1f0-1f1f3\":71719,\"1f1f0-1f1f5\":71720,\"1f1f0-1f1f7\":71721,\"1f1f0-1f1fc\":71722,\"1f1f0-1f1fe\":71723,\"1f1f0-1f1ff\":71724,\"1f1f1-1f1e6\":71725,\"1f1f1-1f1e7\":71726,\"1f1f1-1f1e8\":71727,\"1f1f1-1f1ee\":71728,\"1f1f1-1f1f0\":71729,\"1f1f1-1f1f7\":71730,\"1f1f1-1f1f8\":71731,\"1f1f1-1f1f9\":71732,\"1f1f1-1f1fa\":71733,\"1f1f1-1f1fb\":71734,\"1f1f1-1f1fe\":71735,\"1f1f2-1f1e6\":71736,\"1f1f2-1f1e8\":71737,\"1f1f2-1f1e9\":71738,\"1f1f2-1f1ea\":71739,\"1f1f2-1f1eb\":71740,\"1f1f2-1f1ec\":71741,\"1f1f2-1f1ed\":71742,\"1f1f2-1f1f0\":71743,\"1f1f2-1f1f1\":71744,\"1f1f2-1f1f2\":71745,\"1f1f2-1f1f3\":71746,\"1f1f2-1f1f4\":71747,\"1f1f2-1f1f5\":71748,\"1f1f2-1f1f6\":71749,\"1f1f2-1f1f7\":71750,\"1f1f2-1f1f8\":71751,\"1f1f2-1f1f9\":71752,\"1f1f2-1f1fa\":71753,\"1f1f2-1f1fb\":71754,\"1f1f2-1f1fc\":71755,\"1f1f2-1f1fd\":71756,\"1f1f2-1f1fe\":71757,\"1f1f2-1f1ff\":71758,\"1f1f3-1f1e6\":71759,\"1f1f3-1f1e8\":71760,\"1f1f3-1f1ea\":71761,\"1f1f3-1f1eb\":71762,\"1f1f3-1f1ec\":71763,\"1f1f3-1f1ee\":71764,\"1f1f3-1f1f1\":71765,\"1f1f3-1f1f4\":71766,\"1f1f3-1f1f5\":71767,\"1f1f3-1f1f7\":71768,\"1f1f3-1f1fa\":71769,\"1f1f3-1f1ff\":71770,\"1f1f4-1f1f2\":71771,\"1f1f5-1f1e6\":71772,\"1f1f5-1f1ea\":71773,\"1f1f5-1f1eb\":71774,\"1f1f5-1f1ec\":71775,\"1f1f5-1f1ed\":71776,\"1f1f5-1f1f0\":71777,\"1f1f5-1f1f1\":71778,\"1f1f5-1f1f2\":71779,\"1f1f5-1f1f3\":71780,\"1f1f5-1f1f7\":71781,\"1f1f5-1f1f8\":71782,\"1f1f5-1f1f9\":71783,\"1f1f5-1f1fc\":71784,\"1f1f5-1f1fe\":71785,\"1f1f6-1f1e6\":71786,\"1f1f7-1f1ea\":71787,\"1f1f7-1f1f4\":71788,\"1f1f7-1f1f8\":71789,\"1f1f7-1f1fa\":71790,\"1f1f7-1f1fc\":71791,\"1f1f8-1f1e6\":71792,\"1f1f8-1f1e7\":71793,\"1f1f8-1f1e8\":71794,\"1f1f8-1f1e9\":71795,\"1f1f8-1f1ea\":71796,\"1f1f8-1f1ec\":71797,\"1f1f8-1f1ed\":71798,\"1f1f8-1f1ee\":71799,\"1f1f8-1f1ef\":71800,\"1f1f8-1f1f0\":71801,\"1f1f8-1f1f1\":71802,\"1f1f8-1f1f2\":71803,\"1f1f8-1f1f3\":71804,\"1f1f8-1f1f4\":71805,\"1f1f8-1f1f7\":71806,\"1f1f8-1f1f8\":71807,\"1f1f8-1f1f9\":71808,\"1f1f8-1f1fb\":71809,\"1f1f8-1f1fd\":71810,\"1f1f8-1f1fe\":71811,\"1f1f8-1f1ff\":71812,\"1f1f9-1f1e6\":71813,\"1f1f9-1f1e8\":71814,\"1f1f9-1f1e9\":71815,\"1f1f9-1f1eb\":71816,\"1f1f9-1f1ec\":71817,\"1f1f9-1f1ed\":71818,\"1f1f9-1f1ef\":71819,\"1f1f9-1f1f0\":71820,\"1f1f9-1f1f1\":71821,\"1f1f9-1f1f2\":71822,\"1f1f9-1f1f3\":71823,\"1f1f9-1f1f4\":71824,\"1f1f9-1f1f7\":71825,\"1f1f9-1f1f9\":71826,\"1f1f9-1f1fb\":71827,\"1f1f9-1f1fc\":71828,\"1f1f9-1f1ff\":71829,\"1f1fa-1f1e6\":71830,\"1f1fa-1f1ec\":71831,\"1f1fa-1f1f2\":71832,\"1f1fa-1f1f3\":71833,\"1f1fa-1f1f8\":71834,\"1f1fa-1f1fe\":71835,\"1f1fa-1f1ff\":71836,\"1f1fb-1f1e6\":71837,\"1f1fb-1f1e8\":71838,\"1f1fb-1f1ea\":71839,\"1f1fb-1f1ec\":71840,\"1f1fb-1f1ee\":71841,\"1f1fb-1f1f3\":71842,\"1f1fb-1f1fa\":71843,\"1f1fc-1f1eb\":71844,\"1f1fc-1f1f8\":71845,\"1f1fd-1f1f0\":71846,\"1f1fe-1f1ea\":71847,\"1f1fe-1f1f9\":71848,\"1f1ff-1f1e6\":71849,\"1f1ff-1f1f2\":71850,\"1f1ff-1f1fc\":71851,\"1f201\":62899,\"1f202\":62900,\"1f21a\":62906,\"1f22f\":62903,\"1f232\":62907,\"1f233\":62911,\"1f234\":62910,\"1f235\":62915,\"1f236\":62902,\"1f237\":62901,\"1f238\":62909,\"1f239\":62905,\"1f23a\":62914,\"1f250\":62904,\"1f251\":62908,\"1f300\":41010,\"1f301\":4857,\"1f302\":41012,\"1f303\":4858,\"1f304\":4860,\"1f305\":4861,\"1f306\":4862,\"1f307\":4863,\"1f308\":41011,\"1f309\":4864,\"1f30a\":41023,\"1f30b\":4815,\"1f30c\":4997,\"1f30d\":4806,\"1f30e\":4807,\"1f30f\":4808,\"1f310\":4809,\"1f311\":4977,\"1f312\":4978,\"1f313\":4979,\"1f314\":4980,\"1f315\":4981,\"1f316\":4982,\"1f317\":4983,\"1f318\":4984,\"1f319\":4985,\"1f31a\":4986,\"1f31b\":4987,\"1f31c\":4988,\"1f31d\":4991,\"1f31e\":4992,\"1f31f\":4995,\"1f320\":4996,\"1f321\":4989,\"1f324\":41001,\"1f325\":41002,\"1f326\":41003,\"1f327\":41004,\"1f328\":41005,\"1f329\":41006,\"1f32a\":41007,\"1f32b\":41008,\"1f32c\":41009,\"1f32d\":3725,\"1f32e\":3727,\"1f32f\":3728,\"1f330\":3708,\"1f331\":2659,\"1f332\":2661,\"1f333\":2662,\"1f334\":2663,\"1f335\":2664,\"1f336\":3698,\"1f337\":2658,\"1f338\":2649,\"1f339\":2653,\"1f33a\":2655,\"1f33b\":2656,\"1f33c\":2657,\"1f33d\":3697,\"1f33e\":2665,\"1f33f\":2666,\"1f340\":2668,\"1f341\":2669,\"1f342\":2670,\"1f343\":2671,\"1f344\":3705,\"1f345\":3690,\"1f346\":3694,\"1f347\":3674,\"1f348\":3675,\"1f349\":3676,\"1f34a\":3677,\"1f34b\":3678,\"1f34c\":3679,\"1f34d\":3680,\"1f34e\":3682,\"1f34f\":3683,\"1f350\":3684,\"1f351\":3685,\"1f352\":3686,\"1f353\":3687,\"1f354\":3722,\"1f355\":3724,\"1f356\":3718,\"1f357\":3719,\"1f358\":3744,\"1f359\":3745,\"1f35a\":3746,\"1f35b\":3747,\"1f35c\":3748,\"1f35d\":3749,\"1f35e\":3709,\"1f35f\":3723,\"1f360\":3750,\"1f361\":3756,\"1f362\":3751,\"1f363\":3752,\"1f364\":3753,\"1f365\":3754,\"1f366\":3765,\"1f367\":3766,\"1f368\":3767,\"1f369\":3768,\"1f36a\":3769,\"1f36b\":3774,\"1f36c\":3775,\"1f36d\":3776,\"1f36e\":3777,\"1f36f\":3778,\"1f370\":3771,\"1f371\":3743,\"1f372\":3735,\"1f373\":3733,\"1f374\":3801,\"1f375\":3783,\"1f376\":3784,\"1f377\":3786,\"1f378\":3787,\"1f379\":3788,\"1f37a\":3789,\"1f37b\":3790,\"1f37c\":3779,\"1f37d\":3800,\"1f37e\":3785,\"1f37f\":3739,\"1f380\":51040,\"1f381\":51041,\"1f382\":3770,\"1f383\":51024,\"1f384\":51025,\"1f385\":1527,\"1f386\":51026,\"1f387\":51027,\"1f388\":51030,\"1f389\":51031,\"1f38a\":51032,\"1f38b\":51033,\"1f38c\":71588,\"1f38d\":51034,\"1f38e\":51035,\"1f38f\":51036,\"1f390\":51037,\"1f391\":51038,\"1f392\":61134,\"1f393\":61147,\"1f396\":51045,\"1f397\":51042,\"1f399\":61167,\"1f39a\":61168,\"1f39b\":61169,\"1f39e\":61203,\"1f39f\":51043,\"1f3a0\":4866,\"1f3a1\":4868,\"1f3a2\":4869,\"1f3a3\":51072,\"1f3a4\":61170,\"1f3a5\":61202,\"1f3a6\":62819,\"1f3a7\":61171,\"1f3a8\":51105,\"1f3a9\":61146,\"1f3aa\":4871,\"1f3ab\":51044,\"1f3ac\":61205,\"1f3ad\":51103,\"1f3ae\":51086,\"1f3af\":51078,\"1f3b0\":51088,\"1f3b1\":51081,\"1f3b2\":51089,\"1f3b3\":51060,\"1f3b4\":51102,\"1f3b5\":61165,\"1f3b6\":61166,\"1f3b7\":61173,\"1f3b8\":61175,\"1f3b9\":61176,\"1f3ba\":61177,\"1f3bb\":61178,\"1f3bc\":61164,\"1f3bd\":51074,\"1f3be\":51058,\"1f3bf\":51075,\"1f3c0\":51054,\"1f3c1\":71586,\"1f3c2\":1600,\"1f3c3-200d-2640\":1584,\"1f3c3-200d-2642\":1583,\"1f3c3\":1582,\"1f3c4-200d-2640\":1606,\"1f3c4-200d-2642\":1605,\"1f3c4\":1604,\"1f3c5\":51047,\"1f3c6\":51046,\"1f3c7\":1598,\"1f3c8\":51056,\"1f3c9\":51057,\"1f3ca-200d-2640\":1612,\"1f3ca-200d-2642\":1611,\"1f3ca\":1610,\"1f3cb-200d-2640\":1618,\"1f3cb-200d-2642\":1617,\"1f3cb\":1616,\"1f3cc-200d-2640\":1603,\"1f3cc-200d-2642\":1602,\"1f3cc\":1601,\"1f3cd\":4902,\"1f3ce\":4901,\"1f3cf\":51061,\"1f3d0\":51055,\"1f3d1\":51062,\"1f3d2\":51063,\"1f3d3\":51065,\"1f3d4\":4813,\"1f3d5\":4817,\"1f3d6\":4818,\"1f3d7\":4824,\"1f3d8\":4829,\"1f3d9\":4859,\"1f3da\":4830,\"1f3db\":4823,\"1f3dc\":4819,\"1f3dd\":4820,\"1f3de\":4821,\"1f3df\":4822,\"1f3e0\":4831,\"1f3e1\":4832,\"1f3e2\":4833,\"1f3e3\":4834,\"1f3e4\":4835,\"1f3e5\":4836,\"1f3e6\":4837,\"1f3e7\":62729,\"1f3e8\":4838,\"1f3e9\":4839,\"1f3ea\":4840,\"1f3eb\":4841,\"1f3ec\":4842,\"1f3ed\":4843,\"1f3ee\":61216,\"1f3ef\":4844,\"1f3f0\":4845,\"1f3f3-200d-1f308\":71591,\"1f3f3-200d-26a7\":71592,\"1f3f3\":71590,\"1f3f4-200d-2620\":71593,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71852,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71853,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71854,\"1f3f4\":71589,\"1f3f5\":2652,\"1f3f7\":61234,\"1f3f8\":51066,\"1f3f9\":61303,\"1f3fa\":3805,\"1f3fb\":9525,\"1f3fc\":9526,\"1f3fd\":9527,\"1f3fe\":9528,\"1f3ff\":9529,\"1f400\":2576,\"1f401\":2575,\"1f402\":2556,\"1f403\":2557,\"1f404\":2558,\"1f405\":2547,\"1f406\":2548,\"1f407\":2579,\"1f408-200d-2b1b\":2544,\"1f408\":2543,\"1f409\":2618,\"1f40a\":2613,\"1f40b\":2622,\"1f40c\":2632,\"1f40d\":2616,\"1f40e\":2550,\"1f40f\":2563,\"1f410\":2565,\"1f411\":2564,\"1f412\":2531,\"1f413\":2596,\"1f414\":2595,\"1f415-200d-1f9ba\":2537,\"1f415\":2535,\"1f416\":2560,\"1f417\":2561,\"1f418\":2570,\"1f419\":2629,\"1f41a\":2630,\"1f41b\":2634,\"1f41c\":2635,\"1f41d\":2636,\"1f41e\":2638,\"1f41f\":2625,\"1f420\":2626,\"1f421\":2627,\"1f422\":2614,\"1f423\":2597,\"1f424\":2598,\"1f425\":2599,\"1f426\":2600,\"1f427\":2601,\"1f428\":2586,\"1f429\":2538,\"1f42a\":2566,\"1f42b\":2567,\"1f42c\":2623,\"1f42d\":2574,\"1f42e\":2555,\"1f42f\":2546,\"1f430\":2578,\"1f431\":2542,\"1f432\":2617,\"1f433\":2621,\"1f434\":2549,\"1f435\":2530,\"1f436\":2534,\"1f437\":2559,\"1f438\":2612,\"1f439\":2577,\"1f43a\":2539,\"1f43b-200d-2744\":2585,\"1f43b\":2584,\"1f43c\":2587,\"1f43d\":2562,\"1f43e\":2593,\"1f43f\":2580,\"1f440\":1381,\"1f441-200d-1f5e8\":1159,\"1f441\":1382,\"1f442\":1373,\"1f443\":1375,\"1f444\":1384,\"1f445\":1383,\"1f446\":1347,\"1f447\":1349,\"1f448\":1345,\"1f449\":1346,\"1f44a\":1355,\"1f44b\":1327,\"1f44c\":1336,\"1f44d\":1352,\"1f44e\":1353,\"1f44f\":1358,\"1f450\":1361,\"1f451\":61144,\"1f452\":61145,\"1f453\":61110,\"1f454\":61115,\"1f455\":61116,\"1f456\":61117,\"1f457\":61122,\"1f458\":61123,\"1f459\":61128,\"1f45a\":61129,\"1f45b\":61130,\"1f45c\":61131,\"1f45d\":61132,\"1f45e\":61136,\"1f45f\":61137,\"1f460\":61140,\"1f461\":61141,\"1f462\":61143,\"1f463\":1687,\"1f464\":1684,\"1f465\":1685,\"1f466\":1388,\"1f467\":1389,\"1f468-200d-1f33e\":1457,\"1f468-200d-1f373\":1460,\"1f468-200d-1f37c\":1524,\"1f468-200d-1f393\":1448,\"1f468-200d-1f3a4\":1478,\"1f468-200d-1f3a8\":1481,\"1f468-200d-1f3eb\":1451,\"1f468-200d-1f3ed\":1466,\"1f468-200d-1f466-200d-1f466\":1674,\"1f468-200d-1f466\":1673,\"1f468-200d-1f467-200d-1f466\":1676,\"1f468-200d-1f467-200d-1f467\":1677,\"1f468-200d-1f467\":1675,\"1f468-200d-1f468-200d-1f466\":1663,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1666,\"1f468-200d-1f468-200d-1f467\":1664,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1665,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1667,\"1f468-200d-1f469-200d-1f466\":1658,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1661,\"1f468-200d-1f469-200d-1f467\":1659,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1660,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1662,\"1f468-200d-1f4bb\":1475,\"1f468-200d-1f4bc\":1469,\"1f468-200d-1f527\":1463,\"1f468-200d-1f52c\":1472,\"1f468-200d-1f680\":1487,\"1f468-200d-1f692\":1490,\"1f468-200d-1f9af\":1574,\"1f468-200d-1f9b0\":1396,\"1f468-200d-1f9b1\":1397,\"1f468-200d-1f9b2\":1399,\"1f468-200d-1f9b3\":1398,\"1f468-200d-1f9bc\":1577,\"1f468-200d-1f9bd\":1580,\"1f468-200d-2695\":1445,\"1f468-200d-2696\":1454,\"1f468-200d-2708\":1484,\"1f468-200d-2764-200d-1f468\":1655,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1651,\"1f468\":1392,\"1f469-200d-1f33e\":1458,\"1f469-200d-1f373\":1461,\"1f469-200d-1f37c\":1523,\"1f469-200d-1f393\":1449,\"1f469-200d-1f3a4\":1479,\"1f469-200d-1f3a8\":1482,\"1f469-200d-1f3eb\":1452,\"1f469-200d-1f3ed\":1467,\"1f469-200d-1f466-200d-1f466\":1679,\"1f469-200d-1f466\":1678,\"1f469-200d-1f467-200d-1f466\":1681,\"1f469-200d-1f467-200d-1f467\":1682,\"1f469-200d-1f467\":1680,\"1f469-200d-1f469-200d-1f466\":1668,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1671,\"1f469-200d-1f469-200d-1f467\":1669,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1670,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1672,\"1f469-200d-1f4bb\":1476,\"1f469-200d-1f4bc\":1470,\"1f469-200d-1f527\":1464,\"1f469-200d-1f52c\":1473,\"1f469-200d-1f680\":1488,\"1f469-200d-1f692\":1491,\"1f469-200d-1f9af\":1575,\"1f469-200d-1f9b0\":1401,\"1f469-200d-1f9b1\":1403,\"1f469-200d-1f9b2\":1407,\"1f469-200d-1f9b3\":1405,\"1f469-200d-1f9bc\":1578,\"1f469-200d-1f9bd\":1581,\"1f469-200d-2695\":1446,\"1f469-200d-2696\":1455,\"1f469-200d-2708\":1485,\"1f469-200d-2764-200d-1f468\":1654,\"1f469-200d-2764-200d-1f469\":1656,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1650,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1652,\"1f469\":1400,\"1f46a\":1657,\"1f46b\":1647,\"1f46c\":1648,\"1f46d\":1646,\"1f46e-200d-2640\":1494,\"1f46e-200d-2642\":1493,\"1f46e\":1492,\"1f46f-200d-2640\":1590,\"1f46f-200d-2642\":1589,\"1f46f\":1588,\"1f470-200d-2640\":1518,\"1f470-200d-2642\":1517,\"1f470\":1516,\"1f471-200d-2640\":1409,\"1f471-200d-2642\":1410,\"1f471\":1391,\"1f472\":1511,\"1f473-200d-2640\":1510,\"1f473-200d-2642\":1509,\"1f473\":1508,\"1f474\":1412,\"1f475\":1413,\"1f476\":1386,\"1f477-200d-2640\":1504,\"1f477-200d-2642\":1503,\"1f477\":1502,\"1f478\":1507,\"1f479\":1109,\"1f47a\":1110,\"1f47b\":1111,\"1f47c\":1526,\"1f47d\":1112,\"1f47e\":1113,\"1f47f\":1104,\"1f480\":1105,\"1f481-200d-2640\":1428,\"1f481-200d-2642\":1427,\"1f481\":1426,\"1f482-200d-2640\":1500,\"1f482-200d-2642\":1499,\"1f482\":1498,\"1f483\":1585,\"1f484\":61152,\"1f485\":1366,\"1f486-200d-2640\":1560,\"1f486-200d-2642\":1559,\"1f486\":1558,\"1f487-200d-2640\":1563,\"1f487-200d-2642\":1562,\"1f487\":1561,\"1f488\":4870,\"1f489\":61326,\"1f48a\":61328,\"1f48b\":1127,\"1f48c\":1128,\"1f48d\":61153,\"1f48e\":61154,\"1f48f\":1649,\"1f490\":2648,\"1f491\":1653,\"1f492\":4846,\"1f493\":1133,\"1f494\":1138,\"1f495\":1135,\"1f496\":1131,\"1f497\":1132,\"1f498\":1129,\"1f499\":1145,\"1f49a\":1144,\"1f49b\":1143,\"1f49c\":1146,\"1f49d\":1130,\"1f49e\":1134,\"1f49f\":1136,\"1f4a0\":62946,\"1f4a1\":61214,\"1f4a2\":1151,\"1f4a3\":1157,\"1f4a4\":1163,\"1f4a5\":1152,\"1f4a6\":1154,\"1f4a7\":41022,\"1f4a8\":1155,\"1f4a9\":1107,\"1f4aa\":1368,\"1f4ab\":1153,\"1f4ac\":1158,\"1f4ad\":1162,\"1f4ae\":2650,\"1f4af\":1150,\"1f4b0\":61235,\"1f4b1\":62841,\"1f4b2\":62842,\"1f4b3\":61242,\"1f4b4\":61237,\"1f4b5\":61238,\"1f4b6\":61239,\"1f4b7\":61240,\"1f4b8\":61241,\"1f4b9\":61244,\"1f4ba\":4936,\"1f4bb\":61191,\"1f4bc\":61265,\"1f4bd\":61197,\"1f4be\":61198,\"1f4bf\":61199,\"1f4c0\":61200,\"1f4c1\":61266,\"1f4c2\":61267,\"1f4c3\":61227,\"1f4c4\":61229,\"1f4c5\":61269,\"1f4c6\":61270,\"1f4c7\":61273,\"1f4c8\":61274,\"1f4c9\":61275,\"1f4ca\":61276,\"1f4cb\":61277,\"1f4cc\":61278,\"1f4cd\":61279,\"1f4ce\":61280,\"1f4cf\":61282,\"1f4d0\":61283,\"1f4d1\":61232,\"1f4d2\":61226,\"1f4d3\":61225,\"1f4d4\":61218,\"1f4d5\":61219,\"1f4d6\":61220,\"1f4d7\":61221,\"1f4d8\":61222,\"1f4d9\":61223,\"1f4da\":61224,\"1f4db\":62847,\"1f4dc\":61228,\"1f4dd\":61264,\"1f4de\":61185,\"1f4df\":61186,\"1f4e0\":61187,\"1f4e1\":61325,\"1f4e2\":61159,\"1f4e3\":61160,\"1f4e4\":61249,\"1f4e5\":61250,\"1f4e6\":61251,\"1f4e7\":61246,\"1f4e8\":61247,\"1f4e9\":61248,\"1f4ea\":61253,\"1f4eb\":61252,\"1f4ec\":61254,\"1f4ed\":61255,\"1f4ee\":61256,\"1f4ef\":61161,\"1f4f0\":61230,\"1f4f1\":61182,\"1f4f2\":61183,\"1f4f3\":62823,\"1f4f4\":62824,\"1f4f5\":62751,\"1f4f6\":62822,\"1f4f7\":61207,\"1f4f8\":61208,\"1f4f9\":61209,\"1f4fa\":61206,\"1f4fb\":61172,\"1f4fc\":61210,\"1f4fd\":61204,\"1f4ff\":61151,\"1f500\":62801,\"1f501\":62802,\"1f502\":62803,\"1f503\":62769,\"1f504\":62770,\"1f505\":62820,\"1f506\":62821,\"1f507\":61155,\"1f508\":61156,\"1f509\":61157,\"1f50a\":61158,\"1f50b\":61188,\"1f50c\":61190,\"1f50d\":61211,\"1f50e\":61212,\"1f50f\":61290,\"1f510\":61291,\"1f511\":61292,\"1f512\":61288,\"1f513\":61289,\"1f514\":61162,\"1f515\":61163,\"1f516\":61233,\"1f517\":61313,\"1f518\":62947,\"1f519\":62771,\"1f51a\":62772,\"1f51b\":62773,\"1f51c\":62774,\"1f51d\":62775,\"1f51e\":62752,\"1f51f\":62876,\"1f520\":62877,\"1f521\":62878,\"1f522\":62879,\"1f523\":62880,\"1f524\":62881,\"1f525\":41021,\"1f526\":61215,\"1f527\":61306,\"1f528\":61294,\"1f529\":61308,\"1f52a\":3803,\"1f52b\":61301,\"1f52c\":61323,\"1f52d\":61324,\"1f52e\":51082,\"1f52f\":62787,\"1f530\":62848,\"1f531\":62846,\"1f532\":62949,\"1f533\":62948,\"1f534\":62916,\"1f535\":62920,\"1f536\":62940,\"1f537\":62941,\"1f538\":62942,\"1f539\":62943,\"1f53a\":62944,\"1f53b\":62945,\"1f53c\":62811,\"1f53d\":62813,\"1f549\":62778,\"1f54a\":2602,\"1f54b\":4854,\"1f54c\":4850,\"1f54d\":4852,\"1f54e\":62786,\"1f550\":4955,\"1f551\":4957,\"1f552\":4959,\"1f553\":4961,\"1f554\":4963,\"1f555\":4965,\"1f556\":4967,\"1f557\":4969,\"1f558\":4971,\"1f559\":4973,\"1f55a\":4975,\"1f55b\":4953,\"1f55c\":4956,\"1f55d\":4958,\"1f55e\":4960,\"1f55f\":4962,\"1f560\":4964,\"1f561\":4966,\"1f562\":4968,\"1f563\":4970,\"1f564\":4972,\"1f565\":4974,\"1f566\":4976,\"1f567\":4954,\"1f56f\":61213,\"1f570\":4952,\"1f573\":1156,\"1f574\":1587,\"1f575-200d-2640\":1497,\"1f575-200d-2642\":1496,\"1f575\":1495,\"1f576\":61111,\"1f577\":2641,\"1f578\":2642,\"1f579\":51087,\"1f57a\":1586,\"1f587\":61281,\"1f58a\":61261,\"1f58b\":61260,\"1f58c\":61262,\"1f58d\":61263,\"1f590\":1329,\"1f595\":1348,\"1f596\":1331,\"1f5a4\":1148,\"1f5a5\":61192,\"1f5a8\":61193,\"1f5b1\":61195,\"1f5b2\":61196,\"1f5bc\":51104,\"1f5c2\":61268,\"1f5c3\":61285,\"1f5c4\":61286,\"1f5d1\":61287,\"1f5d2\":61271,\"1f5d3\":61272,\"1f5dc\":61310,\"1f5dd\":61293,\"1f5de\":61231,\"1f5e1\":61299,\"1f5e3\":1683,\"1f5e8\":1160,\"1f5ef\":1161,\"1f5f3\":61257,\"1f5fa\":4810,\"1f5fb\":4816,\"1f5fc\":4847,\"1f5fd\":4848,\"1f5fe\":4811,\"1f5ff\":61362,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":114,\"1f608\":1103,\"1f609\":112,\"1f60a\":113,\"1f60b\":124,\"1f60c\":150,\"1f60d\":116,\"1f60e\":170,\"1f60f\":144,\"1f610\":139,\"1f611\":140,\"1f612\":145,\"1f613\":195,\"1f614\":151,\"1f615\":173,\"1f616\":192,\"1f617\":119,\"1f618\":118,\"1f619\":122,\"1f61a\":121,\"1f61b\":125,\"1f61c\":126,\"1f61d\":128,\"1f61e\":194,\"1f61f\":175,\"1f620\":1101,\"1f621\":1100,\"1f622\":189,\"1f623\":193,\"1f624\":199,\"1f625\":188,\"1f626\":184,\"1f627\":185,\"1f628\":186,\"1f629\":196,\"1f62a\":152,\"1f62b\":197,\"1f62c\":147,\"1f62d\":190,\"1f62e-200d-1f4a8\":148,\"1f62e\":178,\"1f62f\":179,\"1f630\":187,\"1f631\":191,\"1f632\":180,\"1f633\":181,\"1f634\":154,\"1f635-200d-1f4ab\":165,\"1f635\":164,\"1f636-200d-1f32b\":143,\"1f636\":141,\"1f637\":155,\"1f638\":1116,\"1f639\":1117,\"1f63a\":1115,\"1f63b\":1118,\"1f63c\":1119,\"1f63d\":1120,\"1f63e\":1123,\"1f63f\":1122,\"1f640\":1121,\"1f641\":176,\"1f642\":19,\"1f643\":110,\"1f644\":146,\"1f645-200d-2640\":1422,\"1f645-200d-2642\":1421,\"1f645\":1420,\"1f646-200d-2640\":1425,\"1f646-200d-2642\":1424,\"1f646\":1423,\"1f647-200d-2640\":1437,\"1f647-200d-2642\":1436,\"1f647\":1435,\"1f648\":1124,\"1f649\":1125,\"1f64a\":1126,\"1f64b-200d-2640\":1431,\"1f64b-200d-2642\":1430,\"1f64b\":1429,\"1f64c\":1359,\"1f64d-200d-2640\":1416,\"1f64d-200d-2642\":1415,\"1f64d\":1414,\"1f64e-200d-2640\":1419,\"1f64e-200d-2642\":1418,\"1f64e\":1417,\"1f64f\":1364,\"1f680\":4942,\"1f681\":4937,\"1f682\":4872,\"1f683\":4873,\"1f684\":4874,\"1f685\":4875,\"1f686\":4876,\"1f687\":4877,\"1f688\":4878,\"1f689\":4879,\"1f68a\":4880,\"1f68b\":4883,\"1f68c\":4884,\"1f68d\":4885,\"1f68e\":4886,\"1f68f\":4911,\"1f690\":4887,\"1f691\":4888,\"1f692\":4889,\"1f693\":4890,\"1f694\":4891,\"1f695\":4892,\"1f696\":4893,\"1f697\":4894,\"1f698\":4895,\"1f699\":4896,\"1f69a\":4898,\"1f69b\":4899,\"1f69c\":4900,\"1f69d\":4881,\"1f69e\":4882,\"1f69f\":4938,\"1f6a0\":4939,\"1f6a1\":4940,\"1f6a2\":4930,\"1f6a3-200d-2640\":1609,\"1f6a3-200d-2642\":1608,\"1f6a3\":1607,\"1f6a4\":4926,\"1f6a5\":4918,\"1f6a6\":4919,\"1f6a7\":4921,\"1f6a8\":4917,\"1f6a9\":71587,\"1f6aa\":61333,\"1f6ab\":62745,\"1f6ac\":61358,\"1f6ad\":62747,\"1f6ae\":62730,\"1f6af\":62748,\"1f6b0\":62731,\"1f6b1\":62749,\"1f6b2\":4907,\"1f6b3\":62746,\"1f6b4-200d-2640\":1621,\"1f6b4-200d-2642\":1620,\"1f6b4\":1619,\"1f6b5-200d-2640\":1624,\"1f6b5-200d-2642\":1623,\"1f6b5\":1622,\"1f6b6-200d-2640\":1566,\"1f6b6-200d-2642\":1565,\"1f6b6\":1564,\"1f6b7\":62750,\"1f6b8\":62743,\"1f6b9\":62733,\"1f6ba\":62734,\"1f6bb\":62735,\"1f6bc\":62736,\"1f6bd\":61340,\"1f6be\":62737,\"1f6bf\":61342,\"1f6c0\":1643,\"1f6c1\":61343,\"1f6c2\":62738,\"1f6c3\":62739,\"1f6c4\":62740,\"1f6c5\":62741,\"1f6cb\":61338,\"1f6cc\":1644,\"1f6cd\":61133,\"1f6ce\":4944,\"1f6cf\":61337,\"1f6d0\":62776,\"1f6d1\":4920,\"1f6d2\":61357,\"1f6d5\":4851,\"1f6d6\":4828,\"1f6d7\":61334,\"1f6e0\":61298,\"1f6e1\":61304,\"1f6e2\":4914,\"1f6e3\":4912,\"1f6e4\":4913,\"1f6e5\":4929,\"1f6e9\":4932,\"1f6eb\":4933,\"1f6ec\":4934,\"1f6f0\":4941,\"1f6f3\":4927,\"1f6f4\":4908,\"1f6f5\":4903,\"1f6f6\":4925,\"1f6f7\":51076,\"1f6f8\":4943,\"1f6f9\":4909,\"1f6fa\":4906,\"1f6fb\":4897,\"1f6fc\":4910,\"1f7e0\":62917,\"1f7e1\":62918,\"1f7e2\":62919,\"1f7e3\":62921,\"1f7e4\":62922,\"1f7e5\":62925,\"1f7e6\":62929,\"1f7e7\":62926,\"1f7e8\":62927,\"1f7e9\":62928,\"1f7ea\":62930,\"1f7eb\":62931,\"1f90c\":1337,\"1f90d\":1149,\"1f90e\":1147,\"1f90f\":1338,\"1f910\":137,\"1f911\":129,\"1f912\":156,\"1f913\":171,\"1f914\":135,\"1f915\":157,\"1f916\":1114,\"1f917\":130,\"1f918\":1343,\"1f919\":1344,\"1f91a\":1328,\"1f91b\":1356,\"1f91c\":1357,\"1f91d\":1363,\"1f91e\":1340,\"1f91f\":1342,\"1f920\":167,\"1f921\":1108,\"1f922\":158,\"1f923\":17,\"1f924\":153,\"1f925\":149,\"1f926-200d-2640\":1440,\"1f926-200d-2642\":1439,\"1f926\":1438,\"1f927\":160,\"1f928\":138,\"1f929\":117,\"1f92a\":127,\"1f92b\":134,\"1f92c\":1102,\"1f92d\":131,\"1f92e\":159,\"1f92f\":166,\"1f930\":1519,\"1f931\":1522,\"1f932\":1362,\"1f933\":1367,\"1f934\":1506,\"1f935-200d-2640\":1515,\"1f935-200d-2642\":1514,\"1f935\":1513,\"1f936\":1528,\"1f937-200d-2640\":1443,\"1f937-200d-2642\":1442,\"1f937\":1441,\"1f938-200d-2640\":1627,\"1f938-200d-2642\":1626,\"1f938\":1625,\"1f939-200d-2640\":1639,\"1f939-200d-2642\":1638,\"1f939\":1637,\"1f93a\":1597,\"1f93c-200d-2640\":1630,\"1f93c-200d-2642\":1629,\"1f93c\":1628,\"1f93d-200d-2640\":1633,\"1f93d-200d-2642\":1632,\"1f93d\":1631,\"1f93e-200d-2640\":1636,\"1f93e-200d-2642\":1635,\"1f93e\":1634,\"1f93f\":51073,\"1f940\":2654,\"1f941\":61180,\"1f942\":3791,\"1f943\":3792,\"1f944\":3802,\"1f945\":51069,\"1f947\":51048,\"1f948\":51049,\"1f949\":51050,\"1f94a\":51067,\"1f94b\":51068,\"1f94c\":51077,\"1f94d\":51064,\"1f94e\":51053,\"1f94f\":51059,\"1f950\":3710,\"1f951\":3693,\"1f952\":3700,\"1f953\":3721,\"1f954\":3695,\"1f955\":3696,\"1f956\":3711,\"1f957\":3738,\"1f958\":3734,\"1f959\":3730,\"1f95a\":3732,\"1f95b\":3780,\"1f95c\":3706,\"1f95d\":3689,\"1f95e\":3715,\"1f95f\":3757,\"1f960\":3758,\"1f961\":3759,\"1f962\":3799,\"1f963\":3737,\"1f964\":3794,\"1f965\":3692,\"1f966\":3702,\"1f967\":3773,\"1f968\":3713,\"1f969\":3720,\"1f96a\":3726,\"1f96b\":3742,\"1f96c\":3701,\"1f96d\":3681,\"1f96e\":3755,\"1f96f\":3714,\"1f970\":115,\"1f971\":198,\"1f972\":123,\"1f973\":168,\"1f974\":163,\"1f975\":161,\"1f976\":162,\"1f977\":1501,\"1f978\":169,\"1f97a\":182,\"1f97b\":61124,\"1f97c\":61113,\"1f97d\":61112,\"1f97e\":61138,\"1f97f\":61139,\"1f980\":3760,\"1f981\":2545,\"1f982\":2643,\"1f983\":2594,\"1f984\":2551,\"1f985\":2603,\"1f986\":2604,\"1f987\":2583,\"1f988\":2628,\"1f989\":2606,\"1f98a\":2540,\"1f98b\":2633,\"1f98c\":2553,\"1f98d\":2532,\"1f98e\":2615,\"1f98f\":2572,\"1f990\":3762,\"1f991\":3763,\"1f992\":2569,\"1f993\":2552,\"1f994\":2582,\"1f995\":2619,\"1f996\":2620,\"1f997\":2639,\"1f998\":2591,\"1f999\":2568,\"1f99a\":2610,\"1f99b\":2573,\"1f99c\":2611,\"1f99d\":2541,\"1f99e\":3761,\"1f99f\":2644,\"1f9a0\":2647,\"1f9a1\":2592,\"1f9a2\":2605,\"1f9a3\":2571,\"1f9a4\":2607,\"1f9a5\":2588,\"1f9a6\":2589,\"1f9a7\":2533,\"1f9a8\":2590,\"1f9a9\":2609,\"1f9aa\":3764,\"1f9ab\":2581,\"1f9ac\":2554,\"1f9ad\":2624,\"1f9ae\":2536,\"1f9af\":61312,\"1f9b4\":1380,\"1f9b5\":1371,\"1f9b6\":1372,\"1f9b7\":1379,\"1f9b8-200d-2640\":1532,\"1f9b8-200d-2642\":1531,\"1f9b8\":1530,\"1f9b9-200d-2640\":1535,\"1f9b9-200d-2642\":1534,\"1f9b9\":1533,\"1f9ba\":61114,\"1f9bb\":1374,\"1f9bc\":4905,\"1f9bd\":4904,\"1f9be\":1369,\"1f9bf\":1370,\"1f9c0\":3717,\"1f9c1\":3772,\"1f9c2\":3741,\"1f9c3\":3796,\"1f9c4\":3703,\"1f9c5\":3704,\"1f9c6\":3731,\"1f9c7\":3716,\"1f9c8\":3740,\"1f9c9\":3797,\"1f9ca\":3798,\"1f9cb\":3795,\"1f9cd-200d-2640\":1569,\"1f9cd-200d-2642\":1568,\"1f9cd\":1567,\"1f9ce-200d-2640\":1572,\"1f9ce-200d-2642\":1571,\"1f9ce\":1570,\"1f9cf-200d-2640\":1434,\"1f9cf-200d-2642\":1433,\"1f9cf\":1432,\"1f9d0\":172,\"1f9d1-200d-1f33e\":1456,\"1f9d1-200d-1f373\":1459,\"1f9d1-200d-1f37c\":1525,\"1f9d1-200d-1f384\":1529,\"1f9d1-200d-1f393\":1447,\"1f9d1-200d-1f3a4\":1477,\"1f9d1-200d-1f3a8\":1480,\"1f9d1-200d-1f3eb\":1450,\"1f9d1-200d-1f3ed\":1465,\"1f9d1-200d-1f4bb\":1474,\"1f9d1-200d-1f4bc\":1468,\"1f9d1-200d-1f527\":1462,\"1f9d1-200d-1f52c\":1471,\"1f9d1-200d-1f680\":1486,\"1f9d1-200d-1f692\":1489,\"1f9d1-200d-1f91d-200d-1f9d1\":1645,\"1f9d1-200d-1f9af\":1573,\"1f9d1-200d-1f9b0\":1402,\"1f9d1-200d-1f9b1\":1404,\"1f9d1-200d-1f9b2\":1408,\"1f9d1-200d-1f9b3\":1406,\"1f9d1-200d-1f9bc\":1576,\"1f9d1-200d-1f9bd\":1579,\"1f9d1-200d-2695\":1444,\"1f9d1-200d-2696\":1453,\"1f9d1-200d-2708\":1483,\"1f9d1\":1390,\"1f9d2\":1387,\"1f9d3\":1411,\"1f9d4-200d-2640\":1395,\"1f9d4-200d-2642\":1394,\"1f9d4\":1393,\"1f9d5\":1512,\"1f9d6-200d-2640\":1593,\"1f9d6-200d-2642\":1592,\"1f9d6\":1591,\"1f9d7-200d-2640\":1596,\"1f9d7-200d-2642\":1595,\"1f9d7\":1594,\"1f9d8-200d-2640\":1642,\"1f9d8-200d-2642\":1641,\"1f9d8\":1640,\"1f9d9-200d-2640\":1538,\"1f9d9-200d-2642\":1537,\"1f9d9\":1536,\"1f9da-200d-2640\":1541,\"1f9da-200d-2642\":1540,\"1f9da\":1539,\"1f9db-200d-2640\":1544,\"1f9db-200d-2642\":1543,\"1f9db\":1542,\"1f9dc-200d-2640\":1547,\"1f9dc-200d-2642\":1546,\"1f9dc\":1545,\"1f9dd-200d-2640\":1550,\"1f9dd-200d-2642\":1549,\"1f9dd\":1548,\"1f9de-200d-2640\":1553,\"1f9de-200d-2642\":1552,\"1f9de\":1551,\"1f9df-200d-2640\":1556,\"1f9df-200d-2642\":1555,\"1f9df\":1554,\"1f9e0\":1376,\"1f9e1\":1142,\"1f9e2\":61148,\"1f9e3\":61118,\"1f9e4\":61119,\"1f9e5\":61120,\"1f9e6\":61121,\"1f9e7\":51039,\"1f9e8\":51028,\"1f9e9\":51090,\"1f9ea\":61320,\"1f9eb\":61321,\"1f9ec\":61322,\"1f9ed\":4812,\"1f9ee\":61201,\"1f9ef\":61356,\"1f9f0\":61316,\"1f9f1\":4825,\"1f9f2\":61317,\"1f9f3\":4945,\"1f9f4\":61346,\"1f9f5\":51106,\"1f9f6\":51108,\"1f9f7\":61347,\"1f9f8\":51091,\"1f9f9\":61348,\"1f9fa\":61349,\"1f9fb\":61350,\"1f9fc\":61352,\"1f9fd\":61355,\"1f9fe\":61243,\"1f9ff\":51084,\"1fa70\":61142,\"1fa71\":61125,\"1fa72\":61126,\"1fa73\":61127,\"1fa74\":61135,\"1fa78\":61327,\"1fa79\":61329,\"1fa7a\":61331,\"1fa80\":51079,\"1fa81\":51080,\"1fa82\":4935,\"1fa83\":61302,\"1fa84\":51083,\"1fa85\":51092,\"1fa86\":51094,\"1fa90\":4993,\"1fa91\":61339,\"1fa92\":61345,\"1fa93\":61295,\"1fa94\":61217,\"1fa95\":61179,\"1fa96\":61149,\"1fa97\":61174,\"1fa98\":61181,\"1fa99\":61236,\"1fa9a\":61305,\"1fa9b\":61307,\"1fa9c\":61318,\"1fa9d\":61315,\"1fa9e\":61335,\"1fa9f\":61336,\"1faa0\":61341,\"1faa1\":51107,\"1faa2\":51109,\"1faa3\":61351,\"1faa4\":61344,\"1faa5\":61354,\"1faa6\":61360,\"1faa7\":61363,\"1faa8\":4826,\"1fab0\":2645,\"1fab1\":2646,\"1fab2\":2637,\"1fab3\":2640,\"1fab4\":2660,\"1fab5\":4827,\"1fab6\":2608,\"1fac0\":1377,\"1fac1\":1378,\"1fac2\":1686,\"1fad0\":3688,\"1fad1\":3699,\"1fad2\":3691,\"1fad3\":3712,\"1fad4\":3729,\"1fad5\":3736,\"1fad6\":3782,\"203c\":62834,\"21a9\":62765,\"21aa\":62766,\"231a\":4948,\"231b\":4946,\"23cf\":62818,\"23e9\":62805,\"23ea\":62809,\"23eb\":62812,\"23ec\":62814,\"23ed\":62806,\"23ee\":62810,\"23ef\":62807,\"23f0\":4949,\"23f1\":4950,\"23f2\":4951,\"23f3\":4947,\"23f8\":62815,\"23f9\":62816,\"23fa\":62817,\"24c2\":62890,\"25aa\":62938,\"25ab\":62939,\"25b6\":62804,\"25c0\":62808,\"25fb\":62935,\"25fc\":62934,\"25fd\":62937,\"25fe\":62936,\"260e\":61184,\"261d\":1350,\"262a\":62784,\"262e\":62785,\"262f\":62781,\"263a\":120,\"264a\":62790,\"264b\":62791,\"264c\":62792,\"264d\":62793,\"264e\":62794,\"264f\":62795,\"265f\":51099,\"267b\":62844,\"267e\":62833,\"267f\":62732,\"269b\":62777,\"269c\":62845,\"26a0\":62742,\"26a1\":41016,\"26a7\":62827,\"26aa\":62924,\"26ab\":62923,\"26b0\":61359,\"26b1\":61361,\"26bd\":51051,\"26be\":51052,\"26c4\":41019,\"26c5\":4999,\"26c8\":41000,\"26ce\":62800,\"26cf\":61296,\"26d1\":61150,\"26d3\":61314,\"26d4\":62744,\"26e9\":4853,\"26ea\":4849,\"26f0\":4814,\"26f1\":41015,\"26f2\":4855,\"26f3\":51070,\"26f4\":4928,\"26f5\":4924,\"26f7\":1599,\"26f8\":51071,\"26f9-200d-2640\":1615,\"26f9-200d-2642\":1614,\"26f9\":1613,\"26fa\":4856,\"26fd\":4915,\"270a\":1354,\"270b\":1330,\"270c\":1339,\"270d\":1365,\"270f\":61258,\"271d\":62782,\"274c\":62853,\"274e\":62854,\"2764-200d-1f525\":1139,\"2764-200d-1fa79\":1140,\"27a1\":62757,\"27b0\":62855,\"27bf\":62856,\"2b05\":62761,\"2b06\":62755,\"2b07\":62759,\"2b1b\":62932,\"2b1c\":62933,\"2b50\":4994,\"2b55\":62849,\"303d\":62857,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f48f-1f3fb\":0,\"1f48f-1f3fc\":0,\"1f48f-1f3fd\":0,\"1f48f-1f3fe\":0,\"1f48f-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f491-1f3fb\":0,\"1f491-1f3fc\":0,\"1f491-1f3fd\":0,\"1f491-1f3fe\":0,\"1f491-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91d-1f3fb\":0,\"1f91d-1f3fc\":0,\"1f91d-1f3fd\":0,\"1f91d-1f3fe\":0,\"1f91d-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb-200d-2640\":0,\"1f9d4-1f3fc-200d-2640\":0,\"1f9d4-1f3fd-200d-2640\":0,\"1f9d4-1f3fe-200d-2640\":0,\"1f9d4-1f3ff-200d-2640\":0,\"1f9d4-1f3fb-200d-2642\":0,\"1f9d4-1f3fc-200d-2642\":0,\"1f9d4-1f3fd-200d-2642\":0,\"1f9d4-1f3fe-200d-2642\":0,\"1f9d4-1f3ff-200d-2642\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport deferredPromise, { CancellablePromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { makeMediaSize } from \"./mediaSize\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf, fastRafPromise } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\nexport type ScrollStartCallbackDimensions = {\r\n scrollSize: number,\r\n scrollPosition: number,\r\n distanceToEnd: number,\r\n path: number,\r\n duration: number,\r\n containerRect: DOMRect,\r\n elementRect: DOMRect,\r\n};\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement,\r\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = fastRafPromise().then(() => scrollWithJs(options));\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n if(options.startCallback) {\r\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\r\n options.startCallback({\r\n scrollSize,\r\n scrollPosition,\r\n distanceToEnd,\r\n path,\r\n duration,\r\n containerRect,\r\n elementRect\r\n });\r\n }\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport forEachReverse from \"./array/forEachReverse\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"./array/forEachReverse\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T | Promise;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n \n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\n }\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach((listener) => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport calcImageInBox from \"./calcImageInBox\";\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport { makeMediaSize, MediaSize } from \"./mediaSize\";\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize,\r\n documentName: MediaSize\r\n};\r\n\r\nexport type MediaSizeType = keyof MediaTypeSizes;\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200),\r\n documentName: makeMediaSize(200, 0)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280),\r\n documentName: makeMediaSize(240, 0)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","import { IS_APPLE_MOBILE } from \"../environment/userAgent\";\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport type { MessagesStorageKey, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport incrementMessageId from \"../lib/appManagers/utils/messageId/incrementMessageId\";\nimport rootScope from \"../lib/rootScope\";\nimport forEachReverse from \"./array/forEachReverse\";\nimport filterChatPhotosMessages from \"./filterChatPhotosMessages\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void, \n isInner?: boolean, \n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then((value) => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options, \n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n \n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, mids.length)) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = async(obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = await this.filterMids(sorted);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(this.searchContext.useSearch === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious() {\n let previous = this.previous;\n\n if(this.otherSideLoader) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext() {\n let next = this.next;\n\n if(this.otherSideLoader) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n \n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed && \n this.otherSideLoader && \n value && \n this.searchContext?.useSearch !== false/* && \n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generateMessageId from \"./generateMessageId\";\nimport getServerMessageId from \"./getServerMessageId\";\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\n}\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport deferredPromise, { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport DEBUG from '../config/debug';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\n\r\nconst eventListener = new EventListenerBase<{\r\n start: () => void,\r\n end: () => void\r\n}>();\r\nconst ANIMATION_START_EVENT = 'start';\r\nconst ANIMATION_END_EVENT = 'end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApiFileManager, DownloadMediaOptions, DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { Document, InputFile, Photo, PhotoSize } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport getFileNameForUpload from \"../../helpers/getFileNameForUpload\";\r\nimport { AppManagers } from \"./managers\";\r\nimport rootScope from \"../rootScope\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport getDocumentDownloadOptions from \"./utils/docs/getDocumentDownloadOptions\";\r\nimport getPhotoDownloadOptions from \"./utils/photos/getPhotoDownloadOptions\";\r\nimport createDownloadAnchor from \"../../helpers/dom/createDownloadAnchor\";\r\nimport noop from \"../../helpers/noop\";\r\nimport getDownloadMediaDetails from \"./utils/download/getDownloadMediaDetails\";\r\nimport getDownloadFileNameFromOptions from \"./utils/download/getDownloadFileNameFromOptions\";\r\nimport { AppMessagesManager } from \"./appMessagesManager\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadUrl = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\ntype DownloadType = 'url' | 'blob' | 'void';\r\n\r\nexport class AppDownloadManager {\r\n private downloads: {[fileName: string]: {main: Download, url?: Download, blob?: Download, void?: Download}} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n // private progressCallbacks: {[fileName: string]: Array} = {};\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n rootScope.addEventListener('download_progress', (details) => {\r\n this.progress[details.fileName] = details;\r\n\r\n // const callbacks = this.progressCallbacks[details.fileName];\r\n // if(callbacks) {\r\n // callbacks.forEach((callback) => callback(details));\r\n // }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.main.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string, type?: DownloadType) {\r\n const deferred = deferredPromise();\r\n\r\n let download = this.downloads[fileName];\r\n if(!download) {\r\n download = this.downloads[fileName] = {\r\n main: deferred as any\r\n };\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n this.managers.apiFileManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n \r\n } */\r\n };\r\n \r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n }).finally(() => {\r\n delete this.progress[fileName];\r\n // delete this.progressCallbacks[fileName];\r\n });\r\n } else {\r\n const main = download.main;\r\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\r\n if(!main[key]) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n deferred[key] = main[key].bind(main);\r\n });\r\n }\r\n\r\n return download[type] = deferred as any;\r\n }\r\n\r\n public getNewDeferredForUpload>(fileName: string, promise: T) {\r\n const deferred = this.getNewDeferred(fileName);\r\n promise.then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as CancellablePromise>;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public getUpload(fileName: string): ReturnType['promise'] {\r\n let deferred: CancellablePromise = this.getDownload(fileName);\r\n if(deferred) {\r\n return deferred;\r\n }\r\n \r\n deferred = this.getNewDeferred(fileName);\r\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n /* public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then((response) => response.blob())\r\n .then((blob) => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n } */\r\n\r\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\r\n let deferred = this.getDownload(fileName, type);\r\n if(deferred) return deferred;\r\n\r\n deferred = this.getNewDeferred(fileName, type);\r\n getPromise().then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getDownloadFileNameFromOptions(options);\r\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob'): DownloadBlob {\r\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\r\n return this.d(fileName, () => {\r\n const cb = type === 'url' ? this.managers.apiFileManager.downloadMediaURL : (type === 'void' ? this.managers.apiFileManager.downloadMediaVoid : this.managers.apiFileManager.downloadMedia);\r\n return cb(options);\r\n }, type) as any;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\r\n return this.downloadMedia(options, 'url') as any;\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\r\n return this.downloadMedia(options, 'void');\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\r\n if(!fileName) {\r\n fileName = getFileNameForUpload(file);\r\n }\r\n\r\n if(!promise) {\r\n promise = this.managers.apiFileManager.upload({file, fileName});\r\n }\r\n \r\n const deferred = this.getNewDeferredForUpload(fileName, promise);\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string, type?: DownloadType) {\r\n const d = this.downloads[fileName];\r\n return d && d[type];\r\n }\r\n\r\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n // const progress = this.progress[fileName];\r\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n // if(progress) {\r\n // callback(progress);\r\n // }\r\n // }\r\n\r\n public downloadToDisc(options: DownloadMediaOptions) {\r\n const media = options.media;\r\n const isDocument = media._ === 'document';\r\n if(!isDocument && !options.thumb) {\r\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\r\n }\r\n \r\n const promise = this.downloadMedia(options);\r\n promise.then((blob) => {\r\n const url = URL.createObjectURL(blob);\r\n const downloadOptions = isDocument ? \r\n getDocumentDownloadOptions(media) : \r\n getPhotoDownloadOptions(media as any, options.thumb);\r\n const fileName = (options.media as Document.document).file_name || getFileNameByLocation(downloadOptions.location);\r\n createDownloadAnchor(url, fileName, () => {\r\n URL.revokeObjectURL(url);\r\n });\r\n }, noop);\r\n\r\n return promise;\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n \n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n \n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch (e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n \n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\n}\n","import { Document, Message, MessageAction, MessageMedia, Photo, WebPage } from \"../../../../layer\";\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n \n const media = (message as Message.messageService).action ? \n ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo : \n (message as Message.message).media && (\n ((message as Message.message).media as MessageMedia.messageMediaPhoto).photo || \n ((message as Message.message).media as MessageMedia.messageMediaDocument).document || (\n ((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage && (\n (((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document || \n (((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).photo\n )\n )\n );\n\n return media as Photo.photo | Document.document;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport parseEntities from \"./parseEntities\";\nimport wrapRichText from \"./wrapRichText\";\n\nexport default function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return wrapRichText('');\n\n let entities = parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SITE_HASHTAGS } from \".\";\nimport { EmojiVersions } from \"../../config/emoji\";\nimport IS_EMOJI_SUPPORTED from \"../../environment/emojiSupport\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport buildURLHash from \"../../helpers/buildURLHash\";\nimport copy from \"../../helpers/object/copy\";\nimport encodeEntities from \"../../helpers/string/encodeEntities\";\nimport { MessageEntity } from \"../../layer\";\nimport encodeSpoiler from \"./encodeSpoiler\";\nimport parseEntities from \"./parseEntities\";\nimport setBlankToAnchor from \"./setBlankToAnchor\";\nimport wrapUrl from \"./wrapUrl\";\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n\n contextHashtag?: string,\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean\n}> = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement, \n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontWeight = 'bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontStyle = 'italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: line-through;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: underline;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n \n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'var(--font-monospace)';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n \n break;\n }\n \n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n \n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version];\n if(emojiData.hasOwnProperty(entity.unicode)) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n //if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n \n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n nasty.i++;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? url\n : `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n element = document.createElement('a');\n element.className = 'mention';\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n // insertPart(entity, ``, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n }\n \n break;\n }\n }\n\n if(!usedText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentElement) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < (endOffset - 1)) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentElement) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n return fragment;\n}\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach((arg) => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(typeof(arg) === 'object' && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as Transferable[]);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport rootScope from '../rootScope';\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\r\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\r\n\r\n queryableWorker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n queryableWorker.addEventListener('frame', this.onFrame);\r\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\r\n queryableWorker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n queryableWorker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then((res) => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data)).then((arr) => blobConstruct(arr as Uint8Array, ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then((str) => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then((blob) => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', middleware?: () => boolean): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n \r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach((animation) => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport clamp from \"../../helpers/number/clamp\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: Blob, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n this.width = Math.round(this.width);\n this.height = Math.round(this.height);\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n \n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.cleanup();\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"names":["animationIntersector","constructor","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","this","observer","IntersectionObserver","entries","entry","target","group","player","find","p","el","isIntersecting","add","checkAnimation","delete","animation","clearCache","overrideIdleGroups","doc","type","checkAnimations","idle","setOverrideIdleGroup","override","getAnimations","element","found","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","addAnimation","loop","observe","blurred","destroy","undefined","groups","Object","keys","animations","paused","pause","has","autoplay","play","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","window","requestAnimationFrame","lockIntersectionGroup","unlockIntersectionGroup","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","Map","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","get","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","set","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","previous","getPrevious","jumpLength","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","item","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","proxy","Proxy","apply","that","args","animate","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","parentElement","position","forceDirection","forceDuration","axis","prevId","classList","contains","mutateCallback","tagName","toLowerCase","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","firstElementChild","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","filter","offsetWidth","slideTabs","TransitionSlider","isHeavy","animationFunction","Transition","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","onTransitionEndCallback","_from","getPeerTitle","plainText","onlyFirstName","_limitSymbols","isUser","user","appUsersManager","getUser","toUserId","first_name","last_name","trim","deleted","username","appChatsManager","getChat","toChatId","split","EmojiVersions","Emoji","version","assign","instances","cancelAnimationByKey","instance","getAnimationInstance","isCancelled","animateSingle","tick","createAnimationInstance","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","simulateEvent","elem","name","event","Event","bubbles","cancelable","findUpAsChild","parent","isInDOM","isConnected","whichChild","parentNode","i","previousElementSibling","FocusDirection","fastSmoothScroll","options","margin","maxDistance","Static","scrollWithJs","getNormalSize","Promise","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","containerRect","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","abs","scrollTop","remainingPath","absPath","startAt","Date","now","transition","shortTransition","longTransition","t","currentPath","startCallback","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","location","ext","str","thumb_size","Boolean","join","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","error","filterChatPhotosMessages","history","arr","photo","splice","count","ListLoader","loadedAllUp","loadedAllDown","index","loadedAll","setLoaded","items","pop","unshift","shift","unsetCurrent","toPrevious","goUnsafe","leftLength","down","loadPromiseDown","loadPromiseUp","anchor","loadMore","result","processedArr","bind","processed","results","all","onLoadedMore","ListenerSetter","listeners","listener","addManual","onceCallback","onceFired","removeManual","_listener","MediaSize","height","aspect","boxSize","fitted","aspectFitted","aspectCovered","makeMediaSize","ScreenSize","MediaSizes","super","screenSizes","mobile","medium","large","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","documentName","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","active","rAF","cancelAnimationFrame","mediaSizes","clamp","v","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","IS_APPLE_MOBILE","SearchListLoader","backLimit","maxId","messageId","generateMessageId","getServerMessageId","getSearch","limit","inputFilter","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","forEachReverse","onHistoryMultiappend","obj","mids","sorted","Array","sort","a","b","filtered","targets","map","onMessageSent","rootScope","isInner","otherSideLoader","storageKey","filterMessagesByInputFilterFromStorage","useSearch","concat","goToOtherEnd","ret","changed","cleanup","encodeEntities","replace","charCodeAt","limitSymbols","limitFrom","slice","eventListener","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","log","dispatchHeavyAnimationEvent","promises","finally","perf","performance","_heavyAnimationPromise","race","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","appDownloadManager","downloads","progress","fileName","download","main","notifyAll","getNewDeferred","cancel","Error","apiFileManager","cancelDownload","reject","catch","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","d","getPromise","getDownloadFileNameFromOptions","downloadMedia","downloadOptions","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","upload","file","getFileNameForUpload","downloadToDisc","isDocument","blob","URL","createObjectURL","getDocumentDownloadOptions","getPhotoDownloadOptions","onRemove","href","top","left","clickEvent","createEvent","initMouseEvent","click","open","createDownloadAnchor","revokeObjectURL","noop","getMediaFromMessage","wrapEmojiText","text","isDraft","entities","wrappingDraft","setBlankToAnchor","rel","wrapRichText","fragment","createDocumentFragment","nasty","usedLength","parseEntities","passEntities","contextSite","contextExternal","textLength","lastElement","entity","offset","copy","lastEntity","nextEntity","startOffset","endOffset","endPartOffset","fullEntityText","partText","property","usedText","noTextFormat","fontWeight","fontStyle","styleName","fontFamily","className","noLinks","bot","atPos","command","indexOf","fromBot","encodeURIComponent","isSupported","hasOwnProperty","unicode","onclick","masked","wrapped","wrapUrl","currentContext","electronHelpers","contextUrl","hashtag","user_id","follow","encoded","encodeSpoiler","entityText","textContent","voodoo","QueryableWorker","worker","onerror","terminate","onmessage","data","queryMethodListener","queryMethodArguments","postMessage","sendQuery","queryMethod","transfer","arg","ArrayBuffer","buffer","lottieLoader","isWebAssemblySupported","loadPromise","loaded","workersLimit","players","workers","curWorkerNum","logger","onPlayerLoaded","reqId","frameCount","fps","rlPlayer","debug","onLoad","onFrame","frameNo","frame","clamped","renderFrame","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","loadAnimationAsAsset","loadAnimationFromURL","fetch","res","headers","arrayBuffer","blobConstruct","newParams","animationData","needUpscale","loadAnimationWorker","waitForFirstFrame","middleware","parseInt","initPlayer","onDestroy","destroyWorkers","loadFromData","cache","getCache","frames","counter","releaseCache","getCacheCounter","generateName","color","toneIndex","RLottiePlayer","direction","speed","cachingDelta","skipRatio","initFrame","inverseColor","skipFirstFrameRendering","IS_ANDROID","skipDelta","pixelRatio","devicePixelRatio","noCache","Infinity","canvas","getContext","Uint8ClampedArray","imageData","ImageData","cacheName","methodName","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","curFrame","minFrame","maxFrame","renderFirstFrame","requestFrame","restart","setSpeed","setDirection","applyColor","r","g","applyInversing","renderFrame2","putImageData","frInterval","delta","frThen","onLap","mainLoopForwards","mainLoopBackwards","method","currentMethod","frameListener","listenerResults","enterFrame","playPart","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setColor","renderIfPaused","setInverseColor","diff","appendChild","time","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","setPage","isAuthPage","display","pageEl","Page","onFirstMount","onMount","installed","mount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","char","toString","getEmojiToneIndex","input","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","curr","fromCodePoint"],"sourceRoot":""} \ No newline at end of file diff --git a/public/6.3fcd156db2ca66c7e6d0.chunk.js b/public/6.3fcd156db2ca66c7e6d0.chunk.js deleted file mode 100644 index e1d3f56d8..000000000 --- a/public/6.3fcd156db2ca66c7e6d0.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[6],Array(60).concat([function(e,t,s){"use strict";var i=s(1),a=s(157),n=s(39),r=s(76),o=s(10),d=s(153);function c(e){return e&&e.toLowerCase()||""}var l=s(37),h=s(121),u=s(19),p=s(123),g=s(44),f=s(7),m=s(8),v=s(20),_=s(87),y=s(28),I=s(0),P=s(136),S=s(80),M=s(68),b=s(63),w=s(35);const C=new class{constructor(){this.storage=w.c.storages.users,this.updateUsersStatuses=()=>{const e=Object(l.h)(!0);for(const t in this.users){const s=this.users[t];this.updateUserStatus(s,e)}},this.clear(!0),setInterval(this.updateUsersStatuses,6e4),I.a.addEventListener("state_synchronized",this.updateUsersStatuses),I.a.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,s=this.users[t];s&&(s.status=e.status,s.status&&("expires"in s.status&&(s.status.expires-=_.a.serverTimeOffset),"was_online"in s.status&&(s.status.was_online-=_.a.serverTimeOffset)),I.a.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(s))},updateUserPhoto:e=>{var t,s;const i=e.user_id,a=this.users[i];if(a){if((null===(t=a.photo)||void 0===t?void 0:t.photo_id)===(null===(s=e.photo)||void 0===s?void 0:s.photo_id))return;this.forceUserOnline(i,e.date),"userProfilePhotoEmpty"===e.photo._?delete a.photo:a.photo=Object(p.a)(a.photo,e.photo),this.setUserToStateIfNeeded(a),I.a.dispatchEvent("user_update",i),I.a.dispatchEvent("avatar_update",i.toPeerId())}else console.warn("No user by id:",i)},updateUserName:e=>{const t=e.user_id,s=this.users[t];s&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},s),{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),I.a.addEventListener("language_change",e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))}),w.c.getState().then(e=>{const t=w.c.storagesResults.users;if(t.length)for(let e=0,s=t.length;e{this.pushContact(e)}),s.length&&(this.contactsFillPromise=Object(o.a)(),this.contactsFillPromise.resolve(this.contactsList))),w.c.addEventListener("peerNeeded",e=>{if(!b.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})}),w.c.addEventListener("peerUnneeded",e=>{if(!b.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)})})}clear(e=!1){if(e)this.users={},this.usernames={};else{const e=w.c.storagesResults.users;for(const t in this.users){if(!t)continue;const s=t.toPeerId();if(!w.c.isPeerNeeded(s)){const s=this.users[t];s.username&&delete this.usernames[c(s.username)],Object(n.a)(e,e=>e.id===t),this.storage.delete(t),delete this.users[t]}}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1}onContactsModified(){const e=[...this.contactsList];w.c.pushToState("contactsList",e)}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=Object(o.a)();return m.a.invokeApi("contacts.getContacts").then(e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach(e=>{this.pushContact(e.user_id)}),this.onContactsModified(),this.contactsFillPromise=t),t.resolve(this.contactsList)},()=>{this.updatedContactsList=!1}),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){return"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase(),this.usernames[e]?Promise.resolve(this.users[this.usernames[e]]):m.a.invokeApi("contacts.resolveUsername",{username:e}).then(e=>this.processResolvedPeer(e))}processResolvedPeer(e){return this.saveApiUsers(e.users),M.a.saveApiChats(e.chats),b.a.getPeer(b.a.getPeerId(e.peer))}resolvePhone(e){return m.a.invokeApi("contacts.resolvePhone",{phone:e}).then(e=>this.processResolvedPeer(e))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),w.c.requestPeerSingle(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),w.c.releaseSinglePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];if(!t)return"";return[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?f.c.format("SavedMessages",!0):"",t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" ")}getContacts(e,t=!1,s="name"){return this.fillContacts().promise.then(i=>{let a=[...i];if(e){const t=this.contactsIndex.search(e);a=[...a].filter(e=>t.has(e))}"name"===s?a.sort((e,t)=>{const s=(this.users[e]||{}).sortName||"",i=(this.users[t]||{}).sortName||"";return s.localeCompare(i)}):"online"===s&&a.sort((e,t)=>{const s=C.getUserStatusForSort(C.getUser(e).status);return C.getUserStatusForSort(C.getUser(t).status)-s});const n=I.a.myId.toUserId();return Object(r.a)(a,n),t&&this.testSelfSearch(e)&&a.unshift(n),a})}getContactsPeerIds(e,t,s){return this.getContacts(e,t,s).then(e=>e.map(e=>e.toPeerId(!1)))}toggleBlock(e,t){return m.a.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:b.a.getInputPeerById(e)}).then(s=>(s&&S.a.processLocalUpdate({_:"updatePeerBlocked",peer_id:b.a.getOutputPeer(e),blocked:t}),s))}testSelfSearch(e){const t=this.getSelf(),s=this.createSearchIndex();return s.indexObject(t.id,this.getUserSearchText(t.id)),s.search(e).has(t.id)}createSearchIndex(){return new P.a({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiUser(e,t)))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=c(t.username);delete this.usernames[e]}if(e.username){const t=c(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var s,i;if("userEmpty"===e._)return;const a=e.id,n=this.users[a];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;if(this.setUserNameToCache(e,n),n&&void 0!==n.sortName&&n.first_name===e.first_name&&n.last_name===e.last_name)e.sortName=n.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(d.b)(t,!1)}e.status&&(e.status.expires&&(e.status.expires-=_.a.serverTimeOffset),e.status.was_online&&(e.status.was_online-=_.a.serverTimeOffset));let r=!1,o=!1;if(void 0===n)this.users[a]=e;else{e.first_name===n.first_name&&e.last_name===n.last_name&&e.username===n.username||(o=!0);(null===(s=n.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(r=!0);const t=!!n.pFlags.contact,d=!!e.pFlags.contact;Object(p.a)(n,e),I.a.dispatchEvent("user_update",a),t!==d&&this.onContactUpdated(a,d,t)}r&&I.a.dispatchEvent("avatar_update",e.id.toPeerId()),o&&I.a.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){w.c.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}formatUserPhone(e){return"+"+Object(h.a)(e).formatted}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return Object(u.a)(e)?e:this.users[e]||{_:"userEmpty",id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(I.a.myId)}getUserStatusString(e){var t;let s,i;switch(e){case v.e:s="Peer.RepliesNotifications";break;case v.f:s="Peer.ServiceNotifications";break;default:{if(this.isBot(e)){s="Bot";break}const a=this.getUser(e);if(!a){s="";break}if(a.pFlags.support){s="SupportStatus";break}switch(null===(t=a.status)||void 0===t?void 0:t._){case"userStatusRecently":s="Lately";break;case"userStatusLastWeek":s="WithinAWeek";break;case"userStatusLastMonth":s="WithinAMonth";break;case"userStatusOffline":{const e=a.status.was_online,t=new Date,n=(t.getTime()/1e3|0)-e;if(n<60)s="Peer.Status.justNow";else if(n<3600){s="Peer.Status.minAgo";i=[n/60|0]}else if(n<86400&&t.getDate()===new Date(1e3*e).getDate()){s="LastSeen.HoursAgo";i=[n/3600|0]}else{s="Peer.Status.LastSeenAt";const{dateEl:t,timeEl:a}=Object(l.e)(e);i=[t,a]}break}case"userStatusOnline":s="Online";break;default:s="ALongTimeAgo"}break}}return Object(f.d)(s,i)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e.toPeerId()!==I.a.myId}hasUser(e,t){const s=this.users[e];return Object(u.a)(s)&&(t||!s.pFlags.min)}canSendToUser(e){const t=this.getUser(e);return!t.pFlags.deleted&&t.id.toPeerId()!==v.e}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=Object(l.h)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(S.a.updatesState.syncLoading)return;const i=this.getUser(e);i&&i.status&&"userStatusOnline"!==i.status._&&"userStatusEmpty"!==i.status._&&!i.pFlags.support&&!i.pFlags.deleted&&(i.status={_:"userStatusOnline",expires:s+60},I.a.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(i))}importContact(e,t,s){return this.importContacts([{first_name:e,last_name:t,phones:[s]}]).then(e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]})}importContacts(e){const t=[];for(let s=0;s{this.saveApiUsers(e.users);return e.imported.map(e=>(this.onContactUpdated(e.user_id,!0),e.user_id))})}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=w.c.getState().then(t=>{const s=t.topPeersCache[e];return s&&s.cachedTime+864e5>Date.now()&&s.peers?s.peers:m.a.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then(s=>{let i=[];return"contacts.topPeers"===s._&&(this.saveApiUsers(s.users),M.a.saveApiChats(s.chats),s.categories.length&&(i=s.categories[0].peers.map(e=>{const t=b.a.getPeerId(e.peer);return w.c.requestPeer(t,"topPeer"),{id:t,rating:e.rating}}))),t.topPeersCache[e]={peers:i,cachedTime:Date.now()},w.c.pushToState("topPeersCache",t.topPeersCache),i})})}getBlocked(e=0,t=0){return m.a.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then(e=>{this.saveApiUsers(e.users),M.a.saveApiChats(e.chats);return{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map(e=>e.id.toPeerId()).concat(e.chats.map(e=>e.id.toPeerId(!0)))}})}getLocated(e,t,s,i=!1,a=0){const n={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:s};return m.a.invokeApi("contacts.getLocated",{geo_point:n,background:i}).then(e=>(S.a.processUpdateMessage(e),e))}searchContacts(e,t=20){const s=y.a.parseEntities(e);if(s.length&&s[0].length===e.trim().length&&"messageEntityUrl"===s[0]._)try{const t=new URL(y.a.wrapUrl(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return m.a.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then(e=>{this.saveApiUsers(e.users),M.a.saveApiChats(e.chats);return{my_results:Object(a.a)(e.my_results.map(e=>b.a.getPeerId(e))),results:e.results.map(e=>b.a.getPeerId(e))}})}onContactUpdated(e,t,s=this.isContact(e)){t!==s&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),I.a.dispatchEvent("contacts_update",e))}updateUsername(e){return m.a.invokeApi("account.updateUsername",{username:e}).then(e=>{this.saveApiUser(e)})}setUserStatus(e,t){if(this.isBot(e))return;const s=this.users[e];if(s){const i=t?{_:"userStatusOffline",was_online:Object(l.h)(!0)}:{_:"userStatusOnline",expires:Object(l.h)(!0)+50};s.status=i,I.a.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s)}}addContact(e,t,s,i,a){return m.a.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:s,phone:i,add_phone_privacy_exception:a}).then(t=>{S.a.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)})}deleteContacts(e){return m.a.invokeApi("contacts.deleteContacts",{id:e.map(e=>this.getUserInput(e))}).then(t=>{S.a.processUpdateMessage(t,{override:!0}),e.forEach(e=>{this.onContactUpdated(e,!1)})})}isRestricted(e){const t=this.getUser(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&Object(g.c)(s))}};i.a.appUsersManager=C;t.a=C},,,function(e,t,s){"use strict";var i=s(1),a=s(28),n=s(0),r=s(68),o=s(60),d=s(7),c=s(20),l=s(44),h=s(19),u=s(133);const p=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],g=["red","green","yellow","blue","violet","pink","cyan","orange"],f=[0,7,4,1,6,3,5];["isChannel","isMegagroup","isAnyGroup","isBroadcast","isBot","isContact","isUser","isAnyChat"].forEach(e=>{const t=Array.isArray(e)?e[0]:e,s=Array.isArray(e)?e[1]:e;String.prototype[t]=function(){return m[s](this.toString())},Number.prototype[t]=function(){return m[s](this)}});const m=new class{canPinMessage(e){return e.isUser()||r.a.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){if(this.isRestricted(e))return;const t=e.isUser()?o.a.getUserPhoto(e.toUserId()):r.a.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:void 0}getPeerMigratedTo(e){if(e.isUser())return!1;const t=r.a.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&this.getPeerId(t.migrated_to)}getPeerTitle(e,t=!1,s=!1,i){e||(e=n.a.myId);let c="";if(e.isUser()){const t=o.a.getUser(e.toUserId());t.first_name&&(c+=t.first_name),!t.last_name||s&&c||(c+=" "+t.last_name),c=c?c.trim():t.pFlags.deleted?d.c.format("HiddenName",!0):t.username}else{c=r.a.getChat(e.toChatId()).title,s&&(c=c.split(" ")[0])}return void 0!==i&&(c=Object(u.a)(c,i,i)),t?c:a.a.wrapEmojiText(c)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return r.a.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?o.a.getUserString(e.toUserId()):r.a.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?o.a.getUser(e.toUserId()):r.a.getChat(e.toChatId())}getPeerInitials(e){var t;const s=this.getPeer(e);return a.a.getAbbreviation(null!==(t=s.title)&&void 0!==t?t:[s.first_name,s.last_name].filter(Boolean).join(" "))}getPeerId(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if(Object(h.a)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const s=e.channel_id||e.chat_id;return void 0!==s?s.toPeerId(!0):n.a.myId}if(!e)return c.c;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&r.a.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&r.a.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!r.a.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&o.a.isBot(e.toUserId())}isContact(e){return e.isUser()&&o.a.isContact(e.toUserId())}isUser(e){return+e>=0}isAnyChat(e){return!this.isUser(e)}isRestricted(e){return e.isUser()?o.a.isRestricted(e.toUserId()):r.a.isRestricted(e.toChatId())}getRestrictionReasonText(e){const t=this.getPeer(e),s=t.restriction_reason?Object(l.a)(t.restriction_reason):void 0;return s?s.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return r.a.getInputPeer(t)}const t=e.toUserId();return o.a.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:Object(h.a)(e)?e:this.getInputPeerById(e)}}getPeerColorById(e,t=!0){if(!e)return"";const s=f[Math.abs(+e)%7];return(t?g:p)[s]}getPeerSearchText(e){let t;if(this.isUser(e))t="%pu "+o.a.getUserSearchText(e.toUserId());else{t="%pg "+(r.a.getChat(e.toChatId()).title||"")}return t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===n.a.myId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return r.a.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return r.a.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;if(e.isUser())return!1;return!!(null===(t=r.a.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}};i.a.appPeersManager=m,t.a=m},function(e,t,s){"use strict";var i=s(92),a=s(124),n=s(10),r=s(37),o=s(112),d=s(21),c=s(7),l=s(4),h=s(8),u=s(166),p=s(87),g=s(28),f=s(0),m=s(136),v=s(150),_=s(20),y=s(30),I=s(12),P=s(78),S=s(76),M=s(144),b=s(174),w=s(123);class C{constructor(e,t,s,i,a,n,r,o,d,c){this.appMessagesManager=e,this.appChatsManager=t,this.appPeersManager=s,this.appUsersManager=i,this.appDraftsManager=a,this.appNotificationsManager=n,this.appStateManager=r,this.apiUpdatesManager=o,this.serverTimeManager=d,this.appMessagesIdsManager=c,this.folders={},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach(e=>{var t;const{folder_id:s,peer:i}=e,a=this.appPeersManager.getPeerId(i),n=this.dropDialog(a)[0];n&&((null===(t=n.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(n,s),n.folder_id=s,this.generateIndexForDialog(n),this.pushDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(a,n)})},this.onUpdateDialogPinned=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(i);a&&(e.pFlags.pinned?a.pFlags.pinned=!0:this.handleDialogUnpinning(a,s),this.generateIndexForDialog(a)),this.appMessagesManager.scheduleHandleNewDialogs(i,a)},this.onUpdatePinnedDialogs=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=e=>{this.pinnedOrders[s].length=0,e.reverse(),e.forEach(e=>{a[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))});const t=this.getFolderDialogs(s,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;a[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},a={};e.order?i(e.order.map(e=>this.appPeersManager.getPeerId(e.peer))):h.a.invokeApi("messages.getPinnedDialogs",{folder_id:s}).then(e=>{this.applyDialogs(e),i(e.dialogs.map(e=>e.peerId))})},this.storage=this.appStateManager.storages.dialogs,this.dialogs=this.storage.getCache(),this.clear(!0),f.a.addEventListener("language_change",()=>{const e=i.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=s.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}});const l=e=>{const t=this.getCachedDialogs(!1);for(let s=0;s{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),s="index_"+e.orderIndex;for(let e=0;e{this.processDialogForFilters(e)}),f.a.addEventListener("chat_update",e=>{const t=this.appChatsManager.getChat(e),s=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(s)&&this.dropDialogOnDeletion(s)}),f.a.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),r.getState().then(e=>{this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]);const t=r.storagesResults.dialogs;t.length&&I.a.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{}})}setDialogsFromState(e){for(let t=0,s=e.length;tvoid 0===e.migratedTo):s.dialogs}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,s){var i;let a;if(this.appMessagesManager.filtersStorage.testDialogForFilter(e,s)){const t=s.pinnedPeerIds.indexOf(e.peerId);a=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(s.pinned_peers.length-1-t),!0):(null===(i=e.pFlags)||void 0===i?void 0:i.pinned)?this.generateIndexForDialog(e,!0):e.index}return e[t]=a}getDialog(e,t,s=!0){const i=[];void 0===t?i.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):i.push(this.getFolderDialogs(t,!1));for(let t of i){let i=0,a=0;for(let n=t.length;it.peerId===e.peerId),n=i[a],r=n&&n[s],o=this.setDialogIndexInFilter(e,s,t);r!==o&&((!r&&o||a&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==a&&i.splice(a,1),o&&Object(M.a)(i,e,s,-1))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],s=this.appMessagesManager.filtersStorage.filters;for(const i in s){const a=s[i];this.appMessagesManager.filtersStorage.testDialogForFilter(e,a)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(a.id,e))}return()=>t.forEach(e=>e())}prepareFolderUnreadCountModifyingByDialog(e,t,s){const i=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===s)return()=>{const s=this.appMessagesManager.getDialogUnreadCount(t),a=s-i,n=s&&!i||!s&&i?i?-1:1:0;this.modifyFolderUnreadCount(e,a,n)};this.modifyFolderUnreadCount(e,s?i:-i,i?s?1:-1:0)}modifyFolderUnreadCount(e,t,s){if(!t&&!s)return;const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t)),s&&(i.unreadDialogsCount=Math.max(0,i.unreadDialogsCount+s)),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=y.a.setTimeout(()=>{i.dispatchUnreadTimeout=void 0,f.a.dispatchEvent("folder_unread",i)},0))}generateIndexForDialog(e,t=!1,s){var i;let a,n=0;if(e.pFlags.pinned&&!t)n=this.generateDialogPinnedDate(e),a=!0;else{s||(s=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),n=s.date||n;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!n||e.date&&e.date>n)&&(n=e.date)}"draftMessage"===(null===(i=e.draft)||void 0===i?void 0:i._)&&e.draft.date>n&&(n=e.draft.date)}n||(n=Object(r.h)(!0));const o=this.generateDialogIndex(n,a);if(t)return o;e.index=o}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],s=t.indexOf(e.peerId);let i=s;return-1===s&&(i=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(i)}setDialogToState(e){const{peerId:t,pts:s}=e,i=this.appMessagesManager.getHistoryStorage(t),a=this.appMessagesManager.getMessagesStorage(t),n=i.history.slice;let r;for(let e=0,s=n.length;ee.peerId===n);if(-1!==o&&r.splice(o,1),this.dialogs[n]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(i){const e=this.dialogsOffsetDate[void 0];(!e||t{"dialogFolder"===t._&&e.dialogs.splice(s,1)}),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach(e=>{const s=this.appPeersManager.getPeerId(e.peer);let i=e.top_message;const a=this.appMessagesManager.pendingTopMsgs[s];a&&(!i||this.appMessagesManager.getMessageByPeer(s,a).date>this.appMessagesManager.getMessageByPeer(s,i).date)&&(e.top_message=i=a,this.appMessagesManager.getHistoryStorage(s).maxId=a),i||e.draft&&"draftMessage"===e.draft._?(this.saveDialog(e),t[s]=e):this.dropDialogWithEvent(s);const n=this.appMessagesManager.newUpdatesAfterReloadToHandle[s];if(void 0!==n){for(const e of n)n.delete(e),this.apiUpdatesManager.saveUpdate(e);n.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[s]}}),Object.keys(t).length&&f.a.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){return this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message).date||0}saveDialog(e,t,s,i){var a,n;void 0===t&&(t=null!==(a=e.folder_id)&&void 0!==a?a:0);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const o=this.appPeersManager.isChannel(r)?r.toChatId():_.c;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const c=this.getDialogOnly(r);let l,h;if(e.top_message){l=this.appMessagesIdsManager.generateMessageId(e.top_message);const t=(null==c?void 0:c.top_message)&&this.appMessagesManager.getMessageByPeer(r,c.top_message);(null===(n=null==t?void 0:t.pFlags)||void 0===n?void 0:n.is_outgoing)&&c.top_message>=l&&(l=c.top_message),h=this.appMessagesManager.getMessageByPeer(r,l)}else l=this.appMessagesManager.generateTempMessageId(r),h={_:"message",id:l,mid:l,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([h],{isOutgoing:!0});if((null==h?void 0:h.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,h),!o&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const s=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=s,this.appMessagesManager.migratedToFrom[s]=r,e.migratedTo=s}}if(e.top_message=l,e.read_inbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_inbox_max_id?c.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_outbox_max_id?c.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=c?c.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,h.pFlags.is_outgoing){const t=h.pFlags.out;l>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(h.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete h.pFlags.unread}const u=this.appMessagesManager.getHistoryStorage(r),p=u.history.slice;if(p.length){if(!p.isEnd(v.a.Bottom)){u.history.insertSlice([l]).setEnd(v.a.Bottom),u.count||(u.count=1),this.appMessagesManager.mergeReplyKeyboard(u,h)&&f.a.dispatchEvent("history_reply_markup",{peerId:r})}}else u.history.unshift(l),u.count||(u.count=1),this.appMessagesManager.mergeReplyKeyboard(u,h)&&f.a.dispatchEvent("history_reply_markup",{peerId:r});u.maxId=l,u.readMaxId=e.read_inbox_max_id,u.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),o&&e.pts&&this.apiUpdatesManager.addChannelState(o,e.pts),this.generateIndexForDialog(e),Object(b.a)(e,["index_0","index_1","index_2","index_3","index_4","index_5","index_6","index_7","index_8","index_9","index_10"]),c&&Object(w.a)(c,e),this.pushDialog(e,h.date,s,i)}getDialogIndexKey(e){return e>1?"index_"+this.appMessagesManager.filtersStorage.getFilter(e).orderIndex:"index"}getDialogs(e="",t,s=20,i=0,a=!1){const n={};if(i>1){const r=[],o=this.appUsersManager.fillContacts();o.cached||r.push(o.promise);const d=this.appMessagesManager.filtersStorage.reloadMissingPeerIds(i);if(d&&r.push(d),r.length)return n.cached=!1,n.promise=Promise.all(r).then(()=>this.getDialogs(e,t,s,i,a).promise),n}const r=i>1||this.getOffsetDate(i)?void 0:i;let o=this.getFolderDialogs(i,a);const d=this.getDialogIndexKey(i);if(e){if(!s||this.cachedResults.query!==e||this.cachedResults.folderId!==i){this.cachedResults.query=e,this.cachedResults.folderId=i;const t=this.dialogsIndex.search(e),s=[];for(const e in this.dialogs){const a=this.dialogs[e];t.has(a.peerId)&&a.folder_id===i&&s.push(a)}s.sort((e,t)=>t[d]-e[d]),this.cachedResults.dialogs=s,this.cachedResults.count=s.length}o=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(t>0)for(let e=o.length;co[c][d]);++c);const l=this.isDialogsLoaded(r),h=o.length>=c+s;if(e||l||h){const i=o.slice(c,c+s);return n.cached=!0,n.promise=Promise.resolve({dialogs:i,count:l?o.length:null,isTopEnd:o.length&&(i[0]&&i[0]===o[0]||o[0][d]=o.length}),n}return n.cached=!1,n.promise=this.appMessagesManager.getTopMessages(s,r).then(e=>{if(a&&(o=this.getFolderDialogs(i,a)),c=0,t>0)for(let e=o.length;co[c][d]);++c);const n=o.slice(c,c+s);return{dialogs:n,count:void 0===e.count?o.length:e.count,isTopEnd:o.length&&(n[0]&&n[0]===o[0]||o[0][d]{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=1,e.order.forEach((e,t)=>{const s=this.filters[e];delete s.orderIndex,this.setOrderIndex(s)}),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)},this.clear(!0),this.filters={},this.appStateManager.getState().then(e=>{Object(w.a)(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}),r.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=Object(E.a)(this.filters);this.getDialogFilters(!0).then(e=>{for(const s in t){const t=+s;e.find(e=>e.id===t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map(e=>e.id)})})},updateDialogFilterOrder:this.onUpdateDialogFilterOrder})}clear(e=!1){e?(this.filters={},this.reloadedPeerIds=new Set):(Object(w.a)(this.filters,{}),this.reloadedPeerIds.clear()),this.orderIndex=1}testDialogForFilter(e,t){const s=e.peerId;if(!this.appMessagesManager.getDialogOnly(s))return!1;if(t.excludePeerIds.includes(s))return!1;if(t.includePeerIds.includes(s))return!0;const i=t.pFlags;if(i.exclude_archived&&1===e.folder_id)return!1;if(i.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(i.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(s)&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(s)){if(i.broadcasts&&this.appPeersManager.isBroadcast(s))return!0;if(i.groups&&this.appPeersManager.isAnyGroup(s))return!0}else{const e=s.toUserId();if(this.appUsersManager.isBot(e))return!!i.bots;if(i.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(i.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}toggleDialogPin(e,t){const s=this.filters[t],i=s.pinnedPeerIds.indexOf(e),a=-1!==i;if(a&&(s.pinned_peers.splice(i,1),s.pinnedPeerIds.splice(i,1)),!a){if(s.pinned_peers.length>=this.rootScope.config.pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});s.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),s.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(s)}createDialogFilter(e,t){const s=Math.max(1,...Object.keys(this.filters).map(e=>+e));return(e=Object(E.a)(e)).id=s+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,s=!1){const i=t?0:1;return h.a.invokeApi("messages.updateDialogFilter",{flags:i,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then(i=>{if(i&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),s)){const t=[];for(const e in this.filters){const s=this.filters[e];++s.orderIndex,t.push(s)}e.orderIndex=1;const s=t.sort((e,t)=>e.orderIndex-t.orderIndex).map(e=>e.id);this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:s})}return i})}getOutputDialogFilter(e){const t=Object(E.a)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){Object(P.a)(e.includePeerIds,(t,s)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(s,1),e.includePeerIds.splice(s,1))})}reloadMissingPeerIds(e,t="pinned_peers"){const s=this.getFilter(e),i=s&&s[t];if(!(null==i?void 0:i.length))return;const a=i.filter(e=>{const t=this.appPeersManager.getPeerId(e),s=this.reloadedPeerIds.has(t),i=this.appMessagesManager.getDialogOnly(t);return!s&&!i});if(!a.length)return;const n=a.map(e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then(e=>(this.reloadedPeerIds.add(t),e?void 0:t))});return Promise.all(n).then(e=>{(e=e.filter(Boolean)).length})}getDialogFilters(e=!1){return k(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length&&!e)return t.map(e=>this.filters[e]).sort((e,t)=>e.orderIndex-t.orderIndex);const s=yield h.a.invokeApiSingle("messages.getDialogFilters");for(const t of s)this.saveDialogFilter(t,e);return s}))}saveDialogFilter(e,t=!0){A.forEach(([t,s])=>{e[s]=e[t].map(e=>this.appPeersManager.getPeerId(e))}),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const s=this.filters[e.id];s?Object.assign(s,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var U=s(80),T=s(68),O=s(84),F=s(91),x=s(63),j=s(72),L=s(145),R=s(35),B=s(60),N=s(158),H=s(134),G=s(143),z=s(75),V=s(1),W=s(111),q=s(69),$=s(159),K=s(109),Y=s(190),J=s(127),Q=s(48),Z=s(113),X=s(88),ee=s(98),te=s(178),se=s(191),ie=s(138),ae=s(101),ne=s(44),re=s(149),oe=s(41),de=s(183),ce=s(133);var le=s(89),he=s(66),ue=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const pe=new class{constructor(){this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new i.a(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=Object(l.b)("MESSAGES",l.a.Error|l.a.Debug|l.a.Log|l.a.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,f.a.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const s in t){const i=t[s];i?(this.dialogsStorage.pushDialog(i),x.a.isChannel(s.toPeerId())||(e=Math.max(e,i.top_message||0))):(this.reloadConversation(s.toPeerId()),delete t[s])}0!==e&&this.incrementMaxSeenId(e),f.a.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{window.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId();if(f.a.peerId===t&&!f.a.idle.isIDLE)continue;const s=this.notificationsToHandle[t];this.getNotifyPeerSettings(t).then(({muted:e,peerTypeNotifySettings:t})=>{const i=s.topMessage;e&&!i.pFlags.mentioned||!i.pFlags.unread||i.pFlags.unread&&this.notifyAboutMessage(i,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})})}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,s=this.pendingByRandomId[t];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s,o=ee.a.generateMessageId(e.id),d=this.getMessageFromStorage(r,o);d.deleted?this.pendingByMessageId[o]=t:([this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)}),this.finalizePendingMessageCallbacks(r,a,d))}},this.onUpdateNewMessage=e=>{var t;const s=e.message,i=this.getMessagePeer(s),a=this.getMessagesStorage(i),n=this.getDialogOnly(i),r="updateNewDiscussionMessage"===e._;this.saveMessages([s],{storage:new Map});const o=this.getThreadKey(s),d=o?+o.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[i]&&this.threadsStorage[i][d]){const e={_:"updateNewDiscussionMessage",message:s};this.onUpdateNewMessage(e)}if(!n&&!r){let s=!0;if(i.isAnyChat()&&(s=T.a.isInChat(i.toChatId())),s){const s=null!==(t=this.newUpdatesAfterReloadToHandle[i])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[i]=new Set;if(s.has(e))return void this.log.error("here we go again",i);e.ignoreExisting=!0,s.add(e),this.scheduleHandleNewDialogs(i)}return}this.saveMessages([s],{storage:a});const c=this.checkPendingMessage(s),l=this.getHistoryStorage(i,r?d:void 0);r||this.updateMessageRepliesIfNeeded(s);const h=e.ignoreExisting;if(!!l.history.findSlice(s.mid)){if(!h)return!1}else{const e=l.history.first;if(e.isEnd(v.a.Bottom)){let t=0;for(const i=e.length;te[t]);++t);e.splice(t,0,s.mid)}else l.history.unshift(s.mid);null!==l.count&&l.count++}this.mergeReplyKeyboard(l,s)&&f.a.dispatchEvent("history_reply_markup",{peerId:i});const u=s.fromId;if(u.isUser()&&!s.pFlags.out&&s.from_id){B.a.forceUserOnline(u,s.date);const e={_:"sendMessageCancelAction"};let t;t=i.isUser()?{_:"updateUserTyping",action:e,user_id:u}:x.a.isChannel(i)?{_:"updateChannelUserTyping",action:e,channel_id:i.toChatId(),from_id:x.a.getOutputPeer(u),top_msg_id:d?ee.a.getServerMessageId(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:i.toChatId(),from_id:x.a.getOutputPeer(u)},U.a.processLocalUpdate(t)}if(c||this.handleNewMessage(i,s.mid),r)return;const p=!s.pFlags.out&&s.pFlags.unread;if(n){if(p&&s.mid>n.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(n);++n.unread_count,s.pFlags.mentioned&&(++n.unread_mentions_count,this.modifyCachedMentions(i,s.mid,!0)),e()}s.mid>=n.top_message&&this.setDialogTopMessage(s,n)}if(p){const e=i;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:_.c}),t.fromId!==u&&(t.fromId=u,t.fwdCount=0),s.fwd_from&&++t.fwdCount,t.topMessage=s,this.notificationsHandlePromise||(this.notificationsHandlePromise=window.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:s,reactions:i}=e,a=ee.a.generateMessageId(s),n=x.a.getPeerId(t),r=this.getMessageByPeer(n,a);if("message"!==r._)return;const o=null==i?void 0:i.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,s=null==t?void 0:t.recent_reactions;x.a.getPeerId(e.peer_id)===f.a.myId||s&&!(s.length<=o.length)||s&&Object(oe.a)(e,s[s.length-1])||this.getNotifyPeerSettings(n).then(({muted:t,peerTypeNotifySettings:s})=>{s.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:s})})}const d=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,d,()=>Object(E.a)(r.reactions)),r.reactions=i,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=x.a.getPeerId(e.peer.peer),s=this.getDialogOnly(t);if(s){const i=this.dialogsStorage.prepareDialogUnreadCountModifying(s);e.pFlags.unread?s.pFlags.unread_mark=!0:delete s.pFlags.unread_mark,i(),f.a.dispatchEvent("dialogs_multiupdate",{[t]:s}),this.dialogsStorage.setDialogToState(s)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=ee.a.generateMessageId(t.id),a=this.getMessagesStorage(s);if(!a.has(i))return;const n=this.getMessageFromStorage(a,i);this.saveMessages([t],{storage:a});const r=this.getMessageFromStorage(a,i);this.handleEditedMessage(n,r);const o=this.getDialogOnly(s),d=o&&o.top_message===i;if(t.clear_history)d&&f.a.dispatchEvent("dialog_flush",{peerId:s});else{if("message"===(null==n?void 0:n._)&&!Object(oe.a)(n.reactions,r.reactions)){const e=r.reactions;return r.reactions=n.reactions,void U.a.processLocalUpdate({_:"updateMessageReactions",peer:x.a.getOutputPeer(s),msg_id:t.id,reactions:e})}if(f.a.dispatchEvent("message_edit",{storage:a,peerId:s,mid:i}),d||t.grouped_id){const e={};e[s]=o,f.a.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}}},this.onUpdateReadHistory=e=>{const t=e.channel_id,s=ee.a.generateMessageId(e.max_id||e.read_max_id),i=ee.a.generateMessageId(e.top_msg_id),a=t?t.toPeerId(!0):x.a.getPeerId(e.peer),n="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getMessagesStorage(a),o=Object(re.a)(r,"desc"),d=this.getDialogOnly(a),c=e.still_unread_count;let l=0,h=0,u=!1;const p=this.getHistoryStorage(a,i);if(a.isUser()&&n&&B.a.forceUserOnline(a),i){const e=this.threadsToReplies[a+"_"+i];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}const g=!i&&d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);for(let e=0,t=o.length;es)continue;const p=r.get(t);if(p.pFlags.out===n){if(!p.pFlags.unread)break;if(i){const e=p.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==i)continue}p.pFlags.unread&&(delete p.pFlags.unread,u||(u=!0),p.pFlags.out||i||!d||(void 0===c&&(l=--d.unread_count),p.pFlags.mentioned&&(h=--d.unread_mentions_count,this.modifyCachedMentions(a,p.mid,!1))),W.a.cancel("msg"+t))}}if(n?p.readOutboxMaxId=s:p.readMaxId=s,!i&&d){if(n?d.read_outbox_max_id=s:d.read_inbox_max_id=s,!n){let e;void 0!==c?e=c:l<0||!this.getReadMaxIdIfUnread(a)?e=0:l&&d.top_message>s&&(e=l),void 0!==e&&(d.unread_count=e),(h<0||!d.unread_count)&&(d.unread_mentions_count=0)}g&&g(),this.dialogsStorage.processDialogForFilters(d),f.a.dispatchEvent("dialog_unread",{peerId:a}),this.dialogsStorage.setDialogToState(d)}if(u&&f.a.dispatchEvent("messages_read"),!i&&t){const e=a+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,s]=this.threadsToReplies[t].split("_");f.a.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+s))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,s=e.messages.map(e=>ee.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;for(let e=0,t=s.length;e{const t=e.channel_id.toPeerId(!0),s=this.getHistoryStorage(t).history.slice,i=ee.a.generateMessageId(e.available_min_id),a=s.filter(e=>e<=i);e.messages=a,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,s=e.messages.map(e=>ee.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;if(!i)return;h.a.clearCache("messages.getSearchCounters",e=>x.a.getPeerId(e.peer)===i);const a=new Set;for(const e of s){const t=this.getMessageByPeer(i,e),s=this.getThreadKey(t);s&&this.threadsStorage[i]&&this.threadsStorage[i][+s.split("_")[1]]&&a.add(s)}const n=this.handleDeletedMessages(i,this.getMessagesStorage(i),s),r=Array.from(a).map(e=>{const[t,s]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+s)}),o=this.getHistoryStorage(i);[o].concat(r).forEach(e=>{for(const t of n.msgs)e.history.delete(t);n.count&&e.count&&(e.count=Math.max(0,e.count-n.count))}),f.a.dispatchEvent("history_delete",{peerId:i,msgs:n.msgs});const d=this.getDialogOnly(i);if(d){const e=n.unreadMentions||n.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);if(n.unread&&(d.unread_count=Math.max(0,d.unread_count-n.unread)),n.unreadMentions&&(d.unread_mentions_count=d.unread_count?Math.max(0,d.unread_mentions_count-n.unreadMentions):0),e&&(t(),f.a.dispatchEvent("dialog_unread",{peerId:i})),n.msgs.has(d.top_message)){const e=o.history.first;if(e.isEnd(v.a.Bottom)&&e.length){const t=e[0],s=this.getMessageByPeer(i,t);this.setDialogTopMessage(s,d)}else this.reloadConversation(i)}}},this.onUpdateChannel=e=>{const t=e.channel_id,s=t.toPeerId(!0),i=T.a.getChat(t),a=T.a.isInChat(t);(!!i.username||!i.pFlags.left)!==(void 0!==this.historiesStorage[s])&&(delete this.historiesStorage[s],f.a.dispatchEvent("history_forbidden",s));!!this.getDialogOnly(s)!==a&&(a?this.reloadConversation(s):this.dialogsStorage.dropDialogOnDeletion(s)),f.a.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then(()=>{f.a.dispatchEvent("history_reload",t)})},this.onUpdateChannelMessageViews=e=>{const t=e.views,s=e.channel_id.toPeerId(!0),i=ee.a.generateMessageId(e.id),a=this.getMessageByPeer(s,i);!a.deleted&&void 0!==a.views&&a.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void f.a.dispatchEvent("service_notification",e);const s=_.f,i=s,a=this.generateTempMessageId(i),n={_:"message",id:a,from_id:x.a.getOutputPeer(s),peer_id:x.a.getOutputPeer(i),pFlags:{unread:!0},date:(e.inbox_date||Object(r.h)(!0))+p.a.serverTimeOffset,message:e.message,media:e.media,entities:e.entities};B.a.hasUser(s)||B.a.saveApiUsers([{_:"user",id:s,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([n],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[i]=a,this.onUpdateNewMessage({_:"updateNewMessage",message:n,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,s=t?t.toPeerId(!0):x.a.getPeerId(e.peer),i=e.messages.map(e=>ee.a.generateMessageId(e)),a=this.getMessagesStorage(s),n=i.filter(e=>!a.has(e));(n.length?Promise.all(n.map(e=>this.wrapSingleMessage(s,e))):Promise.resolve()).finally(()=>{var t;const n=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(n)for(const e of i){a.get(e).pFlags.pinned=!0}else for(const e of i){delete a.get(e).pFlags.pinned}delete this.pinnedMessages[s],R.c.getState().then(e=>{delete e.hiddenPinnedMessages[s],f.a.dispatchEvent("peer_pinned_messages",{peerId:s,mids:i,pinned:n})})})},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:s}=e;if("notifyPeer"===t._){const e=x.a.getPeerId(t.peer),i=this.getDialogOnly(e);i&&(i.notify_settings=s,f.a.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=this.scheduledMessagesStorage[s];if(i){const e=ee.a.generateMessageId(t.id),a=this.getMessageFromStorage(i,e);this.saveMessages([t],{storage:i,isScheduled:!0});const n=this.getMessageFromStorage(i,e);if(a.deleted){this.checkPendingMessage(t)||f.a.dispatchEvent("scheduled_new",{peerId:s,mid:t.mid})}else this.handleEditedMessage(a,n),f.a.dispatchEvent("message_edit",{storage:i,peerId:s,mid:t.mid})}},this.onUpdateDeleteScheduledMessages=e=>{const t=x.a.getPeerId(e.peer),s=this.scheduledMessagesStorage[t];if(s){const i=e.messages.map(e=>ee.a.generateMessageId(e));this.handleDeletedMessages(t,s,i),f.a.dispatchEvent("scheduled_delete",{peerId:t,mids:i})}},this.batchUpdateViews=e=>{const t=[],s=this.getMessagesFromMap(e);for(const[e]of s)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,s,i;const a=[],n=this.getMessagesFromMap(e);for(const[e,r]of n){const n=null!==(s=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==s?s:[],o=null!==(i=null==r?void 0:r.results)&&void 0!==i?i:[],d=n.filter(t=>{const s=o.find(e=>e.reaction===t.reaction);return e.pFlags.out&&(!s||t.count>s.count)||t.pFlags.chosen&&(!s||!s.pFlags.chosen)});a.push({message:e,changedResults:d})}return a},this.clear(),f.a.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages}),f.a.addEventListener("notify_peer_type_settings",({key:e,settings:t})=>{let s;s="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>e.peerId.isBroadcast():e=>x.a.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(s).forEach(e=>{f.a.dispatchEvent("dialog_notify_settings",e)})}),f.a.addEventListener("webpage_updated",({id:e,msgs:t})=>{t.forEach(({peerId:t,mid:s,isScheduled:i})=>{const a=i?this.getScheduledMessagesStorage(t):this.getMessagesStorage(t),n=this.getMessageFromStorage(a,s);n&&(n.media={_:"messageMediaWebPage",webpage:N.a.getWebPage(e)},f.a.dispatchEvent("message_edit",{storage:a,peerId:t,mid:s}))})}),f.a.addEventListener("draft_updated",({peerId:e,threadId:t,draft:s})=>{if(t)return;const i=this.getDialogOnly(e);if(i){if(!t){i.draft=s;let t=!1;s||ee.a.getServerMessageId(i.top_message)?(this.dialogsStorage.generateIndexForDialog(i),this.dialogsStorage.pushDialog(i)):(this.dialogsStorage.dropDialog(e),t=!0),f.a.dispatchEvent("dialog_draft",{peerId:e,dialog:i,drop:t,draft:s,index:i.index})}}else this.reloadConversation(e)}),f.a.addEventListener("poll_update",({poll:e})=>{const t=L.a.pollToMessages[e.id];if(t)for(const e of t){const[t,s]=e.split("_"),i=this.getMessageByPeer(t.toPeerId(),+s);this.setDialogToStateIfMessageIsTop(i)}}),R.c.getState().then(e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}),this.batchUpdatesDebounced=Object(le.a)(()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const s=t.callback(t.batch);!s||s instanceof Array&&!s.length||f.a.dispatchEvent(e,s)}},33,!1,!0)}clear(){this.middleware?this.middleware.clean():this.middleware=Object(Z.a)(),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(),this.filtersStorage&&this.filtersStorage.clear()}construct(){this.filtersStorage=new D(this,x.a,B.a,W.a,R.c,U.a,f.a),this.dialogsStorage=new C(this,T.a,x.a,B.a,H.a,W.a,R.c,U.a,p.a,ee.a)}getInputEntities(e){const t=Object(E.a)(e);return t.forEach(e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=B.a.getUserInput(e.user_id))}),t}invokeAfterMessageIsSent(e,t,s){var i,a;const r=null!==(i=this.tempFinalizeCallbacks[e])&&void 0!==i?i:this.tempFinalizeCallbacks[e]={},o=null!==(a=r[t])&&void 0!==a?a:r[t]={deferred:Object(n.a)()};return o.callback=s,o.deferred}editMessage(e,t,s={}){const{mid:i,peerId:a}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(i,"edit",e=>this.editMessage(e,t,s));let n=s.entities||[];t&&(t=g.a.parseMarkdown(t,n));const r=s.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return h.a.invokeApi("messages.editMessage",{peer:x.a.getInputPeerById(a),id:e.id,message:t,media:s.newMedia,entities:n.length?this.getInputEntities(n):void 0,no_webpage:s.noWebPage,schedule_date:r}).then(e=>{U.a.processUpdateMessage(e)},e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0})}sendText(e,t,s={}){if(!t.trim())return Promise.resolve();s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId);const i=f.a.config.message_length_max;if(t.length>i){const a=function e(t,s){if(t.length{let d=t.slice(a,o);const c=n++;if(d.length>s){e(d.slice(s),s).forEach(e=>{r[n++]=e}),d=d.slice(0,s)}a=o,i=0,r[c]=(r[c]||"")+d};let d=0;for(;;){let e=t.indexOf(" ",d);if(-1===e){d!==t.length-1&&o();break}e+=" ".length;const a=e-d;i+a>s&&o(i),d=e,i+=a}return r}(t,i);t=a[0],a.length>1&&delete s.webPage;for(let t=1;t{this.sendText(e,a[t],s)},t)}e=x.a.getPeerMigratedTo(e)||e;let a=s.entities||[];s.viaBotId||(t=g.a.parseMarkdown(t,a));let n=this.getInputEntities(a);n.length||(n=void 0);const r=this.generateOutgoingMessage(e,s);r.entities=a,r.message=t;const o=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0,d=x.a.isChannel(e);s.webPage&&(r.media={_:"messageMediaWebPage",webpage:s.webPage});const c=e=>{e?r.error=!0:delete r.error,f.a.dispatchEvent("messages_pending")};return r.send=()=>{c(!1);const i={};this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId);const a=s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0;let l;return l=s.viaBotId?h.a.invokeApiAfter("messages.sendInlineBotResult",{peer:x.a.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,send_as:a},i):h.a.invokeApiAfter("messages.sendMessage",{no_webpage:s.noWebPage,peer:x.a.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:n,clear_draft:s.clearDraft,schedule_date:s.scheduleDate||void 0,silent:s.silent,send_as:a},i),this.pendingAfterMsgs[e]=i,l.then(e=>{if("updateShortSentMessage"===e._){const t=r.promise;delete r.promise;const i=Object(E.a)(r);r.promise=t,i.date=e.date,i.id=e.id,i.media=e.media,i.entities=e.entities,this.wrapMessageEntities(i),e.pFlags.out&&(i.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:i.id},{_:s.scheduleDate?"updateNewScheduledMessage":d?"updateNewChannelMessage":"updateNewMessage",message:i,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)});U.a.processUpdateMessage(e),r.promise.resolve()},e=>{c(!0),r.promise.reject(e)}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(r,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),r.promise}sendFile(e,t,s={}){e=x.a.getPeerMigratedTo(e)||e;const i=this.generateOutgoingMessage(e,s),r=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0;let d,c;const l="mime_type"in t?t.mime_type:t.type,u=t instanceof File?t.name:"",p=!(t instanceof File||t instanceof Blob);let m=s.caption||"";this.log("sendFile",t,l);const v=s.entities||[];m&&(m=g.a.parseMarkdown(m,v));const _=[],y=te.a.has(l);let I,P,S;if(p)d="document",c="";else if(0===l.indexOf("audio/")||["video/ogg"].indexOf(l)>=0){d="audio",c="audio."+("ogg"===l.split("/")[1]?"ogg":"mp3"),S="sendMessageUploadAudioAction",s.isVoiceMessage&&(d="voice",i.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:s.isVoiceMessage},waveform:s.waveform,duration:s.duration||0};_.push(e)}else if(s.isMedia)if(y){d="photo",c="photo."+l.split("/")[1],S="sendMessageUploadPhotoAction";const e={_:"photoSize",w:s.width,h:s.height,type:"full",location:null,size:t.size};I={_:"photo",id:""+i.id,sizes:[e],w:s.width,h:s.height};const a=F.a.getCacheContext(I,e.type);a.downloaded=t.size,a.url=s.objectURL||"",I=j.a.savePhoto(I)}else if(se.a.has(l)){d="video",c="video.mp4",S="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:s.isRoundMessage,supports_streaming:!0},duration:s.duration,w:s.width,h:s.height};_.push(e),s.noSound&&t.size>10240&&t.size<10485760&&_.push({_:"documentAttributeAnimated"})}else d="document",c="document."+l.split("/")[1],S="sendMessageUploadDocumentAction";else d="document",c="document."+l.split("/")[1],S="sendMessageUploadDocumentAction";if(_.push({_:"documentAttributeFilename",file_name:u||c}),-1!==["document","video","audio","voice"].indexOf(d)&&!p){const e=[];if(P={_:"document",id:""+i.id,duration:s.duration,attributes:_,w:s.width,h:s.height,thumbs:e,mime_type:l,size:t.size},s.objectURL){const e=F.a.getCacheContext(P);e.downloaded=t.size,e.url=s.objectURL}let a;if(y)_.push({_:"documentAttributeImageSize",w:s.width,h:s.height}),a={_:"photoSize",w:s.width,h:s.height,type:"full",size:t.size};else if("video"===d&&s.thumb){a={_:"photoSize",w:s.thumb.size.width,h:s.thumb.size.height,type:"local-thumb",size:s.thumb.blob.size};const e=F.a.getCacheContext(P,a.type);e.downloaded=a.size,e.url=s.thumb.url}a&&e.push(a),P=O.a.saveDoc(P)}this.log("sendFile",d,c,t.type,s);const M=p?void 0:new a.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),b=Object(n.a)();M&&(M.attachPromise(b),b.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",b.reject(e)},b.catch(t=>{"AbortError"!==t.name||E||(this.log("cancelling upload",w),this.cancelPendingMessage(i.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),(null==k?void 0:k.cancel)&&k.cancel())}));const w=p?void 0:{_:I?"messageMediaPhoto":"messageMediaDocument",pFlags:{},preloader:M,photo:I,document:P,promise:b};i.entities=v,i.message=m,i.media=p?{_:"messageMediaDocument",pFlags:{},document:t}:w;const C=e=>{e?i.error=!0:delete i.error,f.a.dispatchEvent("messages_pending")};let E=!1,k=null;return i.send=()=>{if(p){const{id:e,access_hash:s,file_reference:i}=t,a={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:s,file_reference:i}};b.resolve(a)}else if(t instanceof File||t instanceof Blob){const a=()=>{let a;return E&&!i.error||(E=!1,k=F.a.upload(t),b.notifyAll({done:0,total:t.size})),"video"===d&&s.objectURL&&(a=new Promise((e,t)=>{(s.thumb&&s.thumb.blob?Promise.resolve(s.thumb):Object(o.a)(s.objectURL)).then(s=>{s?F.a.upload(s.blob).then(e,t):e(null)},t)})),k&&k.then(e=>ue(this,void 0,void 0,(function*(){let t;switch(delete i.media.preloader,e.name=c,E=!0,d){case"photo":t={_:"inputMediaUploadedPhoto",file:e};break;default:t={_:"inputMediaUploadedDocument",file:e,mime_type:l,pFlags:{force_file:"sendMessageUploadDocumentAction"===S||void 0},attributes:_}}if(a)try{const e=yield a;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(t)})),()=>{C(!0)}),k.addNotifyListener(t=>{const s=Math.max(1,Math.floor(100*t.done/t.total));S&&this.setTyping(e,{_:S,progress:0|s}),b.notifyAll(t)}),b};s.isGroupedItem?a():this.sendSmthLazyLoadQueue.push({load:a})}return b},this.beforeMessageSending(i,{isGroupedItem:s.isGroupedItem,isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),s.isGroupedItem||(b.then(t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),h.a.invokeApi("messages.sendMedia",{background:s.background,peer:x.a.getInputPeerById(e),media:t,message:m,random_id:i.random_id,reply_to_msg_id:r,schedule_date:s.scheduleDate,silent:s.silent,entities:v,clear_draft:s.clearDraft,send_as:s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0}).then(e=>{U.a.processUpdateMessage(e)},e=>{if("photo"===d&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,d="document",void i.send();throw C(!0),e}))),b.then(i.promise.resolve,i.promise.reject)),{message:i,promise:b}}sendAlbum(e,t,s={}){return ue(this,void 0,void 0,(function*(){if(s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},s),s.sendFileDetails[0]));e=x.a.getPeerMigratedTo(e)||e;const i=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0;let a=s.caption||"",r=s.entities||[];a&&(a=g.a.parseMarkdown(a,r)),this.log("sendAlbum",t,s);const o=""+ ++this.groupedTempId,d=t.map((t,n)=>{const d=s.sendFileDetails[n],c=Object.assign({isGroupedItem:!0,isMedia:s.isMedia,scheduleDate:s.scheduleDate,silent:s.silent,replyToMsgId:i,threadId:s.threadId,sendAsPeerId:s.sendAsPeerId,groupId:o},d);return 0===n&&(c.caption=a,c.entities=r),this.sendFile(e,t,c).message});s.clearDraft&&setTimeout(()=>{H.a.clearDraft(e,s.threadId)},0);const c=(e,t)=>{t?e.error=!0:delete e.error,f.a.dispatchEvent("messages_pending")},l=x.a.getInputPeerById(e),u=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const a=Object(n.a)();return this.sendSmthLazyLoadQueue.push({load:()=>h.a.invokeApi("messages.sendMultiMedia",{peer:l,multi_media:t,reply_to_msg_id:i,schedule_date:s.scheduleDate,silent:s.silent,clear_draft:s.clearDraft,send_as:s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0}).then(e=>{U.a.processUpdateMessage(e),a.resolve()},e=>{d.forEach(e=>c(e,!0)),a.reject(e)})}),a},p=d.map(e=>e.send().then(e=>h.a.invokeApi("messages.uploadMedia",{peer:l,media:e})).then(t=>{let s;if("messageMediaPhoto"===t._){const e=j.a.savePhoto(t.photo);s=j.a.getMediaInput(e)}else if("messageMediaDocument"===t._){const e=O.a.saveDoc(t.document);s=O.a.getMediaInput(e)}const i={_:"inputSingleMedia",media:s,random_id:e.random_id,message:a,entities:r};return a&&(a="",r=[]),i}).catch(t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),c(e,!0),t}));return Promise.all(p).then(e=>u(e.filter(Boolean)))}))}sendContact(e,t){return this.sendOther(e,B.a.getContactMediaInput(t))}sendOther(e,t,s={}){var i;e=x.a.getPeerMigratedTo(e)||e;const a=this.generateOutgoingMessage(e,s),n=s.replyToMsgId?ee.a.getServerMessageId(s.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+a.id;t.poll.id=e,L.a.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:s,results:i}=L.a.getPoll(e);r={_:"messageMediaPoll",poll:s,results:i};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:j.a.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:O.a.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(i=t.user_id)&&void 0!==i?i:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:s.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:s.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}a.media=r;return a.send=()=>{const i={};this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=s.sendAsPeerId?x.a.getInputPeerById(s.sendAsPeerId):void 0;let o;return o=s.viaBotId?h.a.invokeApiAfter("messages.sendInlineBotResult",{peer:x.a.getInputPeerById(e),random_id:a.random_id,reply_to_msg_id:n||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent,send_as:r},i):h.a.invokeApiAfter("messages.sendMedia",{peer:x.a.getInputPeerById(e),media:t,random_id:a.random_id,reply_to_msg_id:n||void 0,message:"",clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent,send_as:r},i),this.pendingAfterMsgs[e]=i,o.then(e=>{e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)}),U.a.processUpdateMessage(e)},e=>{f.a.dispatchEvent("messages_pending")}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(a,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),a.promise}beforeMessageSending(e,t={}){const s=e.id,i=this.getMessagePeer(e),a=t.isScheduled?this.getScheduledMessagesStorage(i):this.getMessagesStorage(i);if(t.isScheduled)this.saveMessages([e],{storage:a,isScheduled:!0,isOutgoing:!0}),setTimeout(()=>{f.a.dispatchEvent("scheduled_new",{peerId:i,mid:s})},0);else{const n=[this.getHistoryStorage(i),t.threadId?this.getHistoryStorage(i,t.threadId):void 0];for(const e of n)e&&e.history.unshift(s);this.saveMessages([e],{storage:a,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout(()=>{f.a.dispatchEvent("history_append",{storage:a,peerId:i,mid:s})},0)}this.pendingByRandomId[e.random_id]={peerId:i,tempId:s,threadId:t.threadId,storage:a},!t.isGroupedItem&&e.send&&setTimeout(()=>{t.clearDraft&&H.a.clearDraft(i,t.threadId),e.send()},0)}generateOutgoingMessage(e,t){let s;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const i=x.a.isBroadcast(e);if(i){if(x.a.getPeer(e).pFlags.signatures){const e=B.a.getSelf();s=e.first_name+(e.last_name?" "+e.last_name:"")}}return{_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?x.a.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:x.a.getOutputPeer(e),post_author:s,pFlags:this.generateFlags(e),date:t.scheduleDate||Object(r.h)(!0)+p.a.serverTimeOffset,message:"",grouped_id:t.groupId,random_id:Object(d.b)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:i&&1,pending:!0,promise:void 0===t.groupId?Object(n.a)():void 0}}generateReplyHeader(e,t){const s={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&s.reply_to_msg_id!==t&&(s.reply_to_top_id=t),s}generateReplies(e){let t;if(x.a.isBroadcast(e)){const s=z.default.getCachedFullChat(e.toChatId());(null==s?void 0:s.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:s.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return e.isAnyChat()&&(e.isBroadcast()||this.isAnonymousSending(e))?void 0:x.a.getOutputPeer(B.a.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==B.a.getSelf().id&&(t.out=!0,x.a.isChannel(e)||B.a.isBot(e)||(t.unread=!0)),x.a.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const s=B.a.getSelf().id.toPeerId(),i=t.fromId;if(i===s&&t.peerId===s&&!t.fwd_from)return;const a={_:"messageFwdHeader",flags:0,date:t.date};let n=!1;if(t.fwd_from)a.from_id=t.fwd_from.from_id,a.from_name=t.fwd_from.from_name,a.post_author=t.fwd_from.post_author;else{if(a.post_author=t.post_author,i.isUser()){const e=z.default.getCachedFullUser(i.toUserId());(null==e?void 0:e.private_forward_name)&&(a.from_name=e.private_forward_name,n=!0)}n||(a.from_id=x.a.getOutputPeer(i))}return x.a.isBroadcast(t.peerId)&&(t.post_author&&(a.post_author=t.post_author),a.channel_post=t.id),e!==s||n||(a.saved_from_msg_id=t.id,a.saved_from_peer=x.a.getOutputPeer(t.peerId)),a}generateFakeAvatarMessage(e,t){const s=Number.MAX_SAFE_INTEGER,i={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:s,peer_id:x.a.getOutputPeer(e),mid:s,peerId:e,date:t.date,fromId:e};return this.getMessagesStorage(e).set(s,i),i}isAnonymousSending(e){var t,s;return e.isAnyChat()&&(null===(s=null===(t=x.a.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){if(t){t.top_message=e.mid;this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t)}}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:s,tempId:i,storage:a}=t,n=this.getHistoryStorage(s);return U.a.processLocalUpdate({_:"updateDeleteMessages",messages:[i],pts:void 0,pts_count:void 0}),n.history.delete(i),delete this.pendingByRandomId[e],a.delete(i),!0}return!1}fillConversations(){return ue(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(void 0);){const t=yield this.getTopMessages(100,void 0);if(!e()||t.isEnd)break}}))}getConversations(e="",t,s,i=0,a){return this.dialogsStorage.getDialogs(e,t,s,i,a)}getReadMaxIdIfUnread(e,t){var s;const i=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),a=Math.max(null!==(s=t.readMaxId)&&void 0!==s?s:0,i.readMaxId);return!this.getMessageByPeer(e,i.maxId).pFlags.out&&a{if(!a()||"messages.dialogsNotModified"===r._)return null;V.b&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),s||void 0===t||this.dialogsStorage.resetPinnedOrder(t),s||Q.default.setAuthorized(!0),B.a.saveApiUsers(r.users),T.a.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!s,d=!1;const c={},l=void 0===t?0:t,h=void 0===t;Object(P.a)(r.dialogs,e=>{void 0===e.folder_id&&(e.folder_id=l),this.dialogsStorage.saveDialog(e,void 0,!0,h),o||x.a.isChannel(e.peerId||x.a.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(i&&e.index>i&&(this.scheduleHandleNewDialogs(e.peerId,e),d=!0),ee.a.getServerMessageId(e.read_inbox_max_id)||ee.a.getServerMessageId(e.read_outbox_max_id)||(c[e.peerId]=e,this.log.error("noIdsDialogs",e,n)))});const u=Object.keys(c);if(u.length){const e=u.map(e=>e.toPeerId()),t=e.map(e=>this.reloadConversation(e));Promise.all(t).then(()=>{f.a.dispatchEvent("dialogs_multiupdate",c);for(let t=0;t=p||!r.dialogs.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),d?this.scheduleHandleNewDialogs():f.a.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,y=100===e?_:_.slice(0,e);return{isEnd:v&&y[y.length-1]===_[_.length-1],count:p,dialogs:y}})}forwardMessages(e,t,s,i={}){e=x.a.getPeerMigratedTo(e)||e;for(let a=0,n=(s=s.slice().sort((e,t)=>e-t)).length;a{var o,d,c,l;const h=this.getMessageByPeer(t,r),u=this.generateOutgoingMessage(e,i);n.push(u.id);const p=["entities","media"];i.dropAuthor||(u.fwd_from=this.generateForwardHeader(e,h),p.push("views","forwards"),(null===(o=u.fwd_from)||void 0===o?void 0:o.from_name)&&e===f.a.myId&&delete u.from_id),i.dropCaptions&&h.media||p.push("message");const g=null===(d=h.reply_to)||void 0===d?void 0:d.reply_to_msg_id,m=s.indexOf(g);if(g&&-1!==m){const e=n[m];u.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}p.forEach(e=>{u[e]=h[e]});const v=null===(c=u.media)||void 0===c?void 0:c.document;if(v){["round","voice"].includes(v.type)&&(u.pFlags.media_unread=!0)}if(h.grouped_id){(null!==(l=a[h.grouped_id])&&void 0!==l?l:a[h.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(u)}return u});for(const e in a){const t=a[e];t.messages.length>1&&t.messages.forEach(e=>{e.grouped_id=t.tempId})}r.forEach(e=>{this.beforeMessageSending(e,{isScheduled:!!i.scheduleDate||void 0})});const o={};this.pendingAfterMsgs[e]&&(o.afterMessageId=this.pendingAfterMsgs[e].messageId);const d=h.a.invokeApiAfter("messages.forwardMessages",{from_peer:x.a.getInputPeerById(t),id:s.map(e=>ee.a.getServerMessageId(e)),random_id:r.map(e=>e.random_id),to_peer:x.a.getInputPeerById(e),with_my_score:i.withMyScore,silent:i.silent,schedule_date:i.scheduleDate,drop_author:i.dropAuthor,drop_media_captions:i.dropCaptions,send_as:i.sendAsPeerId?x.a.getInputPeerById(i.sendAsPeerId):void 0},o).then(e=>{this.log("forwardMessages updates:",e),U.a.processUpdateMessage(e)}).finally(()=>{this.pendingAfterMsgs[e]===o&&delete this.pendingAfterMsgs[e]});return this.pendingAfterMsgs[e]=o,d}generateEmptyMessage(e){return{_:"messageEmpty",id:ee.a.getServerMessageId(e),mid:e,deleted:!0,pFlags:{}}}getMessageFromStorage(e,t){return e&&e.get(t)||this.generateEmptyMessage(t)}createMessageStorage(){return new Map}getMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage()}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(x.a.isChannel(t.toPeerId()))continue;const s=this.messagesStorageByPeerId[t].get(e);if(s)return s}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&x.a.getPeerId(e.peer_id)||_.c}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}reloadConversation(e){let t;if(void 0!==e){const s=x.a.getPeerId(e);let i=this.reloadConversationsPeers.get(s);if(i&&(t=i.promise),t)return t;t=Object(n.a)(),this.reloadConversationsPeers.set(s,i={inputDialogPeer:x.a.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise((e,t)=>{setTimeout(()=>{const t=[],s={};for(const[e,{inputDialogPeer:i,promise:a}]of this.reloadConversationsPeers)t.push(i),s[e]=a;this.reloadConversationsPeers.clear();h.a.invokeApi("messages.getPeerDialogs",{peers:t}).then(e=>{this.dialogsStorage.applyDialogs(e),e.dialogs.forEach(e=>{const t=e.peerId;t&&(s[t].resolve(e),delete s[t])})},e=>{}).finally(()=>{(()=>{for(const e in s)s[e].resolve(void 0)})(),e(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()})},0)})),t||this.reloadConversationsPromise}doFlushHistory(e,t,s){return h.a.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:s,peer:e,max_id:0}).then(i=>(U.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:i.pts,pts_count:i.pts_count}}),!i.offset||this.doFlushHistory(e,t,s)))}flushHistory(e,t,s){return ue(this,void 0,void 0,(function*(){if(x.a.isChannel(e)){const t=this.getHistory(e,0,1),s=t instanceof Promise?yield t:t,i=e.toChatId(),a=s.history[0]||0;return h.a.invokeApiSingle("channels.deleteHistory",{channel:T.a.getChannelInput(i),max_id:ee.a.getServerMessageId(a)}).then(e=>(e&&U.a.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:i,available_min_id:a}),e))}return this.doFlushHistory(x.a.getInputPeerById(e),t,s).then(()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach(t=>{delete t[e]});const s=this.needSingleMessages.get(e);if(s&&s.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach(t=>{const s=t[e];s&&s.clear()}),t)f.a.dispatchEvent("dialog_flush",{peerId:e});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}})}))}onPeerDeleted(e){}hidePinnedMessages(e){return Promise.all([R.c.getState(),this.getPinnedMessage(e)]).then(([t,s])=>{t.hiddenPinnedMessages[e]=s.maxId,f.a.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:s.maxId})})}getPinnedMessage(e){var t;const s=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return s.promise?s.promise:s.maxId?Promise.resolve(s):s.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then(e=>{var t;return s.count=e.count,s.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,s}).finally(()=>{delete s.promise})}updatePinnedMessage(e,t,s,i,a){return h.a.invokeApi("messages.updatePinnedMessage",{peer:x.a.getInputPeerById(e),unpin:s,silent:i,pm_oneside:a,id:ee.a.getServerMessageId(t)}).then(e=>{U.a.processUpdateMessage(e)})}unpinAllMessages(e){return h.a.invokeApiSingle("messages.unpinAllMessages",{peer:x.a.getInputPeerById(e)}).then(t=>{if(U.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),!t.offset){return this.getMessagesStorage(e).forEach(e=>{e.pFlags.pinned&&delete e.pFlags.pinned}),f.a.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0}return this.unpinAllMessages(e)})}getAlbumText(e){const t=this.groupedMessagesStorage[e];let s,i,a,n=0;for(const[e,r]of t)if(r.message){if(++n>1)break;s=r.message,i=r.totalEntities,a=r.entities}return n>1&&(s=void 0,i=void 0,a=void 0),{message:s,entities:a,totalEntities:i}}getGroupsFirstMessage(e){if(!e.grouped_id)return e;const t=this.groupedMessagesStorage[e.grouped_id];let s=Number.MAX_SAFE_INTEGER;for(const[e,i]of t)i.midl[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=ee.a.generateMessageId(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=ee.a.generateMessageId(e.reply_to.reply_to_top_id))),d&&e.replies&&(e.replies.max_id&&(e.replies.max_id=ee.a.generateMessageId(e.replies.max_id)),e.replies.read_max_id&&(e.replies.read_max_id=ee.a.generateMessageId(e.replies.read_max_id)));const h=!!a;h||(e.date-=p.a.serverTimeOffset);const u=B.a.getSelf().id.toPeerId(),g=d&&e.fwd_from;if(e.peerId=a,e.fromId=a===u?g?g.from_id?x.a.getPeerId(g.from_id):_.c:u:e.pFlags.post||!e.from_id?a:x.a.getPeerId(e.from_id),g){g.saved_from_msg_id&&(g.saved_from_msg_id=ee.a.generateMessageId(g.saved_from_msg_id)),g.channel_post&&(g.channel_post=ee.a.generateMessageId(g.channel_post));const t=g.saved_from_peer||g.from_id,s=g.saved_from_msg_id||g.channel_post;if(t&&s){const i=x.a.getPeerId(t),a=ee.a.generateMessageId(s);e.savedFrom=i+"_"+a}e.fwdFromId=x.a.getPeerId(g.from_id),h||(g.date-=p.a.serverTimeOffset)}const f={type:"message",peerId:a,messageId:c};if(d&&e.media){let s=!1;switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?s=!0:e.media.photo=j.a.savePhoto(e.media.photo,f),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=L.a.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":if(e.media.ttl_seconds)s=!0;else{const t=e.media.document;e.media.document=O.a.saveDoc(t,f),e.media.document||"documentEmpty"===t._||(s=!0)}break;case"messageMediaWebPage":{const s=N.a.getMessageKeyForPendingWebPage(a,c,t.isScheduled);e.media.webpage=N.a.saveWebPage(e.media.webpage,s,f);break}case"messageMediaInvoice":s=!0,e.media={_:"messageMediaUnsupported"};break;case"messageMediaUnsupported":s=!0}s&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities)}if(!d&&e.action){const t=e.action;let s,n;const d=e.fromId===B.a.getSelf().id?"You":"";switch(t.photo&&(t.photo=j.a.savePhoto(t.photo,f)),t.document&&(t.document=O.a.saveDoc(t.photo,f)),t._){case"messageActionChatEditPhoto":(null===(i=t.photo)||void 0===i?void 0:i.video_sizes)?t._=o?"messageActionChannelEditVideo":"messageActionChatEditVideo":o&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;ie.a.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",o||(e+="_by"+d),t.type=e;break}case"messageActionChatEditTitle":o&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":o&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+d:"messageActionChatReturn"+d)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+d);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),n=a;break;case"messageActionChatMigrateTo":s=a,n=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&n&&!this.migratedFromTo[s]&&!this.migratedToFrom[n]&&this.migrateChecks(s,n)}d&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),n.set(c,e)}saveMessages(e,t={}){e.saved||(e.saved=!0,e.forEach(e=>{this.saveMessage(e,t)}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=g.a.fixEmoji(e.message,t);const s=g.a.parseEntities(e.message);e.totalEntities=g.a.mergeEntities(t,s)}wrapMessageForReply(e,t=e.message,s,i,a,n){const r=[];let o=!1;const d=(e,t)=>{if(e){if(void 0===t&&o)return;t=i?c.c.format(e,!0):Object(c.d)(e)}if(i)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}},l=this.isRestricted(e);let h=e.totalEntities;if(e.media&&!l){Object(X.a)(e);let a=!0;if(e.grouped_id){if(s){const t=this.getMidsByMessage(e);if(s.length===t.length){for(const e of t)if(!s.includes(e)){a=!1;break}}else a=!1}if(a){const s=this.getAlbumText(e.grouped_id);t=s.message,h=s.totalEntities,n||(d("AttachAlbum"),o=!0)}}else a=!1;if(!a&&!n||!t){const s=e.media;switch(s._){case"messageMediaPhoto":d("AttachPhoto");break;case"messageMediaDice":d(void 0,i?s.emoticon:g.a.wrapEmojiText(s.emoticon));break;case"messageMediaVenue":t=s.title,d("AttachLocation");break;case"messageMediaGeo":d("AttachLocation");break;case"messageMediaGeoLive":d("AttachLiveLocation");break;case"messageMediaPoll":const e="📊 "+(s.poll.question||"poll");d(void 0,i?e:g.a.wrapEmojiText(e));break;case"messageMediaContact":d("AttachContact");break;case"messageMediaGame":{const e="🎮 "+s.game.title;d(void 0,i?e:g.a.wrapEmojiText(e));break}case"messageMediaDocument":{const e=s.document;if("video"===e.type)d("AttachVideo");else if("voice"===e.type)d("AttachAudio");else if("gif"===e.type)d("AttachGif");else if("round"===e.type)d("AttachRound");else if("sticker"===e.type){const s=r.length;if(e.stickerEmojiRaw){const t=e.stickerEmojiRaw+" ";d(void 0,i?t:g.a.wrapEmojiText(t))}d("AttachSticker");const a=r.splice(s,2);if(i)r.push(a[0]+a[1]);else{const e=window.document.createElement("span");e.append(...a),r.push(e)}t=""}else if("audio"===e.type){const t=e.attributes.find(e=>"documentAttributeAudio"===e._&&(e.title||e.performer)),s="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);d(void 0,i?s:g.a.wrapEmojiText(s))}else d(void 0,i?e.file_name:g.a.wrapEmojiText(e.file_name));break}case"messageMediaUnsupported":d(c.a)}}const l=r.length;for(let e=1;et?x.a.getPeerTitle(e,t):new q.a({peerId:e}).element;switch(i._){case"messageActionPhoneCall":o+="."+i.type,n=[Object(Y.a)(i.duration,t)];break;case"messageActionGroupCall":o+="."+i.type,n=[],o.endsWith("You")||e.pFlags.post||n.push(d(e.fromId,t)),void 0!==i.duration?n.push(Object(Y.a)(i.duration,t)):n.push(this.wrapJoinVoiceChatAnchor(e));break;case"messageActionInviteToGroupCall":{const s=[e.fromId,i.users[0].toPeerId()];let r="Chat.Service.VoiceChatInvitation";const o=B.a.getSelf().id;s[0]===o?r+="ByYou":s[1]===o&&(r+="ForYou"),Object(S.a)(s,o),a=r,n=s.map(e=>d(e,t)),n.push(this.wrapJoinVoiceChatAnchor(e));break}case"messageActionGroupCallScheduled":{const s=new Date,o=new Date(1e3*i.schedule_date),l=(o.getTime()-s.getTime())/864e5,h=new Date(s);h.setDate(h.getDate()+1);const u=x.a.isBroadcast(e.peerId);a=u?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",n=[];const p=B.a.getSelf().id;e.fromId===p?a+="You":u||n.push(d(e.fromId,t));let g,f=[];l<1&&o.getDate()===s.getDate()?g="TodayAtFormattedWithToday":l<2&&o.getDate()===h.getDate()?g="Time.TomorrowAt":(g="formatDateAtTime",f.push(new c.c.IntlDateElement({date:o,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),f.push(Object(r.f)(o));const m=Object(c.d)(g,f);n.push(m);break}case"messageActionChatCreate":{const s=B.a.getSelf().id;e.fromId===s?o+="You":n=[d(e.fromId,t)];break}case"messageActionPinMessage":{const s=e.peerId,i=this.getMessageByPeer(s,e.reply_to_mid);if(n=[d(e.fromId,t)],i.deleted)a="ActionPinnedNoText",e.reply_to_mid&&this.fetchMessageReplyTo(e).then(t=>{t.deleted||e.deleted||(f.a.dispatchEvent("message_edit",{storage:this.getMessagesStorage(s),peerId:s,mid:e.mid}),this.isMessageIsTopMessage(e)&&f.a.dispatchEvent("dialogs_multiupdate",{[s]:this.getDialogOnly(s)}))});else{const e=document.createElement("i");e.dataset.savedFrom=i.peerId+"_"+i.mid,e.dir="auto",e.append(this.wrapMessageForReply(i,void 0,void 0,t)),n.push(e)}break}case"messageActionChatJoinedByRequest":{const s=x.a.isBroadcast(e.peerId);e.pFlags.out?a=s?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(a=s?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",n=[d(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":n=[d(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":n=[],"messageActionChatEditTitle"===i._&&n.push(d(e.fromId,t)),n.push(t?i.title:Object(K.a)(g.a.wrapEmojiText(i.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const s=i.users||[i.user_id];if(n=[d(e.fromId,t)],s.length>1){const e=Object(c.f)(s.map(e=>d(e.toPeerId(),t)),!1,t);if(t)n.push(...e);else{const t=document.createElement("span");t.append(...e),n.push(t)}}else n.push(d(s[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=g.a.wrapRichText(i.domain,{entities:[{_:"messageEntityUrl",length:i.domain.length,offset:0}]});n=[Object(K.a)(e)];break}default:a=c.h[o]||`[${i._}]`}return a||(a=c.h[o],void 0===a&&(a="["+o+"]")),t?c.c.format(a,!0,n):Object(c.b)(s,a,n)}}wrapMessageActionTextNew(e,t){try{return this.wrapMessageActionTextNewUnsafe(e,t)}catch(e){return this.log.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}}reportMessages(e,t,s,i){return h.a.invokeApiSingle("messages.report",{peer:x.a.getInputPeerById(e),id:t.map(e=>ee.a.getServerMessageId(e)),reason:{_:s},message:i})}startBot(e,t,s){const i=t?t.toPeerId(!0):e.toPeerId();if(s){const t=Object(d.b)();return h.a.invokeApi("messages.startBot",{bot:B.a.getUserInput(e),peer:x.a.getInputPeerById(i),random_id:t,start_param:s}).then(e=>{U.a.processUpdateMessage(e)})}if(t){let s;return s=T.a.isChannel(t)?T.a.inviteToChannel(t,[e]):T.a.addChatUser(t,e,0),s.catch(e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0}).then(()=>{const t=B.a.getUser(e);return this.sendText(i,"/start@"+t.username)})}return this.sendText(i,"/start")}editPeerFolders(e,t){h.a.invokeApi("folders.editPeerFolders",{folder_peers:e.map(e=>({_:"inputFolderPeer",peer:x.a.getInputPeerById(e),folder_id:t}))}).then(e=>{U.a.processUpdateMessage(e)})}toggleDialogPin(e,t){var s;if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!(null===(s=i.pFlags)||void 0===s?void 0:s.pinned)||void 0;if(a){const e=1===t?f.a.config.pinned_infolder_count_max:f.a.config.pinned_dialogs_count_max;if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return h.a.invokeApi("messages.toggleDialogPin",{peer:x.a.getInputDialogPeerById(e),pinned:a}).then(s=>{if(s){const s=a?{pinned:a}:{};U.a.saveUpdate({_:"updateDialogPinned",peer:x.a.getDialogPeer(e),folder_id:t,pFlags:s})}})}markDialogUnread(e,t){var s;const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!t&&!(null===(s=i.pFlags)||void 0===s?void 0:s.unread_mark)||void 0;return h.a.invokeApi("messages.markDialogUnread",{peer:x.a.getInputDialogPeerById(e),unread:a}).then(t=>{if(t){const t=a?{unread:a}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:x.a.getDialogPeer(e),pFlags:t})}})}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&T.a.hasChat(t.toChatId())){const s=T.a.getChat(e.toChatId());s&&s.migrated_to&&s.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,f.a.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){if(e.pFlags.is_outgoing)return!1;const s=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&s.push("messageMediaPoll"),!("message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===s.indexOf(e.media._)||e.fromId&&B.a.isBot(e.fromId))&&(!e.media||"messageMediaDocument"!==e.media._||!e.media.document.sticker&&"round"!==e.media.document.type)}canEditMessage(e,t="text"){var s;return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===B.a.getSelf().id||!(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date=t.mid)&&(!a.pFlags.selective&&(e.maxOutId&&t.midn.mid||t.pFlags.is_outgoing)&&t.message)return n.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return Object(X.a)(t),!("messageActionChatDeleteUser"!==(null===(i=t.action)||void 0===i?void 0:i._)||!(n?t.action.user_id===n.fromId:B.a.isBot(t.action.user_id)))&&(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},!0)}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,s=!0){if(x.a.isRestricted(e))return Promise.resolve(t.map(e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})));return(s?h.a.invokeApiCacheable:h.a.invokeApi).bind(h.a)("messages.getSearchCounters",{peer:x.a.getInputPeerById(e),filters:t})}filterMessagesByInputFilterFromStorage(e,t,s,i){return this.filterMessagesByInputFilter(e,t.map(e=>s.get(e)),i)}filterMessagesByInputFilter(e,t,s){if("inputMessagesFilterEmpty"===e)return t;const i=[];if(!t.length)return i;let a=!0;const n={},r=[],o=[];switch(e){case"inputMessagesFilterPhotos":n.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":n.messageMediaPhoto=!0,n.messageMediaDocument=!0,r.push("video");break;case"inputMessagesFilterVideo":n.messageMediaDocument=!0,r.push("video");break;case"inputMessagesFilterDocument":n.messageMediaDocument=!0,r.push(void 0,"photo","pdf");break;case"inputMessagesFilterVoice":n.messageMediaDocument=!0,r.push("voice");break;case"inputMessagesFilterRoundVoice":n.messageMediaDocument=!0,r.push("round","voice");break;case"inputMessagesFilterRoundVideo":n.messageMediaDocument=!0,r.push("round");break;case"inputMessagesFilterMusic":n.messageMediaDocument=!0,r.push("audio");break;case"inputMessagesFilterUrl":n.url=!0;break;case"inputMessagesFilterChatPhotos":n.avatar=!0;break;default:a=!1}if(!a)return i;for(let e=0,a=t.length;ee.includes(t._))||g.a.matchUrl(a.message))&&(d=!0)}}else n.avatar&&a.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(a.action._)&&(d=!0);if(d&&(i.push(a),i.length>=s))break}return i}getSearch({peerId:e,query:t,inputFilter:s,maxId:i,limit:a,nextRate:n,backLimit:r,threadId:o,folderId:d,minDate:c,maxDate:l}){if(x.a.isRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),s||(s={_:"inputMessagesFilterEmpty"}),void 0===a&&(a=20),n||(n=0),r||(r=0),c=c?c/1e3|0:0,l=l?l/1e3|0:0;let u=[];r&&(a+=r);let p;if(!e||r||i||t||1===a||o||(p=this.getHistoryStorage(e),u=this.filterMessagesByInputFilterFromStorage(s._,p.history.slice,this.getMessagesStorage(e),a)),u.length){if(!(u.length{B.a.saveApiUsers(e.users),T.a.saveApiChats(e.chats),this.saveMessages(e.messages),V.b&&this.log("getSearch result:",s,e);const t=e.count||u.length+e.messages.length;return e.messages.forEach(e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=T.a.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}u.push(e)}),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:u}})}subscribeRepliesThread(e,t){const s=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===s)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const s=ee.a.getServerMessageId(Math.max(...this.getMidsByMessage(e))),i={_:"messageService",pFlags:{is_single:!0},id:ee.a.generateMessageId(s,!0),date:e.date,from_id:{_:"peerUser",user_id:_.c},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([i],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=i.mid}getDiscussionMessage(e,t){return h.a.invokeApiSingle("messages.getDiscussionMessage",{peer:x.a.getInputPeerById(e),msg_id:ee.a.getServerMessageId(t)}).then(s=>{var i;T.a.saveApiChats(s.chats),B.a.saveApiUsers(s.users),this.saveMessages(s.messages);const a=this.filterMessages(s.messages[0],e=>!!e.replies)[0],n=a.peerId+"_"+a.mid;this.generateThreadServiceStartMessage(a);const r=this.getHistoryStorage(a.peerId,a.mid);return s.max_id=r.maxId=ee.a.generateMessageId(s.max_id)||0,s.read_inbox_max_id=r.readMaxId=ee.a.generateMessageId(null!==(i=s.read_inbox_max_id)&&void 0!==i?i:a.mid),s.read_outbox_max_id=r.readOutboxMaxId=ee.a.generateMessageId(s.read_outbox_max_id)||0,this.threadsToReplies[n]=e+"_"+t,a})}handleNewMessage(e,t){void 0===this.newMessagesToHandle[e]&&(this.newMessagesToHandle[e]=new Set),this.newMessagesToHandle[e].add(t),this.newMessagesHandleTimeout||(this.newMessagesHandleTimeout=window.setTimeout(this.handleNewMessages,0))}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise(e=>{setTimeout(()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()},0)})}deleteMessages(e,t,s){var i,a;let n;const r=t.map(e=>ee.a.getServerMessageId(e));if(e.isAnyChat()&&x.a.isChannel(e)){const s=e.toChatId(),o=T.a.getChat(s);if(!o.pFlags.creator&&!(null===(a=null===(i=o.admin_rights)||void 0===i?void 0:i.pFlags)||void 0===a?void 0:a.delete_messages)&&!(t=t.filter(t=>!!this.getMessageByPeer(e,t).pFlags.out)).length)return;n=h.a.invokeApi("channels.deleteMessages",{channel:T.a.getChannelInput(s),id:r}).then(e=>{U.a.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:s,messages:t,pts:e.pts,pts_count:e.pts_count})})}else n=h.a.invokeApi("messages.deleteMessages",{revoke:s,id:r}).then(e=>{U.a.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})});return n}readHistory(e,t=0,s,i=!1){if(this.log("readHistory:",e,t,s),!this.getReadMaxIdIfUnread(e,s)&&!i)return this.log("readHistory: isn't unread"),Promise.resolve();const a=this.getHistoryStorage(e,s);if(a.triedToReadMaxId>=t)return Promise.resolve();let n;return s?(a.readPromise||(n=h.a.invokeApi("messages.readDiscussion",{peer:x.a.getInputPeerById(e),msg_id:ee.a.getServerMessageId(s),read_max_id:ee.a.getServerMessageId(t)})),U.a.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:s,read_max_id:t})):x.a.isChannel(e)?(a.readPromise||(n=h.a.invokeApi("channels.readHistory",{channel:T.a.getChannelInput(e.toChatId()),max_id:ee.a.getServerMessageId(t)})),U.a.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(a.readPromise||(n=h.a.invokeApi("messages.readHistory",{peer:x.a.getInputPeerById(e),max_id:ee.a.getServerMessageId(t)}).then(e=>{U.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),U.a.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:x.a.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),W.a.soundReset(x.a.getPeerString(e)),a.readPromise?a.readPromise:(a.triedToReadMaxId=t,n.finally(()=>{delete a.readPromise;const{readMaxId:i}=a;this.log("readHistory: promise finally",t,i),i>t&&this.readHistory(e,i,s,!0)}),a.readPromise=n)}readAllHistory(e,t,s=!1){const i=this.getHistoryStorage(e,t);i.maxId&&this.readHistory(e,i.maxId,t,s)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,s){const i=this.unreadMentions[e];i&&(s?i.first.isEnd(v.a.Top)&&i.insertSlice([t]):i.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const s=this.getDialogOnly(e);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const s=this.goToNextMentionPromises[e];if(s)return s;const i=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new v.b,a=i.length,n=i.first.isEnd(v.a.Top);if(!a&&n)return this.fixUnreadMentionsCountIfNeeded(e,i),Promise.resolve();let r=Promise.resolve();return!n&&a<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then(()=>{const t=i.last,s=t&&t[t.length-1];s?(i.delete(s),f.a.dispatchEvent("history_focus",{peerId:e,mid:s})):this.fixUnreadMentionsCountIfNeeded(e,i)}).finally(()=>{delete this.goToNextMentionPromises[e]})}loadNextMentions(e){const t=this.unreadMentions[e],s=t.first[0]||1;return this.getUnreadMentions(e,s,-50,50).then(e=>{this.mergeHistoryResult(t,e,1===s?0:s,50,-50)})}getUnreadMentions(e,t,s,i,a=0,n=0){return h.a.invokeApiSingle("messages.getUnreadMentions",{peer:x.a.getInputPeerById(e),offset_id:ee.a.getServerMessageId(t),add_offset:s,limit:i,max_id:ee.a.getServerMessageId(a),min_id:ee.a.getServerMessageId(n)}).then(e=>(Object(X.a)(e),B.a.saveApiUsers(e.users),T.a.saveApiChats(e.chats),this.saveMessages(e.messages),e))}readMessages(e,t){if(!t.length)return Promise.resolve();let s,i;if(t=t.map(e=>ee.a.getServerMessageId(e)),e.isAnyChat()&&x.a.isChannel(e)){const a=e.toChatId();i={_:"updateChannelReadMessagesContents",channel_id:a,messages:t},s=h.a.invokeApi("channels.readMessageContents",{channel:T.a.getChannelInput(a),id:t})}else i={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},s=h.a.invokeApi("messages.readMessageContents",{id:t}).then(e=>{i.pts=e.pts,i.pts_count=e.pts_count,U.a.processLocalUpdate(i)});return U.a.processLocalUpdate(i),s}getHistoryStorage(e,t){var s,i;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(s=this.threadsStorage[e][t])&&void 0!==s?s:this.threadsStorage[e][t]={count:null,history:new v.b}):null!==(i=this.historiesStorage[e])&&void 0!==i?i:this.historiesStorage[e]={count:null,history:new v.b}}getNotifyPeerSettings(e){return Promise.all([W.a.getNotifyPeerTypeSettings(),W.a.getNotifySettings(x.a.getInputNotifyPeerById(e,!0))]).then(([t,s])=>({muted:W.a.isPeerLocalMuted(e,!0),peerTypeNotifySettings:s}))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let s="";if((null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())&&e.reply_to){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;s=e.peerId+"_"+t}return s}updateMessage(e,t,s){return this.wrapSingleMessage(e,t,!0).then(()=>{const i=this.getMessageByPeer(e,t);return s&&f.a.dispatchEvent(s,i),i})}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let s;if(t){const i=this.pendingByRandomId[t];(s=this.finalizePendingMessage(t,e))&&f.a.dispatchEvent("history_update",{storage:i.storage,peerId:e.peerId,mid:e.mid}),delete this.pendingByMessageId[e.mid]}return s}mutePeer(e,t){const s={_:"inputPeerNotifySettings"};return s.mute_until=t,W.a.updateNotifySettings({_:"inputNotifyPeer",peer:x.a.getInputPeerById(e)},s)}togglePeerMute(e,t){return void 0===t&&(t=!W.a.isPeerLocalMuted(e,!1)),this.mutePeer(e,t?_.b:0)}canSendToPeer(e,t,s="send_messages"){if(x.a.isRestricted(e))return!1;if(e.isAnyChat()){const i=T.a.getChat(e.toChatId());return T.a.hasRights(e.toChatId(),s,void 0,!!t)&&(!i.pFlags.left||!!t)}return B.a.canSendToUser(e)}finalizePendingMessage(e,t){const s=this.pendingByRandomId[e];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s;[this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)});const o=this.getMessageFromStorage(r,a);return o.deleted||(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),f.a.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,a,t),o}}finalizePendingMessageCallbacks(e,t,s){const i=this.tempFinalizeCallbacks[t];if(void 0!==i){for(const e in i){const{deferred:t,callback:a}=i[e];a(s).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(s.media){Object(X.a)(s);const{photo:e,document:i}=s.media;if(e){const s=j.a.getPhoto(""+t);if(s){const t=e.sizes[e.sizes.length-1],i=F.a.getCacheContext(e,t.type),a=F.a.getCacheContext(s,"full");Object.assign(i,a);const n=e.sizes[e.sizes.length-1],r=j.a.getPhotoDownloadOptions(e,n),o=Object(G.a)(r.location);F.a.fakeDownload(o,a.url)}}else if(i){const e=O.a.getDoc(""+t);if(e){const t=F.a.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=F.a.getCacheContext(i);Object.assign(e,t);const s=O.a.getInputFileName(i);F.a.fakeDownload(s,t.url)}}}else s.media.poll&&(delete L.a.polls[t],delete L.a.results[t])}const a=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(a,e),f.a.dispatchEvent("message_sent",{storage:e,tempId:t,tempMessage:a,mid:s.mid,message:s})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,R.c.pushToState("maxSeenMsgId",e),h.a.invokeApi("messages.receivedMessages",{max_id:ee.a.getServerMessageId(e)})}getMessageReactionsListAndReadParticipants(e,t,s,i,a,n){var r,o;const d={reactions:[],count:0,next_offset:void 0},c=this.canViewMessageReadParticipants(e);return c&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!c||s||a?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch(()=>[]),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!n?ae.a.getMessageReactionsList(e.peerId,e.mid,t,s,i).catch(e=>d):d]).then(([e,t])=>{const s=e.map(e=>e.toPeerId()),i=s.slice();Object(P.a)(i,(e,s,i)=>{t.reactions.some(t=>x.a.getPeerId(t.peer_id)===e)&&i.splice(s,1)});let a=t.reactions.map(e=>({peerId:x.a.getPeerId(e.peer_id),reaction:e.reaction}));return a=a.concat(i.map(e=>({peerId:e}))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:s,combined:a,nextOffset:t.next_offset}})}getMessageReadParticipants(e,t){return h.a.invokeApiSingle("messages.getMessageReadParticipants",{peer:x.a.getInputPeerById(e),msg_id:ee.a.getServerMessageId(t)}).then(e=>e.map(e=>e.toUserId()))}canViewMessageReadParticipants(e){if("message"!==e._||e.pFlags.is_outgoing||!e.pFlags.out||!x.a.isAnyGroup(e.peerId))return!1;return T.a.getChat(e.peerId.toChatId()).participants_count<=f.a.appConfig.chat_read_mark_size_threshold&&Object(r.h)(!0)-e.dateee.a.getServerMessageId(e)),increment:!0}).then(s=>{const i=new Array(t.length),a=e.toChatId();for(let e=0,n=t.length;e1)r=c.c.format("Notifications.Forwarded",!0,[t.fwdCount]);else if(r=this.wrapMessageForReply(e,void 0,void 0,!0),t.peerReaction){const e="Notification.Contact.Reacted",s=[g.a.fixEmoji(t.peerReaction.reaction),r];r=c.c.format(e,!0,s)}}else r=c.c.format("Notifications.New",!0);t.peerReaction&&(a.noIncrement=!0,a.silent=!0);const o=t.peerReaction?x.a.getPeerId(t.peerReaction.peer_id):e.fromId;a.title=x.a.getPeerTitle(s,!0),i&&o!==e.peerId&&(a.title=x.a.getPeerTitle(o,!0)+" @ "+a.title),a.title=g.a.wrapPlainText(a.title),a.onclick=()=>{f.a.dispatchEvent("history_focus",{peerId:s,mid:e.mid})},a.message=r,a.key="msg"+e.mid,a.tag=n,a.silent=!0;const d=x.a.getPeerPhoto(s);d?J.a.loadAvatar(s,d,"photo_small").loadPromise.then(s=>{(e.pFlags.unread||t.peerReaction)&&(a.image=s,W.a.notify(a))}):W.a.notify(a)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage()}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return Promise.resolve([]);const t=this.getScheduledMessagesStorage(e);return t.size?Promise.resolve([...t.keys()]):h.a.invokeApiSingle("messages.getScheduledHistory",{peer:x.a.getInputPeerById(e),hash:""}).then(t=>{if("messages.messagesNotModified"!==t._){B.a.saveApiUsers(t.users),T.a.saveApiChats(t.chats);const s=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:s,isScheduled:!0}),[...s.keys()]}return[]})}sendScheduledMessages(e,t){return h.a.invokeApi("messages.sendScheduledMessages",{peer:x.a.getInputPeerById(e),id:t.map(e=>ee.a.getServerMessageId(e))}).then(e=>{U.a.processUpdateMessage(e)})}deleteScheduledMessages(e,t){return h.a.invokeApi("messages.deleteScheduledMessages",{peer:x.a.getInputPeerById(e),id:t.map(e=>ee.a.getServerMessageId(e))}).then(e=>{U.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===_.e||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&e.replies.channel_id.toChatId()!==_.d)return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!T.a.isInChat(e.toChatId())}isRestricted(e){return!(!e.restriction_reason||!Object(ne.c)(e.restriction_reason))}getNewHistory(e,t){var s;return ue(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const i=this.getHistoryStorage(e,t),a=i.history.slice;if(!a.isEnd(v.a.Bottom))return;delete i.maxId,a.unsetEnd(v.a.Bottom);let n=this.getHistory(e,null!==(s=a[0])&&void 0!==s?s:1,0,50,t);n instanceof Promise&&(n=yield n);for(let t=0,s=n.history.length;t{const e=n.history.sliceMe(t,r,s);return{count:n.count,history:(null==e?void 0:e.slice)||n.history.constructSlice(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||n.count}}):{count:n.count,history:o.slice,offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,s){const{offset_id_offset:i,messages:a}=e,n=e.count||a.length,r=i||0,o=s<0?t+s:t;return{count:n,offsetIdOffset:r,isTopEnd:r>=n-o||ne.mid);if(s&&ee.a.getServerMessageId(s)&&!h.includes(s)&&dh[e]);++e);h.splice(e,0,s)}const u=e.insertSlice(h)||e.slice;return c&&u.setEnd(v.a.Top),l&&u.setEnd(v.a.Bottom),Object.assign({slice:u,mids:h,messages:n},r)}fillHistoryStorage(e,t,s,i,a,n){return this.requestHistory(e,t,s,i,void 0,n).then(n=>{const{count:r,isBottomEnd:o,slice:d,messages:c}=this.mergeHistoryResult(a.history,n,t,s,i);a.count=r;for(let t=0,s=c.length;t{V.b&&this.log("requestHistory result:",e,r,t,s,i),B.a.saveApiUsers(r.users),T.a.saveApiChats(r.chats),this.saveMessages(r.messages),x.a.isChannel(e)&&U.a.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,d=r.count;o&&r.messages[o-1].deleted&&(r.messages.splice(o-1,1),o--,d--);const c=this.getHistoryStorage(e,n),l=r.messages[o-1];if(o&&l.grouped_id){const t=c.history.findSlice(l.mid);if(t&&t.slice.length+r.messages.lengthr)}return r},t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=T.a.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},U.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t})}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise(e=>{setTimeout(()=>{const t=[];for(const[e,s]of this.needSingleMessages){const i=[...s.keys()],a=i.map(e=>({_:"inputMessageID",id:ee.a.getServerMessageId(e)}));let n;n=e.isAnyChat()&&x.a.isChannel(e)?h.a.invokeApiSingle("channels.getMessages",{channel:T.a.getChannelInput(e.toChatId()),id:a}):h.a.invokeApiSingle("messages.getMessages",{id:a});const r=n.then(e=>{Object(X.a)(e),B.a.saveApiUsers(e.users),T.a.saveApiChats(e.chats),this.saveMessages(e.messages);for(let t=0;t{f.a.dispatchEvent("messages_downloaded",{peerId:e,mids:i})});t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally(()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()})},0)})}wrapSingleMessage(e,t,s=!1){const i=this.getMessageByPeer(e,t);if(i.deleted||s){let s=this.needSingleMessages.get(e);s||this.needSingleMessages.set(e,s=new Map);let i=s.get(t);return i||(i=Object(n.a)(),s.set(t,i),this.fetchSingleMessages(),i)}return f.a.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?x.a.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then(t=>(t.deleted&&delete e.reply_to_mid,t))}setTyping(e,t,s){var i;let a=this.typings[e];return f.a.myId&&e&&this.canSendToPeer(e)&&e!==f.a.myId&&(s||(null===(i=null==a?void 0:a.action)||void 0===i?void 0:i._)!==t._)?((null==a?void 0:a.timeout)&&clearTimeout(a.timeout),a=this.typings[e]={action:t},h.a.invokeApi("messages.setTyping",{peer:x.a.getInputPeerById(e),action:t}).finally(()=>{a===this.typings[e]&&(a.timeout=window.setTimeout(()=>{delete this.typings[e]},6e3))})):Promise.resolve(!1)}handleReleasingMessage(e,t){const s=e.media;if(s){const i=s.webpage||s,a=i.photo||i.document;if((null==a?void 0:a.file_reference)&&u.a.deleteContext(a.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in s&&s.webpage){const i=this.getScheduledMessagesStorage(e.peerId)===t,a=N.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,i);N.a.deleteWebPageFromPending(s.webpage,a)}s.poll&&L.a.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,s){const i={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const a of s){const s=this.getMessageFromStorage(t,a);if(s.deleted){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(s,t),this.updateMessageRepliesIfNeeded(s),s.pFlags.out||s.pFlags.is_outgoing||!s.pFlags.unread||(++i.unread,W.a.cancel("msg"+a),s.pFlags.mentioned&&(++i.unreadMentions,this.modifyCachedMentions(e,a,!1))),++i.count,i.msgs.add(a),s.deleted=!0;const n=s.grouped_id;if(n){const e=this.groupedMessagesStorage[n];e&&(e.delete(a),i.albums||(i.albums={}),(i.albums[n]||(i.albums[n]=new Set)).add(a),e.size||(delete i.albums,delete this.groupedMessagesStorage[n]))}t.delete(a);const r=this.newMessagesToHandle[e];r&&r.has(a)&&r.delete(a)}if(i.albums)for(const t in i.albums)f.a.dispatchEvent("album_edit",{peerId:e,groupId:t,deletedMids:[...i.albums[t]]});return i}handleEditedMessage(e,t){var s;if("message"===e._&&(null===(s=e.media)||void 0===s?void 0:s.webpage)){const t=N.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);N.a.deleteWebPageFromPending(e.media.webpage,t)}}getMediaFromMessage(e){return e.action?e.action.photo:e.media&&(e.media.photo||e.media.document||e.media.webpage&&(e.media.webpage.document||e.media.webpage.photo))}isMentionUnread(e){var t;const s=null===(t=e.media)||void 0===t?void 0:t.document;return e.pFlags.media_unread&&e.pFlags.mentioned&&(!s||!["voice","round"].includes(s.type))}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===e._&&!e.pFlags.noforwards&&!x.a.noForwards(e.peerId)}pushBatchUpdate(e,t,s,i){let a=this.batchUpdates[e];a||(a=this.batchUpdates[e]={callback:t,batch:new Map}),a.batch.has(s)||(a.batch.set(s,i?i():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[s,i]of e){const[e,a]=s.split("_"),n=this.getMessageByPeer(e.toPeerId(),+a);"messageEmpty"!==n._&&t.set(n,i)}return t}};V.a.appMessagesManager=pe;t.a=pe},,,,function(e,t,s){"use strict";var i=s(1),a=s(3),n=s(41),r=s(19),o=s(123),d=s(8),c=s(0),l=s(80),h=s(63),u=s(35),p=s(60),g=s(44),f=s(39);const m=new class{constructor(){this.storage=u.c.storages.chats,this.onChatUpdated=(e,t)=>{var s;l.a.processUpdateMessage(t),(null===(s=null==t?void 0:t.updates)||void 0===s?void 0:s.length)&&this.isChannel(e)&&c.a.dispatchEvent("invalidate_participants",e)},this.clear(!0),c.a.addMultipleEventsListeners({updateChannelParticipant:e=>{d.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=h.a.getPeerId(e.peer).toChatId(),s=this.chats[t];s&&(s.default_banned_rights=e.default_banned_rights,c.a.dispatchEvent("chat_update",t))}}),u.c.getState().then(e=>{const t=u.c.storagesResults.chats;if(t.length)for(let e=0,s=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})}),u.c.addEventListener("peerUnneeded",e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())})})}clear(e=!1){if(e)this.chats={};else{const e=u.c.storagesResults.chats;for(const t in this.chats)t&&(u.c.isPeerNeeded(t.toPeerId(!0))||(Object(f.a)(e,e=>e.id===t),this.storage.delete(t),delete this.chats[t]))}}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiChat(e,t)))}saveApiChat(e,t){var s,i;if("chatEmpty"===e._)return;const a=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==a)return;"channel"===e._&&void 0===e.participants_count&&void 0!==a&&a.participants_count&&(e.participants_count=a.participants_count);let n=!1,r=!1;if(void 0===a)this.chats[e.id]=e;else{(null===(s=a.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(n=!0),a.title!==e.title&&(r=!0),Object(o.a)(a,e),c.a.dispatchEvent("chat_update",e.id)}const d=e.id.toPeerId(!0);n&&c.a.dispatchEvent("avatar_update",d),r&&c.a.dispatchEvent("peer_title_edit",d),u.c.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}combineParticipantBannedRights(e,t){const s=this.getChat(e);if(s.default_banned_rights){t=Object(a.a)(t);const e=s.default_banned_rights.pFlags;for(let s in e)t.pFlags[s]=e[s]}return t}hasRights(e,t,s,i){const a=this.getChat(e);if("chatEmpty"===a._)return!1;if(a.pFlags.deactivated&&"view_messages"!==t)return!1;const n=void 0===s;if(a.pFlags.creator&&n)return!0;if("chatForbidden"===a._||"channelForbidden"===a._||a.pFlags.left&&!a.pFlags.megagroup)return!1;if(!s&&!(s=a.admin_rights||a.banned_rights||a.default_banned_rights))return!1;let r={};switch(s&&(r=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!i&&a.pFlags.left)return!1;if("chatBannedRights"===s._&&r[t])return!1;if("channel"===a._&&!a.pFlags.megagroup&&!r.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!r[t];case"pin_messages":return"chatAdminRights"===s._?r[t]||!!r.post_messages:!r[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?r[t]:!r[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!r.ban_users;case"view_participants":return!("chat"!==a._&&a.pFlags.broadcast&&!a.pFlags.creator&&!a.admin_rights)}return!0}editChatDefaultBannedRights(e,t){const s=this.getChat(e);return s.default_banned_rights&&s.default_banned_rights.until_date===t.until_date&&Object(n.a)(s.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():d.a.invokeApi("messages.editChatDefaultBannedRights",{peer:h.a.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){const t=this.chats[e];return!(!t||"channel"!==t._||!t.pFlags.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const s=this.getChat(e);return("channelForbidden"===s._||"chatForbidden"===s._||"chatEmpty"===s._||s.pFlags.left||s.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const s=this.chats[e];return Object(r.a)(s)&&(t||!s.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return d.a.invokeApi("channels.createChannel",e).then(e=>{l.a.processUpdateMessage(e);const t=e.chats[0].id;return c.a.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const s=this.getChannelInput(e),i=t.map(e=>p.a.getUserInput(e));return d.a.invokeApi("channels.inviteToChannel",{channel:s,users:i}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return d.a.invokeApi("messages.createChat",{users:t.map(e=>p.a.getUserInput(e)),title:e}).then(e=>{l.a.processUpdateMessage(e);const t=e.chats[0].id;return c.a.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}leaveChannel(e){return d.a.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return d.a.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,s=100){return d.a.invokeApi("messages.addChatUser",{chat_id:e,user_id:p.a.getUserInput(t),fwd_limit:s}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return d.a.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:p.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,p.a.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return d.a.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return d.a.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):d.a.invokeApi("messages.migrateChat",{chat_id:e}).then(t=>{this.onChatUpdated(e,t);return t.updates.find(e=>"updateChannel"===e._).channel_id})}updateUsername(e,t){return d.a.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then(s=>{if(s){this.getChat(e).username=t}return s})}editPhoto(e,t){const s={_:"inputChatUploadedPhoto",file:t};let i;return i=this.isChannel(e)?d.a.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:s}):d.a.invokeApi("messages.editChatPhoto",{chat_id:e,photo:s}),i.then(e=>{l.a.processUpdateMessage(e)})}editTitle(e,t){let s;return s=this.isChannel(e)?d.a.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):d.a.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),s.then(e=>{l.a.processUpdateMessage(e)})}editAbout(e,t){const s=e.toPeerId(!0);return d.a.invokeApi("messages.editChatAbout",{peer:h.a.getInputPeerById(s),about:t}).then(e=>(e&&c.a.dispatchEvent("peer_bio_edit",s),e))}getParticipantPeerId(e){return e.peer?h.a.getPeerId(e.peer):e.user_id.toPeerId()}editBanned(e,t,s){const i="object"!=typeof t?t:this.getParticipantPeerId(t);return d.a.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:h.a.getInputPeerById(i),banned_rights:s}).then(a=>{if(this.onChatUpdated(e,a),"object"==typeof t){const a=Date.now()/1e3|0;l.a.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:a,actor_id:void 0,qts:void 0,user_id:i,prev_participant:t,new_participant:Object.keys(s.pFlags).length?{_:"channelParticipantBanned",date:a,banned_rights:s,kicked_by:p.a.getSelf().id,peer:h.a.getOutputPeer(i),pFlags:{}}:void 0})}})}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return d.a.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then(e=>{this.saveApiChats(e.chats)})}togglePreHistoryHidden(e,t){return this.migrateChat(e).then(e=>d.a.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t})).then(e=>{l.a.processUpdateMessage(e)})}toggleSignatures(e,t){return d.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{l.a.processUpdateMessage(e)})}toggleNoForwards(e,t){return d.a.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(e=>{l.a.processUpdateMessage(e)})}setChatAvailableReactions(e,t){return d.a.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(e=>{l.a.processUpdateMessage(e)})}isRestricted(e){const t=this.getChat(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&Object(g.c)(s))}getSendAs(e){return d.a.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(p.a.saveApiUsers(e.users),m.saveApiChats(e.chats),e.peers)})}};i.a.appChatsManager=m,t.a=m},function(e,t,s){"use strict";s.d(t,"a",(function(){return g}));var i=s(1),a=s(63),n=s(0),r=s(7),o=s(59),d=s(60),c=s(28),l=s(20),h=s(133),u=s(66);const p=new WeakMap;i.a.peerTitleWeakMap=p,n.a.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=p.get(e);t&&t.update()})});class g{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.update(e),p.set(this.element,this)}update(e){if(e)for(let t in e)this.element.dataset[t]=e[t]?""+("boolean"==typeof e[t]?+e[t]:e[t]):"0",this[t]=e[t];let t=this.fromName;if(void 0!==t)return void 0!==this.limitSymbols&&(t=Object(h.a)(t,this.limitSymbols,this.limitSymbols)),void Object(u.a)(this.element,c.b.wrapEmojiText(t));void 0===this.peerId&&(this.peerId=l.c),this.peerId===n.a.myId&&this.dialog?Object(o.a)(this.element,Object(r.d)(this.onlyFirstName?"Saved":"SavedMessages")):this.peerId.isUser()&&d.a.getUser(this.peerId).pFlags.deleted?Object(o.a)(this.element,Object(r.d)(this.onlyFirstName?"Deleted":"HiddenName")):Object(u.a)(this.element,a.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols))}}},,,function(e,t,s){"use strict";var i=s(143),a=s(2),n=s(8),r=s(166),o=s(91),d=s(60),c=s(151),l=s(1),h=s(99),u=s(139),p=s(62),g=s(100);function f(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let i=0;t%2&&(s[i++]=parseInt(e.charAt(0),16));for(let a=i;a1&&(t*=2,s*=2);let n={_:"photoSizeEmpty",type:""},r=e.sizes||e.thumbs;if(a&&r&&"document"===e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==r?void 0:r.length){for(let e=0,i=r.length;e=t||a.height>=s)break}i&&"photoSizeEmpty"===n._&&"photoStrippedSize"===r[0]._&&(n=r[0])}return n}getUserPhotos(e,t="0",s=20){const i=d.a.getUserInput(e);return n.a.invokeApiCacheable("photos.getUserPhotos",{user_id:i,offset:0,limit:s,max_id:t},{cacheSeconds:60}).then(s=>{d.a.saveApiUsers(s.users);const i=s.photos.map((t,i)=>(s.photos[i]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id));if("0"!==t&&t){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}return{count:s.count||i.length,photos:i}})}getPreviewURLFromBytes(e,t=!1){let s,i;return t?s=e instanceof Uint8Array?e:new Uint8Array(e):(s=new Uint8Array(y.jpegHeader.concat(Array.from(e.slice(3)),y.jpegTail)),s[164]=e[1],s[166]=e[2]),i=t?a.g?"image/png":"image/webp":"image/jpeg",function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(s,i)}getPathFromPhotoPathSize(e){const t=e.bytes;let s="M";for(let e=0,i=t.length;e=192?s+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[i-128-64]:(i>=128?s+=",":i>=64&&(s+="-"),s+=""+(63&i))}return s+="z",s}getPreviewURLFromThumb(e,t,s=!1){const i=o.a.getCacheContext(e,t.type);return i.url||(i.url=this.getPreviewURLFromBytes(t.bytes,s))}getImageFromStrippedThumb(e,t,s){const i=this.getPreviewURLFromThumb(e,t,!1);let a,n;if(s){const e=Object(c.a)(i);a=e.canvas,n=e.promise}else a=new Image,n=Object(h.b)(a,i);return a.classList.add("thumbnail"),{image:a,loadPromise:n}}setAttachmentSize(e,t,s,i,a=!0,n,r,o){let d;o||(o=this.choosePhotoSize(e,s,i,void 0,r));const c="document"===e._;d=c?Object(p.c)(e.w||o.w||512,e.h||o.h||512):Object(p.c)(o.w||100,o.h||100);let l=Object(p.c)(s,i);l=d=d.aspect(l,a);let h=!0;return c&&!["video","gif"].includes(e.type)||(l.width<200&&l.height<200&&(l=d=d.aspectCovered(Object(p.c)(200,200))),n&&(n.message||n.reply_to_mid||n.media.webpage||n.replies&&n.replies.pFlags.comments&&n.replies.channel_id.toChatId()!==_.d)&&l.width<320&&(l=Object(p.c)(320,l.height),h=!1),h&&l.width<120&&n&&(l=Object(p.c)(120,l.height),h=!1)),t.style.width=l.width+"px",t.style.height=l.height+"px",{photoSize:o,size:d,isFit:h}}getStrippedThumbIfNeeded(e,t,s,i=!1){if(!t.downloaded||["video","gif"].includes(e.type)||i){if("document"===e._&&t.downloaded&&!i)return null;const a=e.sizes||e.thumbs,n=(null==a?void 0:a.length)?a.find(e=>"photoStrippedSize"===e._):null;if(n&&"bytes"in n)return this.getImageFromStrippedThumb(e,n,s)}return null}getPhotoDownloadOptions(e,t,s,i){const a="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const n=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,r={_:a?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:r,size:n?t.size:void 0,queueId:s,onlyCache:i}}preloadPhoto(e,t,s,a){const n=this.getPhoto(e);if(!n||"photoEmpty"===n._)throw new Error("preloadPhoto photoEmpty!");if(!t){const e=g.a.width,s=g.a.height;t=this.choosePhotoSize(n,e,s)}const r=o.a.getCacheContext(n,t.type);if(r.downloaded>=("size"in t?t.size:0)&&r.url)return Promise.resolve();const d=this.getPhotoDownloadOptions(n,t,s,a),c=Object(i.a)(d.location);let l=o.a.getDownload(c);return l||(l=o.a.download(d),l.then(e=>{if(!r.downloaded||r.downloaded{}),l)}getPhoto(e){return Object(m.a)(e)?e:this.photos[e]}getInput(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}getMediaInput(e){return{_:"inputMediaPhoto",id:this.getInput(e),ttl_seconds:0}}savePhotoFile(e,t){const s=this.choosePhotoSize(e,65535,65535);if("photoSize"!==s._&&"photoSizeProgressive"!==s._)return;const i=this.getPhotoDownloadOptions(e,s,t);i.fileName="photo"+e.id+".jpg",o.a.downloadToDisc(i,i.fileName)}}y.jpegHeader=f("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),y.jpegTail=f("ffd9");const I=new y;l.a&&(l.a.appPhotosManager=I);t.a=I},,,function(e,t,s){"use strict";s.r(t),s.d(t,"AppProfileManager",(function(){return _}));var i=s(1),a=s(37),n=s(156),r=s(7),o=s(8),d=s(0),c=s(136),l=s(80),h=s(68),u=s(98),p=s(111),g=s(63),f=s(72),m=s(60),v=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class _{constructor(){this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const s=e.user_id?e.user_id.toPeerId():g.a.getPeerId(e.from_id);if(d.a.myId===s||"speakingInGroupCallAction"===e.action._)return;const i=g.a.getPeerId(e),a=null!==(t=this.typingsInPeer[i])&&void 0!==t?t:this.typingsInPeer[i]=[];let n=a.find(e=>e.userId===s);const r=()=>{delete n.timeout;const e=a.indexOf(n);-1!==e&&a.splice(e,1),d.a.dispatchEvent("peer_typings",{peerId:i,typings:a}),a.length||delete this.typingsInPeer[i]};if(n&&void 0!==n.timeout&&clearTimeout(n.timeout),"sendMessageCancelAction"===e.action._){if(!n)return;return void r()}n||(n={userId:s},a.push(n)),n.action=e.action;const o=m.a.hasUser(s);o?m.a.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&h.a.hasChat(e.chat_id)&&!h.a.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then(()=>{void 0!==n.timeout&&m.a.hasUser(s)&&d.a.dispatchEvent("peer_typings",{peerId:i,typings:a})}),n.timeout=window.setTimeout(r,6e3),o&&d.a.dispatchEvent("peer_typings",{peerId:i,typings:a})},this.onUpdatePeerBlocked=e=>{const t=g.a.getPeerId(e.peer_id);if(g.a.isUser(t)){const s=t.toUserId(),i=this.usersFull[s];i&&(e.blocked?i.pFlags.blocked=!0:delete i.pFlags.blocked),d.a.dispatchEvent("user_full_update",s)}d.a.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})},d.a.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,s=this.chatsFull[e];void 0!==s&&(s.participants=t,d.a.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,s=i.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,a=i.length;t{var t,s;const i=this.chatsFull[e],a=h.a.getChat(e);if(!i||!a)return;let n=!1;!!i.call!=!!(null===(t=a.pFlags)||void 0===t?void 0:t.call_active)&&(n=!0);const{photo:r}=a;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!i.chat_photo||"photoEmpty"===i.chat_photo._)||e&&r.photo_id!==(null===(s=i.chat_photo)||void 0===s?void 0:s.id))&&(n=!0)}n&&this.refreshFullPeer(e.toPeerId(!0))}),d.a.addEventListener("channel_update",e=>{this.refreshFullPeer(e.toPeerId(!0))}),d.a.addEventListener("chat_full_update",e=>{d.a.dispatchEvent("peer_full_update",e.toPeerId(!0))}),d.a.addEventListener("user_full_update",e=>{d.a.dispatchEvent("peer_full_update",e.toPeerId(!1))}),d.a.addEventListener("invalidate_participants",e=>{this.invalidateChannelParticipants(e)}),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t?this.usersFull[e]:o.a.invokeApiSingleProcess({method:"users.getFullUser",params:{id:m.a.getUserInput(e)},processResult:t=>{h.a.saveApiChats(t.chats,!0),m.a.saveApiUsers(t.users);const s=t.full_user,i=e.toPeerId(!1);return s.profile_photo&&(s.profile_photo=f.a.savePhoto(s.profile_photo,{type:"profilePhoto",peerId:i})),p.a.savePeerSettings({peerId:i,settings:s.notify_settings}),this.usersFull[e]=s,d.a.dispatchEvent("user_full_update",e),s}})}getProfileByPeerId(e,t){return g.a.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return v(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(h.a.isChannel(e))return this.getChannelFull(e,t);const s=this.chatsFull[e];if(s&&!t){const t=h.a.getChat(e);if(t.version===s.participants.version||t.pFlags.left)return s}return o.a.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{h.a.saveApiChats(t.chats,!0),m.a.saveApiUsers(t.users);const s=t.full_chat,i=e.toPeerId(!0);return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=f.a.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:i})),p.a.savePeerSettings({peerId:i,settings:s.notify_settings}),this.chatsFull[e]=s,d.a.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return v(this,void 0,void 0,(function*(){const s=yield this.getChatFull(e);return!t&&s.exported_invite&&"chatInviteExported"==s.exported_invite._?s.exported_invite.link:o.a.invokeApi("messages.exportChatInvite",{peer:g.a.getInputPeerById(e.toPeerId(!0))}).then(t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},s=200,i=0){if("channelParticipantsRecent"===t._){const t=h.a.getChat(e);if(t&&t.pFlags&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return o.a.invokeApiCacheable("channels.getParticipants",{channel:h.a.getChannelInput(e),filter:t,offset:i,limit:s,hash:"0"},{cacheSeconds:60}).then(e=>(m.a.saveApiUsers(e.users),e))}getChannelParticipant(e,t){return o.a.invokeApiSingle("channels.getParticipant",{channel:h.a.getChannelInput(e),participant:g.a.getInputPeerById(t)}).then(e=>(m.a.saveApiUsers(e.users),e.participant))}getChannelFull(e,t){return void 0===this.chatsFull[e]||t?o.a.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:h.a.getChannelInput(e)},processResult:t=>{const s=e.toPeerId(!0);h.a.saveApiChats(t.chats,!0),m.a.saveApiUsers(t.users);const i=t.full_chat;return i&&i.chat_photo.id&&(i.chat_photo=f.a.savePhoto(i.chat_photo,{type:"profilePhoto",peerId:s})),p.a.savePeerSettings({peerId:s,settings:i.notify_settings}),this.chatsFull[e]=i,d.a.dispatchEvent("chat_full_update",e),i},processError:t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=h.a.getChat(e);t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},l.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[t],users:[]})}throw t}}):this.chatsFull[e]}getMentions(e,t,s){let i;return i=h.a.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:u.a.getServerMessageId(s)},50,0).then(e=>e.participants.map(e=>h.a.getParticipantPeerId(e))):e?Promise.resolve(this.getChatFull(e)).then(e=>e.participants.participants.map(e=>e.user_id.toPeerId())):Promise.resolve([]),Promise.all([m.a.getTopPeers("bots_inline").catch(()=>[]),i]).then(e=>(e=>{"@"===t.charAt(0)&&(t=t.slice(1));const s=new c.a({ignoreCase:!0}),i=new Map;e.forEach(e=>{s.indexObject(e.id,m.a.getUserSearchText(e.id)),i.set(e.id,e.rating)});const a=Array.from(s.search(t));return a.sort((e,t)=>i.get(t)-i.get(e)),a})(e[0].concat(e[1].map(e=>({id:e,rating:0})))))}invalidateChannelParticipants(e){o.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],d.a.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],d.a.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,s){return o.a.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:s}).then(e=>{if(m.a.saveApiUser(e),void 0!==s){const t=e.id.toPeerId(),i=this.usersFull[e.id];i&&(i.about=s),d.a.dispatchEvent("peer_bio_edit",t)}return this.getProfile(d.a.myId,!0)})}uploadProfilePhoto(e){return o.a.invokeApi("photos.uploadProfilePhoto",{file:e}).then(e=>{const t=e.photo;if(!e.users.length){const s=t.sizes.find(e=>"photoStrippedSize"===e._);e.users.push(Object.assign(Object.assign({},m.a.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==s?void 0:s.bytes,pFlags:{}}}))}m.a.saveApiUsers(e.users);const s=d.a.myId;f.a.savePhoto(e.photo,{type:"profilePhoto",peerId:s});const i=s.toUserId();l.a.processLocalUpdate({_:"updateUserPhoto",user_id:i,date:Object(a.h)(!0),photo:m.a.getUser(i).photo,previous:!0})})}deletePhotos(e){return o.a.invokeApiSingle("photos.deletePhotos",{id:e.map(e=>{const t=f.a.getPhoto(e);return f.a.getInput(t)})}).then(e=>{})}getChatMembersString(e){var t,s;const i=h.a.getChat(e);if("chatForbidden"===i._)return Object(r.d)("YouWereKicked");const a=this.chatsFull[e];let o;o=a?"channelFull"===a._?a.participants_count:null===(t=a.participants.participants)||void 0===t?void 0:t.length:i.participants_count||(null===(s=i.participants)||void 0===s?void 0:s.participants.length);o=o||1;let d=h.a.isBroadcast(e)?"Peer.Status.Subscribers":"Peer.Status.Member";return Object(r.d)(d,[Object(n.a)(o)])}verifyParticipantForOnlineCount(e){const t=m.a.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce((e,t)=>e+ +this.verifyParticipantForOnlineCount(t),0)}getOnlines(e){var t;return v(this,void 0,void 0,(function*(){if(h.a.isBroadcast(e))return 1;const s=yield this.getChatFull(e);if(h.a.isMegagroup(e)){if(s.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const i=yield o.a.invokeApiCacheable("messages.getOnlines",{peer:h.a.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=i.onlines)&&void 0!==t?t:1}const i=s.participants;return(null==i?void 0:i.participants)?this.reduceParticipantsForOnlineCount(i.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}const y=new _;i.a.appProfileManager=y,t.default=y},,,,,function(e,t,s){"use strict";var i=s(1),a=s(4),n=s(8),r=s(0),o=s(60),d=s(68),c=s(63),l=s(35),h=s(87),u=s(88),p=s(28),g=s(5),f=s(157),m=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const v=new class{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=Object(a.b)("UPDATES",a.a.Error|a.a.Warn|a.a.Log),this.debug=i.b,this.processUpdateMessage=(e,t={})=>{const s={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,s);break;case"updateShortMessage":case"updateShortChatMessage":{Object(u.a)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,i=e.from_id||(t?r.a.myId:e.user_id),a=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||r.a.myId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:c.a.getOutputPeer(i.toPeerId()),peer_id:c.a.getOutputPeer(a),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},s);break}case"updatesCombined":case"updates":o.a.saveApiUsers(e.users,t.override),d.a.saveApiChats(e.chats,t.override),e.updates.forEach(e=>{this.processUpdate(e,s)});break;default:this.log.warn("Unknown update message",e)}}}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,s,i){return t[s]=i,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;l.c.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,s=e.pendingSeqUpdates[t];if(!s)return!1;const i=s.updates;for(let e=0,t=i.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort((e,t)=>e.pts-t.pts);let s=t.pts,i=0,a=0;for(let e=0,n=t.pendingPtsUpdates.length;e=n.pts&&(i=n.pts,a=e)}if(!i)return!1;this.debug&&this.log.debug("pop pending pts updates",i,t.pendingPtsUpdates.slice(0,a+1)),t.pts=i;for(let e=0;e<=a;++e){const s=t.pendingPtsUpdates[e];this.saveUpdate(s)}return t.pendingPtsUpdates.splice(0,a+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let s=t.syncLoading;s||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get diff result",s),"updates.differenceEmpty"===s._)return this.debug&&this.log.debug("apply empty diff",s.seq),t.date=s.date,void(t.seq=s.seq);if(e&&r.a.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==s._){o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),s.other_updates.forEach(e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)}),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})});const e="updates.difference"===s._?s.state:s.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=s.pts,t.date=(Date.now()/1e3|0)+h.a.serverTimeOffset,delete t.seq,this.channelStates={},this.log.warn("getDifference:",s._),r.a.dispatchEvent("state_cleared");if("updates.differenceSlice"===s._)return this.getDifference();this.debug&&this.log.debug("finished get diff")});return s||this.justAName(t,i),i}getChannelDifference(e){const t=this.getChannelState(e),s=t.syncLoading;s||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getChannelDifference",{channel:d.a.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get channel diff result",s),t.pts="pts"in s?s.pts:void 0,"updates.channelDifferenceEmpty"!==s._){if("updates.channelDifferenceTooLong"===s._)return this.debug&&this.log.debug("channel diff too long",s),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),this.debug&&this.log.debug("applying",s.other_updates.length,"channel other updates"),s.other_updates.forEach(e=>{this.saveUpdate(e)}),this.debug&&this.log.debug("applying",s.new_messages.length,"channel new messages"),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})}),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===s._&&!s.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",s)});return s||this.justAName(t,i,e),i}justAName(e,t,s){e.syncLoading=t,r.a.dispatchEvent("state_synchronizing",s),t.then(()=>{e.syncLoading=null,r.a.dispatchEvent("state_synchronized",s)},()=>{e.syncLoading=null})}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var s;let i;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":i=c.a.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(i=e.channel_id,!(i in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(i=e.channel_id)}const{pts:a,pts_count:n}=e,r=i?this.getChannelState(i,a):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(i?this.getChannelDifference(i):this.getDifference())},6)}),r.syncPending.ptsAwaiting=!0,!1;if(a>r.pts)r.pts=a,l=!0,r.lastPtsUpdateTime=Date.now();else if(n)return!1;i&&t.date&&this.updatesState.date0){const s=t.seq,i=t.seqStart||s;if(i!==r.seq+1&&i>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[i]&&(r.pendingSeqUpdates[i]={seq:s,date:t.date,updates:[]}),r.pendingSeqUpdates[i].updates.push(e),r.syncPending||(r.syncPending={timeout:window.setTimeout(()=>{r.syncPending=null,r.syncLoading||this.getDifference()},6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const s=l.c.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise(e=>{n.a.invokeApi("updates.getState",{},{noErrorBox:!0}).then(t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()})})),n.a.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),s&&this.updatesState.syncLoading.then(()=>m(this,void 0,void 0,(function*(){const t={en:"was updated to version",ru:"обновлён до версии"},i=e=>{fetch(`changelogs/${e}_${s.split(" ")[0]}.md`).then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(i=>{const a=t[e]||t.en;i=`**Telegram Web${g.a.suffix} ${a} ${s}**\n\n`+i;const n=[],r={_:"updateServiceNotification",entities:n,message:p.b.parseMarkdown(i,n),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)})},a=Object(f.a)([e,"en"]);for(const e of a)try{yield i(e);break}catch(e){}})))}))}};i.a.apiUpdatesManager=v,t.a=v},function(e,t,s){"use strict";var i=s(8),a=s(0),n=s(84),r=s(12),o=s(1),d=s(17),c=s(71),l=s(62),h=s(29),u=s(28),p=s(88),g=s(118),f=s(176),m=s(78),v=s(39),_=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const y=new Set(["emoji","emojiAnimations"]);const I=new class{constructor(){this.storage=new r.a(d.a,"stickerSets"),this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.getAnimatedEmojiStickerSet(),a.a.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),a.a.dispatchEvent("stickers_installed",t.set)}}),this.getGreetingStickersTimeout=window.setTimeout(()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)},5e3)}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then(e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort((e,t)=>Math.random()-Math.random())})),this.getGreetingStickersPromise.then(()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),n.a.downloadDoc(this.greetingStickers[0]),t})}saveStickers(e){Object(m.a)(e,(t,s)=>{(t=n.a.saveDoc(t))?e[s]=t:e.splice(s,1)})}getStickerSet(e,t={}){return _(this,void 0,void 0,(function*(){const s=e.id;return this.getStickerSetPromises[s]?this.getStickerSetPromises[s]:this.getStickerSetPromises[s]=new Promise(a=>_(this,void 0,void 0,(function*(){var n;if(!t.overwrite){const e=yield this.storage.get(s);if(e&&(null===(n=e.documents)||void 0===n?void 0:n.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),a(e),void delete this.getStickerSetPromises[s]}try{const n=yield i.a.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),r=t.saveById?s:n.set.id;this.saveStickerSet(n,r),a(n)}catch(e){a(null)}delete this.getStickerSetPromises[s]})))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:"emoji"},{saveById:!0}),this.getStickerSet({id:"emojiAnimations"},{saveById:!0}),this.getAnimatedEmojiSounds()]).then(([e,t])=>({emoji:e,animations:t}))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.resolve(i.a.getAppConfig(e)).then(e=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],i=atob(Object(g.a)(s.file_reference_base64,!1)),r=new Uint8Array(i.length);for(let e=0,t=r.length;e(Object(p.a)(e),this.saveStickers(e.stickers),e)})}))}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const s=this.storage.getFromCache(t?"emojiAnimations":"emoji");if(!s||!s.documents)return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const i=s.packs.find(t=>t.emoticon===e);return i?n.a.getDoc(i.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e,t,s){const i=this.getAnimatedEmojiStickerSet().then(()=>{const i=this.getAnimatedEmojiSticker(e);if(i)return n.a.downloadDoc(i).then(a=>_(this,void 0,void 0,(function*(){const r=l.b.active.emojiSticker,o=Object(h.d)(e),d=yield c.a.loadAnimationWorker({container:void 0,animationData:a,width:null!=t?t:r.width,height:null!=s?s:r.height,name:"doc"+i.id,autoplay:!1,loop:!1,toneIndex:o},"none");d.addEventListener("firstFrame",()=>{n.a.saveLottiePreview(i,d.canvas,o),d.remove()},{once:!0})})))});return Promise.all([i,this.preloadAnimatedEmojiStickerAnimation(e)])}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then(()=>{const t=this.getAnimatedEmojiSticker(e,!0);if(t){const s=this.getAnimatedEmojiSoundDocument(e);return Promise.all([n.a.downloadDoc(t),s?n.a.downloadDoc(s):void 0])}})}saveStickerSet(e,t){const s={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let i=this.storage.getFromCache(t);i?Object.assign(i,s):i=this.storage.setToCache(t,s),this.saveStickers(e.documents);const a=i.set.installed_date||y.has(t);i.refreshTime=Date.now(),this.storage.set({[t]:i},!a)}getStickerSetThumbDownloadOptions(e){var t;const s=e.thumbs.find(e=>"photoSize"===e._),i=e.thumb_dc_id,a=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:i,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:s.size,mimeType:a?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return"emoji"===e.id?{_:"inputStickerSetAnimatedEmoji"}:"emojiAnimations"===e.id?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return _(this,void 0,void 0,(function*(){return(yield i.a.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>(Object(p.a)(e),Object(m.a)(e.sets,(e,t,s)=>{e.set.pFlags.videos&&!f.a&&s.splice(t,1)}),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)})).sets}))}toggleStickerSet(e){return _(this,void 0,void 0,(function*(){if(e.installed_date){if(yield i.a.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,a.a.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else{if(yield i.a.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,a.a.dispatchEvent("stickers_installed",e),!0}return!1}))}searchStickerSets(e,t=!0){return _(this,void 0,void 0,(function*(){const s=t?1:0,a=yield i.a.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:s,exclude_featured:t||void 0,q:e},processResult:e=>(Object(p.a)(e),Object(m.a)(e.sets,(e,t,s)=>{e.set.pFlags.videos&&!f.a&&s.splice(t,1)}),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)}),n=[],r=this.storage.getCache();for(let t in r){const{set:s}=r[t];s.title.toLowerCase().includes(e.toLowerCase())&&!a.sets.find(e=>e.set.id===s.id)&&n.push({_:"stickerSetCovered",set:s,cover:null})}return a.sets.concat(n)}))}getAllStickers(){return i.a.invokeApiHashable({method:"messages.getAllStickers",processResult:e=>(Object(p.a)(e),Object(m.a)(e.sets,(e,t,s)=>{e.pFlags.videos&&!f.a&&s.splice(t,1)}),e)})}preloadStickerSets(){return this.getAllStickers().then(e=>Promise.all(e.sets.map(e=>this.getStickerSet(e,{useCache:!0}))))}getStickersByEmoticon(e,t=!0){return e=u.b.fixEmoji(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([i.a.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then(([t,s,i])=>{const a=t.stickers.map(e=>n.a.saveDoc(e)),r=[],o=[],d=t=>{for(const s of t){if(u.b.fixEmoji(s.emoticon).includes(e))for(const e of s.documents){const t=n.a.getDoc(e);(t.animated?r:o).push(t)}}};if(i){d(i.packs);const e=i.stickers;[r,o].forEach(t=>{t.sort((t,s)=>e.indexOf(t)-e.indexOf(s))})}for(const e of s)d(e.packs);const c=[...new Set(r.concat(o,a))];return Object(m.a)(c,(e,t,s)=>{3!==e.sticker||f.a||s.splice(t,1)}),c})}pushRecentSticker(e){const t=u.b.fixEmoji(e.stickerEmojiRaw);for(const s in this.getStickersByEmoticonsPromises){this.getStickersByEmoticonsPromises[s].then(i=>{const a=Object(v.a)(i,t=>t.id===e.id);a?i.unshift(a):s.includes(t)&&i.unshift(e)})}}};o.a.appStickersManager=I,t.a=I},,,function(e,t,s){"use strict";var i=s(143),a=s(166),n=s(175),r=s(28),o=s(91),d=s(72),c=s(151),l=s(8),h=s(1),u=s(37),p=s(0),g=s(46),f=s(176),m=s(174),v=s(19),_=s(177),y=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const I={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};const P=new class{constructor(){this.docs={},this.savingLottiePreview={},this.downloading=new Map,this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];if(t.supportsStreaming){delete t.supportsStreaming;delete o.a.getCacheContext(t).url}}},l.a.onServiceWorkerFail=this.onServiceWorkerFail}saveDoc(e,t){if("documentEmpty"===e._)return;const s=this.docs[e.id];e.file_reference&&(Object(_.a)("file_reference",s,e),a.a.saveContext(e.file_reference,t)),s||(this.docs[e.id]=e);for(let t=0,s=e.attributes.length;t8e6||"audio"===e.type||"video"===e.type)){e.supportsStreaming=!0;const t=o.a.getCacheContext(e);t.url||(t.url=this.getFileURL(e))}return e.file_name||(e.file_name=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),s?Object.assign(s,e):e}getDoc(e){return Object(v.a)(e)?e:this.docs[e]}getMediaInput(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}getInput(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}getFileDownloadOptions(e,t,s,i){const a=this.getInput(e,null==t?void 0:t.type);let n;return n=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:a,size:t?t.size:e.size,mimeType:n,fileName:e.file_name,queueId:s,onlyCache:i}}getFileURL(e,t=!1,s){let a;return a=t?"download":s?"thumb":e.supportsStreaming?"stream":"document",Object(i.b)(a,this.getFileDownloadOptions(e,s))}getThumbURL(e,t){let s=Promise.resolve();const i=o.a.getCacheContext(e,t.type);if(!i.url)if("bytes"in t){const a=Object(c.a)(d.a.getPreviewURLFromBytes(t.bytes,!!e.sticker));s=a.promise.then(()=>{i.url=a.canvas.toDataURL()})}else s=d.a.preloadPhoto(e,t);return{thumb:t,cacheContext:i,promise:s}}getThumb(e,t=!0){const s=d.a.choosePhotoSize(e,0,0,!t);return"photoSizeEmpty"===s._?null:this.getThumbURL(e,s)}getInputFileName(e,t){return Object(i.a)(this.getInput(e,t),{fileName:e.file_name})}downloadDoc(e,t,s){const i=this.getInputFileName(e);let a=o.a.getDownload(i);if(a)return a;const r=this.getFileDownloadOptions(e,void 0,t,s);a=o.a.download(r),this.downloading.set(e.id,a),p.a.dispatchEvent("download_start",e.id);const d=o.a.getCacheContext(e),c=a;return c.then(e=>{d.url=URL.createObjectURL(e),d.downloaded=e.size},()=>{}).finally(()=>{this.downloading.delete(e.id)}),"voice"!==e.type||n.a.isPlaySupported()||(a=c.then(e=>y(this,void 0,void 0,(function*(){const t=new FileReader;return yield new Promise((s,i)=>{t.onloadend=e=>{const t=new Uint8Array(e.target.result);n.a.decode(t).then(e=>{d.url=e.url,s()},e=>{delete d.downloaded,i(e)})},t.readAsArrayBuffer(e)}),e})))),a.then(()=>{p.a.dispatchEvent("document_downloaded",e)}),a}isSavingLottiePreview(e,t){const s=e.id+"-"+t;return!!this.savingLottiePreview[s]}saveLottiePreview(e,t,s){const i=e.id+"-"+s;if(this.savingLottiePreview[i])return;e.stickerCachedThumbs||(Object(m.a)(e,["stickerCachedThumbs"]),e.stickerCachedThumbs={});const a=e.stickerCachedThumbs[s];a&&a.w>=t.width&&a.h>=t.height||(this.savingLottiePreview[i]=!0,t.toBlob(a=>{const n={url:URL.createObjectURL(a),w:t.width,h:t.height};e.stickerCachedThumbs[s]=n,delete this.savingLottiePreview[i]}))}saveDocFile(e,t){const s=this.downloadDoc(e,t);return s.then(()=>{const t=o.a.getCacheContext(e);o.a.createDownloadAnchor(t.url,e.file_name)}),s}};h.a.appDocsManager=P,t.a=P},,,function(e,t,s){"use strict";var i=s(1),a=s(6),n=s(8);const r=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),n.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=r),t.a=r},function(e,t,s){"use strict";function i(e){}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(30),a=s(40);function n(e,t,s=!0,n=!0){let r,o,d,c,l=!1;const h=t=>{const s=d,i=c;try{s(e.apply(null,t))}catch(e){console.error("debounce error",e),i(e)}},u=(...e)=>{o||(o=new Promise((e,t)=>(d=e,c=t))),r?(clearTimeout(r),l=!0,c(),o=new Promise((e,t)=>(d=e,c=t))):s&&(h(e),l=!1);const u=i.a.setTimeout(()=>{!n||s&&!l||h(e),r===u&&(r=o=d=c=void 0,l=!1)},t);return r=u,o.catch(a.a),o};return u.clearTimeout=()=>{r&&(i.a.clearTimeout(r),c(),r=o=d=c=void 0,l=!1)},u}},,,function(e,t,s){"use strict";s.d(t,"a",(function(){return l})),s.d(t,"d",(function(){return u})),s.d(t,"b",(function(){return p})),s.d(t,"c",(function(){return g}));var i=s(4);class a{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver(t=>{if(this.locked)return;const s=[];t.forEach(e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),s[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))}),s.forEach(t=>{e(t.target,t.visible)})})}getVisible(){const e=[];return this.items.forEach((t,s)=>{t&&e.push(s)}),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}var n=s(22);function r(e,t){const s=[];let i=-1;for(;-1!==(i=e.findIndex(t));)s.push(e.splice(i,1)[0]);return s}var o=s(76),d=s(39),c=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class l{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=Object(i.b)("LL",i.a.Error),this.processQueue=Object(n.a)(()=>this._processQueue(),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise((e,t)=>{this.unlockResolve=e}))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return c(this,void 0,void 0,(function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}}))}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit)return;do{if(e?Object(o.a)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.sizee.div===t.div&&e.load===t.load))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout(()=>{this.intersectorTimeout=0,this.processQueue()},0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){r(this.queue,t=>t.div===e),this.intersector.unobserve(e)}}class u extends h{constructor(e=8){super(e),this.parallelLimit=e,this.onVisibilityChange=(e,t)=>{t&&(r(this.queue,t=>t.div===e).forEach(e=>{e.wasSeen=!0,this.queue.unshift(e)}),this.setProcessQueueTimeout())},this.intersector=new a(this.onVisibilityChange)}getItem(){return Object(d.a)(this.queue,e=>e.wasSeen)}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return c(this,void 0,void 0,(function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)}))}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}class p extends h{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this._queue=new Map,this.intersector=new a((e,t)=>{const s=r(this.queue,t=>t.div===e);if(t){(s.length?s:[this._queue.get(e)]).forEach(t=>{this.queue.unshift(t||this._queue.get(e))})}this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}class g extends h{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this.intersector=new a((e,t)=>{const s=r(this.queue,t=>t.div===e);t&&s.length&&s.forEach(e=>{this.queue.unshift(e)}),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}observe(e){this.intersector.observe(e)}}},,,,,,function(e,t,s){"use strict";var i=s(1);class a{constructor(){this.tempNum=0}generateMessageId(e,t=!1){const s=a.MESSAGE_ID_OFFSET,i=t?++this.tempNum:0;return e>=s?t?e+(i&a.MESSAGE_ID_INCREMENT-1):e:s+(e*a.MESSAGE_ID_INCREMENT+(i&a.MESSAGE_ID_INCREMENT-1))}getServerMessageId(e){return this.clearMessageId(e,!0)}clearMessageId(e,t){const s=a.MESSAGE_ID_OFFSET;if(e{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function n(e,t,s,n=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(s&&s());if(i[t]&&n||e instanceof HTMLVideoElement)e&&a(e,t),s&&s();else{const n=e instanceof HTMLImageElement,r=n?e:new Image;r.src=t,r.addEventListener("load",()=>{!n&&e&&a(e,t),i[t]=!0,s&&s()},{once:!0}),s&&r.addEventListener("error",e=>{console.error("Render image from url failed:",e,t,r),s()})}}function r(e,t,s){return new Promise(i=>{n(e,t,i,s)})}},function(e,t,s){"use strict";const i=new class{constructor(){const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}};t.a=i},function(e,t,s){"use strict";var i=s(1),a=s(39),n=s(88),r=s(129);function o(e,t){return e.some(e=>e instanceof Promise)?Promise.all(e).then(t):t(e)}var d=s(3),c=s(8),l=s(0),h=s(80),u=s(84),p=s(98),g=s(63),f=s(75),m=s(60),v=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const _=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],y={type:"reactions"};const I=new class{constructor(){l.a.addEventListener("language_change",()=>{this.availableReactions=void 0,this.getAvailableReactions()}),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,setTimeout(()=>{Promise.resolve(this.getAvailableReactions()).then(e=>v(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&u.a.downloadDoc(t.around_animation),t.static_icon&&u.a.downloadDoc(t.static_icon),t.appear_animation&&u.a.downloadDoc(t.appear_animation),t.center_icon&&u.a.downloadDoc(t.center_icon)])})))},7500)}getAvailableReactions(){return this.availableReactions?this.availableReactions:c.a.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{Object(n.a)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of _)e[t]&&(e[t]=u.a.saveDoc(e[t],y));return t},params:{hash:0}})}getActiveAvailableReactions(){return Object(r.a)(this.getAvailableReactions(),e=>e.filter(e=>!e.pFlags.inactive))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();if(e.isUser())return this.unshiftQuickReaction(t);return o([t,f.default.getChatFull(e.toChatId()),this.getQuickReaction()],([e,t,s])=>{var i;const a=(null!==(i=t.available_reactions)&&void 0!==i?i:[]).map(t=>e.find(e=>e.reaction===t)).filter(Boolean);return this.unshiftQuickReactionInner(a,s)})}unshiftQuickReactionInner(e,t){const s=Object(a.a)(e,e=>e.reaction===t.reaction);return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return o([e,t],([e,t])=>this.unshiftQuickReactionInner(e,t))}getAvailableReactionsByMessage(e){var t;const s=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&g.a.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(s)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find(t=>t.reaction===e)}getQuickReaction(){return o([c.a.getAppConfig(),this.getAvailableReactions()],([e,t])=>t.find(t=>t.reaction===e.reactions_default))}getReactionCached(e){return this.availableReactions.find(t=>t.reaction===e)}getReaction(e){return Object(r.a)(this.getAvailableReactions(),()=>this.getReactionCached(e))}getMessagesReactions(e,t){return c.a.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map(e=>p.a.getServerMessageId(e)),peer:g.a.getInputPeerById(e)},processResult:e=>{h.a.processUpdateMessage(e)}})}getMessageReactionsList(e,t,s,i,a){return c.a.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:g.a.getInputPeerById(e),id:p.a.getServerMessageId(t),limit:s,reaction:i,offset:a},processResult:e=>(m.a.saveApiUsers(e.users),e)})}setDefaultReaction(e){return c.a.invokeApi("messages.setDefaultReaction",{reaction:e}).then(t=>{if(t){const t=l.a.appConfig;t?t.reactions_default=e:c.a.getAppConfig(!0),l.a.dispatchEvent("quick_reaction",e)}return t})}sendReaction(e,t,s){const i=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(i))return;this.lastSendingTimes.set(i,Date.now()),setTimeout(()=>{this.lastSendingTimes.delete(i)},333);const{peerId:r,mid:o}=e,u=l.a.myId;let f=s?e.reactions:Object(d.a)(e.reactions),m=f?f.results.findIndex(e=>e.pFlags.chosen):-1,v=-1!==m&&f.results[m];if(v&&(--v.count,delete v.pFlags.chosen,t===v.reaction&&(t=void 0),v.count||f.results.splice(m,1),f.recent_reactions&&Object(a.a)(f.recent_reactions,e=>g.a.getPeerId(e.peer_id)===u),f.results.length||(f=void 0)),t){f||(f={_:"messageReactions",results:[],pFlags:{}},g.a.isBroadcast(e.peerId)||(f.pFlags.can_see_list=!0));let s=f.results.findIndex(e=>e.reaction===t),i=-1!==s&&f.results[s];if(i||(i={_:"reactionCount",count:0,reaction:t,pFlags:{}},s=f.results.push(i)-1),++i.count,i.pFlags.chosen=!0,!f.recent_reactions&&f.pFlags.can_see_list&&(f.recent_reactions=[]),f.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:g.a.getOutputPeer(u)};g.a.isMegagroup(r)?(f.recent_reactions.unshift(e),f.recent_reactions=f.recent_reactions.slice(0,3)):(f.recent_reactions.push(e),f.recent_reactions=f.recent_reactions.slice(-3))}}const _=this.availableReactions;if(f&&(null==_?void 0:_.length)){const e=new Map;_.forEach((t,s)=>{e.set(t.reaction,s)}),f.results.sort((t,s)=>s.count-t.count||e.get(t.reaction)-e.get(s.reaction))}if(s)return e.reactions=f,l.a.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();h.a.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:f,local:!0});const y=[r,o].join("-"),I=p.a.getServerMessageId(o),P=c.a.invokeApi("messages.sendReaction",{peer:g.a.getInputPeerById(r),msg_id:I,reaction:t}).then(e=>{Object(n.a)(e);const t=e.updates.findIndex(e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._);if(-1!==t){const s=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:I,peer:g.a.getOutputPeer(r),reactions:s.message.reactions,pts:s.pts,pts_count:s.pts_count}}h.a.processUpdateMessage(e)}).catch(t=>{"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(y)===P&&this.sendReaction(e,null==v?void 0:v.reaction,!0)}).finally(()=>{this.sendReactionPromises.get(y)===P&&this.sendReactionPromises.delete(y)});return this.sendReactionPromises.set(y,P),P}};i.a&&(i.a.appReactionsManager=I);t.a=I},,,,,,,,function(e,t,s){"use strict";function i(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}s.d(t,"a",(function(){return i}))},,function(e,t,s){"use strict";var i=s(137),a=s(1),n=s(10),r=s(37),o=s(2),d=s(7),c=s(8),l=s(51),h=s(0),u=s(11),p=s(80),g=s(68),f=s(63),m=s(25),v=s(35),_=s(60),y=s(172),I=s(20),P=s(22),S=s(41),M=s(173);const b=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=y.a,this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.faviconEl=document.head.querySelector('link[rel="icon"]'),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{Promise.all(["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map(e=>u.a.get(e))).then(e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&l.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?l.default.subscribe():l.default.unsubscribe())}l.default.setSettings(this.settings)}),v.c.getState().then(e=>{this.settings.nosound=!e.settings.notifications.sound})},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=Object(r.h)(!0);let t=I.b;for(const s in this.peerSettings.notifyPeer){const i=this.peerSettings.notifyPeer[s];if(i instanceof Promise)continue;const a=i.mute_until;a&&(a<=e?(i.mute_until=0,h.a.dispatchEvent("updateNotifySettings",{_:"updateNotifySettings",peer:{_:"notifyPeer",peer:f.a.getOutputPeer(s.toPeerId())},notify_settings:i})):a{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)},navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.topMessagesDeferred=Object(n.a)(),this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.checkMuteUntilThrottled=Object(P.a)(this.checkMuteUntil,1e3,!1),h.a.addEventListener("instance_deactivated",()=>{this.stop()}),h.a.addEventListener("instance_activated",()=>{this.stopped&&this.start()}),h.a.addEventListener("idle",e=>{this.stopped||(e||this.clear(),this.toggleToggler())}),h.a.addMultipleEventsListeners({updateNotifySettings:e=>{const t="notifyPeer"===e.peer._&&f.a.getPeerId(e.peer.peer),s="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:s,peerId:t,settings:e.notify_settings}),h.a.dispatchEvent("notify_settings",e)}}),h.a.addEventListener("push_init",e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):l.default.subscribe()}),h.a.addEventListener("push_subscribe",e=>{this.registerDevice(e)}),h.a.addEventListener("push_unsubscribe",e=>{this.unregisterDevice(e)}),h.a.addEventListener("dialogs_multiupdate",()=>{this.topMessagesDeferred.resolve()},{once:!0}),h.a.addEventListener("push_notification_click",e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void c.a.invokeApi("account.updateDeviceLocked",{period:86400}).then(()=>{});const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then(()=>{e.custom.channel_id&&!g.a.hasChat(e.custom.channel_id)||t.isUser()&&!_.a.hasUser(t)||h.a.dispatchEvent("history_focus",{peerId:t,mid:+e.custom.msg_id})})})}toggleToggler(e=h.a.idle.isIDLE){if(o.e)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval(()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=d.c.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const s=t.getContext("2d");s.beginPath(),s.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),s.fillStyle="#3390ec",s.fill();let a=24,n=""+e;e<10?a=22:e<100?a=20:(n="99+",a=16),a*=window.devicePixelRatio,s.font=`700 ${a}px ${i.b}`,s.textBaseline="middle",s.textAlign="center",s.fillStyle="white",s.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)},1e3):t()}getLocalSettings(){return this.settings}getNotifySettings(e){let t,s=Object(M.a)(e._),i=this.peerSettings[s];return"inputNotifyPeer"===e._&&(t=s=f.a.getPeerId(e.peer),i=i[s]),i||((i||this.peerSettings)[s]=c.a.invokeApi("account.getNotifySettings",{peer:e}).then(e=>(this.savePeerSettings({key:s,peerId:t,settings:e}),e)))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map(e=>this.getNotifySettings({_:e}));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return c.a.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then(s=>{s&&p.a.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:Object(M.a)(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})})}getNotifyExceptions(){c.a.invokeApi("account.getNotifyExceptions",{compare_sound:!0}).then(e=>{p.a.processUpdateMessage(e)})}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=c.a.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){c.a.invokeApi("account.setContactSignUpNotification",{silent:e}).then(t=>{this.notifyContactsSignUp=Promise.resolve(!e)})}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}savePeerSettings({key:e,peerId:t,settings:s}){let i;t&&(e=t,i=this.peerSettings.notifyPeer),(i||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(h.a.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),v.c.getState().then(t=>{const i=t.notifySettings;i[e]=s,v.c.pushToState("notifySettings",i)}))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>Object(r.h)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:f.a.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then(e=>this.isMuted(e))}getPeerLocalSettings(e,t=!0){const s={_:"peerNotifySettings"},i=this.peerSettings.notifyPeer[e];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=f.a.getInputNotifyPeerById(e,!0),i=Object(M.a)(t._),a=this.peerSettings[i];if(a&&!(a instanceof Promise))for(let e in a)void 0===s[e]&&(s[e]=a[e])}return s}isPeerLocalMuted(e,t=!0){if(e===h.a.myId)return!1;const s=this.getPeerLocalSettings(e,t);return this.isMuted(s)}start(){if(this.updateLocalSettings(),h.a.addEventListener("settings_updated",this.updateLocalSettings),l.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,s=e.key||"k"+t;this.notificationsShown[s]=!0;const i=Object(r.h)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=i),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let a;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const s=this.notificationsShown[t];"boolean"!=typeof s&&s.tag===e.tag&&(s.hidden=!0)}a=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void l.default.setLocalNotificationsDisabled()}a.onclick=()=>{a.close(),m.a.focus(),this.clear(),e.onclick&&e.onclick()},a.onclose=()=>{a.hidden||(delete this.notificationsShown[s],this.clear())},a.show&&a.show(),this.notificationsShown[s]=a,o.e||setTimeout(()=>{this.hide(s)},8e3)}}testSound(e){const t=Object(r.h)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(i),i.addEventListener("ended",()=>{i.remove()},{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,l.default.hidePushNotifications()}registerDevice(e){if(this.registeredDevice&&Object(S.a)(this.registeredDevice,e))return!1;c.a.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then(()=>{this.registeredDevice=e},e=>{e.handled=!0})}unregisterDevice(e){if(!this.registeredDevice)return!1;c.a.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then(()=>{this.registeredDevice=!1},e=>{e.handled=!0})}getVibrateSupport(){return this.vibrateSupport}};a.a.appNotificationsManager=b,t.a=b},function(e,t,s){"use strict";s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return d})),s.d(t,"a",(function(){return c})),s.d(t,"e",(function(){return l})),s.d(t,"d",(function(){return h})),s.d(t,"f",(function(){return u}));var i=s(62),a=s(16),n=s(2),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function o(e){let t,s;return e instanceof HTMLVideoElement?(t=e.videoWidth,s=e.videoHeight):(t=e.naturalWidth,s=e.naturalHeight),a={media:e,mediaSize:Object(i.c)(t,s),boxSize:Object(i.c)(320,240),quality:.9},new Promise(e=>{var t,s;const i=document.createElement("canvas"),n=a.mediaSize.aspectFitted(a.boxSize);i.width=n.width*window.devicePixelRatio,i.height=n.height*window.devicePixelRatio,i.getContext("2d").drawImage(a.media,0,0,i.width,i.height),i.toBlob(t=>{e({blob:t,size:n})},null!==(t=a.mimeType)&&void 0!==t?t:"image/jpeg",null!==(s=a.quality)&&void 0!==s?s:1)});var a}function d(e){return new Promise((t,s)=>{e.onseeked=()=>{e.onseeked=()=>{o(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=s,e.currentTime=Math.min(e.duration,1)})}function c(e){return r(this,void 0,void 0,(function*(){const t=yield function(e){return new Promise((t,s)=>{const i=document.createElement("video");i.volume=0,i.addEventListener("loadedmetadata",()=>t(i),{once:!0}),i.addEventListener("error",s,{once:!0}),i.src=e})}(e);return Promise.race([Object(a.a)(2e3),d(t)])}))}function l(e,t=e.HAVE_METADATA,s){return new Promise(i=>{e.readyState>=t?i():e.addEventListener(n.c&&!s?"loadeddata":"canplay",()=>i(),{once:!0})})}function h(e,t=!1){return r(this,void 0,void 0,(function*(){const s=[],i=(e,a)=>r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise((e,s)=>{t.readEntries(t=>r(this,void 0,void 0,(function*(){for(const e of t)yield i(e,a);e()})))})}else if(e)if(t)s.push(e.type);else{const t=a.getAsFile(),i=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise((s,i)=>e.file(s,e=>s(t)));if(!i)return;s.push(i)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let i=0;i{t.addEventListener("change",t=>{const i=t.target.files[0];i?e(i):s("NO_FILE_SELECTED")},{once:!0})}).finally(()=>{t.remove()});return t.click(),s}},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const i=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const s=e;return()=>!s.cleaned&&(!t||t())}}}},,,,,function(e,t,s){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}s.d(t,"a",(function(){return i}))},,,function(e,t,s){"use strict";s.d(t,"a",(function(){return o}));var i=s(7);const a=new Map;let n=0;const r=(e,t,s="")=>{s=t.country_code+s,n=Math.max(n,s.length),a.set(s,{country:e,code:t})};function o(e){e=e||"",a.size||i.c.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(s=>{r(e,t,s)}):r(e,t)})});let t,s=e.replace(/\D/g,""),o=s.slice(0,n);for(let e=o.length-1;e>=0&&(t=a.get(o.slice(0,e+1)),!t);--e);if(!t)return{formatted:s,country:void 0,code:void 0,leftPattern:""};const d=t.country,c=t.code.patterns||[],l=s.slice(t.code.country_code.length);let h="",u=0,p="";for(let e=c.length-1;e>=0;--e){h=c[e];const t=h.replace(/ /g,"");let s=0;for(let e=0,i=Math.min(l.length,t.length);eu&&(u=s,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=t.code.country_code+" "+h,h.split("").forEach((e,t)=>{" "===e&&" "!==s[t]&&s.length>t&&(s=s.slice(0,t)+" "+s.slice(t))});let g=h&&h.length>s.length?h.slice(s.length):"";return g&&(g=g.replace(/X/g,"‒")),{formatted:s,country:d,code:t.code,leftPattern:g}}},,function(e,t,s){"use strict";function i(e,t){if(!e)return t;for(var s in e)t.hasOwnProperty(s)||delete e[s];for(var s in t)e[s]=t[s];return e}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return c}));var i=s(74),a=s(36),n=s(27),r=s(57),o=s(103),d=s(18);class c{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&Object(n.a)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&Object(d.a)(this,e)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&Object(r.b)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,s=Date.now(),i=i=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const n=Date.now()-s;if(!i&&this.cancelable){this.setProgress(100);const e=150;n{t===this.tempId&&this.detach()},e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),Object(a.b)(()=>{this.setManual()})):this.detach();this.promise=e=null};e.then(()=>i(null)).catch(e=>i(e)),e.addNotifyListener&&e.addNotifyListener(e=>{if(t!==this.tempId)return;const s=e.done/e.total*100;this.setProgress(s)})}attach(e,t=!1,s){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,s&&this.attachPromise(s),this.detached||this.preloader.parentElement!==e){const t=Object(o.a)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),Object(i.a)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&Object(i.a)(this.preloader,"is-visible",!1,200,()=>{this.preloader.remove()},1))}setProgress(e){if(this.totalLength||Object(o.a)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},,,function(e,t,s){"use strict";var i=s(1),a=s(99),n=s(59),r=s(66),o=s(141),d=s(20),c=s(28),l=s(0),h=s(91),u=s(63),p=s(72),g=s(60);const f=new class{constructor(){this.savedAvatarURLs={}}isAvatarCached(e){return!!this.savedAvatarURLs[e]}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,s){const i=u.a.getInputPeerById(e);let a,n=!1,r=this.savedAvatarURLs[e];if(r&&r[s])"string"!=typeof r[s]?a=r[s]:(a=Promise.resolve(r[s]),n=!0);else{r||(r=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:i,photo_id:t.photo_id},o={dcId:t.dc_id,location:n};"photo_big"===s&&(n.pFlags.big=!0,o.limitPart=524288);const d=h.a.download(o);a=r[s]=d.then(e=>r[s]=URL.createObjectURL(e))}return{cached:n,loadPromise:a}}putAvatar(e,t,s,i,r=new Image,d=!1){let c,h,u,{cached:g,loadPromise:f}=this.loadAvatar(t,s,i);if(r.classList.add("avatar-photo"),g)h=()=>{Object(n.a)(e,r),e.dataset.color=""};else{const d=l.a.settings.animationsEnabled;d&&r.classList.add("fade-in");let g=!1;if("photo_big"===i){const i=this.putAvatar(e,t,s,"photo_small");c=i.loadPromise,u=i.thumbImage}else if(s.stripped_thumb){u=new Image,e.classList.add("avatar-relative"),u.classList.add("avatar-photo","avatar-photo-thumbnail");const t=p.a.getPreviewURLFromBytes(s.stripped_thumb);c=Object(a.b)(u,t).then(()=>{g||Object(n.a)(e,u)})}h=()=>{g=!0,u?e.append(r):Object(n.a)(e,r),setTimeout(()=>{e.childElementCount&&o.a.mutateElement(r,()=>{e.dataset.color="",d&&r.classList.remove("fade-in"),u&&u.remove()})},d?200:0)}}const m=f.then(e=>Object(a.b)(r,e)).then(h);return{cached:g,loadPromise:c||m,thumbImage:u}}s(e,t,s,i){Object(r.a)(e,t),e.dataset.color=s,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),i&&e.classList.add(i)}putPhoto(e,t,s=!1,i="",a=!1,n){const r=l.a.myId;if(t===r&&s)return void this.s(e,"","","tgico-saved");if(t!==d.c&&t.isUser()){const s=g.a.getUser(t);if(s&&s.pFlags&&s.pFlags.deleted)return void this.s(e,"",u.a.getPeerColorById(t),"tgico-deletedaccount")}const o=u.a.getPeerPhoto(t),h=!!o,p=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!h||!p||!this.savedAvatarURLs[t]){let a="";if(!t||t===r&&s||(a=u.a.getPeerColorById(t)),t===d.e)return void this.s(e,"",a,"tgico-reply_filled");const n=i?c.b.getAbbreviation(i):u.a.getPeerInitials(t);this.s(e,n,a,"")}if(h){const s=n?"photo_big":"photo_small";return this.putAvatar(e,t,o,s,void 0,a)}}};i.a&&(i.a.appAvatarsManager=f),t.a=f},function(e,t,s){"use strict";var i;!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(i||(i={})),t.a=i},function(e,t,s){"use strict";function i(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,"a",(function(){return i}))},,,,function(e,t,s){"use strict";function i(e,t,s=t+10){return(e=e.trim()).length>s&&(e=e.slice(0,t)+"..."),e}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(0),a=s(63),n=s(64),r=s(80),o=s(28),d=s(87),c=s(8),l=s(37),h=s(1),u=s(11),p=s(98),g=s(88),f=s(19),m=s(41),v=s(105),_=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const y=new class{constructor(){this.drafts={},this.getAllDraftPromise=null,u.a.get("drafts").then(e=>{this.drafts=e||{}}),i.a.addMultipleEventsListeners({updateDraftMessage:e=>{const t=a.a.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}})}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then(()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();n.a.getDialogOnly(t)||n.a.reloadConversation(t)}})}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=c.a.invokeApi("messages.getAllDrafts").then(e=>{(r.a.updatesState.syncLoading||Promise.resolve()).then(()=>{r.a.processUpdateMessage(e)})}))}saveDraft(e,t,s,a={}){const n=this.processApiDraft(s),r=this.getKey(e,t);return n?this.drafts[r]=n:delete this.drafts[r],u.a.set({drafts:this.drafts}),a.notify&&i.a.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:a.force}),n}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!Object(f.a)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!Object(m.a)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(!e||"draftMessage"!==e._)return;const t=o.b.parseEntities(e.message),s=e.entities||[],i=o.b.mergeEntities(s.slice(),t);return e.rMessage=Object(v.a)(o.b.wrapDraftText(e.message,{entities:i})),e.reply_to_msg_id&&(e.reply_to_msg_id=p.a.generateMessageId(e.reply_to_msg_id)),e}syncDraft(e,t,s,i=!0,r=!1){return _(this,void 0,void 0,(function*(){const o=this.getDraft(e,t);if(this.draftsAreEqual(o,s))return!0;let h,u={peer:a.a.getInputPeerById(e),message:""};if(this.isEmptyDraft(s))h={_:"draftMessageEmpty"};else{Object(g.a)(s);let e=s.message,t=s.entities;s.reply_to_msg_id&&(u.reply_to_msg_id=p.a.getServerMessageId(s.reply_to_msg_id)),(null==t?void 0:t.length)&&(u.entities=n.a.getInputEntities(t)),s.pFlags.no_webpage&&(u.no_webpage=s.pFlags.no_webpage),u.message=e}const f=h||s;return f.date=Object(l.h)(!0)+d.a.serverTimeOffset,this.saveDraft(e,t,f,{notify:!0,force:r}),!(i&&!t)||c.a.invokeApi("messages.saveDraft",u)}))}clearAllDrafts(){return c.a.invokeApi("messages.clearAllDrafts").then(e=>{if(e)for(const e in this.drafts){const[t,s]=e.split("_");i.a.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:s?+s:void 0,draft:void 0})}})}clearDraft(e,t){const s={_:"draftMessageEmpty"};t?this.syncDraft(e,t,s,!1,!0):this.saveDraft(e,t,s,{notify:!0,force:!0})}setDraft(e,t,s,i){const a={_:"draftMessage",date:Date.now()/1e3|0,message:s,pFlags:{},entities:i};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}};h.a.appDraftsManager=y,t.a=y},function(e,t,s){"use strict";s.d(t,"a",(function(){return r})),s.d(t,"c",(function(){return o})),s.d(t,"b",(function(){return d}));var i=s(76),a=s(18),n=s(163);class r{constructor(e,t){this.mid=e,this.type=t,this.port=n.b}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver(Object(n.c)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function o(e,t,s){let i;if(Array.isArray(t)){if(!t[0])return;i=t,t=i[0].sources[0]}return{endpoint:s,type:e,source:t,sourceGroups:i}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return Object(a.a)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,s=new r(t,e);return this.entries.push(s),this.entriesByMid.set(t,s),s}deleteEntry(e){Object(i.a)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let s=this.entriesByPeerId.get(t);s||this.entriesByPeerId.set(t,s=new Set),s.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let s=this.entries.find(s=>"sendrecv"===s.direction&&s.type===e&&!(t?s.sendEntry:s.recvEntry));return s||(s=this.createEntry(e),s.setDirection("sendrecv")),s}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return n.a.fromConference(Object.assign({conference:this},e))}}},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(153);class a{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=Object(i.c)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}_search(e){const t=[],s=this.fullTexts,i=e.split(" "),a=i.length;return s.forEach((e,s)=>{let n=!0,r=0;for(let t=0;tthis._search(e)).reduce((e,t)=>(e.push(...t),e),[]);s.sort((e,t)=>e.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars);return new Set(s.map(e=>e.what))}}},function(e,t,s){"use strict";let i;function a(e,t){if(!i){const e=document.createElement("canvas");i=e.getContext("2d"),i.font=t}return i.measureText(e).width}s.d(t,"b",(function(){return l})),s.d(t,"a",(function(){return f}));var n=s(62),r=s(104),o=s(36);const d=new Map,c=new Set,l='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let h=!1;function u(){h||(h=!0,Object(o.b)(()=>{h=!1,c.forEach(g),c.clear()}))}function p(e){const t=e.dataset.sizeType;if(t){return n.b.active[t].width}return e.getBoundingClientRect().width}function g(e){let t=d.get(e);const s=!t;let{text:i,textLength:n,from:o,multiplier:c,font:h,textWidth:u,elementWidth:g}=t||{};s&&(i=e.textContent,n=i.length,o=50,c=o>0&&o/100,h=`${e.dataset.fontWeight||400} 16px ${l}`,u=a(i,h),g=p(e),t={text:i,textLength:n,from:o,multiplier:c,font:h,textWidth:u,elementWidth:g},d.set(e,t));const f=p(e),m=s||g!==f;if(!s&&m&&(t.elementWidth=g=f),m)if(u>g){e.setAttribute("title",i);let s=i,n=g;for(;s.length>3;){let t=s.length;const i=c&&Object(r.a)(c*t<<0,1,t-2)||Math.max(t+o-1,1),d=s.substr(0,i).replace(/\s*$/,""),l=s.substr(i+1).replace(/^\s*/,"");if(s=d+l,n=a(s+"…",h),n{for(const[e]of d)c.add(e);u()},{capture:!0,passive:!0});class f extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType?g(this):(c.add(this),u())}disconnectedCallback(){d.delete(this);c.delete(this)}}customElements.define("middle-ellipsis-element",f)},function(e,t,s){"use strict";var i=s(1),a=s(179),n=s(123),r=s(21),o=s(43),d=s(185),c=s(128),l=s(162),h=s(147),u=s(193),p=s(160),g=s(161),f=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};var m=s(135),v=s(4),_=s(8),y=s(20),I=s(0),P=s(80),S=s(68),M=s(63),b=s(60),w=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const C=new class{constructor(){this.makeSsrcsFromParticipant=e=>{var t,s;return[this.makeSsrcFromParticipant(e,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.video.audio_source),e.video&&this.makeSsrcFromParticipant(e,"video",e.video.source_groups,e.video.endpoint),(null===(s=e.presentation)||void 0===s?void 0:s.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.presentation.audio_source),e.presentation&&this.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)},this.log=Object(v.b)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,I.a.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),I.a.addEventListener("group_call_update",e=>{if("groupCallDiscarded"===e._){const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&t.hangUp(!1,!1,!0),this.participants.delete(e.id)}}),this.audioAsset=new a.a(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"])}get groupCall(){return this.currentGroupCall}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,s=t.get(e);return{nextOffset:s,setNextOffset:i=>{t.get(e)===s&&t.set(e,i)}}}saveApiParticipant(e,t,s){const{currentGroupCall:i}=this,a=this.getCachedParticipants(e),r=M.a.getPeerId(t.peer),o=a.get(r),d=t.pFlags.left;if(!o&&d)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0);const c=(null==i?void 0:i.id)===e;o?(Object(n.a)(o,t),t=o):a.set(r,t),c&&i.onParticipantUpdate(t,this.doNotDispatchParticipantUpdate);const l=this.getGroupCall(e);if("groupCall"===(null==l?void 0:l._)){let e=!1;d?(--l.participants_count,e=!0):!t.pFlags.just_joined||o||t.pFlags.self||(++l.participants_count,e=!0),e&&I.a.dispatchEvent("group_call_update",l)}d&&a.delete(r),o&&this.doNotDispatchParticipantUpdate!==r&&I.a.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,s){t.saved||(t.saved=!0,t.forEach(t=>this.saveApiParticipant(e,t,s)))}editParticipant(e,t,s){return w(this,void 0,void 0,(function*(){if(!Object.keys(s).length)return;if(t){const{currentGroupCall:i}=this,a=(null==i?void 0:i.id)===e&&t.pFlags.self;if(a&&void 0!==s.muted&&!i.isSharingAudio&&(delete s.muted,!Object.keys(s).length))return;const n=s.muted;void 0!==n&&t.pFlags.self&&(n?t.pFlags.muted=!0:t.pFlags.can_self_unmute&&delete t.pFlags.muted),void 0!==s.raiseHand&&(s.raiseHand?t.raise_hand_rating="1":delete t.raise_hand_rating),a&&(void 0!==s.videoStopped&&(s.videoStopped?delete t.video:t.video=this.generateSelfVideo(i.connections.main.sources.video)),!t.pFlags.muted&&t.pFlags.can_self_unmute&&i.setMuted(!1),i.dispatchEvent("state",i.state)),I.a.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}const i=t.pFlags.self?y.c:M.a.getPeerId(t.peer),a=yield _.a.invokeApiSingle("phone.editGroupCallParticipant",{call:C.getGroupCallInput(e),participant:i===y.c?M.a.getInputPeerSelf():M.a.getInputPeerById(i),muted:s.muted,volume:s.volume,raise_hand:s.raiseHand,video_paused:s.videoPaused,video_stopped:s.videoStopped,presentation_paused:s.presentationPaused});P.a.processUpdateMessage(a)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return w(this,void 0,void 0,(function*(){const s=this.getGroupCall(e);if(s&&"inputGroupCall"!==s._&&!t)return s;const i=this.getCachedParticipants(e).size?0:100;return _.a.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:i},processResult:t=>{b.a.saveApiUsers(t.users),S.a.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const s=this.saveGroupCall(t.call);return i&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),s}})}))}saveGroupCall(e,t){const s=this.groupCalls.get(e.id),i="inputGroupCall"!==e._&&(!s||"groupCallDiscarded"!==s._);return s?(i&&Object(n.a)(s,e),e=s):this.groupCalls.set(e.id,e),i&&I.a.dispatchEvent("group_call_update",e),e}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}setCurrentGroupCall(e){this.currentGroupCall=e,e&&I.a.dispatchEvent("group_call_instance",e)}createGroupCall(e,t,s){return w(this,void 0,void 0,(function*(){const i=yield _.a.invokeApi("phone.createGroupCall",{peer:M.a.getInputPeerById(e.toPeerId(!0)),random_id:Object(r.a)(32),schedule_date:t,title:s});P.a.processUpdateMessage(i);return i.updates.find(e=>"updateGroupCall"===e._).call}))}joinGroupCall(e,t,s=!0,i,a){return w(this,void 0,void 0,(function*(){let n;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${s} rejoin=${i}`),n=i?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return f(this,void 0,void 0,(function*(){const s={audio:Object(u.a)(),video:t&&Object(g.a)()},i=new h.a(l.b);try{const t=yield Object(p.a)(s,e);i.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,s),i.inputStream=new MediaStream}return i}))}(s,a),this.joinGroupCallInternal(e,t,n,s,i,a)}))}joinGroupCallInternal(e,t,s,i,a=!1,n){return w(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);let{currentGroupCall:o}=this;if(!o||!a){o=new d.a({chatId:e,id:t}),o.fixSafariAudio(),o.addEventListener("state",e=>{this.currentGroupCall===o&&e===c.a.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),I.a.dispatchEvent("chat_update",o.chatId))}),o.groupCall=yield this.getGroupCallFull(t);const l=o.createConnectionInstance({streamManager:s,type:"main",options:{type:"main",isMuted:i,joinVideo:n,rejoin:a}}),h=l.createPeerConnection();return h.addEventListener("negotiationneeded",()=>{l.negotiate()}),h.addEventListener("track",e=>{r("ontrack",e),o.onTrack(e)}),h.addEventListener("iceconnectionstatechange",()=>{o.dispatchEvent("state",o.state);const{iceConnectionState:e}=h;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":break;case"closed":o.hangUp();break;case"completed":break;case"connected":o.joined||(o.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.getGroupCallParticipants(t).then(({participants:e})=>{this.saveApiParticipants(t,[...e.values()])}));break;case"disconnected":break;case"failed":o.hangUp()}}),l.createDescription(),l.createDataChannel(),l.appendStreamToConference(),this.setCurrentGroupCall(o),r("set currentGroupCall",t,o),this.startConnectingSound(),l.negotiate()}o.handleUpdateGroupCallParticipants=!1,o.updatingSdp=!1,r("update currentGroupCall",t,o)}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}generateSelfVideo(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}generateSelfParticipant(){var e,t;const s=this.currentGroupCall.connections.main.sources,i=null===(e=this.currentGroupCall.connections.presentation)||void 0===e?void 0:e.sources;return{_:"groupCallParticipant",pFlags:{can_self_unmute:!0,self:!0},source:s.audio.source,video:this.generateSelfVideo(s.video),presentation:i&&this.generateSelfVideo(i.video,null===(t=i.audio)||void 0===t?void 0:t.source),date:Object(o.a)(!0),peer:M.a.getOutputPeer(I.a.myId)}}makeSsrcFromParticipant(e,t,s,i){return Object(m.c)(t,s,i)}getGroupCallParticipants(e){return w(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:s}=this.prepareToSavingNextOffset(e);return""!==t&&(yield _.a.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const i=t.count===t.participants.length?"":t.next_offset;S.a.saveApiChats(t.chats),b.a.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),s(i)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t=!1,s=!1){return w(this,void 0,void 0,(function*(){this.log(`hangUp start id=${e} discard=${t} rejoin=${s}`);const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.hangUp(t,s)}))}toggleMuted(e){return this.changeUserMuted(y.c,e)}changeUserMuted(e,t){const{currentGroupCall:s}=this;if(!s)return;const i=s.getParticipantByPeerId(e);return y.c===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(s.id,i,{muted:t})}};i.a&&(i.a.appGroupCallsManager=C);t.a=C},,,,,,function(e,t,s){"use strict";function i(e,t,s,i){const a=t[s];if(void 0===i&&-1!==(i=e.indexOf(t))){const t=e[i-1],n=e[i+1];if((!t||t[s]>=a)&&(!n||n[s]<=a))return i;e.splice(i,1)}const n=e.length;if(!n||a<=e[n-1][s])return e.push(t)-1;if(a>=e[0][s])return e.unshift(t),0;for(let i=0;ie[i][s])return e.splice(i,0,t),i;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(1),a=s(3),n=s(4),r=s(8),o=s(28),d=s(0),c=s(80),l=s(98),h=s(64),u=s(63),p=s(60);const g=new class{constructor(){this.polls={},this.results={},this.pollToMessages={},this.log=Object(n.b)("POLLS",n.a.Error),d.a.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let s=e.results;const i=this.savePoll(t,s);t=i.poll,s=i.results,d.a.dispatchEvent("poll_update",{poll:t,results:s})}})}savePoll(e,t,s){s&&this.updatePollToMessage(s,!0);const i=e.id;return this.polls[i]?(e=Object.assign(this.polls[i],e),t=this.saveResults(e,t)):(this.polls[i]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var s;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(s=null==t?void 0:t.results)||void 0===s?void 0:s.length)&&t.results.forEach((t,s)=>{var i;(null===(i=t.pFlags)||void 0===i?void 0:i.chosen)&&e.chosenIndexes.push(s)})),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,s,i){return s?(i||(i=[]),s=o.a.parseMarkdown(s,i)):s=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:s,solution_entities:s?i:void 0}}updatePollToMessage(e,t){const{id:s}=e.media.poll;let i=this.pollToMessages[s];if(!t&&!i)return;i||(i=this.pollToMessages[s]=new Set);const a=e.peerId+"_"+e.mid;t?i.add(a):i.delete(a),t||i.size||(delete this.polls[s],delete this.results[s],delete this.pollToMessages[s])}sendVote(e,t){const s=e.media.poll,i=t.map(e=>s.answers[e].option),a=e.mid,n=e.peerId,o=u.a.getInputPeerById(n);return e.pFlags.is_outgoing?h.a.invokeAfterMessageIsSent(a,"sendVote",e=>(this.log("invoke sendVote callback"),this.sendVote(e,t))):r.a.invokeApi("messages.sendVote",{peer:o,msg_id:l.a.getServerMessageId(e.mid),options:i}).then(e=>{this.log("sendVote updates:",e),c.a.processUpdateMessage(e)})}getResults(e){const t=u.a.getInputPeerById(e.peerId);return r.a.invokeApi("messages.getPollResults",{peer:t,msg_id:l.a.getServerMessageId(e.mid)}).then(e=>{c.a.processUpdateMessage(e),this.log("getResults updates:",e)})}getVotes(e,t,s,i=20){return r.a.invokeApi("messages.getPollVotes",{peer:u.a.getInputPeerById(e.peerId),id:l.a.getServerMessageId(e.mid),option:t,offset:s,limit:i}).then(e=>(this.log("getPollVotes messages:",e),p.a.saveApiUsers(e.users),e))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const s=Object(a.a)(t);return s.pFlags.closed=!0,h.a.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(s)}).then(()=>{},e=>{this.log.error("stopPoll error:",e)})}};i.a.appPollsManager=g,t.a=g},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(114);function a(e){e.stop(),Object(i.a)(e,"ended")}},function(e,t,s){"use strict";s.d(t,"a",(function(){return l}));var i=s(4),a=s(0),n=s(162),r=s(146),o=s(163),d=s(148);class c{constructor(e,t){const s=this.streamSource=e.createMediaStreamSource(t),i=this.analyser=e.createAnalyser();this.gain=e.createGain();i.minDecibels=-100,i.maxDecibels=-30,i.smoothingTimeConstant=.05,i.fftSize=1024,s.connect(i)}}class l{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:s,track:i,source:a,type:n}=e,r=t.analyser;if(!r)return;const o=new Uint8Array(r.frequencyBinCount);r.getByteFrequencyData(o);return{type:n,source:a,stream:s,track:i,value:Object(d.b)(o)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter(e=>"input"===e.type)).filter(e=>"audio"===e.kind).slice(0,n.a).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),a.a.dispatchEvent("group_call_amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=Object(i.b)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach(s=>{this.addTrack(e,s,t)})}addTrack(e,t,s){this.log("addTrack",s,t,e);const{context:i,items:a,inputStream:n,outputStream:r}=this,o=t.kind,d=l.getSource(e,s);switch(s){case"input":n?n.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)},{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find(t=>"input"===t.type&&t.kind===e)}static getSource(e,t){return"input"===t?e.source||e.id:""+Object(d.c)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let s=!1;for(let i=0,a=t.length;!s&&i[e,a]),r=t.getTracks();for(const[t,a]of n){let n=e.findEntry(e=>e.direction===s&&e.type===t);if(!n){if(!i)continue;n=e.createEntry(t)}let{transceiver:d}=n;d||(d=n.createTransceiver(e.connection,a)),n.direction!==d.direction&&(d.direction=n.direction);const c=Object(o.c)(t),l=r.findIndex(e=>e.kind===c),h=-1!==l?r.splice(l,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch(e=>{this.log.error(e)})}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach(e=>{Object(r.a)(e)})}catch(e){this.log.error(e)}}}},function(e,t,s){"use strict";function i(e){return e<<0}function a(e){return e>>>0}function n(e,t=3){if(!e)return 0;const{length:s}=e;let i=0;for(let t=0;t+e);return"asc"===t?s.sort((e,t)=>e-t):s.sort((e,t)=>t-e)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return i})),s.d(t,"b",(function(){return r}));var i,a=s(1);function n(e,t){if(e.toExponential){const s=e-t;return s<0?-1:s>0?1:0}return function(e,t){const s=e.length;if(s!==t.length){const e=s-t.length;return e<0?-1:e>0?1:0}for(let i=0;i=2)for(let t=0,s=this.slices.length;t=0)return{slice:t,offset:e===t[i]?i:i-1}}if(t&&t.isEnd(i.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let a=this.slice,n=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;a=t.slice,n=r=t.offset,a.includes(e)&&(r+=1)}let o=Math.max(r+t,0),d=r+t+s;const c=a.slice(o,d),l=t<0?s+t:s,h=Math.abs(t),u=a.length-r>=l||!!a.isEnd(i.Top)&&(c.setEnd(i.Top),!0),p=r-h>=0||!!a.isEnd(i.Bottom)&&(c.setEnd(i.Bottom),!0);return{slice:c,offsetIdOffset:n,fulfilled:i.None|(u&&p?i.Both:(u?i.Top:i.None)|(p?i.Bottom:i.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(i.Bottom)||(t=this.constructSlice(),t.setEnd(i.Bottom),this.slices.unshift(t)):t.setEnd(i.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(i.Top)||(t=this.constructSlice(),t.setEnd(i.Top),this.slices.push(t)):t.setEnd(i.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}}a.a&&(a.a.SlicedArray=r)},function(e,t,s){"use strict";s.d(t,"a",(function(){return f}));var i=s(10),a=s(93),n=s(36),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=[];let d=!1;function c(e,t="push"){if(!e.items.length)return Promise.resolve([]);const s=e.promise=Object(i.a)();return o[t](e),function e(){if(!d){(function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),s=[];return new Promise((i,o)=>{const d=()=>r(this,void 0,void 0,(function*(){const r=performance.now();do{yield Object(a.c)();const i=e.process.apply(e.context,t.shift());let n;if(i instanceof Promise)try{n=yield i}catch(e){return void o(e)}else n=i;s.push(n)}while(t.length>0&&performance.now()-r<6);t.length>0?Object(n.b)(d):i(s)}));Object(n.b)(d)}).then(e.promise.resolve,e.promise.reject)})(o.shift()).finally(()=>{d=!1,o.length&&e()})}}(),s}var l="filter"in(document.createElement("canvas").getContext("2d")||{});let h,u;function p(e,t,s,i=document.createElement("canvas")){i.width=e.width,i.height=e.height;const a=i.getContext("2d",{alpha:!1});return l?(a.filter=`blur(${t}px)`,a.drawImage(e,2*-t,2*-t,i.width+4*t,i.height+4*t)):(a.drawImage(e,0,0),u(a,0,0,i.width,i.height,t,s)),i}h=l?Promise.resolve():s.e(24).then(s.bind(null,200)).then(e=>{u=e.default});const g=new Map;function f(e,t=2,s=2){if(!e)throw"no dataUri for blur: "+e;g.size>150&&g.clear();const i=document.createElement("canvas");i.className="canvas-thumbnail";let a=g.get(e);if(a)i.width=a.canvas.width,i.height=a.canvas.height,a.promise.then(()=>{i.getContext("2d").drawImage(a.canvas,0,0,i.width,i.height)});else{const n=new Promise(a=>{h.then(()=>{const n=new Image;n.onload=()=>{c({items:[[n,t,s,i]],context:null,process:p},"unshift").then(()=>{a()})},n.src=e})});g.set(e,a={canvas:i,promise:n})}return Object.assign(Object.assign({},a),{canvas:i})}},,function(e,t,s){"use strict";s.d(t,"a",(function(){return o})),s.d(t,"b",(function(){return d})),s.d(t,"c",(function(){return c}));var i={"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A","Ẳ":"A","Ẵ":"A","Ǎ":"A","Â":"A","Ấ":"A","Ậ":"A","Ầ":"A","Ẩ":"A","Ẫ":"A","Ä":"A","Ǟ":"A","Ȧ":"A","Ǡ":"A","Ạ":"A","Ȁ":"A","À":"A","Ả":"A","Ȃ":"A","Ā":"A","Ą":"A","Å":"A","Ǻ":"A","Ḁ":"A","Ⱥ":"A","Ã":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ḃ":"B","Ḅ":"B","Ɓ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ć":"C","Č":"C","Ç":"C","Ḉ":"C","Ĉ":"C","Ċ":"C","Ƈ":"C","Ȼ":"C","Ď":"D","Ḑ":"D","Ḓ":"D","Ḋ":"D","Ḍ":"D","Ɗ":"D","Ḏ":"D","Dz":"D","Dž":"D","Đ":"D","Ƌ":"D","DZ":"DZ","DŽ":"DZ","É":"E","Ĕ":"E","Ě":"E","Ȩ":"E","Ḝ":"E","Ê":"E","Ế":"E","Ệ":"E","Ề":"E","Ể":"E","Ễ":"E","Ḙ":"E","Ë":"E","Ė":"E","Ẹ":"E","Ȅ":"E","È":"E","Ẻ":"E","Ȇ":"E","Ē":"E","Ḗ":"E","Ḕ":"E","Ę":"E","Ɇ":"E","Ẽ":"E","Ḛ":"E","Ꝫ":"ET","Ḟ":"F","Ƒ":"F","Ǵ":"G","Ğ":"G","Ǧ":"G","Ģ":"G","Ĝ":"G","Ġ":"G","Ɠ":"G","Ḡ":"G","Ǥ":"G","Ḫ":"H","Ȟ":"H","Ḩ":"H","Ĥ":"H","Ⱨ":"H","Ḧ":"H","Ḣ":"H","Ḥ":"H","Ħ":"H","Í":"I","Ĭ":"I","Ǐ":"I","Î":"I","Ï":"I","Ḯ":"I","İ":"I","Ị":"I","Ȉ":"I","Ì":"I","Ỉ":"I","Ȋ":"I","Ī":"I","Į":"I","Ɨ":"I","Ĩ":"I","Ḭ":"I","Ꝺ":"D","Ꝼ":"F","Ᵹ":"G","Ꞃ":"R","Ꞅ":"S","Ꞇ":"T","Ꝭ":"IS","Ĵ":"J","Ɉ":"J","Ḱ":"K","Ǩ":"K","Ķ":"K","Ⱪ":"K","Ꝃ":"K","Ḳ":"K","Ƙ":"K","Ḵ":"K","Ꝁ":"K","Ꝅ":"K","Ĺ":"L","Ƚ":"L","Ľ":"L","Ļ":"L","Ḽ":"L","Ḷ":"L","Ḹ":"L","Ⱡ":"L","Ꝉ":"L","Ḻ":"L","Ŀ":"L","Ɫ":"L","Lj":"L","Ł":"L","LJ":"LJ","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ń":"N","Ň":"N","Ņ":"N","Ṋ":"N","Ṅ":"N","Ṇ":"N","Ǹ":"N","Ɲ":"N","Ṉ":"N","Ƞ":"N","Nj":"N","Ñ":"N","NJ":"NJ","Ó":"O","Ŏ":"O","Ǒ":"O","Ô":"O","Ố":"O","Ộ":"O","Ồ":"O","Ổ":"O","Ỗ":"O","Ö":"O","Ȫ":"O","Ȯ":"O","Ȱ":"O","Ọ":"O","Ő":"O","Ȍ":"O","Ò":"O","Ỏ":"O","Ơ":"O","Ớ":"O","Ợ":"O","Ờ":"O","Ở":"O","Ỡ":"O","Ȏ":"O","Ꝋ":"O","Ꝍ":"O","Ō":"O","Ṓ":"O","Ṑ":"O","Ɵ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Õ":"O","Ṍ":"O","Ṏ":"O","Ȭ":"O","Ƣ":"OI","Ꝏ":"OO","Ɛ":"E","Ɔ":"O","Ȣ":"OU","Ṕ":"P","Ṗ":"P","Ꝓ":"P","Ƥ":"P","Ꝕ":"P","Ᵽ":"P","Ꝑ":"P","Ꝙ":"Q","Ꝗ":"Q","Ŕ":"R","Ř":"R","Ŗ":"R","Ṙ":"R","Ṛ":"R","Ṝ":"R","Ȑ":"R","Ȓ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꜿ":"C","Ǝ":"E","Ś":"S","Ṥ":"S","Š":"S","Ṧ":"S","Ş":"S","Ŝ":"S","Ș":"S","Ṡ":"S","Ṣ":"S","Ṩ":"S","ẞ":"SS","Ť":"T","Ţ":"T","Ṱ":"T","Ț":"T","Ⱦ":"T","Ṫ":"T","Ṭ":"T","Ƭ":"T","Ṯ":"T","Ʈ":"T","Ŧ":"T","Ɐ":"A","Ꞁ":"L","Ɯ":"M","Ʌ":"V","Ꜩ":"TZ","Ú":"U","Ŭ":"U","Ǔ":"U","Û":"U","Ṷ":"U","Ü":"U","Ǘ":"U","Ǚ":"U","Ǜ":"U","Ǖ":"U","Ṳ":"U","Ụ":"U","Ű":"U","Ȕ":"U","Ù":"U","Ủ":"U","Ư":"U","Ứ":"U","Ự":"U","Ừ":"U","Ử":"U","Ữ":"U","Ȗ":"U","Ū":"U","Ṻ":"U","Ų":"U","Ů":"U","Ũ":"U","Ṹ":"U","Ṵ":"U","Ꝟ":"V","Ṿ":"V","Ʋ":"V","Ṽ":"V","Ꝡ":"VY","Ẃ":"W","Ŵ":"W","Ẅ":"W","Ẇ":"W","Ẉ":"W","Ẁ":"W","Ⱳ":"W","Ẍ":"X","Ẋ":"X","Ý":"Y","Ŷ":"Y","Ÿ":"Y","Ẏ":"Y","Ỵ":"Y","Ỳ":"Y","Ƴ":"Y","Ỷ":"Y","Ỿ":"Y","Ȳ":"Y","Ɏ":"Y","Ỹ":"Y","Ź":"Z","Ž":"Z","Ẑ":"Z","Ⱬ":"Z","Ż":"Z","Ẓ":"Z","Ȥ":"Z","Ẕ":"Z","Ƶ":"Z","IJ":"IJ","Œ":"OE","ᴀ":"A","ᴁ":"AE","ʙ":"B","ᴃ":"B","ᴄ":"C","ᴅ":"D","ᴇ":"E","ꜰ":"F","ɢ":"G","ʛ":"G","ʜ":"H","ɪ":"I","ʁ":"R","ᴊ":"J","ᴋ":"K","ʟ":"L","ᴌ":"L","ᴍ":"M","ɴ":"N","ᴏ":"O","ɶ":"OE","ᴐ":"O","ᴕ":"OU","ᴘ":"P","ʀ":"R","ᴎ":"N","ᴙ":"R","ꜱ":"S","ᴛ":"T","ⱻ":"E","ᴚ":"R","ᴜ":"U","ᴠ":"V","ᴡ":"W","ʏ":"Y","ᴢ":"Z","á":"a","ă":"a","ắ":"a","ặ":"a","ằ":"a","ẳ":"a","ẵ":"a","ǎ":"a","â":"a","ấ":"a","ậ":"a","ầ":"a","ẩ":"a","ẫ":"a","ä":"a","ǟ":"a","ȧ":"a","ǡ":"a","ạ":"a","ȁ":"a","à":"a","ả":"a","ȃ":"a","ā":"a","ą":"a","ᶏ":"a","ẚ":"a","å":"a","ǻ":"a","ḁ":"a","ⱥ":"a","ã":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ḃ":"b","ḅ":"b","ɓ":"b","ḇ":"b","ᵬ":"b","ᶀ":"b","ƀ":"b","ƃ":"b","ɵ":"o","ć":"c","č":"c","ç":"c","ḉ":"c","ĉ":"c","ɕ":"c","ċ":"c","ƈ":"c","ȼ":"c","ď":"d","ḑ":"d","ḓ":"d","ȡ":"d","ḋ":"d","ḍ":"d","ɗ":"d","ᶑ":"d","ḏ":"d","ᵭ":"d","ᶁ":"d","đ":"d","ɖ":"d","ƌ":"d","ı":"i","ȷ":"j","ɟ":"j","ʄ":"j","dz":"dz","dž":"dz","é":"e","ĕ":"e","ě":"e","ȩ":"e","ḝ":"e","ê":"e","ế":"e","ệ":"e","ề":"e","ể":"e","ễ":"e","ḙ":"e","ë":"e","ė":"e","ẹ":"e","ȅ":"e","è":"e","ẻ":"e","ȇ":"e","ē":"e","ḗ":"e","ḕ":"e","ⱸ":"e","ę":"e","ᶒ":"e","ɇ":"e","ẽ":"e","ḛ":"e","ꝫ":"et","ḟ":"f","ƒ":"f","ᵮ":"f","ᶂ":"f","ǵ":"g","ğ":"g","ǧ":"g","ģ":"g","ĝ":"g","ġ":"g","ɠ":"g","ḡ":"g","ᶃ":"g","ǥ":"g","ḫ":"h","ȟ":"h","ḩ":"h","ĥ":"h","ⱨ":"h","ḧ":"h","ḣ":"h","ḥ":"h","ɦ":"h","ẖ":"h","ħ":"h","ƕ":"hv","í":"i","ĭ":"i","ǐ":"i","î":"i","ï":"i","ḯ":"i","ị":"i","ȉ":"i","ì":"i","ỉ":"i","ȋ":"i","ī":"i","į":"i","ᶖ":"i","ɨ":"i","ĩ":"i","ḭ":"i","ꝺ":"d","ꝼ":"f","ᵹ":"g","ꞃ":"r","ꞅ":"s","ꞇ":"t","ꝭ":"is","ǰ":"j","ĵ":"j","ʝ":"j","ɉ":"j","ḱ":"k","ǩ":"k","ķ":"k","ⱪ":"k","ꝃ":"k","ḳ":"k","ƙ":"k","ḵ":"k","ᶄ":"k","ꝁ":"k","ꝅ":"k","ĺ":"l","ƚ":"l","ɬ":"l","ľ":"l","ļ":"l","ḽ":"l","ȴ":"l","ḷ":"l","ḹ":"l","ⱡ":"l","ꝉ":"l","ḻ":"l","ŀ":"l","ɫ":"l","ᶅ":"l","ɭ":"l","ł":"l","lj":"lj","ſ":"s","ẜ":"s","ẛ":"s","ẝ":"s","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ᵯ":"m","ᶆ":"m","ń":"n","ň":"n","ņ":"n","ṋ":"n","ȵ":"n","ṅ":"n","ṇ":"n","ǹ":"n","ɲ":"n","ṉ":"n","ƞ":"n","ᵰ":"n","ᶇ":"n","ɳ":"n","ñ":"n","nj":"nj","ó":"o","ŏ":"o","ǒ":"o","ô":"o","ố":"o","ộ":"o","ồ":"o","ổ":"o","ỗ":"o","ö":"o","ȫ":"o","ȯ":"o","ȱ":"o","ọ":"o","ő":"o","ȍ":"o","ò":"o","ỏ":"o","ơ":"o","ớ":"o","ợ":"o","ờ":"o","ở":"o","ỡ":"o","ȏ":"o","ꝋ":"o","ꝍ":"o","ⱺ":"o","ō":"o","ṓ":"o","ṑ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","õ":"o","ṍ":"o","ṏ":"o","ȭ":"o","ƣ":"oi","ꝏ":"oo","ɛ":"e","ᶓ":"e","ɔ":"o","ᶗ":"o","ȣ":"ou","ṕ":"p","ṗ":"p","ꝓ":"p","ƥ":"p","ᵱ":"p","ᶈ":"p","ꝕ":"p","ᵽ":"p","ꝑ":"p","ꝙ":"q","ʠ":"q","ɋ":"q","ꝗ":"q","ŕ":"r","ř":"r","ŗ":"r","ṙ":"r","ṛ":"r","ṝ":"r","ȑ":"r","ɾ":"r","ᵳ":"r","ȓ":"r","ṟ":"r","ɼ":"r","ᵲ":"r","ᶉ":"r","ɍ":"r","ɽ":"r","ↄ":"c","ꜿ":"c","ɘ":"e","ɿ":"r","ś":"s","ṥ":"s","š":"s","ṧ":"s","ş":"s","ŝ":"s","ș":"s","ṡ":"s","ṣ":"s","ṩ":"s","ʂ":"s","ᵴ":"s","ᶊ":"s","ȿ":"s","ɡ":"g","ß":"ss","ᴑ":"o","ᴓ":"o","ᴝ":"u","ť":"t","ţ":"t","ṱ":"t","ț":"t","ȶ":"t","ẗ":"t","ⱦ":"t","ṫ":"t","ṭ":"t","ƭ":"t","ṯ":"t","ᵵ":"t","ƫ":"t","ʈ":"t","ŧ":"t","ᵺ":"th","ɐ":"a","ᴂ":"ae","ǝ":"e","ᵷ":"g","ɥ":"h","ʮ":"h","ʯ":"h","ᴉ":"i","ʞ":"k","ꞁ":"l","ɯ":"m","ɰ":"m","ᴔ":"oe","ɹ":"r","ɻ":"r","ɺ":"r","ⱹ":"r","ʇ":"t","ʌ":"v","ʍ":"w","ʎ":"y","ꜩ":"tz","ú":"u","ŭ":"u","ǔ":"u","û":"u","ṷ":"u","ü":"u","ǘ":"u","ǚ":"u","ǜ":"u","ǖ":"u","ṳ":"u","ụ":"u","ű":"u","ȕ":"u","ù":"u","ủ":"u","ư":"u","ứ":"u","ự":"u","ừ":"u","ử":"u","ữ":"u","ȗ":"u","ū":"u","ṻ":"u","ų":"u","ᶙ":"u","ů":"u","ũ":"u","ṹ":"u","ṵ":"u","ᵫ":"ue","ꝸ":"um","ⱴ":"v","ꝟ":"v","ṿ":"v","ʋ":"v","ᶌ":"v","ⱱ":"v","ṽ":"v","ꝡ":"vy","ẃ":"w","ŵ":"w","ẅ":"w","ẇ":"w","ẉ":"w","ẁ":"w","ⱳ":"w","ẘ":"w","ẍ":"x","ẋ":"x","ᶍ":"x","ý":"y","ŷ":"y","ÿ":"y","ẏ":"y","ỵ":"y","ỳ":"y","ƴ":"y","ỷ":"y","ỿ":"y","ȳ":"y","ẙ":"y","ɏ":"y","ỹ":"y","ź":"z","ž":"z","ẑ":"z","ʑ":"z","ⱬ":"z","ż":"z","ẓ":"z","ȥ":"z","ẕ":"z","ᵶ":"z","ᶎ":"z","ʐ":"z","ƶ":"z","ɀ":"z","ff":"ff","ffi":"ffi","ffl":"ffl","fi":"fi","fl":"fl","ij":"ij","œ":"oe","st":"st","ₐ":"a","ₑ":"e","ᵢ":"i","ⱼ":"j","ₒ":"o","ᵣ":"r","ᵤ":"u","ᵥ":"v","ₓ":"x","Ё":"YO","Й":"I","Ц":"TS","У":"U","К":"K","Е":"E","Н":"N","Г":"G","Ш":"SH","Щ":"SCH","З":"Z","Х":"H","Ъ":"","ё":"yo","й":"i","ц":"ts","у":"u","к":"k","е":"e","н":"n","г":"g","ш":"sh","щ":"sch","з":"z","х":"h","ъ":"","Ф":"F","Ы":"I","В":"V","А":"A","П":"P","Р":"R","О":"O","Л":"L","Д":"D","Ж":"ZH","Э":"E","ф":"f","ы":"i","в":"v","а":"a","п":"p","р":"r","о":"o","л":"l","д":"d","ж":"zh","э":"e","Я":"Ya","Ч":"CH","С":"S","М":"M","И":"I","Т":"T","Ь":"","Б":"B","Ю":"YU","я":"ya","ч":"ch","с":"s","м":"m","и":"i","т":"t","ь":"","б":"b","ю":"yu"};const a=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,n=/^\s+|\s$/g,r={"й":"q","ц":"w","у":"e","к":"r","е":"t","н":"y","г":"u","ш":"i","щ":"o","з":"p","х":"[","ъ":"]","ф":"a","ы":"s","в":"d","а":"f","п":"g","р":"h","о":"j","л":"k","д":"l","ж":";","э":"'","я":"z","ч":"x","с":"c","м":"v","и":"b","т":"n","ь":"m","б":",","ю":".",".":"/"};function o(e){return e.replace(a,"").replace(n,"")}function d(e,t=!0){return c(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function c(e,t={}){const s=t.includeTag&&"%"===e.charAt(0),a=e;return t.clearBadChars&&(e=o(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,e=>{const t=i[e];return null!=t?t:e})}(e)),t.ignoreCase&&(e=e.toLowerCase()),s&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,e=>{const t=r[e];return null!=t?t:e})}(a)),e}},,,function(e,t,s){"use strict";function i(e,t=" "){const s=e.toString().split(".");return s[0]=s[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),s.join(".")}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";function i(e){return[...new Set(e)]}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(72),a=s(84),n=s(28),r=s(0),o=s(1),d=s(123),c=s(133);const l=new Set(["photo","video","gif","document"]);const h=new class{constructor(){this.webpages={},this.pendingWebPages={},r.a.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,s){var n,o;if("webPageNotModified"===e._)return;const{id:c}=e,h=this.webpages[c],u=h&&h._===e._&&h.hash==h.hash;if("webPage"===e._){"photo"===(null===(n=e.photo)||void 0===n?void 0:n._)?e.photo=i.a.savePhoto(e.photo,s):delete e.photo,"document"===(null===(o=e.document)||void 0===o?void 0:o._)?e.document=a.a.saveDoc(e.document,s):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let r=e.title||e.author||t||"";t&&r===t&&delete e.site_name,l.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[c];if(t&&(p||(p=this.pendingWebPages[c]=new Set),p.add(t)),void 0===h?this.webpages[c]=e:Object(d.a)(h,e),!t&&void 0!==p&&u){const e=[];p.forEach(t=>{const[s,i,a]=t.split("_");e.push({peerId:s.toPeerId(),mid:+i,isScheduled:!!a})}),r.a.dispatchEvent("webpage_updated",{id:c,msgs:e})}return e}wrapTitle(e){let t=e.title||e.author||e.site_name||"";return t=Object(c.a)(t,80,100),n.a.wrapRichText(t,{noLinks:!0,noLinebreaks:!0})}wrapDescription(e){const t=Object(c.a)(e.description||"",150,180);return n.a.wrapRichText(t)}getMessageKeyForPendingWebPage(e,t,s){return e+"_"+t+(s?"_s":"")}deleteWebPageFromPending(e,t){const s=e.id;if(!s)return;const i=this.pendingWebPages[s];i&&i.has(t)&&(i.delete(t),i.size||delete this.pendingWebPages[s])}getWebPage(e){return this.webpages[e]}};o.a&&(o.a.appWebPagesManager=h),t.a=h},function(e,t,s){"use strict";function i(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function a(e,t){return i(this,void 0,void 0,(function*(){const s=yield navigator.mediaDevices.getUserMedia(e);return s.getTracks().forEach(e=>{e.enabled=!t}),s}))}window.getStream=a},function(e,t,s){"use strict";function i(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return i})),s.d(t,"b",(function(){return a}));const i=50,a=100},function(e,t,s){"use strict";s.d(t,"b",(function(){return r})),s.d(t,"c",(function(){return o})),s.d(t,"d",(function(){return c})),s.d(t,"a",(function(){return l}));var i=s(2),a=s(182),n=s(148);const r="9";function o(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function c(e,t=r,s){const i=d(e);return`m=${o(e)} ${t} ${i} ${s.join(" ")}`}class l extends a.a{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(" generation "+e.generation),t.join("")}(e))}addHeader(e,t){const s=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed","a=group:BUNDLE "+s,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add("a=ice-ufrag:"+e.ufrag,"a=ice-pwd:"+e.pwd,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,"a=setup:"+t.setup);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:s,sourceGroups:i}=e;const a=Object(n.a)(e.source);t+=a,s+=a;const r=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${s}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${s}`)};return(()=>{this.add(`a=msid:${t} ${s}`)})(),(null==i?void 0:i.length)?i.forEach(e=>{if(e.sources.length){const t=e.sources.map(n.a);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(r)}}):r(a),this}addSsrcEntry(e,t,s){const i=(...e)=>this.add(...e),{type:a,mid:n,direction:r,port:l}=e,h=t.transport,u="application"===a,p=u?void 0:t[a],g="inactive"===r;if(e.shouldBeSkipped(s))return i(`m=${o(a)} 0 ${d(a)} 0`,"c=IN IP4 0.0.0.0","a=inactive","a=mid:"+n);const f=u?[{id:5e3}]:p["payload-types"],m=f.map(e=>e.id);i(c(a,l,m),"c=IN IP4 0.0.0.0",`a=rtcp:${l} IN IP4 0.0.0.0`),h["rtcp-mux"]&&i("a=rtcp-mux"),i("a=mid:"+n);let v=r;if("sendrecv"===r||!s||g||u||(v="sendonly"===r?"recvonly":"sendonly"),i("a="+v),this.addTransport(h),u)i(`a=sctpmap:${f[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach(e=>{i(`a=extmap:${e.id} ${e.uri}`)}),f.forEach(e=>{i(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?"/"+e.channels:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const s=[];for(const e in t)s.push(`${e}=${t[e]}`);i(`a=fmtp:${e.id} ${s.join(";")}`)}const s=e["rtcp-fbs"];(null==s?void 0:s.length)&&s.forEach(t=>{i(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)})})}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:s,bundle:a,isAnswer:n}=e;this.addHeader(t.sessionId,a),i.d&&this.addTransport(t.transport);for(const e of s)this.addSsrcEntry((n?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,n);return this}static fromConference(e){return(new l).addConference(e).finalize()}}},function(e,t,s){"use strict";s.d(t,"b",(function(){return re})),s.d(t,"a",(function(){return de}));var i,a,n=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},r=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class o{constructor(e,t){i.set(this,void 0),a.set(this,void 0),n(this,i,e,"f"),n(this,a,t,"f")}get session(){return r(this,i,"f")}get media(){return r(this,a,"f")}get bundle(){return this.session.lines.find(e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map(e=>e.lines)).map(e=>e.toString()).join("\r\n")+"\r\n"}}function d(e,t,s){const i=e.split(t),a=[];for(;s>0&&i.length;)a.push(i.shift()),--s;return i.length&&a.push(i.join(t)),a}i=new WeakMap,a=new WeakMap;var c,l,h,u=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},p=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class g{constructor(e,t){c.set(this,void 0),l.set(this,void 0),h.set(this,void 0),u(this,c,new Set,"f"),u(this,l,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,l,"f"),t=p(this,h,"f"),s=p(this,c,"f"),i=t-e+1;let a=Math.floor(e+i*Math.random()),n=0;for(;s.has(a);)if(a=i)return null;return s.add(a),a}add(e){p(this,c,"f").add(e)}}c=new WeakMap,l=new WeakMap,h=new WeakMap;var f,m,v=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},_=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class y{constructor(e,t){f.set(this,void 0),m.set(this,void 0),v(this,f,e,"f"),v(this,m,t,"f")}get key(){return _(this,f,"f")}get value(){return _(this,m,"f")}}f=new WeakMap,m=new WeakMap;var I,P,S,M,b=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},w=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class C{constructor(e,t,s,i){I.set(this,void 0),P.set(this,void 0),S.set(this,void 0),M.set(this,void 0),b(this,I,e,"f"),b(this,P,t,"f"),b(this,S,s,"f"),b(this,M,i,"f")}get type(){return w(this,I,"f")}get port(){return w(this,P,"f")}get protocol(){return w(this,S,"f")}get ids(){return w(this,M,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}I=new WeakMap,P=new WeakMap,S=new WeakMap,M=new WeakMap;var E,k,A,D,U=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},T=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class O{constructor(e,t){if(E.set(this,void 0),k.set(this,void 0),A.set(this,void 0),D.set(this,void 0),U(this,E,e,"f"),"string"==typeof t){if(U(this,k,t,"f"),"m"===e){const e=t.split(" ");U(this,A,new C(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],U(this,D,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof C?(U(this,A,t,"f"),U(this,k,t.toString(),"f")):t instanceof y&&(U(this,D,t,"f"),U(this,k,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return T(this,E,"f")}get value(){return T(this,k,"f")}get parsed(){return T(this,D,"f")}get mediaLineParts(){return T(this,A,"f")}toString(){return`${this.key}=${this.value}`}}E=new WeakMap,k=new WeakMap,A=new WeakMap,D=new WeakMap;var F,x,j,L,R,B,N=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},H=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class G{constructor(e,t,s=":",i=!1){F.set(this,void 0),x.set(this,void 0),j.set(this,void 0),L.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N(this,F,e,"f"),N(this,x,t,"f"),N(this,j,s,"f"),N(this,R,i,"f"),N(this,L,i?new Map:null,"f"),N(this,B,i?[]:null,"f")}get lines(){return H(this,x,"f")}get value(){return H(this,R,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,R,"f")}get key(){return H(this,F,"f")}get keys(){return G.fill(this),H(this,B,"f")}forEach(e){G.fill(this),H(this,L,"f").forEach(e)}get(e){return G.fill(this),H(this,L,"f").get(e)||new G(e,[],":",!0)}static fill(e){if(null!==H(e,L,"f"))return;const t=new Map;e.lines.forEach(s=>{const[i,a]=d(s,H(e,j,"f"),1),n=t.get(i)||[];t.set(i,[...n,a||""])});const s=N(e,L,G.makeAttributes(t),"f");N(e,B,Array.from(s.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach((e,s)=>{t.set(s,new G(s,e))}),t}}F=new WeakMap,x=new WeakMap,j=new WeakMap,L=new WeakMap,R=new WeakMap,B=new WeakMap;var z,V,W=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},q=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ${constructor(e){z.set(this,void 0),V.set(this,void 0),W(this,z,e,"f"),W(this,V,new Map,"f"),$.fillAttributes(this)}get(e){return q(this,V,"f").get(e)||new G(e,[]," ",!0)}static fillAttributes(e){const t=new Map;q(e,z,"f").forEach(e=>{if("a"===e.key){const{key:s,value:i}=e.parsed;let a=t.get(s);a||(a=[],t.set(s,a)),a.push(i||"")}}),t.forEach((t,s)=>{q(e,V,"f").set(s,new G(s,t," ",!1))})}}z=new WeakMap,V=new WeakMap;var K,Y,J,Q,Z=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},X=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ee{constructor(e){K.set(this,void 0),Y.set(this,void 0),J.set(this,void 0),Q.set(this,void 0),Z(this,K,e,"f"),Z(this,Y,e[0],"f"),Z(this,J,Z(this,Q,null,"f"),"f")}get lines(){return X(this,K,"f")}get mediaLine(){return X(this,Y,"f")}get mediaLineParts(){return X(this,Y,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!X(this,Q,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",Z(this,Q,t,"f")}return X(this,Q,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return X(this,J,"f")||Z(this,J,new $(this.lines),"f"),X(this,J,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const s in e){const i=this.attributes.get(s),a=!e[s];t[s]=i?a?i.lines:i.value:a?[]:void 0}return t}}K=new WeakMap,Y=new WeakMap,J=new WeakMap,Q=new WeakMap;var te,se,ie=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},ae=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ne{constructor(e){te.set(this,void 0),se.set(this,void 0),ie(this,te,e,"f"),ie(this,se,e.filter(e=>"o"===e.key).map(e=>e.value.split(" ")[1])[0],"f")}get lines(){return ae(this,te,"f")}get sessionId(){return ae(this,se,"f")}}function re(e){function t(){s?i.push(new ee(a)):s=new ne(a)}let s=null,i=[],a=[];return e.split(/\r?\n/).forEach(e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const s=oe(e);"m"===s.key&&(t(),a=[]),a.push(s)}}),t(),new o(s,i)}function oe(e){const t=d(e,"=",1);return new O(t[0],t[1])}function de(e){let t;return e.media.forEach((s,i)=>{if("video"===s.mediaType&&s.isSending&&!s.attributes.get("ssrc-group").get("SIM").exists){t||(t=new g(2,4294967295));const a=s.attributes.get("ssrc-group").get("FID").value.split(" "),n=s.lines;a.forEach(e=>t.add(+e));const r=[a[0],t.generate(),t.generate()],o=[a[1],t.generate(),t.generate()];n.push(oe("a=ssrc-group:SIM "+r.join(" ")));const d=s.attributes.get("ssrc").get(a[0]).lines;r.forEach((e,t)=>{const s=o[t];t>0&&(n.push(oe("a=ssrc-group:FID "+e+" "+s)),d.forEach(t=>{n.push(oe("a=ssrc:"+e+" "+t))}),d.forEach(e=>{n.push(oe("a=ssrc:"+s+" "+e))}))}),e.media[i]=new ee(n)}}),!!t}te=new WeakMap,se=new WeakMap},,function(e,t,s){"use strict";var i=s(64),a=s(81),n=s(1),r=s(8),o=s(88),d=s(4);function c(e){const t=e.length,s=new Array(t);for(let i=0;i{const t=e.payload;Object(o.a)(e),e.originalPayload=t,this.refreshReference(t).then(t=>{e.payload=t},t=>{e.error=t}).then(()=>r.a.postMessage(e))})}saveContext(e,t,s){[s,e]=this.getContexts(e),s||(s=new Set,this.contexts.set(e,s)),this.links[c(e)]=e;for(const e of s)if(Object(l.a)(e,t))return;s.add(t)}getReferenceByLink(e){return this.links[c(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,s){if([s,e]=this.getContexts(e),s)for(const i of s)if(Object(l.a)(i,t))return s.delete(i),s.size||(this.contexts.delete(e),delete this.links[c(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const s=this.getContext(e);if(!s)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=s}let s;switch(null==t?void 0:t.type){case"message":s=i.a.wrapSingleMessage(t.peerId,t.messageId,!0);break;case"emojiesSounds":s=this.refreshEmojiesSoundsPromise||a.a.getAnimatedEmojiSounds(!0).then(()=>{this.refreshEmojiesSoundsPromise=void 0});break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const n=c(e);return this.log("refreshReference: refreshing reference:",n),s.then(()=>{const s=c(e);if(this.log("refreshReference: refreshed, reference before:",n,"after:",s),n!==s)return e;this.deleteContext(e,t);const i=this.getContext(e);if(i)return this.refreshReference(e,i[0]);throw this.log.error("refreshReference: no new context, reference before:",n,"after:",s,t),"NO_NEW_CONTEXT"})}};n.a.referenceDatabase=h;t.a=h},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(148);function a(e,t){const s=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!s.fingerprint){const t=e.session.lines.find(e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)});s.fingerprint=t.parsed.value}const a=function(e){const t=e.map(e=>{const[t,...s]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:s.map(e=>Object(i.c)(+e))}});return t.length?t:void 0}(s["ssrc-group"]),[n,r]=s.fingerprint.split(" ",2),o=s.ssrc&&Object(i.c)(+s.ssrc.split(" ",1)[0]);return{raw:s,ufrag:s["ice-ufrag"],pwd:s["ice-pwd"],fingerprint:{fingerprint:r,setup:s.setup,hash:n},source:o,sourceGroups:a,mid:s.mid}}},,,,,function(e,t,s){"use strict";const i=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate);t.a=i},function(e,t,s){"use strict";function i(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";function i(e,t){const s={writable:!0,configurable:!0},i={};t.forEach(t=>{e.hasOwnProperty(t)||(i[t]=s)}),Object.defineProperties(e,i)}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(1),a=s(2),n=s(4),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=Object(n.b)("OPUS",n.a.Error)}isPlaySupported(){if(void 0!==this.isPlaySupportedResult)return this.isPlaySupportedResult;const e=document.createElement("audio");return this.isPlaySupportedResult=!(!e.canPlayType||!e.canPlayType("audio/ogg;").replace(/no/,""))}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}}))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},a.g?void 0:t.map(e=>e.buffer))}))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},a.g?void 0:[e.pages.buffer]),e.timeout=window.setTimeout(()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())},1e4)}pushDecodeTask(e,t){return new Promise((s,i)=>{const a={pages:e,withWaveform:t,callback:{resolve:s,reject:i},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(a)&&this.executeNewTask(a)})}decode(e,t=!1){return r(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then(e=>{const t=new Blob([e.bytes],{type:"audio/wav"});return{url:URL.createObjectURL(t),waveform:e.waveform}})}))}};i.a.opusDecodeController=o,t.a=o},function(e,t,s){"use strict";var i=s(2);const a=!!document.createElement("video").canPlayType("video/webm")&&!i.g&&!i.c;window.IS_WEBM_SUPPORTED=a,t.a=a},function(e,t,s){"use strict";function i(e,t,s){"byteLength"in s[e]&&(s[e]=[...s[e]]),t&&t[e]!==s[e]&&(t[e].length=s[e].length,s[e].forEach((s,i)=>{t[e][i]=s}),s[e]=t[e])}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(46);const a=new Set(["image/jpeg","image/png","image/bmp"]);i.a&&a.add("image/webp"),t.a=a},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const s=this.createAudio();s.autoplay=!0,s.src="assets/audio/"+e,s.loop=t,s.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,s){const i=++this.tempId;setTimeout(()=>{this.tempId===i&&this.playSound(e,t)},s)}}},function(e,t,s){"use strict";function i(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function a(e){return i(this,void 0,void 0,(function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t}))}},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}},function(e,t,s){"use strict";function i(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}s.d(t,"a",(function(){return i}))},,function(e,t,s){"use strict";s.d(t,"a",(function(){return T}));var i=s(2),a=s(76),n=s(18),r=s(22),o=s(80),d=s(138),c=s(63),l=s(4),h=s(8),u=s(20),p=s(0),g=s(192),f=s(78),m=s(186);var v=s(3),_=s(135),y=s(164),I=s(163),P=s(167);var S=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class M extends m.a{constructor(e){super(e),this.negotiateThrottled=Object(r.a)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",()=>{this.maybeUpdateRemoteVideoConstraints()}),e.addEventListener("close",()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}),e}createDescription(){if(this.description)return this.description;return super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,s){return S(this,void 0,void 0,(function*(){const{groupCall:i,description:a}=this,n=i.id,r=t.map(t=>{const s=function(e,t){const s=Object(P.a)(e,t),i=t.mediaType,a={source:s.source,sourceGroups:s.sourceGroups,type:i};s.fingerprint.setup="active";const n={fingerprints:[s.fingerprint],pwd:s.pwd,ssrc:s.source,"ssrc-groups":s.sourceGroups||[],ufrag:s.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(n)},source:s.source,media:t,sourceGroups:s.sourceGroups,entry:a}}(e,t);return this.sources[s.entry.type]=s.entry,s});let c;const l=r.find(e=>"audio"===e.media.mediaType),u=r.find(e=>"video"===e.media.mediaType);let{source:g,params:m}=l||{};const v=u||l,_={audio:l,video:u};if(a.entries.forEach(e=>{if("sendonly"===e.direction){const t=_[e.type];if(!t)return;a.setEntrySource(e,t.sourceGroups||t.source),a.setEntryPeerId(e,p.a.myId)}}),m!==v.params){const e=JSON.parse(v.params.data);g?e.ssrc=g:delete e.ssrc,m={_:"dataJSON",data:JSON.stringify(e)}}const y=d.a.getGroupCallInput(n);if("main"===s.type){const e={call:y,join_as:{_:"inputPeerSelf"},params:m,muted:s.isMuted,video_stopped:!s.joinVideo};c=h.a.invokeApi("phone.joinGroupCall",e),this.log("[api] joinGroupCall id="+n,e)}else{const e={call:y,params:m};c=h.a.invokeApi("phone.joinGroupCallPresentation",e),this.log("[api] joinGroupCallPresentation id="+n,e)}const I=yield c;o.a.processUpdateMessage(I);const S=I.updates.find(e=>"updateGroupCallConnection"===e._),M=JSON.parse(S.params.data);return M.audio=M.audio||i.connections.main.description.audio,a.setData(M),function(e,t){["audio","video"].filter(e=>t[e]).map(e=>[t[e],e]).forEach(([t,s])=>{const i=e.find(e=>e.mediaType===s);if(!i)return;const a=(e=>{const t={};return e.attributes.get("extmap").forEach(e=>{const s=e.key.split("/",1)[0];t[s]=e.value}),t})(i);Object(f.a)(t["rtp-hdrexts"],(e,t,i)=>{a[e.id]!==e.uri&&(i.splice(t,1),console.log("[sdp] filtered extmap:",e,t,s))})})}(t,M),M}))}negotiateInternal(){return S(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,s="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,i=this.log.bindPrefix("startNegotiation");i("start");const a=yield e.createOffer({iceRestart:!1});if(s&&this.dataChannel){t.createEntry("application").setDirection("sendrecv")}const{sdp:n,offer:r}=function(e){const{offer:t,data:s}=e,i=Object(y.b)(t.sdp);let a=!1;if(e.skipAddingMulticast||(a=Object(y.a)(i)||a),Object(f.a)(i.media,(e,t,n)=>{if(e.isSending)return;if("application"===e.mediaType)return;const r=e.mediaLine,o=r.mediaLineParts,d=(o.ids,r.toString()),c=s[e.mediaType]["payload-types"].map(e=>""+e.id);if(d!==Object(I.d)(e.mediaType,void 0,c)){const r=Object(P.a)(i,e);let d=Object.assign({},s);d.transport=Object(v.a)(d.transport),d.transport.ufrag=r.ufrag,d.transport.pwd=r.pwd,d.transport.fingerprints=[r.fingerprint],d.transport.candidates=[];const c=new _.a(r.mid,o.type);c.setPort(o.port),r.source&&c.setSource(r.sourceGroups||r.source),c.setDirection(e.direction);const l=(new I.a).addSsrcEntry(c,d).finalize(),h=Object(y.b)(l).media[0];n[t]=h,a=!0}}),a){const e=i.toString();t.sdp=e}return{offer:t,sdp:i}}({offer:a,data:t});i("[sdp] setLocalDescription",r.sdp),yield e.setLocalDescription(r);const o=n.media.filter(e=>"application"!==e.mediaType&&e.isSending);if(s)try{yield this.invokeJoinGroupCall(n,o,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],c=n.bundle;Object(f.a)(c,(e,s,i)=>{const a=t.getEntryByMid(e);a.shouldBeSkipped(!0)&&(i.splice(s,1),d.push(a))});const l=n.media.map(e=>{const s=e.mid;let i=t.getEntryByMid(s);return i||(i=new _.a(s,e.mediaType),i.setDirection("inactive")),i}),h={type:"answer",sdp:t.generateSdp({bundle:c,entries:l,isAnswer:!0})};d.forEach(e=>{t.deleteEntry(e)}),i(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,h.sdp),yield e.setRemoteDescription(h),i("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then(()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1}),"presentation"===this.options.type&&e.then(()=>{this.connection.getTransceivers().find(e=>{var t,s;"video"===(null===(s=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===s?void 0:s.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))})}),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:s}=t;e.onStageEndpoints.push(s),e.constraints[s]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var b=s(128),w=s(180),C=s(181),E=s(160),k=s(161),A=s(146),D=s(147),U=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class T extends g.a{constructor(e){super(),Object(n.a)(this,e),this.log||(this.log=Object(l.b)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=Object(r.a)(()=>{this.dispatchEvent("pinned",this.pinnedSource)},0,!1),this.addEventListener("state",e=>{e===b.a.CLOSED&&this.cleanup()})}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return b.a.CLOSED;if("connected"===e||i.g&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?b.a.MUTED:b.a.UNMUTED:b.a.MUTED_BY_ADMIN}return b.a.CONNECTING}get participants(){return d.a.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==b.a.UNMUTED}get isClosing(){const{state:e}=this;return e===b.a.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){Object(a.a)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),Object(a.a)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return u.c===e?this.participant:this.participants.get(e)}toggleMuted(){return this.requestAudioSource(!0).then(()=>d.a.toggleMuted())}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let s;if(e.pFlags.self){s="video"===t?"main":"presentation"}else{s=e[t].source_groups[0].sources[0]}const i=this.getElement(s);if(!i)return;const a=i.cloneNode();return a.srcObject=i.srcObject,{video:a,source:s}}createConnectionInstance(e){return this.connections[e.type]=new M(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type)},e))}changeRaiseHand(e){return d.a.editParticipant(this.id,this.participant,{raiseHand:e})}startScreenSharingInternal(){return U(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Object(C.a)(Object(w.a)()),s=new D.a,i=this.createConnectionInstance({streamManager:s,type:e,options:{type:e}});i.createPeerConnection().addEventListener("negotiationneeded",()=>{i.negotiate()}),t.getVideoTracks()[0].addEventListener("ended",()=>{this.connections.presentation&&this.stopScreenSharing()},{once:!0}),i.createDescription(),i.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){return this.startScreenSharingPromise||(this.startScreenSharingPromise=this.startScreenSharingInternal().finally(()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,d.a.saveApiParticipant(this.id,this.participant),h.a.invokeApi("phone.leaveGroupCallPresentation",{call:d.a.getGroupCallInput(this.id)}).then(e=>{o.a.processUpdateMessage(e)})):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return U(this,void 0,void 0,(function*(){const e={video:Object(k.a)()};try{const t=yield Object(E.a)(e,!1);this.connections.main.addInputVideoStream(t),yield d.a.editParticipant(this.id,this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){return this.startVideoSharingPromise||(this.startVideoSharingPromise=this.startVideoSharingInternal().finally(()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return U(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(Object(A.a)(t),e.streamManager.appendToConference(e.description),yield d.a.editParticipant(this.id,this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,s=!1){return U(this,void 0,void 0,(function*(){for(const e in this.connections){this.connections[e].closeConnectionAndStream(!t)}if(this.dispatchEvent("state",this.state),!s&&!t){let t;const s=d.a.getGroupCallInput(this.id);if(e)this.log("[api] discardGroupCall id="+this.id),t=h.a.invokeApi("phone.discardGroupCall",{call:s});else if(this.joined){this.log("[api] leaveGroupCall id="+this.id);const e=this.connections.main;t=h.a.invokeApi("phone.leaveGroupCall",{call:s,source:e.sources.audio.source})}else this.log(`[api] id=${this.id} payload=null`),t=h.a.invokeApi("phone.joinGroupCall",{call:s,join_as:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}});const i=yield t;o.a.processUpdateMessage(i)}}))}tryAddTrack(e){const{description:t}=this,s=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+s),i=this.participants.get(e.peerId);i&&p.a.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:i})}return s}onParticipantUpdate(e,t){const s=this.connections.main,{connection:i,description:a}=s,n=c.a.getPeerId(e.peer),r=!!e.pFlags.left,o=this.participantsSsrcs.get(n)||[];if(e.presentation&&!r){const{source:t}=d.a.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,s.sources.audio.source!==e.source&&this.hangUp();let i=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(i=!0):(this.stopScreenSharing(),this.stopVideoSharing(),i=!0),i&&this.setMuted(!0),void(t!==n&&this.dispatchEvent("state",this.state))}const l=r?[]:d.a.makeSsrcsFromParticipant(e);r?this.participantsSsrcs.delete(n):this.participantsSsrcs.set(n,l);const h=new Set;o.forEach(e=>{const t=e.source;if(!l.find(e=>e.source===t)){this.unpinSource(t);const e=a.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),h.add(e.type))}}),l.forEach(e=>{let t=a.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),h.add(t.type)):(t=a.createEntry(e.type),a.setEntrySource(t,e.sourceGroups||e.source),a.setEntryPeerId(t,n),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(i,{direction:"recvonly"}),h.add(t.type))}),h.size&&(h.has("video")&&(s.updateConstraints=!0),s.negotiateThrottled())}}},function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(18),a=s(4);var n=s(135);class r{constructor(e){var t;Object(i.a)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||Object(a.b)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=Object(a.b)("RTCPeerConnection")),t("constructor");const s=new RTCPeerConnection(e);return s.addEventListener("track",e=>{t("ontrack",e)}),s.addEventListener("signalingstatechange",()=>{t("onsignalingstatechange",s.signalingState)}),s.addEventListener("connectionstatechange",()=>{t("onconnectionstatechange",s.connectionState)}),s.addEventListener("negotiationneeded",()=>{t("onnegotiationneeded",s.signalingState)}),s.addEventListener("icecandidate",e=>{t("onicecandidate",e)}),s.addEventListener("iceconnectionstatechange",()=>{t("oniceconnectionstatechange",s.iceConnectionState)}),s.addEventListener("datachannel",()=>{t("ondatachannel")}),s.log=t,{connection:s}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,s){s||(s=Object(a.b)("RTCDataChannel"));const i=e.createDataChannel("data",t);return i.addEventListener("message",e=>{s("onmessage",e)}),i.addEventListener("open",()=>{s("onopen")}),i.addEventListener("close",()=>{s("onclose")}),i.log=s,i}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new n.b(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){let e=this.negotiating;return e||(this.negotiating=this.negotiateInternal().finally(()=>{this.negotiating=void 0}))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},,,,function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(7);const a={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function n(e,t){const s=function(e,t=2){e||(e=1);let s=[];const i=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let a=1;i.forEach((t,n)=>{if(a*=t.m,e=0;--e)0===n[e].duration&&n.splice(e,1);return n}(e,2);if(t){const e=s.map(e=>i.c.format(a[e.type],!0,[e.duration]));return Object(i.f)(e,!1,t)}const n=s.map(e=>Object(i.d)(a[e.type],[e.duration])),r=document.createElement("span");return r.append(...Object(i.f)(n,!1)),r}},function(e,t,s){"use strict";var i=s(2);var a=!!document.createElement("video").canPlayType("video/quicktime")||i.g||i.c;const n=new Set(["image/gif","video/mp4","video/webm"]);a&&n.add("video/quicktime");t.a=n},function(e,t,s){"use strict";s.d(t,"a",(function(){return g}));var i=s(15),a=s(40),n=s(193),r=s(180),o=s(181),d=s(160),c=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function l(){const e={main:{},screen:{}};return t=>c(this,void 0,void 0,(function*(){const{isScreen:s,constraints:i}=t,a=e[s?"screen":"main"];let n=a[i.audio?"audio":"video"];n||(n=(s?o.a:d.a)(i,t.muted),i.audio&&!a.audio&&(a.audio=n.finally(()=>a.audio=void 0)),i.video&&!a.video&&(a.video=n.finally(()=>a.video=void 0)));try{return yield n}catch(e){throw e}}))}window.getStreamCached=l;var h=s(161),u=s(146),p=s(147);class g extends i.a{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(a.a)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,s){const{streamManager:i}=this;if(i){const s=!e||this.isSharingAudio,i=!t||this.isSharingVideo;if(s&&i)return Promise.resolve()}const a={audio:e&&Object(n.a)(),video:t&&Object(h.a)()};return this.getStream({constraints:a,muted:s}).then(e=>{this.onInputStream(e)})}requestScreen(){return this.getStream({isScreen:!0,constraints:Object(r.a)(!0)}).then(e=>{this.onInputStream(e)})}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const s=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:s,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:s,source:i}){i||(i=p.a.getSource(e,s)),this.log("tryAddTrack",e,t,s,i);const n="output"===s,{player:r,elements:o,streamManager:d}=this,c=t.kind,l="video"===c,h=l?i:c;let u=o.get(h);l&&t.addEventListener("ended",()=>{this.log("[track] onended"),o.delete(h)},{once:!0}),n&&d.addTrack(e,t,s);const g=l?e:d.outputStream;if(u)u.paused&&u.play().catch(a.a),u.srcObject=g;else{if(u=document.createElement(c),u.autoplay=!0,u.srcObject=g,u.volume=1,"undefined"!==u.sinkId){const{outputDeviceId:e}=this;e&&u.setSinkId(e)}l?(u.setAttribute("playsinline","true"),u.muted=!0):r.appendChild(u),o.set(h,u)}return i}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach(t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)})}onInputStream(e){if(this.isClosing)e.getTracks().forEach(e=>{Object(u.a)(e)});else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:s}=this;t.addStream(e,"input"),s&&t.appendToConference(s)}}}},function(e,t,s){"use strict";function i(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach(t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)}),e}s.d(t,"a",(function(){return i}))}])]); -//# sourceMappingURL=6.3fcd156db2ca66c7e6d0.chunk.js.map \ No newline at end of file diff --git a/public/6.3fcd156db2ca66c7e6d0.chunk.js.map b/public/6.3fcd156db2ca66c7e6d0.chunk.js.map deleted file mode 100644 index c7ef61b93..000000000 --- a/public/6.3fcd156db2ca66c7e6d0.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/cleanUsername.ts","webpack:///./src/lib/appManagers/appUsersManager.ts","webpack:///./src/lib/appManagers/appPeersManager.ts","webpack:///./src/lib/storages/dialogs.ts","webpack:///./src/lib/storages/filters.ts","webpack:///./src/lib/appManagers/appMessagesManager.ts","webpack:///./src/helpers/string/splitStringByLength.ts","webpack:///./src/lib/appManagers/appChatsManager.ts","webpack:///./src/components/peerTitle.ts","webpack:///./src/helpers/bytes/bytesFromHex.ts","webpack:///./src/lib/appManagers/appPhotosManager.ts","webpack:///./src/helpers/bytes/bytesToDataURL.ts","webpack:///./src/lib/appManagers/appProfileManager.ts","webpack:///./src/lib/appManagers/apiUpdatesManager.ts","webpack:///./src/lib/appManagers/appStickersManager.ts","webpack:///./src/lib/appManagers/appDocsManager.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/assumeType.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/components/visibilityIntersector.ts","webpack:///./src/helpers/array/findAndSpliceAll.ts","webpack:///./src/components/lazyLoadQueue.ts","webpack:///./src/lib/appManagers/appMessagesIdsManager.ts","webpack:///./src/helpers/dom/renderImageFromUrl.ts","webpack:///./src/helpers/windowSize.ts","webpack:///./src/helpers/callbackifyAll.ts","webpack:///./src/lib/appManagers/appReactionsManager.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/lib/appManagers/appNotificationsManager.ts","webpack:///./src/helpers/files.ts","webpack:///./src/helpers/middleware.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/helpers/object/safeReplaceObject.ts","webpack:///./src/components/preloader.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/helpers/callbackify.ts","webpack:///./src/helpers/string/limitSymbols.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/lib/calls/localConferenceDescription.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/helpers/array/flatten.ts","webpack:///./src/helpers/canvas/getTextWidth.ts","webpack:///./src/components/middleEllipsis.ts","webpack:///./src/lib/appManagers/appGroupCallsManager.ts","webpack:///./src/lib/calls/helpers/createMainStreamManager.ts","webpack:///./src/helpers/array/insertInDescendSortedArray.ts","webpack:///./src/lib/appManagers/appPollsManager.ts","webpack:///./src/lib/calls/helpers/stopTrack.ts","webpack:///./src/lib/calls/streamManager.ts","webpack:///./src/lib/calls/utils.ts","webpack:///./src/helpers/object/getObjectKeysAndSort.ts","webpack:///./src/helpers/slicedArray.ts","webpack:///./src/helpers/compareValue.ts","webpack:///./src/helpers/long/compareLong.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/environment/canvasFilterSupport.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/config/latinizeMap.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/number/numberThousandSplitter.ts","webpack:///./src/helpers/array/filterUnique.ts","webpack:///./src/lib/appManagers/appWebPagesManager.ts","webpack:///./src/helpers/dom/htmlToDocumentFragment.ts","webpack:///./src/lib/calls/helpers/getStream.ts","webpack:///./src/lib/calls/helpers/getVideoConstraints.ts","webpack:///./src/lib/calls/constants.ts","webpack:///./src/lib/calls/sdpBuilder.ts","webpack:///./src/lib/calls/sdp/index.ts","webpack:///./src/helpers/string/splitStringByLimitWithRest.ts","webpack:///./src/helpers/uniqueNumberGenerator.ts","webpack:///./src/lib/calls/sdp/attributeSplitted.ts","webpack:///./src/lib/calls/sdp/mediaLineParts.ts","webpack:///./src/lib/calls/sdp/line.ts","webpack:///./src/lib/calls/sdp/attributeInner.ts","webpack:///./src/lib/calls/sdp/attributes.ts","webpack:///./src/lib/calls/sdp/mediaSection.ts","webpack:///./src/lib/calls/sdp/sessionSection.ts","webpack:///./src/lib/calls/sdp/utils.ts","webpack:///./src/helpers/bytes/bytesToHex.ts","webpack:///./src/lib/mtproto/referenceDatabase.ts","webpack:///./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack:///./src/lib/calls/helpers/parseSourceGroups.ts","webpack:///./src/environment/vibrateSupport.ts","webpack:///./src/helpers/string/convertInputKeyToKey.ts","webpack:///./src/helpers/object/defineNotNumerableProperties.ts","webpack:///./src/lib/opusDecodeController.ts","webpack:///./src/environment/webmSupport.ts","webpack:///./src/helpers/object/safeReplaceArrayInObject.ts","webpack:///./src/environment/imageMimeTypesSupport.ts","webpack:///./src/helpers/audioAssetPlayer.ts","webpack:///./src/lib/calls/helpers/getScreenConstraints.ts","webpack:///./src/lib/calls/helpers/getScreenStream.ts","webpack:///./src/lib/calls/stringFromLineBuilder.ts","webpack:///./src/helpers/string/escapeRegExp.ts","webpack:///./src/lib/calls/groupCallConnectionInstance.ts","webpack:///./src/lib/calls/helpers/processMediaSection.ts","webpack:///./src/lib/calls/helpers/filterServerCodecs.ts","webpack:///./src/lib/calls/helpers/fixLocalOffer.ts","webpack:///./src/lib/calls/groupCallInstance.ts","webpack:///./src/lib/calls/callConnectionInstanceBase.ts","webpack:///./src/lib/calls/helpers/createPeerConnection.ts","webpack:///./src/lib/calls/helpers/createDataChannel.ts","webpack:///./src/helpers/formatCallDuration.ts","webpack:///./src/helpers/formatDuration.ts","webpack:///./src/environment/movSupport.ts","webpack:///./src/environment/videoMimeTypesSupport.ts","webpack:///./src/lib/calls/helpers/getStreamCached.ts","webpack:///./src/lib/calls/callInstanceBase.ts","webpack:///./src/lib/calls/helpers/getAudioConstraints.ts","webpack:///./src/environment/constraintSupport.ts"],"names":["cleanUsername","username","toLowerCase","appUsersManager","storage","appStateManager","storages","users","updateUsersStatuses","timestampNow","i","this","user","updateUserStatus","clear","setInterval","rootScope","addEventListener","addMultipleEventsListeners","update","userId","user_id","status","expires","serverTimeManager","serverTimeOffset","was_online","dispatchEvent","setUserToStateIfNeeded","updateUserPhoto","photo","photo_id","forceUserOnline","date","_","safeReplaceObject","toPeerId","console","warn","updateUserName","saveApiUser","first_name","last_name","e","getSelf","id","contactsIndex","indexObject","getUserSearchText","getState","then","state","storagesResults","length","setUserNameToCache","contactsList","Array","isArray","forEach","pushContact","contactsFillPromise","resolve","peerId","appPeersManager","isUser","toUserId","getFromCache","set","getUser","delete","init","usernames","isPeerNeeded","findAndSplice","getTopPeersPromises","createSearchIndex","undefined","Set","updatedContactsList","pushToState","cached","isFulfilled","promise","invokeApi","result","saveApiUsers","contacts","contact","onContactsModified","slice","Promise","resolvedPeer","processResolvedPeer","appChatsManager","saveApiChats","chats","getPeer","getPeerId","peer","phone","add","requestPeerSingle","releaseSinglePeer","pFlags","self","format","filter","Boolean","join","query","includeSaved","sortBy","fillContacts","_contactsList","results","search","has","sort","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","myId","indexOfAndSplice","testSelfSearch","unshift","getContacts","userIds","map","block","invokeApiSingle","getInputPeerById","value","apiUpdatesManager","processLocalUpdate","peer_id","getOutputPeer","blocked","index","clearBadChars","ignoreCase","latinize","includeTag","apiUsers","override","saved","oldUser","oldSearchUsername","searchUsername","min","fullName","deleted","cleanSearchText","changedPhoto","changedTitle","wasContact","newContact","onContactUpdated","formatPhoneNumber","formatted","isObject","access_hash","key","args","isBot","support","today","Date","diff","getTime","getDate","dateEl","timeEl","bot","isRegularUser","isContact","allowMin","phone_number","vcard","eventTimestamp","timestamp","updatesState","syncLoading","importContacts","phones","error","Error","type","inputContacts","j","push","client_id","toString","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","now","peers","offset","limit","hash","topPeers","categories","topPeer","requestPeer","rating","contactsBlocked","count","peerIds","u","concat","c","lat","long","accuracy_radius","background","self_expires","geo_point","updates","processUpdateMessage","entities","parseEntities","trim","path","URL","wrapUrl","url","pathname","err","invokeApiCacheable","q","cacheSeconds","my_results","filterUnique","p","curIsContact","popContact","offline","showPhone","getUserInput","add_phone_privacy_exception","restrictionReasons","restriction_reason","restricted","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","originMethod","String","prototype","Number","hasRights","toChatId","isRestricted","getUserPhoto","getChatPhoto","chat","getChat","migrated_to","deactivated","plainText","onlyFirstName","_limitSymbols","title","split","wrapEmojiText","chatId","isChannel","channel_id","chat_id","getUserString","getChatString","getAbbreviation","isPeerId","charAt","peerParams","substr","isMegagroup","isBroadcast","reason","text","ignorePeerId","getInputPeer","getUserInputPeer","pic","idx","Math","abs","getDialogType","getChatTyped","noforwards","appMessagesManager","appDraftsManager","appNotificationsManager","appMessagesIdsManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","dialog","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","reverse","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","d","getCache","peerText","getPeerSearchText","dialogsIndex","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","left","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","freezeSaving","setDialogsFromState","bind","allDialogsLoaded","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","loaded","0","1","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","offsetDate","getOffsetDate","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","getFolder","migratedTo","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","indexOf","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","skipped","isPinned","filters","getDialogIndexKey","wasIndex","findIndex","wasDialog","wasDialogIndex","newDialogIndex","setDialogIndexInFilter","prepareFolderUnreadCountModifyingByDialog","splice","insertInDescendSortedArray","callbacks","callback","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","max","dispatchUnreadTimeout","ctx","setTimeout","justReturn","message","topDate","generateDialogPinnedDate","channelId","channel","draft","foundIndex","pts","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","fromId","viaBotId","isAnyChat","newPts","getChannelState","ignoreOffsetDate","saveGlobalOffset","pos","setDialogToState","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","isDialogsLoaded","clearDialogFromState","foundDialog","getDialog","wasPinned","keepLocal","dropped","dropDialogWithEvent","forEachReverse","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","newUpdatesAfterReloadToHandle","saveUpdate","size","Object","keys","assign","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","out","isOutgoing","log","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","Bottom","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","settings","notify_settings","addChannelState","defineNotNumerableProperties","getFilter","offsetIndex","ret","promises","fillContactsResult","reloadMissingDialogsPromise","reloadMissingPeerIds","all","getDialogs","realFolderId","curDialogStorage","indexStr","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","hasOwnProperty","updateDialogFilter","updateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","find","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includes","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","unread_mentions_count","broadcasts","groups","isAnyGroup","bots","non_contacts","config","pinned_infolder_count_max","reject","prepend","remove","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","from","to","oldFilter","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","Map","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","logger","Debug","Log","Warn","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","handleNewMessages","clearTimeout","handleNewDialogs","newMaxSeenId","obj","dialogsStorage","incrementMaxSeenId","handleNotifications","window","_peerId","idle","isIDLE","notifyPeerToHandle","getNotifyPeerSettings","muted","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","random_id","pendingData","tempId","threadId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","threadsStorage","good","isInChat","ignoreExisting","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","first","action","top_msg_id","handleNewMessage","inboxUnread","releaseUnreadCount","prepareDialogUnreadCountModifying","modifyCachedMentions","setDialogTopMessage","notifyPeer","fwd_from","onUpdateMessageReactions","msg_id","reactions","recentReactions","recent_reactions","recentReaction","previousReactions","previousRecentReactions","deepEqual","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","local","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","updateMessage","get","replyTo","reply_to","reply_to_top_id","reply_to_msg_id","cancel","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","clearCache","params","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","messageId","inbox_date","media","hasUser","verified","pts_count","onUpdatePinnedMessages","missingMessages","wrapSingleMessage","finally","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","isScheduled","onUpdateDeleteScheduledMessages","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reaction","chosen","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getWebPage","drop","poll","appPollsManager","pollToMessages","maxSeenMsgId","batchUpdatesDebounced","debounce","event","details","middleware","clean","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","sendEntites","entity","callbackName","finalize","deferred","options","invokeAfterMessageIsSent","editMessage","parseMarkdown","schedule_date","scheduleDate","is_scheduled","newMedia","getInputEntities","no_webpage","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","splitted","splitStringByLength","str","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","lastIndex","partLength","webPage","sendText","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","query_id","queryId","resultId","clear_draft","clearDraft","send_as","silent","wrapMessageEntities","seq","beforeMessageSending","file","attachType","apiFileName","fileType","mime_type","fileName","File","name","isDocument","Blob","caption","attributes","isPhoto","document","actionName","isVoiceMessage","attribute","voice","waveform","duration","isMedia","photoSize","w","width","h","height","location","sizes","cacheContext","appDownloadManager","getCacheContext","downloaded","objectURL","appPhotosManager","savePhoto","videoAttribute","round_message","isRoundMessage","supports_streaming","noSound","file_name","thumbs","thumb","blob","thumbCacheContext","appDocsManager","saveDoc","preloader","attachMethod","tryAgainOnFail","isUpload","sentDeferred","attachPromise","catch","uploaded","cancelPendingMessage","setTyping","uploadPromise","file_reference","inputMedia","load","thumbUploadPromise","upload","notifyAll","done","total","inputFile","force_file","addNotifyListener","progress","percents","floor","isGroupedItem","code","files","sendFile","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","messageMedia","getMediaInput","doc","inputSingleMedia","inputs","contactPeerId","sendOther","getContactMediaInput","pollId","savePoll","total_voters","recent_voters","getPoll","getPhoto","getDoc","geo","geoPoint","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","getCachedFullChat","linked_chat_id","comments","replies_pts","isAnonymousSending","post","originalMessage","fwdHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","MAX_SAFE_INTEGER","admin_rights","anonymous","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","noErrorBox","resetPinnedOrder","telegramMeWebManager","setAuthorized","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","fromPeerId","dropCaptions","dropAuthor","newMids","newMessages","generateForwardHeader","replyToMid","replyToMessageIdx","newReplyToMid","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","just_clear","revoke","affectedHistory","doFlushHistory","justClear","getHistory","historyResult","getChannelInput","s","m","ss","getPinnedMessage","getSearch","inputFilter","unpin","pm_oneside","unpinAll","unpinAllMessages","totalEntities","foundMessages","minMid","getMidsByAlbum","verify","isMessage","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","mediaContext","unsupported","ttl_seconds","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","migrateFrom","migrateTo","suffix","video_sizes","appGroupCallsManager","saveGroupCall","call","video","migrateChecks","saveMessage","apiEntities","fixEmoji","myEntities","mergeEntities","usingMids","plain","highlightWord","withoutMediaType","parts","hasAlbumKey","addPart","langKey","el","createElement","innerHTML","append","assumeType","usingFullAlbum","getMidsByMessage","albumText","getAlbumText","emoticon","question","game","stickerEmojiRaw","span","performer","actionWrapped","wrapMessageActionTextNew","limitSymbols","wrapPlainText","match","found","regExp","RegExp","escapeRegExp","exec","sortEntities","messageWrapped","wrapRichText","noLinebreaks","noLinks","noTextFormat","htmlToDocumentFragment","fragment","createDocumentFragment","senderTitle","classList","fromMe","getMessageSenderPeerIdOrName","element","peerTitle","fromName","onclick","href","setAttribute","unsafeMessage","setInnerHTML","langPackKey","getNameDivHTML","getPeerTitle","formatCallDuration","endsWith","wrapJoinVoiceChatAnchor","daysToStart","tomorrowDate","setDate","k","_args","IntlDateElement","day","month","year","t","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dataset","dir","wrapMessageForReply","htmlToSpan","joined","anchorHTML","domain","langPack","wrapMessageActionTextNewUnsafe","botId","startParam","start_param","inviteToChannel","addChatUser","toggleDialogPin","pinned_dialogs_count_max","getPinnedOrders","getDialogPeer","read","hasChat","fromChat","kind","goodMedias","sticker","canMessageBeEdited","edit_time_limit","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","canCache","func","filterMessagesByInputFilter","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","offset_id_offset","next_rate","filterMessagesByInputFilterFromStorage","method","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","getDiscussionMessage","maxMessageId","serviceStartMessage","is_single","filterMessages","generateThreadServiceStartMessage","newDialogsHandlePromise","localMessageIds","creator","delete_messages","affectedMessages","force","triedToReadMaxId","readPromise","soundReset","getPeerString","readHistory","slicedArray","Top","fixUnreadMentionsCountIfNeeded","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","msgIds","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","threadMessage","broadcastEventName","finalizePendingMessage","muteUntil","mute_until","mute","mutePeer","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","downloadOptions","getPhotoDownloadOptions","fakeDownload","oldDoc","getInputFileName","polls","handleReleasingMessage","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","next_offset","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","arr","some","combined","readPeerId","reactionsCount","readParticipants","nextOffset","participants_count","appConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","increment","notification","peerString","notificationMessage","noIncrement","notificationFromPeerId","tag","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","loadPromise","image","notify","canSendToPeer","isFetchIntervalNeeded","unsetEnd","Both","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","topWasMeantToLoad","isBottomEnd","isHistoryResultEnd","requestHistory","oldestMessage","foundSlice","_historyResult","requestPromises","after","getMessagesResult","fetchSingleMessages","replyToPeerId","reply_to_peer_id","typing","timeout","smth","referenceDatabase","deleteContext","deleteWebPageFromPending","updatePollToMessage","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","noForwards","getElementCallback","newMap","peerIdStr","onChatUpdated","updateChannelParticipant","updateChatDefaultBannedRights","default_banned_rights","apiChats","saveApiChat","oldChat","rights","defaultRights","isThread","isCheckingRightsForSelf","megagroup","banned_rights","myFlags","post_messages","broadcast","until_date","getChannelInputPeer","getChatInputPeer","input","usersInputs","fwdLimit","fwd_limit","deleteChatUser","leaveChannel","leaveChat","deleteChannel","deleteChat","inputChatPhoto","about","participant","getParticipantPeerId","actor_id","qts","prev_participant","new_participant","kicked_by","editBanned","view_messages","kickFromChannel","messagesChats","enabled","migrateChat","available_reactions","invokeApiSingleProcess","processResult","sendAsPeers","weakMap","WeakMap","peerTitleWeakMap","querySelectorAll","PeerTitle","bytesFromHex","hexString","len","bytes","Uint8Array","ceil","start","parseInt","photos","context","oldPhoto","safeReplaceArrayInObject","saveContext","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","calcImageInBox","inputUser","photosResult","photoIds","isSticker","mimeType","jpegHeader","jpegTail","btoa","fromCharCode","bytesToDataURL","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","canvas","Image","renderImageFromUrl","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","windowSize","fullHeight","download","getDownload","createObjectURL","getInput","fullPhotoSize","downloadToDisc","AppProfileManager","usersFull","chatsFull","onUpdateUserTyping","typingsInPeer","cancelAction","getChatFull","onUpdatePeerBlocked","updateChatParticipants","participants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","getProfile","profile","getProfileByPeerId","getChannelFull","full_chat","exported_invite","link","exportedInvite","channelParticipant","fullChannel","processError","getChannelParticipants","cP","getTopPeers","ratingMap","processUserIds","updateResult","strippedThumb","stripped_thumb","previous","deletedList","reduce","acc","verifyParticipantForOnlineCount","chatInfo","channelParticipants","reduceParticipantsForOnlineCount","res","onlines","pendingPtsUpdates","pendingSeqUpdates","syncPending","channelStates","attached","debug","processOpts","seqStart","seq_start","forceGetDifference","processUpdate","toId","Proxy","target","saveUpdatesState","us","nextSeq","pendingUpdatesData","popPendingSeqUpdate","seqAwaiting","ptsAwaiting","curState","curPts","goodPts","goodIndex","getDifference","wasSyncing","pts_total_limit","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","channelState","getChannelDifference","lastPtsUpdateTime","popPts","popSeq","popPendingPtsUpdate","langCode","newVersion","stateResult","setUpdatesProcessor","setProxy","strs","en","ru","getChangelog","lang","fetch","ok","langStr","languages","language","LOCAL_IDS_SET","appStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","updateNewStickerSet","stickerSet","stickerset","saveStickerSet","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","docs","greetingStickers","shift","downloadDoc","cachedSet","documents","refreshTime","useCache","saveStickers","getStickerSetInput","saveById","getStickerSet","getAnimatedEmojiSounds","emoji","animations","getAnimatedEmojiSoundsPromise","getAppConfig","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","invokeApiHashable","stickers","replace","isAnimation","cleanEmoji","pack","packs","preloadEmojiPromise","getAnimatedEmojiSticker","mediaSize","active","emojiSticker","toneIndex","animation","loadAnimationWorker","container","animationData","autoplay","loop","saveLottiePreview","once","preloadAnimatedEmojiStickerAnimation","soundDoc","getAnimatedEmojiSoundDocument","newSet","setToCache","needSave","installed_date","thumb_dc_id","isAnimated","animated","thumb_version","short_name","sets","covered","videos","archived","excludeFeatured","exclude_featured","foundSaved","cache","cover","allStickers","getAllStickers","includeOurStickers","preloadStickerSets","getRecentStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","docId","docEmoticon","_doc","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","savingLottiePreview","downloading","onServiceWorkerFail","supportsStreaming","alt","stickerSetInput","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","thumbSize","inputFileLocation","getFileDownloadOptions","toDataURL","preloadPhoto","tryNotToUseBytes","getThumbURL","originalPromise","isPlaySupported","reader","FileReader","onloadend","uint8","decode","readAsArrayBuffer","stickerCachedThumbs","toBlob","createDownloadAnchor","addTaskListener","task","payload","x","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","apply","_waitingTimeout","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","visible","getVisible","disconnect","targets","observe","unobserve","unlock","refresh","findAndSpliceAll","array","parallelLimit","queue","inProcess","lockPromise","unlockResolve","processQueue","throttle","_processQueue","item","loadItem","getItem","processItem","addElement","super","lock","intersector","unlockAndRefresh","div","intersectorTimeout","wasSeen","setProcessQueueTimeout","_queue","spliced","AppMessagesIdsManager","tempNum","temp","MESSAGE_ID_OFFSET","MESSAGE_ID_INCREMENT","clearMessageId","toServer","l","used","loadedURLs","elem","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","isImage","loader","renderImageFromUrlPromise","visualViewport","innerWidth","innerHeight","callbackifyAll","values","SAVE_DOC_KEYS","REFERENCE_CONTEXT","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","callbackify","inactive","activeAvailableReactions","getActiveAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsForPeer","reactions_default","getReactionCached","onlyLocal","lastSendingTimeKey","myPeerId","chosenReactionIdx","chosenReaction","can_see_list","reactionCountIdx","userReaction","indexes","promiseKey","editMessageUpdateIdx","editMessageUpdate","sendReaction","html","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","volume","novibrate","nopreview","nopush","needPush","isAvailable","registeredDevice","subscribe","unsubscribe","setSettings","nosound","notifications","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","requestPermission","Notification","removeEventListener","navigator","vibrate","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","body","checkMuteUntilThrottled","stop","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","notificationData","period","custom","enable","resetTitle","setFavicon","clearInterval","titleInterval","getContext","beginPath","arc","PI","fillStyle","fill","fontSize","font","textBaseline","textAlign","fillText","getNotifyPeerTypePromise","inputKey","compare_sound","notifyContactsSignUp","prevFavicon","cloneNode","parentNode","replaceChild","notifySettings","isMuted","respectType","n","inputNotify","typeNotifySettings","getPeerLocalSettings","permission","data","testSound","icon","setLocalNotificationsDisabled","close","focus","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","audio","hidePushNotifications","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","createPosterFromMedia","videoWidth","videoHeight","naturalWidth","naturalHeight","quality","aspectFitted","drawImage","createPosterFromVideo","onseeked","currentTime","onerror","createPosterForVideo","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","webkitGetAsEntry","requestFile","accept","display","click","getMiddleware","cleanupObj","cleaned","additionalCallback","_cleanupObj","fixBase64String","toUrl","prefixes","maxPrefixLength","setPrefix","country","prefix","country_code","originalStr","countriesList","country_codes","prefixCountry","phoneCode","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","wasObject","newObject","ProgressivePreloader","detached","cancelable","streamable","onClick","contains","loadFunc","color","bold","constructContainer","construct","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","setProgress","startTime","onEnd","elapsedTime","delay","TRANSITION_TIME","detach","attach","parentElement","setManual","reset","useRafs","getTotalLength","strokeDasharray","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","limitPart","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","isFullLoaded","putAvatar","childElementCount","mutateElement","renderPromise","isDialog","isBig","getPeerColorById","avatarAvailable","avatarRendered","abbr","getPeerInitials","GROUP_CALL_STATE","limitFrom","drafts","getAllDraftPromise","updateDraftMessage","peerID","getKey","getAllDrafts","apiDraft","processApiDraft","draft1","draft2","rMessage","wrapDraftText","localDraft","saveOnServer","serverDraft","getDraft","draftsAreEqual","draftObj","isEmptyDraft","saveLocalDraft","emptyDraft","syncDraft","ConferenceEntry","port","direction","originalDirection","endpoint","connection","setDirection","transceiver","addTransceiver","source","sourceGroups","sources","isAnswer","generateSsrc","LocalConferenceDescription","sessionId","entriesByMid","entriesBySource","entriesByPeerId","setSource","setPeerId","isSending","sendEntry","recvEntry","createEntry","fromConference","conference","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","queries","_search","val","getTextWidth","measureText","testQueue","fontFamily","pendingTest","setTestQueue","testElement","getElementWidth","sizeType","mediaSizes","getBoundingClientRect","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","clamp","half1","half2","removeAttribute","capture","passive","MiddleEllipsisElement","HTMLElement","customElements","define","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","source_groups","presentation","groupCalls","nextOffsets","updateGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","currentGroupCall","hangUp","audioAsset","nextOffsetsMap","setNextOffset","newNextOffset","skipCounterUpdating","getCachedParticipants","oldParticipant","hasLeft","can_self_unmute","isCurrentGroupCall","onParticipantUpdate","doNotDispatchParticipantUpdate","getGroupCall","modified","just_joined","apiParticipants","saveApiParticipant","isUpdatingMeInCurrentCall","isSharingAudio","raiseHand","raise_hand_rating","videoStopped","generateSelfVideo","connections","main","setMuted","getGroupCallInput","getInputPeerSelf","raise_hand","video_paused","videoPaused","video_stopped","presentation_paused","presentationPaused","participants_next_offset","oldCall","shouldUpdate","stopConnectingSound","playSoundWithTimeout","stopSound","cancelDelayedPlay","rejoin","joinVideo","streamManager","createAudio","constraints","getAudioConstraints","getVideoConstraints","stream","getStream","addStream","inputStream","MediaStream","createMainStreamManager","joinGroupCallInternal","bindPrefix","fixSafariAudio","CLOSED","setCurrentGroupCall","playSound","getGroupCallFull","connectionInstance","createConnectionInstance","createPeerConnection","negotiate","onTrack","iceConnectionState","startConnectingSound","getGroupCallParticipants","createDescription","createDataChannel","appendStreamToConference","handleUpdateGroupCallParticipants","updatingSdp","audioSource","mainSources","presentationSources","tsNow","prepareToSavingNextOffset","ids","groupCallParticipants","discard","changeUserMuted","getParticipantByPeerId","editParticipant","property","sortProperty","prev","next","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","optionIds","answers","option","sendVote","votesList","closed","newPoll","getInputMediaPoll","stopTrack","track","AudioStreamAnalyser","streamSource","createMediaStreamSource","analyser","createAnalyser","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","connect","StreamManager","interval","getAmplitude","streamAnalyser","frequencyBinCount","getByteFrequencyData","analyse","counter","amplitudes","AudioContext","webkitAudioContext","outputStream","canCreateConferenceEntry","types","getTracks","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","oldTrack","timer","transceiverInit","streams","tracks","findEntry","createTransceiver","mediaTrackType","trackIdx","sender","replaceTrack","toTelegramSource","fromTelegramSource","scale","rms","sqrt","object","SliceEnd","compareValue","val1","val2","toExponential","str1","str2","str1Length","compareLong","sliceConstructor","getSliceConstructor","slices","None","side","deleteCount","flatten","lowerBound","upperBound","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","prevSlice","nextSlice","sliceOffset","findSliceOffset","sliceStart","sliceEnd","bottomWasMeantToLoad","topFulfilled","bottomFulfilled","SlicedArray","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","dataUri","className","onload","badCharsRe","trimRe","C2L","й","ц","у","к","е","н","г","ш","щ","з","х","ъ","ф","ы","в","а","п","р","о","л","д","ж","э","я","ч","с","м","и","т","ь","б","ю","clearBadCharsAndTrim","processSearchText","hasTag","originalText","ch","latinizeCh","latinizeString","fixCyrillic","numberThousandSplitter","joiner","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","description","pendingSet","shortDescriptionText","DocumentFragment","template","content","mediaDevices","getUserMedia","frameRate","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","WEBRTC_MEDIA_PORT","fixMediaLineType","mediaType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","foundation","component","protocol","toUpperCase","priority","ip","generation","performCandidate","sId","bundleMids","bundle","transport","skipCandidates","ufrag","pwd","fingerprint","fingerprints","setup","candidates","candidate","addCandidate","streamName","addSource","ssrc","addMsid","ssrcGroup","semantics","isApplication","codec","isInactive","shouldBeSkipped","payloadTypes","addTransport","hdrexts","hdrext","uri","clockrate","channels","parameters","fbs","fb","subtype","addSsrc","addHeader","addSsrcEntry","addConference","SDP","session","mediaSections","lines","line","parsed","section","splitStringByLimitWithRest","separator","UniqueNumberGenerator","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","missed","rest","nestedMap","makeAttributes","innerParts","fillAttributes","attributesMap","linesArray","mediaLineParts","exists","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","test","isIncorrectSdpLine","parseSdpLine","addSimulcast","sdp","generator","originalSsrcs","ssrcs","generate","ssrcs2","ssrcsStrLines","ssrc2","v","bytesToHex","contexts","links","originalPayload","refreshReference","postMessage","reference","getContexts","_context","getReferenceByLink","refreshEmojiesSoundsPromise","hex","newHex","newContext","parseMediaSectionInfo","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","parseSourceGroups","raw","IS_VIBRATE_SUPPORTED","convertInputKeyToKey","names","props","writable","configurable","defineProperties","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupportedResult","canPlayType","wavWorker","Worker","page","onTaskEnd","worker","command","buffers","typedArray","buffer","loadWorker","loadWavWorker","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","dataBlob","IS_WEBM_SUPPORTED","IMAGE_MIME_TYPES_SUPPORTED","AudioAssetPlayer","assets","assetName","play","Audio","pause","getScreenConstraints","skipAudio","getScreenStream","screenStream","getDisplayMedia","getVideoTracks","contentHint","StringFromLineBuilder","newLine","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","dataChannel","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","localSdp","mainChannels","processedChannels","processed","sectionInfo","JSON","stringify","processMediaSection","audioChannel","videoChannel","useChannel","setEntrySource","setEntryPeerId","parse","groupCallInput","request","join_as","setData","extmap","performExtmap","filterServerCodecs","isNewConnection","getEntryByMid","originalOffer","createOffer","iceRestart","offer","hasMunged","skipAddingMulticast","mediaLine","localMLine","codecIds","newData","setPort","newSdp","newChannel","mungedSdp","fixLocalOffer","setLocalDescription","invokeJoinGroupCall","entriesToDelete","answerDescription","generateSdp","deleteEntry","signalingState","iceGatheringState","connectionState","setRemoteDescription","negotiating","updateConstraints","getTransceivers","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","maxHeight","onStageEndpoints","minHeight","sendDataChannelData","saveInputVideoStream","safeAssign","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","cleanup","MUTED","UNMUTED","MUTED_BY_ADMIN","CONNECTING","requestAudioSource","toggleMuted","getElement","clone","srcObject","raise","stopScreenSharing","addInputVideoStream","startScreenSharingPromise","startScreenSharingInternal","unpinSource","closeConnectionAndStream","isSharingScreen","startScreenSharing","startVideoSharingPromise","startVideoSharingInternal","appendToConference","isSharingVideo","stopVideoSharing","startVideoSharing","isDiscarded","tryAddTrack","getEntryBySource","oldSsrcs","pinSource","modifiedTypes","oldSsrc","oldSource","oldEntry","setEndpoint","RTCPeerConnection","dict","stopStream","closeConnection","negotiateInternal","CALL_DURATION_LANG_KEYS","showLast","modulus","formatDuration","strings","elements","VIDEO_MIME_TYPES_SUPPORTED","getStreamCached","_cache","screen","isScreen","player","hasInputTrackKind","noop","requestInputSource","isAudioGood","isVideoGood","onInputStream","isOutput","tagName","isVideo","elementEndpoint","useStream","paused","sinkId","outputDeviceId","setSinkId","appendChild","getAudioTracks","isClosing","channelCount","constraint","getSupportedConstraints","constraintSupported"],"mappings":"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,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,MAAM,IAAK,MAAM,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,KAAM,IAAK,KAAM,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,MCC1gQ,MAAMw7B,EAAa,4CACpBC,EAAS,YAETC,EAA6B,CACjCC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACHC,IAAG,IACH,IAAK,KAGA,SAASC,EAAqBzjE,GACnC,OAAOA,EAAKqxC,QAAQiwB,EAAY,IAAIjwB,QAAQkwB,EAAQ,IAiBvC,SAAS1pE,EAAgBmI,EAAc9I,GAAW,GAC/D,OAAOwsE,EAAkB1jE,EAAM,CAC7BhJ,eAAe,EACfE,WACAD,YAAY,IAWT,SAASysE,EAAkB1jE,EAAc6e,EAAoC,IAClF,MAAM8kD,EAAS9kD,EAAQ1nB,YAAiC,MAAnB6I,EAAKN,OAAO,GAC3CkkE,EAAe5jE,EAMrB,OALG6e,EAAQ7nB,gBAAegJ,EAAOyjE,EAAqBzjE,IACnD6e,EAAQ3nB,WAAU8I,EA1BhB,SAAwBA,GAC7B,OAAOA,EAAKqxC,QAAQ,gBAAkBwyB,IACpC,MAAMC,EAAa,EAAYD,GAC/B,OAAOC,UAAcD,IAuBKE,CAAe/jE,IACxC6e,EAAQ5nB,aAAY+I,EAAOA,EAAK9R,eAChCy1E,IAAQ3jE,EAAO,IAAMA,GACrB6e,EAAQ3nB,WAAU8I,GAAQ,IApCxB,SAAqBA,GAC1B,OAAOA,EAAK9R,cAAcmjD,QAAQ,WAAawyB,IAC7C,MAAMC,EAAatC,EAAIqC,GACvB,OAAOC,UAAcD,IAiCeG,CAAYJ,IAC3C5jE,I,+BC7FM,SAASikE,EAAuB/sB,EAAWgtB,EAAS,KACjE,MAAMzzC,EAAQymB,EAAE78C,WAAW2E,MAAM,KAEjC,OADAyxB,EAAM,GAAKA,EAAM,GAAG4gB,QAAQ,wBAAyB6yB,GAC9CzzC,EAAM77B,KAAK,KAHpB,mC,6BCAe,SAASoI,EAAmCw/B,GACzD,MAAO,IAAI,IAAI3pC,IAAI2pC,IADrB,mC,6BCAA,4DAqBA,MAAM2nC,EAAe,IAAItxE,IAAI,CAAC,QAAS,QAAS,MAAO,aA0IvD,MAAM0qB,EAAqB,IAtIpB,MAQL,cAPQ,KAAA6mD,SAEJ,GACI,KAAAC,gBAEJ,GAGF,IAAUn1E,2BAA2B,CACnCo1E,cAAgBn1E,IACdR,KAAK2gC,YAAYngC,EAAOmuB,YAKvB,YAAYinD,EAAqBn1C,EAAgCJ,G,QACtE,GAAoB,uBAAjBu1C,EAAWr0E,EAA4B,OAC1C,MAAM,GAACW,GAAM0zE,EAEPC,EAAa71E,KAAKy1E,SAASvzE,GAC3B4zE,EAAYD,GAChBA,EAAWt0E,IAAMq0E,EAAWr0E,GAC3Bs0E,EAA+BzpE,MAAUypE,EAA+BzpE,KAE3E,GAAoB,YAAjBwpE,EAAWr0E,EAAiB,CACF,WAAR,QAAhB,EAAAq0E,EAAWz0E,aAAK,eAAEI,GACnBq0E,EAAWz0E,MAAQ,IAAiBm0B,UAAUsgD,EAAWz0E,MAAOk/B,UAEzDu1C,EAAWz0E,MAGU,cAAR,QAAnB,EAAAy0E,EAAW3hD,gBAAQ,eAAE1yB,GACtBq0E,EAAW3hD,SAAW,IAAeiC,QAAQ0/C,EAAW3hD,SAAUoM,IAE3C,aAApBu1C,EAAWvqE,aACLuqE,EAAWvqE,YAGbuqE,EAAW3hD,UAGpB,MAAM8hD,EAAWH,EAAWI,UAC5B,IAAIC,EAAaL,EAAWxlE,OAASwlE,EAAWM,QAAUH,GAAY,GACnEA,GAAYE,IAAeF,UACrBH,EAAWI,UAKhBR,EAAa/uE,IAAImvE,EAAWvqE,OAC7BuqE,EAAWO,cACZP,EAAWz0E,QACXy0E,EAAWvqE,KAAO,SAItB,IAAI+qE,EAAap2E,KAAK01E,gBAAgBxzE,GAYtC,GAXGu+B,IACG21C,IAAYA,EAAap2E,KAAK01E,gBAAgBxzE,GAAM,IAAIgC,KAC5DkyE,EAAW3wE,IAAIg7B,SAGCx8B,IAAf4xE,EACD71E,KAAKy1E,SAASvzE,GAAM0zE,EAEpB,YAAkBC,EAAYD,IAG5Bn1C,QAA6Bx8B,IAAfmyE,GAA4BN,EAAW,CACvD,MAAMxrD,EAA8D,GACpE8rD,EAAWrzE,QAAS+E,IAClB,MAAO3E,EAAQuW,EAAKuS,GAAenkB,EAAMuI,MAAM,KAC/Cia,EAAK9e,KAAK,CACRrI,OAAQA,EAAO1B,WACfiY,KAAMA,EACNuS,cAAeA,MAInB,IAAUjrB,cAAc,kBAAmB,CACzCkB,KACAooB,SAIJ,OAAOsrD,EAGF,UAAU/jD,GACf,IAAIokD,EAAapkD,EAAQzhB,OAASyhB,EAAQqkD,QAAUrkD,EAAQmkD,WAAa,GAEzE,OADAC,EAAa,YAAaA,EAAY,GAAI,KACnC,IAAkBpyC,aAAaoyC,EAAY,CAAClyC,SAAS,EAAMD,cAAc,IAG3E,gBAAgBjS,GACrB,MAAMwkD,EAAuB,YAAaxkD,EAAQskD,aAAe,GAAI,IAAK,KAS1E,OAAO,IAAkBtyC,aAAawyC,GAMjC,+BAA+BlzE,EAAgBuW,EAAauS,GACjE,OAAO9oB,EAAS,IAAMuW,GAAOuS,EAAc,KAAO,IAG7C,yBAAyB4F,EAAkB4O,GAChD,MAAMv+B,EAAM2vB,EAA4B3vB,GACxC,IAAIA,EAAI,OAER,MAAMsB,EAAMxD,KAAK01E,gBAAgBxzE,GAC9BsB,GAAOA,EAAIiD,IAAIg6B,KAChBj9B,EAAIE,OAAO+8B,GAEPj9B,EAAIiY,aACCzb,KAAK01E,gBAAgBxzE,IAK3B,WAAWA,GAChB,OAAOlC,KAAKy1E,SAASvzE,KAKzB,MAAmB,IAAe0sB,mBAAqBA,GACxC,O,6BC3JA,SAASqV,EAAuB2rB,GAC7C,GAAGA,aAAgB0mB,iBAAkB,OAAO1mB,EAC5C,MAAM2mB,EAAWtiD,SAASkO,cAAc,YAGxC,OAFAytB,EAAOA,EAAKliD,OACZ6oE,EAASn0C,UAAYwtB,EACd2mB,EAASC,QAXlB,mC,yWCAe,SAAejO,EAAUJ,EAAqC9jD,G,yCAG5E,MAAMikD,QAAenW,UAAUskB,aAAaC,aAAavO,GAazD,OAZAG,EAAOuF,YAAY9qE,QAAQwlD,IAQ1BA,EAAEjU,SAAWjwB,IAIPikD,KAGPvkD,OAAewkD,UAAYA,G,6BCnBb,SAASF,IACtB,MAAO,CACL1zC,MAAO,CAAC5rB,IAAK,KAAMwP,IAAK,MACxBsc,OAAQ,CAAC9rB,IAAK,IAAKwP,IAAK,MACxBo+D,UAAW,CAAC5tE,IAAK,GAAIwP,IAAK,KAJ9B,mC,6BCAA,oEAAO,MAAMq+D,EAAyC,GACzCC,EAA2C,K,6BCDxD,qKAqBO,MAAMC,EAAoB,IAE1B,SAASC,EAAiBC,GAC/B,MAAqB,eAAdA,EAA6B,QAAUA,EAczC,SAASC,EAA8BD,GAE5C,MAAqB,gBAAdA,EAA8B,YAAc,oBAG9C,SAASE,EAAuBF,EAA2BnX,EAAOiX,EAAmBK,GAC1F,MAAMC,EAAiBH,EAA8BD,GACrD,MAAO,KAAKD,EAAiBC,MAAcnX,KAAQuX,KAAkBD,EAAWlxE,KAAK,OAOhF,MAAMoxE,UAAmB,IACvB,aAAatqE,GAClB,OAAO/M,KAAKyF,IA3BT,SAA0BsH,GAC/B,MAAM8gC,EAAgB,GAOtB,OANAA,EAAIriC,KAAK,gBACTqiC,EAAIriC,KAAK,GAAGuB,EAAEuqE,cAAcvqE,EAAEwqE,aAAaxqE,EAAEyqE,SAASC,iBAAiB1qE,EAAE2qE,YAAY3qE,EAAE4qE,MAAM5qE,EAAE8yD,YAAY9yD,EAAE1B,aACxFpH,IAAlB8I,EAAE,aACH8gC,EAAIriC,KAAK,UAAUuB,EAAE,qBAAqBA,EAAE,eAE9C8gC,EAAIriC,KAAK,eAAeuB,EAAE6qE,YACnB/pC,EAAI5nC,KAAK,IAmBE4xE,CAAiB9qE,IAuB5B,UAAU+qE,EAAaC,GAC5B,MAAMC,EAASD,EAAW9xE,KAAK,KAC/B,OAAOjG,KAAKyF,IACV,MACA,OAAOqyE,qBACP,MACA,QACA,uBACA,kBAAkBE,EAClB,wBAEA,yBAIG,aAAaC,EAAyCC,GAC3Dl4E,KAAKyF,IACH,eAAewyE,EAAUE,MACzB,aAAaF,EAAUG,IACvB,yBAGF,IAAI,MAAMC,KAAeJ,EAAUK,aACjCt4E,KAAKyF,IACH,iBAAiB4yE,EAAYjsE,QAAQisE,EAAYA,cACjD,WAAWA,EAAYE,OAI3B,IAAIL,GAAkBD,EAAUO,WAC9B,IAAI,MAAMC,KAAaR,EAAUO,WAC/Bx4E,KAAK04E,aAAaD,GAItB,OAAOz4E,KAGF,QAAQ2pD,GACb,IAAIgvB,EAAa,UACb,KAACttE,EAAI,aAAEi1D,GAAgB3W,EAI3B,MAAM0W,EAAS,YAAmB1W,EAAM0W,QAExCsY,GAActY,EACdh1D,GAAQg1D,EAOR,MAIMuY,EAAaC,IACjB74E,KAAKyF,IACH,UAAUozE,WAAcF,IACxB,UAAUE,UAAaF,KAActtE,IACrC,UAAUwtE,aAAgBF,IAC1B,UAAUE,WAAcxtE,MAiB5B,MA1BgB,MACdrL,KAAKyF,IAAI,UAAUkzE,KAActtE,MAYnCytE,IACGxY,aAAY,EAAZA,EAAc59D,QACf49D,EAAav9D,QAAQg2E,IACnB,GAAGA,EAAUxY,QAAQ79D,OAAQ,CAC3B,MAAM69D,EAAUwY,EAAUxY,QAAQ74D,IAAI,KACtC1H,KAAKyF,IAAI,gBAAgBszE,EAAUC,aAAazY,EAAQt6D,KAAK,QAC7Ds6D,EAAQx9D,QAAQ61E,MAIpBA,EAAUvY,GAGLrgE,KAGF,aAAa2pD,EAAwB0L,EAAsBmL,GAChE,MAAM/6D,EAAM,IAAI8iD,IAAgBvoD,KAAKyF,OAAO8iD,IAEtC,KAACl9C,EAAI,IAAEqO,EAAG,UAAEomD,EAAS,KAAED,GAAQlW,EAC/BsuB,EAAY5iB,EAAK4iB,UAMjBgB,EAAyB,gBAAT5tE,EAChB6tE,EAAQD,OAAgBh1E,EAAYoxD,EAAKhqD,GAEzC8tE,EAA2B,aAAdrZ,EACnB,GAAGnW,EAAMyvB,gBAAgB5Y,GACvB,OAAO/6D,EACL,KAAKsxE,EAAiB1rE,QAAW4rE,EAA8B5rE,OAC/D,mBACA,aACA,SAASqO,GAIb,MAAM2/D,EAAgBJ,EAAyC,CAAC,CAAC/2E,GAAI,MAA/Bg3E,EAAM,iBACtC7O,EAAMgP,EAAa3xE,IAAI2D,GAAQA,EAAKnJ,IAC1CuD,EACEyxE,EAAuB7rE,EAAMw0D,EAAMwK,GACnC,mBACA,UAAUxK,oBAGToY,EAAU,aACXxyE,EAAI,cAGNA,EAAI,SAASiU,GAKb,IAAIwmD,EAAeJ,EAWnB,GAViB,aAAdA,IAA4BU,GAAc2Y,GAAcF,IACzD/Y,EAA6B,aAAdJ,EAA2B,WAAa,YAIzDr6D,EAAI,KAAKy6D,GAGTlgE,KAAKs5E,aAAarB,GAEdgB,EAgCFxzE,EAAI,aAAa4zE,EAAa,GAAGn3E,iCAhChB,CACjB,MAAMq3E,EAAUL,EAAM,gBACnBK,aAAO,EAAPA,EAAS72E,SACV62E,EAAQx2E,QAAQy2E,IACd/zE,EAAI,YAAY+zE,EAAOt3E,MAAMs3E,EAAOC,SAIxCJ,EAAat2E,QAAQsI,IACnB5F,EAAI,YAAY4F,EAAKnJ,MAAMmJ,EAAKsoB,QAAQtoB,EAAKquE,YAAYruE,EAAKsuE,UAAYtuE,EAAKsuE,SAAW,EAAI,IAAItuE,EAAKsuE,SAAa,MAEpH,MAAMC,EAAavuE,EAAKuuE,WACxB,GAAG/2E,MAAMC,QAAQ82E,GACZA,EAAWl3E,QACZhB,QAAQyJ,MAAM,yBAA0ByuE,QAErC,GAAGA,GAAcl+D,OAAOC,KAAKi+D,GAAYl3E,OAAQ,CACtD,MAAM4L,EAAc,GACpB,IAAI,MAAMvO,KAAK65E,EACbtrE,EAAE9C,KAAK,GAAGzL,KAAK65E,EAAW75E,MAE5B0F,EAAI,UAAU4F,EAAKnJ,MAAMoM,EAAErI,KAAK,QAGlC,MAAM4zE,EAAMxuE,EAAK,aACdwuE,aAAG,EAAHA,EAAKn3E,SACNm3E,EAAI92E,QAAQ+2E,IACVr0E,EAAI,aAAa4F,EAAKnJ,MAAM43E,EAAGzuE,OAAOyuE,EAAGC,QAAU,IAAMD,EAAGC,QAAU,UAY9E,OAJGpwB,EAAM0W,QAA4B,aAAjBH,GAAgD,aAAjBA,GACjDlgE,KAAKg6E,QAAQrwB,GAGR3pD,KAGF,cAAckwB,GAMnB,MAAM,WAACoxC,EAAU,QAAE7X,EAAO,OAAEuuB,EAAM,SAAExX,GAAYtwC,EAChDlwB,KAAKi6E,UAAU3Y,EAAWX,UAAWqX,GAElC,KACDh4E,KAAKs5E,aAAahY,EAAW2W,WAG/B,IAAI,MAAMtuB,KAASF,EAEjBzpD,KAAKk6E,cAAc1Z,EAAW7W,EAAMwX,WAAaxX,EAAMuX,UAAYvX,EAAMuX,WAAavX,EAAMwX,YAAcxX,EAAO2X,EAAYd,GAG/H,OAAOxgE,KAGF,sBAAsBkwB,GAC3B,OAAO,IAAImnD,GAAa8C,cAAcjqD,GAASF,c,+vBClQpC,MAAMoqD,EAInB,YAAYC,EAAyBC,GAHrC,mBACA,mBAGE,EAAAt6E,KAAI,EAAYq6E,EAAO,KACvB,EAAAr6E,KAAI,EAAUs6E,EAAa,KAG7B,cACE,OAAO,EAAAt6E,KAAI,OAGb,YACE,OAAO,EAAAA,KAAI,OAGb,aAEE,OADmBA,KAAKq6E,QAAQE,MAAM/6D,KAAKg7D,IAAO,MAAC,MAAqB,WAAV,QAAX,EAAAA,EAAKC,cAAM,eAAE7wE,OAC9C9B,MAAMuI,MAAM,KAAKvL,MAAM,GAG3C,WACE,OAAO9E,KAAKq6E,QAAQE,MACnBztE,UAAU9M,KAAKmrB,MAAMzjB,IAAIgzE,GAAWA,EAAQH,QAC5C7yE,IAAI8yE,GAAQA,EAAK9uE,YAAYzF,KAAK,QAAU,QCpClC,SAAS00E,EAA2BxpD,EAAaypD,EAAmBzuE,GACjF,MAAM8kB,EAAWE,EAAI9gB,MAAMuqE,GACrB1+D,EAAgB,GAEtB,KAAM/P,EAAQ,GAAK8kB,EAASvuB,QAC1BwZ,EAAI1Q,KAAKylB,EAASiwB,WAChB/0C,EAOJ,OAJG8kB,EAASvuB,QACVwZ,EAAI1Q,KAAKylB,EAAShrB,KAAK20E,IAGlB1+D,E,0rBCbM,MAAM2+D,EAKnB,YAAY9xE,EAAawP,GAJzB,mBACA,mBACA,mBAGE,EAAAvY,KAAI,EAAQ,IAAIkE,IAAK,KACrB,EAAAlE,KAAI,EAAQ+I,EAAG,KACf,EAAA/I,KAAI,EAAQuY,EAAG,KAGV,WACL,MAAMxP,EAAM,EAAA/I,KAAI,OACVuY,EAAM,EAAAvY,KAAI,OACVwD,EAAM,EAAAxD,KAAI,OAEV86E,EAAWviE,EAAMxP,EAAM,EAC7B,IAAIjB,EAAQ6J,KAAKgmB,MAAM5uB,EAAM+xE,EAAWnpE,KAAKqoB,UAAW+gD,EAAO,EAC/D,KAAMv3E,EAAIiD,IAAIqB,IAOZ,GANGA,EAAQyQ,IACPzQ,EAEFA,EAAQiB,IAGLgyE,GAAQD,EACX,OAAO,KAKX,OADAt3E,EAAIiC,IAAIqC,GACDA,EAGF,IAAIA,GACT,EAAA9H,KAAI,OAAMyF,IAAIqC,I,ssBCjCH,MAAMkzE,EAKnB,YAAYpxE,EAAmB9B,GAJ/B,mBACA,mBAIE,EAAA9H,KAAI,EAAQ4J,EAAG,KACf,EAAA5J,KAAI,EAAU8H,EAAK,KAGrB,UACE,OAAO,EAAA9H,KAAI,OAGb,YACE,OAAO,EAAAA,KAAI,Q,4rBCjBA,MAAMi7E,EAMnB,YACE5vE,EACAw0D,EACA2X,EACAnN,GATF,mBACA,mBACA,mBACA,mBAQE,EAAArqE,KAAI,EAASqL,EAAI,KACjB,EAAArL,KAAI,EAAS6/D,EAAI,KACjB,EAAA7/D,KAAI,EAAaw3E,EAAQ,KACzB,EAAAx3E,KAAI,EAAQqqE,EAAG,KAGjB,WACE,OAAO,EAAArqE,KAAI,OAGb,WACE,OAAO,EAAAA,KAAI,OAGb,eACE,OAAO,EAAAA,KAAI,OAGb,UACE,OAAO,EAAAA,KAAI,OAGb,WACE,OAAOA,KAAKqL,KAAO,IAAMrL,KAAK6/D,KAAO,IAAM7/D,KAAKw3E,SAAW,IAAMx3E,KAAKqqE,IAAIpkE,KAAK,M,wtBC/BpE,MAAM,EAOnB,YAAY2D,EAAqB9B,GAG/B,GATF,mBACA,mBACA,mBACA,mBAIE,EAAA9H,KAAI,EAAQ4J,EAAG,KAEM,iBAAZ,GAGP,GAFA,EAAA5J,KAAI,EAAU8H,EAAK,KAER,MAAR8B,EAAa,CACd,MAAMqnB,EAAWnpB,EAAMuI,MAAM,KAC7B,EAAArQ,KAAI,EAAmB,IAAIi7E,EAAkBhqD,EAAS,GAAWA,EAAS,GAAIA,EAAS,GAAIA,EAASnsB,MAAM,IAAG,UAE7G,GAAW,MAAR8E,EAAa,CACd,MAAMnF,EAASk2E,EAA2B7yE,EAAO,IAAK,GACtDA,EAAQrD,EAAO,GACf,EAAAzE,KAAI,EAA6B,IAAlByE,EAAO/B,OAAe,IAAIs4E,EAAqBlzE,EAAc,MAAQ,IAAIkzE,EAAqBlzE,EAAcrD,EAAO,IAAG,WAItIqD,aAAiBmzE,GAClB,EAAAj7E,KAAI,EAAmB8H,EAAK,KAC5B,EAAA9H,KAAI,EAAU8H,EAAM4D,WAAU,MACtB5D,aAAiBkzE,IACzB,EAAAh7E,KAAI,EAAW8H,EAAK,KACpB,EAAA9H,KAAI,EAAU8H,EAAMA,MAAQ,GAAGA,EAAM8B,OAAO9B,EAAMA,QAAUA,EAAM8B,IAAG,MAK3E,UACE,OAAO,EAAA5J,KAAI,OAGb,YACE,OAAO,EAAAA,KAAI,OAGb,aACE,OAAO,EAAAA,KAAI,OAGb,qBACE,OAAO,EAAAA,KAAI,OAGb,WACE,MAAO,GAAGA,KAAK4J,OAAO5J,KAAK8H,S,4tBCrDhB,MAAM,EAQnB,YAAY8B,EAA+B2wE,EAAmC5gB,EAAiB,IAAKuhB,GAAS,GAP7G,mBACA,mBACA,mBACA,mBACA,mBACA,mBAGE,EAAAl7E,KAAI,EAAQ4J,EAAG,KACf,EAAA5J,KAAI,EAAUu6E,EAAK,KACnB,EAAAv6E,KAAI,EAAW25D,EAAM,KACrB,EAAA35D,KAAI,EAAWk7E,EAAM,KACrB,EAAAl7E,KAAI,EAAck7E,EAAS,IAAI74D,IAAQ,KAAI,KAC3C,EAAAriB,KAAI,EAASk7E,EAAS,GAAK,KAAI,KAGjC,YACE,OAAO,EAAAl7E,KAAI,OAGb,YACE,OAAO,EAAAA,KAAI,SAAaA,KAAKu6E,MAAM73E,OAAS,KAAO1C,KAAKu6E,MAAM,GAGhE,aACE,OAAQ,EAAAv6E,KAAI,OAGd,UACE,OAAO,EAAAA,KAAI,OAGb,WAEE,OADA,EAAkB+zD,KAAK/zD,MAChB,EAAAA,KAAI,OAGN,QAAQ+X,GACb,EAAkBg8C,KAAK/zD,MACvB,EAAAA,KAAI,OAAY+C,QAAQgV,GAGnB,IAAInO,GAET,OADA,EAAkBmqD,KAAK/zD,MAChB,EAAAA,KAAI,OAAY8oB,IAAIlf,IAAQ,IAAI,EAAkBA,EAAK,GAAI,KAAK,GAGjE,YAAYwqB,GAClB,GAA4B,OAAzB,EAAAA,EAAS,OACV,OAGF,MAAM1sB,EAAkC,IAAI2a,IAC5C+R,EAAUmmD,MAAMx3E,QAAQouB,IACtB,MAAOvnB,EAAKuxE,GAAQR,EAA2BxpD,EAAK,EAAAiD,EAAS,OAAU,GACjEk5B,EAAS5lD,EAAIohB,IAAIlf,IAAQ,GAC/BlC,EAAIlE,IAAIoG,EAAK,IAAI0jD,EAAQ6tB,GAAQ,OAGnC,MAAMC,EAAY,EAAAhnD,EAAS,EAAc,EAAkBinD,eAAe3zE,GAAI,KAC9E,EAAA0sB,EAAS,EAASvxB,MAAM+e,KAAKw5D,EAAUz/D,QAAO,KAGxC,sBAAsB2/D,GAC5B,MAAMp/D,EAAsC,IAAImG,IAMhD,OAJAi5D,EAAWv4E,QAAQ,CAACw3E,EAAO3wE,KACzBsS,EAAI1Y,IAAIoG,EAAK,IAAI,EAAkBA,EAAK2wE,MAGnCr+D,G,gvBCtEI,MAAM,EAInB,YAAYq+D,GAHZ,mBACA,mBAGE,EAAAv6E,KAAI,EAAUu6E,EAAK,KACnB,EAAAv6E,KAAI,EAAe,IAAIqiB,IAAK,KAC5B,EAAck5D,eAAev7E,MAGxB,IAAI4J,GACT,OAAO,EAAA5J,KAAI,OAAa8oB,IAAIlf,IAAQ,IAAI,EAAkBA,EAAK,GAAI,KAAK,GAGlE,sBAAsBmqB,GAC5B,MAAMynD,EAA4C,IAAIn5D,IACtD,EAAA0R,EAAU,OAAQhxB,QAASy3E,IACzB,GAAgB,MAAbA,EAAK5wE,IAAa,CACnB,MAAM,IAACA,EAAG,MAAE9B,GAAS0yE,EAAKC,OAE1B,IAAIgB,EAAaD,EAAc1yD,IAAIlf,GAC/B6xE,IACFA,EAAa,GACbD,EAAch4E,IAAIoG,EAAK6xE,IAGzBA,EAAWjwE,KAAK1D,GAAS,OAI7B0zE,EAAcz4E,QAAQ,CAAC04E,EAAY7xE,KACjC,EAAAmqB,EAAU,OAAavwB,IAAIoG,EAAK,IAAI,EAAkBA,EAAK6xE,EAAY,KAAK,O,4rBC5BnE,MAAM,GAMnB,YAAYlB,GALZ,mBACA,mBACA,mBACA,mBAGE,EAAAv6E,KAAI,EAAUu6E,EAAK,KACnB,EAAAv6E,KAAI,EAAcu6E,EAAM,GAAE,KAC1B,EAAAv6E,KAAI,EAAe,EAAAA,KAAI,EAAc,KAAI,UAG3C,YACE,OAAO,EAAAA,KAAI,OAGb,gBACE,OAAO,EAAAA,KAAI,OAGb,qBACE,OAAO,EAAAA,KAAI,OAAY07E,eAGzB,gBACE,OAAO17E,KAAK07E,eAAerwE,KAG7B,gBACE,IAAI,EAAArL,KAAI,OAAa,CACnB,MAAM+zB,EAAa/zB,KAAK+zB,WAExB,IAAI+rC,EACkCA,EAAnC/rC,EAAWjL,IAAI,YAAY6yD,OAAoB,WAC1C5nD,EAAWjL,IAAI,YAAY6yD,OAAoB,WAC/C5nD,EAAWjL,IAAI,YAAY6yD,OAAoB,WACtC,WAEjB,EAAA37E,KAAI,EAAc8/D,EAAS,KAG7B,OAAO,EAAA9/D,KAAI,OAGb,gBACE,MAA0B,aAAnBA,KAAK8/D,WAA+C,aAAnB9/D,KAAK8/D,UAG/C,kBACE,MAA0B,aAAnB9/D,KAAK8/D,WAA+C,aAAnB9/D,KAAK8/D,UAG/C,iBAEE,OADA,EAAA9/D,KAAI,QAAiB,EAAAA,KAAI,EAAe,IAAI,EAAcA,KAAKu6E,OAAM,KAC9D,EAAAv6E,KAAI,OAGb,UACE,OAAOA,KAAK+zB,WAAWjL,IAAI,OAAOhhB,MAG7B,oBAA4C6T,GACjD,MAAMO,EAAW,GAEjB,IAAI,MAAMtS,KAAO+R,EAAM,CACrB,MAAMlX,EAASzE,KAAK+zB,WAAWjL,IAAIlf,GAE7BgyE,GAAuBjgE,EAAK/R,GAIhCsS,EAAItS,GAHFnF,EAGSm3E,EAAsBn3E,EAAO81E,MAAQ91E,EAAOqD,MAF5C8zE,EAAsB,QAAK33E,EAM1C,OAAOiY,G,wtBC/EI,MAAM2/D,GAInB,YAAYtB,GAHZ,oBACA,oBAGE,GAAAv6E,KAAI,GAAUu6E,EAAK,KACnB,GAAAv6E,KAAI,GAAcu6E,EAAMx0E,OAAOy0E,GAAqB,MAAbA,EAAK5wE,KAAalC,IAAI8yE,GAAQA,EAAK1yE,MAAMuI,MAAM,KAAK,IAAI,GAAE,KAGnG,YACE,OAAO,GAAArQ,KAAI,QAGb,gBACE,OAAO,GAAAA,KAAI,SCTR,SAAS87E,GAAS3qD,GACvB,SAAS4qD,IACJC,EACD1B,EAAc9uE,KAAK,IAAI,GAAgB+uE,IAEvCyB,EAAiB,IAAIH,GAAkBtB,GAI3C,IAAIyB,EAAoC,KAAM1B,EAAmC,GAAIC,EAAmB,GAcxG,OAbAppD,EAAI9gB,MAAM,SAAStN,QAAQk5E,IACzB,IAeG,SAA4B9qD,GACjC,MAAO,cAAc+qD,KAAK/qD,GAhBpBgrD,CAAmBF,GAAU,CAC/B,MAAMzB,EAAO4B,GAAaH,GACV,MAAbzB,EAAK5wE,MACNmyE,IACAxB,EAAQ,IAGVA,EAAM/uE,KAAKgvE,MAIfuB,IACO,IAAI3B,EAAI4B,EAAgB1B,GAO1B,SAAS8B,GAAajrD,GAC3B,MAAMF,EAAW0pD,EAA2BxpD,EAAK,IAAK,GACtD,OAAO,IAAI,EAAQF,EAAS,GAAWA,EAAS,IAG3C,SAASorD,GAAaC,GAC3B,IAAIC,EAoCJ,OAnCAD,EAAInxD,MAAMpoB,QAAQ,CAAC23E,EAAShpE,KAC1B,GAAyB,UAAtBgpE,EAAQ1D,WAAyB0D,EAAQzZ,YAAcyZ,EAAQ3mD,WAAWjL,IAAI,cAAcA,IAAI,OAAO6yD,OAAQ,CAC5GY,IACFA,EAAY,IAAI1B,EAAsB,EAAG,aAG3C,MAAM2B,EAAgB9B,EAAQ3mD,WAAWjL,IAAI,cAAcA,IAAI,OAAOhhB,MAAMuI,MAAM,KAC5EkqE,EAAQG,EAAQH,MACtBiC,EAAcz5E,QAAQ81E,GAAQ0D,EAAU92E,KAAKozE,IAC7C,MAAM4D,EAAQ,CAACD,EAAc,GAAID,EAAUG,WAAYH,EAAUG,YAC3DC,EAAS,CAACH,EAAc,GAAID,EAAUG,WAAYH,EAAUG,YAElEnC,EAAM/uE,KAAK4wE,GAAa,oBAAsBK,EAAMx2E,KAAK,OAEzD,MAAM22E,EAAgBlC,EAAQ3mD,WAAWjL,IAAI,QAAQA,IAAI0zD,EAAc,IAAIjC,MAE3EkC,EAAM15E,QAAQ,CAAC81E,EAAMnnE,KACnB,MAAMmrE,EAAQF,EAAOjrE,GAClBA,EAAM,IACP6oE,EAAM/uE,KAAK4wE,GAAa,oBAAsBvD,EAAO,IAAMgE,IAE3DD,EAAc75E,QAAQ+5E,IACpBvC,EAAM/uE,KAAK4wE,GAAa,UAAYvD,EAAO,IAAMiE,MAGnDF,EAAc75E,QAAQ+5E,IACpBvC,EAAM/uE,KAAK4wE,GAAa,UAAYS,EAAQ,IAAMC,SAKxDR,EAAInxD,MAAMzZ,GAAO,IAAI,GAAgB6oE,QAIhCgC,E,8GCrFI,SAASQ,EAAW3nC,GACjC,MAAM1yC,EAAS0yC,EAAM1yC,OACfmrC,EAAgB,IAAIhrC,MAAMH,GAChC,IAAI,IAAI3C,EAAI,EAAGA,EAAI2C,IAAU3C,EAC3B8tC,EAAI9tC,IAAMq1C,EAAMr1C,GAAK,GAAK,IAAM,KAAOq1C,EAAMr1C,IAAM,GAAG2L,SAAS,IAEjE,OAAOmiC,EAAI5nC,KAAK,I,YC+KlB,MAAM+qC,EAAoB,IAzI1B,MAOE,cANQ,KAAAgsC,SAAmD,IAAI36D,IAEvD,KAAA46D,MAAyC,GACzC,KAAA7gE,IAAM,OAAA0G,EAAA,GAAO,UAAM7e,GAAW,GAIpC,IAAWmkD,gBAAgB,mBAAqBC,IAC9C,MAAM60B,EAAkB70B,EAAKC,QAE7B,OAAAhmB,EAAA,GAAyC+lB,GACzCA,EAAK60B,gBAAkBA,EAEvBl9E,KAAKm9E,iBAAiBD,GAAiB36E,KAAM6yC,IAC3CiT,EAAKC,QAAUlT,GACbpnC,IACFq6C,EAAKl9C,MAAQ6C,IACZzL,KAAK,IAAM,IAAW66E,YAAY/0B,MAIlC,YAAYg1B,EAA2B3nC,EAA2BsnC,IACtEA,EAAUK,GAAar9E,KAAKs9E,YAAYD,GACrCL,IACFA,EAAW,IAAI94E,IACflE,KAAKg9E,SAASx5E,IAAI65E,EAAWL,IAG/Bh9E,KAAKi9E,MAAMF,EAAWM,IAAcA,EACpC,IAAI,MAAME,KAAYP,EACpB,GAAG,OAAA91D,EAAA,GAAUq2D,EAAU7nC,GACrB,OAIJsnC,EAASv3E,IAAIiwC,GAGR,mBAAmB2nC,GACxB,OAAOr9E,KAAKi9E,MAAMF,EAAWM,IAGxB,YAAYA,GAEjB,MAAO,CADUr9E,KAAKg9E,SAASl0D,IAAIu0D,KAAeA,EAAYr9E,KAAKw9E,mBAAmBH,IAAcA,EAAWr9E,KAAKg9E,SAASl0D,IAAIu0D,IAC/GA,GAGb,WAAWA,GAChB,MAAML,EAAWh9E,KAAKs9E,YAAYD,GAClC,OAAOL,EAAS,GAAK,CAACA,EAAS,GAAG1vB,SAASwd,OAAOhjE,MAAOk1E,EAAS,SAAM/4E,EAGnE,cAAco5E,EAA2B3nC,EAA2BsnC,GAEzE,IADCA,EAAUK,GAAar9E,KAAKs9E,YAAYD,GACtCL,EACD,IAAI,MAAMO,KAAYP,EACpB,GAAG,OAAA91D,EAAA,GAAUq2D,EAAU7nC,GAMrB,OALAsnC,EAASt5E,OAAO65E,GACZP,EAASvhE,OACXzb,KAAKg9E,SAASt5E,OAAO25E,UACdr9E,KAAKi9E,MAAMF,EAAWM,MAExB,EAKb,OAAO,EAGF,iBAAiBA,EAA2B3nC,GAEjD,GADA11C,KAAKoc,IAAI,0BAA2BihE,EAAUv4E,QAAS4wC,IACnDA,EAAS,CACX,MAAM3oC,EAAI/M,KAAK0zD,WAAW2pB,GAC1B,IAAItwE,EAEF,OADA/M,KAAKoc,IAAI,kDAAmDihE,EAAUv4E,SAC/DC,QAAQ4b,OAAO,eAGvB+0B,EAAS2nC,GAAatwE,EAGzB,IAAIxI,EACJ,OAAOmxC,aAAO,EAAPA,EAASrqC,MACd,IAAK,UACH9G,EAAUyN,EAAA,EAAmByZ,kBAAkBiqB,EAAQvyC,OAAQuyC,EAAQzqB,WAAW,GAClF,MAMF,IAAK,gBACH1mB,EAAUvE,KAAKy9E,6BAA+Bv9B,EAAA,EAAmB0B,wBAAuB,GAAMr/C,KAAK,KACjGvC,KAAKy9E,iCAA8Bx5E,IAErC,MAGF,QAEE,OADAjE,KAAKoc,IAAIza,KAAK,4CAA6C+zC,GACpD3wC,QAAQ4b,SAInB,MAAM+8D,EAAMX,EAAWM,GAEvB,OADAr9E,KAAKoc,IAAI,0CAA2CshE,GAC7Cn5E,EAAQhC,KAAK,KAClB,MAAMo7E,EAASZ,EAAWM,GAE1B,GADAr9E,KAAKoc,IAAI,iDAAkDshE,EAAK,SAAUC,GACvED,IAAQC,EACT,OAAON,EAGTr9E,KAAKixC,cAAcosC,EAAW3nC,GAE9B,MAAMkoC,EAAa59E,KAAK0zD,WAAW2pB,GACnC,GAAGO,EACD,OAAO59E,KAAKm9E,iBAAiBE,EAAWO,EAAW,IAKrD,MAFA59E,KAAKoc,IAAIjR,MAAM,sDAAuDuyE,EAAK,SAAUC,EAAQjoC,GAEvF,qBAcZ,IAAe1E,kBAAoBA,EACpB,O,4EC5KA,SAAS6sC,EAAsBvB,EAAUtjE,GACtD,MAAM8kE,EAAa9kE,EAAQ+kE,oBAAoB,CAC7C,aAAa,EACb,WAAW,EACX1F,aAAa,EACbE,OAAO,EACPM,MAAM,EACNn/D,KAAK,EACL,cAAc,IAGhB,IAAIokE,EAAWzF,YAAa,CAC1B,MAAMmC,EAAO8B,EAAIjC,QAAQE,MAAM/6D,KAAKg7D,IAAO,MAAC,MAAqB,iBAAV,QAAX,EAAAA,EAAKC,cAAM,eAAE7wE,OACzDk0E,EAAWzF,YAAcmC,EAAKC,OAAO3yE,MAGvC,MAAMk2E,EClBD,SAA2BC,GAChC,MAAMD,EAAuBC,EAASv2E,IAAIypB,IACxC,MAAO6nD,KAAcmC,GAAQhqD,EAAI9gB,MAAM,KASvC,MAP0D,CACxD9O,EAAG,uCACHy3E,YAEAzY,QAAS4a,EAAKzzE,IAAImxE,GAAQ,aAAkBA,OAYhD,OAAOmF,EAAqBt7E,OAASs7E,OAAuB/5E,EDF/Bi6E,CAAkBJ,EAAW,gBACnD1xE,EAAMisE,GAAeyF,EAAWzF,YAAYhoE,MAAM,IAAK,GACxDwoE,EAAOiF,EAAWjF,MAAQ,aAAkBiF,EAAWjF,KAAKxoE,MAAM,IAAK,GAAG,IAGhF,MAAO,CACL8tE,IAAKL,EACL3F,MAAO2F,EAAW,aAClB1F,IAAK0F,EAAW,WAChBzF,YAAa,CACXA,cACAE,MAAOuF,EAAWvF,MAClBnsE,QAEFi0D,OAAQwY,EACRvY,aAAc0d,EACdtkE,IAAKokE,EAAWpkE,O,iCE3CpB,MAAM0kE,KAAkC,OAATjsB,gBAAS,IAATA,eAAS,EAATA,UAAWC,SAE3B,O,6BCFA,SAASisB,EAAuC/pB,GAC7D,MAAMnjC,EAAMmjC,EAAS5R,QAAQ,QAAS,IACtC,OAAQvxB,EAAI,GAAG5xB,cAAgB4xB,EAAIrsB,MAAM,GAF3C,mC,6BCAe,SAAS2Y,EAA4CkG,EAAQ26D,GAE1E,MAAMC,EAAQ,CAACC,UAAU,EAAMC,cAAc,GACvCviE,EAA0C,GAChDoiE,EAAMv7E,QAAQ4wB,IACRhQ,EAAI1E,eAAe0U,KACrBzX,EAAIyX,GAAQ4qD,KAGhB7iE,OAAOgjE,iBAAiB/6D,EAAKzH,GAT/B,mC,6BCAA,yB,sSAoLA,MAAMyiE,EAAuB,IA7JtB,MAAP,cAGU,KAAAC,WAAa,KACb,KAAAC,MAAqB,GACrB,KAAAC,WAAY,EAEZ,KAAA1iE,IAAM,YAAO,OAAQ,IAAShR,OAE/B,kBACL,QAAkCnH,IAA/BjE,KAAK++E,sBAAqC,OAAO/+E,KAAK++E,sBAEzD,MAAM9oB,EAAQhiC,SAASkO,cAAc,SACrC,OAAOniC,KAAK++E,yBAA2B9oB,EAAM+oB,cAAe/oB,EAAM+oB,YAAY,cAAct8B,QAAQ,KAAM,KAGrG,gBACF1iD,KAAKi/E,YAERj/E,KAAKi/E,UAAY,IAAIC,OAAO,qBAC5Bl/E,KAAKi/E,UAAU3+E,iBAAiB,UAAY0B,IAC1C,MAAMqzD,EAAOrzD,EAAEqzD,KAGf,GADAr1D,KAAKoc,IAAI,qBAAsBi5C,GAC5BA,GAAQA,EAAK8pB,KAAM,CACpB,MAAM/pC,EAAQigB,EAAK8pB,KACnBn/E,KAAKo/E,UAAUp/E,KAAK6+E,MAAM39B,QAAS9L,OAKlC,aACFp1C,KAAKq/E,SAERr/E,KAAKq/E,OAAS,IAAIH,OAAO,wBACzBl/E,KAAKq/E,OAAO/+E,iBAAiB,UAAY0B,IACvC,MAAMqzD,EAAOrzD,EAAEqzD,KAEfr1D,KAAKoc,IAAI,wBAAyBi5C,GACjB,SAAdA,EAAKhqD,MAENrL,KAAKi/E,UAAU7B,YAAY,CAACkC,QAAS,SAElCjqB,EAAK/gC,WACNt0B,KAAK6+E,MAAM,GAAGvqD,SAAW+gC,EAAK/gC,WAIhCt0B,KAAKi/E,UAAU7B,YAAY,CACzBkC,QAAS,SACTC,QAASv9E,EAAEqzD,MACV,SAAYpxD,EAAYoxD,EAAK3tD,IAAK83E,GAA2BA,EAAWC,YAK1E,aAAaX,GAClB9+E,KAAK8+E,UAAYA,EACd9+E,KAAK8+E,WACN9+E,KAAK0/E,aACL1/E,KAAK2/E,iBACI3/E,KAAK6+E,MAAMn8E,QACpB1C,KAAK4/E,mBAIF,UAAUv3B,EAAY5jD,GACvBA,GAGF+e,aAAa6kC,EAAKvX,SAClBuX,EAAKtwC,SAAS7U,QAAQ,CAACkyC,MAAO3wC,EAAQ6vB,SAAU+zB,EAAK/zB,YAHrD+zB,EAAKtwC,SAAS4I,OAAO,WAMpB3gB,KAAK6+E,MAAMn8E,QACZ1C,KAAK6/E,eAAe7/E,KAAK6+E,MAAM,IAGjC7+E,KAAK4/E,mBAGA,iBAAiBE,GAAO,KACzB9/E,KAAK8+E,YAAa9+E,KAAK6+E,MAAMn8E,QAAYo9E,KAE1C9/E,KAAKq/E,SACNr/E,KAAKq/E,OAAOU,YACZ//E,KAAKq/E,OAAS,MAGbr/E,KAAKi/E,YACNj/E,KAAKi/E,UAAUc,YACf//E,KAAKi/E,UAAY,OAId,eAAe52B,GACpBroD,KAAKq/E,OAAOjC,YAAY,CACtBkC,QAAS,OACTU,kBAAmBhgF,KAAK4+E,WACxBqB,uBAAwBjgF,KAAK4+E,aAG/B5+E,KAAKi/E,UAAU7B,YAAY,CACzBkC,QAAS,OACTY,YAAa,GACbC,cAAengF,KAAK4+E,aAKpB5+E,KAAKoc,IAAI,yBACTpc,KAAKq/E,OAAOjC,YAAY,CACtBkC,QAAS,SACTc,MAAO/3B,EAAK+3B,MACZ9rD,SAAU+zB,EAAKg4B,cACd,SAAYp8E,EAAY,CAACokD,EAAK+3B,MAAMX,SAGzCp3B,EAAKvX,QAAU/sB,OAAOrL,WAAW,KAC/B1Y,KAAKoc,IAAIjR,MAAM,kBAEfnL,KAAK4/E,kBAAiB,GACnB5/E,KAAK6+E,MAAMn8E,SACZ1C,KAAK0/E,aACL1/E,KAAK2/E,iBAGP3/E,KAAKo/E,UAAUp/E,KAAK6+E,MAAM39B,UACzB,KAGE,eAAek/B,EAAmBC,GACvC,OAAO,IAAIt7E,QAAgB,CAAC7B,EAASyd,KACnC,MAAM0nC,EAAO,CACX+3B,QACAC,eACAtoE,SAAU,CAAC7U,UAASyd,UACpBmwB,QAAS,GAGX9wC,KAAK0/E,aACL1/E,KAAK2/E,gBAEwB,IAA1B3/E,KAAK6+E,MAAMrzE,KAAK68C,IACjBroD,KAAK6/E,eAAex3B,KAKb,OAAOm3B,EAAwBa,GAAe,G,yCACzD,OAAOrgF,KAAKsgF,eAAed,EAAYa,GAAc99E,KAAKkC,IACxD,MAAM87E,EAAW,IAAI1sD,KAAK,CAACpvB,EAAO2wC,OAAQ,CAAC/pC,KAAM,cACjD,MAAO,CAACyC,IAAKF,IAAI8qC,gBAAgB6nC,GAAWjsD,SAAU7vB,EAAO6vB,iBAMnE,IAAeqqD,qBAAuBA,EACvB,O,6BCtLf,WAEA,MAAM6B,IAAsBvsD,SAASkO,cAAc,SAAS68C,YAAY,gBAAkB,MAAc,IAEvGj7D,OAAey8D,kBAAoBA,EACrB,O,6BCCC,SAAS5qC,EAA4BhsC,EAAQ+wD,EAAgBC,GACxE,eAAgBA,EAAUhxD,KAC3BgxD,EAAUhxD,GAAO,IAAIgxD,EAAUhxD,KAG9B+wD,GAAaA,EAAU/wD,KAASgxD,EAAUhxD,KAC3C+wD,EAAU/wD,GAAKlH,OAASk4D,EAAUhxD,GAAKlH,OACtCk4D,EAAUhxD,GAAe7G,QAAQ,CAAC+5E,EAAG/8E,KACpC46D,EAAU/wD,GAAK7J,GAAK+8E,IAItBliB,EAAUhxD,GAAO+wD,EAAU/wD,IAlB/B,mC,6BCAA,YAEA,MAAM62E,EAA6B,IAAIv8E,IAAI,CACzC,aACA,YACA,cAGC,KACDu8E,EAA2Bh7E,IAAI,cAGlB,O,6BCZf,kCAQe,MAAMi7E,EAKnB,YAAoBC,GAAA,KAAAA,SAClB3gF,KAAK8kB,OAAS,EAGT,UAAU6O,EAAiB+vB,GAAO,KACrC1jD,KAAK8kB,OACP9kB,KAAK4gF,UAAYjtD,EAEjB,IACE,MAAMsiC,EAAQj2D,KAAKkoE,cACnBjS,EAAMxS,UAAW,EACjBwS,EAAMtJ,IAlBQ,gBAkBYh5B,EAC1BsiC,EAAMvS,KAAOA,EACbuS,EAAM4qB,OACN,MAAM7+E,GACNN,QAAQyJ,MAAM,YAAawoB,EAAM3xB,IAI9B,qBAAqB2xB,EAAiB+vB,GACxC1jD,KAAK4gF,YAAcjtD,GACpB3zB,KAAKipE,UAAUt1C,EAAM+vB,GAIlB,cACL,IAAI,MAACuS,GAASj2D,KACd,OAAGi2D,IAIHA,EAAQj2D,KAAKi2D,MAAQ,IAAI6qB,MACzB7qB,EAAM4qB,OACC5qB,GAGF,YACDj2D,KAAKi2D,OAITj2D,KAAKi2D,MAAM8qB,QAGN,sBACH/gF,KAAK8kB,OAGF,qBAAqB6O,EAAiB+vB,EAAe5S,GAE1D,MAAMhsB,IAAW9kB,KAAK8kB,OACtBpM,WAAW,KACN1Y,KAAK8kB,SAAWA,GAInB9kB,KAAKipE,UAAUt1C,EAAM+vB,IACpB5S,M,6BCtEQ,SAASkwC,EAAqBC,GAC3C,MAAM9Y,EAA6C,CAClDhnC,MAAO,CAGJxM,MAAO,CAACpc,IAAK,MACbsc,OAAQ,CAACtc,IAAK,MACdo+D,UAAW,CAACp+D,IAAK,MAQrB,OAJI0oE,IACF9Y,EAAYlS,OAAQ,GAGfkS,EAfT,mC,yWCAe,SAAe+Y,EAAgB/Y,G,yCAC5C,MAAMgZ,QAAqBhvB,UAAUskB,aAAa2K,gBAAgBjZ,GAGlE,OAFcgZ,EAAaE,iBAAiB,GACtCC,YAAc,OACbH,O,6BCJT,kCAWe,MAAMI,EAInB,YAAoBhM,EAAS,QAAT,KAAAA,SAClBv1E,KAAKu6E,MAAQ,GACbv6E,KAAKwhF,QAAU,GAGV,OAAOjiC,GAEZ,OADAv/C,KAAKu6E,MAAM/uE,QAAQ+zC,GACZv/C,KAGF,KAAKgiE,GAEV,OADAhiE,KAAKwhF,QAAQh2E,KAAKw2D,GACXhiE,KAGF,UAAU46E,EAAY,IAG3B,OAFA56E,KAAKyF,IAAIzF,KAAKwhF,QAAQv7E,KAAK20E,IAC3B56E,KAAKwhF,QAAU,GACRxhF,KAGF,OACL,OAAOA,KAAKu6E,MAAMt0E,KAAKjG,KAAKu1E,QAGvB,WACL,OAAOv1E,KAAKiG,OAASjG,KAAKu1E,U,6BCxCf,SAAS9xC,EAAatS,GACnC,OAAOA,EACJuxB,QAAQ,sBAAuB,QAC/BA,QAAQ,KAAM,SAJnB,mC,4gBCwBe,MAAM,UAAoC,IAgBvD,YAAYxyB,GAKVk7B,MAAMl7B,GAENlwB,KAAKyhF,mBAAqB,OAAA52B,EAAA,GAAS7qD,KAAKspE,UAAUt0D,KAAKhV,MAAO,GAAG,GAG5D,uBACL,OAAOA,KAAKigE,YAAc7U,MAAMie,qBAAqB,CACnDqY,WAAY,GACZC,mBAAoB,MACpBC,aAAc,aACdC,cAAe,UACfC,qBAAsB,IAMnB,oBACL,GAAG9hF,KAAK+hF,YACN,OAAO/hF,KAAK+hF,YAGd,MAAMA,EAAc32B,MAAMwe,oBAa1B,OAXAmY,EAAYzhF,iBAAiB,OAAQ,KACnCN,KAAKgiF,sCAGPD,EAAYzhF,iBAAiB,QAAS,KACjCN,KAAKiiF,4BACNzuB,cAAcxzD,KAAKiiF,2BACnBjiF,KAAKiiF,+BAA4Bh+E,KAI9B89E,EAGF,oBACL,GAAG/hF,KAAKm2E,YACN,OAAOn2E,KAAKm2E,YAed,OAZoB/qB,MAAMue,oBAerB,2BACLve,MAAMye,2BAUM,oBAAoBqY,EAAeC,EAAiCjyD,G,yCAChF,MAAM,UAACi1C,EAAS,YAAEgR,GAAen2E,KAC3BilE,EAAcE,EAAUjjE,GAExBkgF,EAAoBD,EAAaz6E,IAAIgzE,IACzC,MAAM2H,EC3GG,SAA6B/F,EAAUnxD,GACpD,MAAMm3D,EAAc,OAAAzE,EAAA,GAAsBvB,EAAKnxD,GAEzC6rD,EAA+D7rD,EAAM6rD,UACrErtB,EAAc,CAClB0W,OAAQiiB,EAAYjiB,OACpBC,aAAcgiB,EAAYhiB,aAC1Bj1D,KAAM2rE,GAIRsL,EAAYjK,YAAYE,MAAQ,SAChC,MAAMjwB,EAAoC,CACxCgwB,aAAc,CAACgK,EAAYjK,aAC3BD,IAAKkK,EAAYlK,IACjBS,KAAMyJ,EAAYjiB,OAClB,cAAeiiB,EAAYhiB,cAAgB,GAC3C6X,MAAOmK,EAAYnK,OASrB,MAAO,CACLluD,OANuB,CACvB1oB,EAAG,WACH8zD,KAJqBktB,KAAKC,UAAUl6B,IASpC+X,OAAQiiB,EAAYjiB,OACpBl1C,QACAm1C,aAAcgiB,EAAYhiB,aAC1B3W,SD4EoB84B,CAAoBP,EAAUxH,GAIhD,OAFA16E,KAAKugE,QAAQ8hB,EAAU14B,MAAMt+C,MAA6Bg3E,EAAU14B,MAE7D04B,IAGT,IAAI99E,EACJ,MAAMm+E,EAAeN,EAAkB5iE,KAAKxG,GAAuC,UAA5BA,EAAQmS,MAAM6rD,WAC/D2L,EAAeP,EAAkB5iE,KAAKxG,GAAuC,UAA5BA,EAAQmS,MAAM6rD,WACrE,IAAI,OAAC3W,EAAM,OAAEp2C,GAAUy4D,GAAgB,GACvC,MAAME,EAAaD,GAAgBD,EAE7B/I,EAA6D,CACjE1jB,MAAOysB,EACPvhD,MAAOwhD,GAcT,GAXAxM,EAAY1sB,QAAQ1mD,QAAQ4mD,IAC1B,GAAuB,aAApBA,EAAMmW,UAA0B,CACjC,MAAM9mD,EAAU2gE,EAAShwB,EAAMt+C,MAC/B,IAAI2N,EAAS,OAEbm9D,EAAY0M,eAAel5B,EAAO3wC,EAAQsnD,cAAgBtnD,EAAQqnD,QAClE8V,EAAY2M,eAAen5B,EAAOtpD,EAAA,EAAU+G,SAK7C6iB,IAAW24D,EAAW34D,OAAQ,CAC/B,MAAMorC,EAAiCktB,KAAKQ,MAAMH,EAAW34D,OAAOorC,MAEjEgL,EAAQhL,EAAKwjB,KAAOxY,SACXhL,EAAKwjB,KACjB5uD,EAAS,CACP1oB,EAAG,WACH8zD,KAAMktB,KAAKC,UAAUntB,IAIzB,MAAM2tB,EAAiBhiD,EAAA,EAAqBgmC,kBAAkB/B,GAC9D,GAAoB,SAAjB/0C,EAAQ7kB,KAAiB,CAC1B,MAAM43E,EAA8B,CAClC/hD,KAAM8hD,EACNE,QAAS,CAAC3hF,EAAG,iBACb0oB,SACA5F,MAAO6L,EAAQ4kC,QACfuS,eAAgBn3C,EAAQ83C,WAG1BzjE,EAAU,IAAWC,UAAU,sBAAuBy+E,GACtDjjF,KAAKoc,IAAI,0BAA0B6oD,EAAege,OAC7C,CACL,MAAMA,EAA0C,CAC9C/hD,KAAM8hD,EACN/4D,UAGF1lB,EAAU,IAAWC,UAAU,kCAAmCy+E,GAClEjjF,KAAKoc,IAAI,sCAAsC6oD,EAAege,GAGhE,MAAM31E,QAAgB/I,EACtBwD,EAAA,EAAkBwF,qBAAqBD,GACvC,MAAM9M,EAAU8M,EAA4BA,QAAQkS,KAAKhf,GAAuB,8BAAbA,EAAOe,GAEpE8zD,EAAsCktB,KAAKQ,MAAMviF,EAAOypB,OAAOorC,MAMrE,OAJAA,EAAKY,MAAQZ,EAAKY,OAASkP,EAAU0B,YAAYC,KAAKqP,YAAYlgB,MAClEkgB,EAAYgN,QAAQ9tB,GElLT,SAA4B8sB,EAAiC9sB,GAc9D,CAAC,QAAkB,SAAkBtvD,OAAOsF,GAAQgqD,EAAKhqD,IAAO3D,IAAI2D,GAAQ,CAAEgqD,EAAKhqD,GAAOA,IAGtFtI,QAAQ,EAAEm2E,EAAO7tE,MAC/B,MAAM2N,EAAUmpE,EAAa3iE,KAAKg7D,GAAQA,EAAKxD,YAAc3rE,GAC7D,IAAI2N,EACF,OAGF,MAAMoqE,EArBc,CAACpqE,IACrB,MAAMkD,EAA8B,GAOpC,OANelD,EAAQ+a,WAAWjL,IAAI,UAC/B/lB,QAASqgF,IACd,MAAMlhF,EAAKkhF,EAAOx5E,IAAIyG,MAAM,IAAK,GAAG,GACpC6L,EAAIha,GAAMkhF,EAAOt7E,QAGZoU,GAaQmnE,CAAcrqE,GAC7B,OAAAiC,EAAA,GAAei+D,EAAM,eAAgB,CAACpxE,EAAOM,EAAOylC,KAC/Cu1C,EAAOt7E,EAAM5F,MAAQ4F,EAAM2xE,MAC5B5rC,EAAIj2B,OAAOxP,EAAO,GAClB1G,QAAQ0a,IAAI,yBAA0BtU,EAAOM,EAAOiD,QFwJxDi4E,CAAmBnB,EAAc9sB,GAE1BA,KAGO,oB,yCACd,MAAM,WAAC4K,EAAU,YAAEkW,GAAen2E,KAC5BujF,EAAoD,QAAlCtjB,EAAWuJ,qBAAiC2M,EAAYqN,cAAc,KAAKnjB,OAC7FjkD,EAAMpc,KAAKoc,IAAIysD,WAAW,oBAChCzsD,EAAI,SAEJ,MAAMqnE,QAAsBxjB,EAAWyjB,YAAY,CAACC,YAAY,IAEhE,GAAGJ,GAAmBvjF,KAAK+hF,YAAa,CACb5L,EAAY/U,YAAY,eAChClB,aAAa,YAGhC,MAAOoc,IAAK4F,EAAQ,MAAE0B,GGjMX,SAAuB1zD,GAMpC,MAAM,MAAC0zD,EAAK,KAAEvuB,GAAQnlC,EAChBosD,EAAM,YAASsH,EAAMtH,KAC3B,IAAIuH,GAAY,EAwEhB,GAtEI3zD,EAAQ4zD,sBACVD,EAAY,YAAavH,IAAQuH,GAMnC,OAAA5oE,EAAA,GAAeqhE,EAAInxD,MAAO,CAACuvD,EAAShpE,EAAKm8B,KAYvC,GAA0C6sC,EAAQzZ,UAChD,OAGF,GAAyB,gBAAtByZ,EAAQ1D,UACT,OAGF,MAAM+M,EAAYrJ,EAAQqJ,UACpBrI,EAAiBqI,EAAUrI,eAE3BsI,GADgBtI,EAAerR,IAClB0Z,EAAUr4E,YAavBu4E,EAXQ5uB,EAAKqlB,EAAQ1D,WACA,iBAUGtvE,IAAI4gD,GAAW,GAAKA,EAAQpmD,IAG1D,GAAG8hF,IAFkB,YAAuBtJ,EAAQ1D,eAAW/yE,EAAWggF,GAE1C,CAC9B,MAAM3B,EAAc,OAAAzE,EAAA,GAAsBvB,EAAK5B,GAE/C,IAAIwJ,EAAU,OAAH,UAAO7uB,GAClB6uB,EAAQjM,UAAY,OAAA54D,EAAA,GAAK6kE,EAAQjM,WACjCiM,EAAQjM,UAAUE,MAAQmK,EAAYnK,MACtC+L,EAAQjM,UAAUG,IAAMkK,EAAYlK,IACpC8L,EAAQjM,UAAUK,aAAe,CAACgK,EAAYjK,aAC9C6L,EAAQjM,UAAUO,WAAa,GAE/B,MAAM7uB,EAAQ,IAAI,IAAgB24B,EAAY5oE,IAAKgiE,EAAerwE,MAClEs+C,EAAMw6B,QAAQzI,EAAe7b,MAC7ByiB,EAAYjiB,QAAU1W,EAAMoX,UAAUuhB,EAAYhiB,cAAgBgiB,EAAYjiB,QAC9E1W,EAAMuW,aAAawa,EAAQ5a,WAE3B,MAAMskB,GAAS,IAAI,KAAalK,aAAavwB,EAAOu6B,GAASl0D,WAEvDq0D,EAAa,YAASD,GAAQj5D,MAAM,GAC1C0iB,EAAIn8B,GAAO2yE,EAEXR,GAAY,KAIbA,EAAW,CACZ,MAAMS,EAAYhI,EAAI5wE,WACtBk4E,EAAMtH,IAAMgI,EAGd,MAAO,CAACV,QAAOtH,OH4GkBiI,CAAc,CAC3CX,MAAOH,EACPpuB,KAAM8gB,IAGR/5D,EAAI,4BAA6BwnE,EAAMtH,WACjCrc,EAAWukB,oBAAoBZ,GAErC,MAAMzB,EAAeD,EAAS/2D,MAAMplB,OAAOolB,GACd,gBAApBA,EAAM6rD,WAA+B7rD,EAAM81C,WAGpD,GAAGsiB,EACD,UACQvjF,KAAKykF,oBAAoBvC,EAAUC,EAAcniF,KAAKkwB,SAC5D,MAAMluB,GACNhC,KAAKoc,IAAIjR,MAAM,8BAA+BnJ,GAqBlD,MAEM0iF,EAAqC,GACrC1M,EAASkK,EAASlK,OACxB,OAAA/8D,EAAA,GAAe+8D,EAAQ,CAACt+D,EAAKhI,EAAKm8B,KAChC,MAAM8b,EAAQwsB,EAAYqN,cAAc9pE,GACrCiwC,EAAMyvB,iBANM,KAObvrC,EAAIj2B,OAAOlG,EAAK,GAChBgzE,EAAgBl5E,KAAKm+C,MAazB,MAAMF,EAAUy4B,EAAS/2D,MAAMzjB,IAAKgzE,IAClC,MAAMhhE,EAAMghE,EAAQhhE,IACpB,IAAIiwC,EAAQwsB,EAAYqN,cAAc9pE,GAMtC,OALIiwC,IACFA,EAAQ,IAAI,IAAgBjwC,EAAKghE,EAAQ1D,WACzCrtB,EAAMuW,aAAa,aAGdvW,IAGHg7B,EAA+C,CACnDt5E,KAAM,SACNixE,IAAKnG,EAAYyO,YAAY,CAC3B5M,SACAvuB,UACA+W,UArCa,KAyCjBkkB,EAAgB3hF,QAAQ4mD,IACtBwsB,EAAY0O,YAAYl7B,KAG1BvtC,EAAI,wCAAwC6jD,EAAW6kB,sBAAsB7kB,EAAWuJ,gCAAgCvJ,EAAW8kB,gCAAgC9kB,EAAW+kB,kBAAmBL,EAAkBrI,WAC7Mrc,EAAWglB,qBAAqBN,GAEtCvoE,EAAI,UAGC,YACL,IAAI7X,EAAUvE,KAAKklF,YACnB,OAAG3gF,IAIHA,EAAU6mD,MAAMke,YAEbtpE,KAAKmlF,mBACN5gF,EAAQhC,KAAK,KACXvC,KAAKgiF,oCACLhiF,KAAKmlF,mBAAoB,IAIJ,iBAAtBnlF,KAAKkwB,QAAQ7kB,MACd9G,EAAQhC,KAAK,KACXvC,KAAKigE,WAAWmlB,kBAAkB5lE,KAAK2gD,I,QACE,WAAX,QAAzB,EAAkB,QAAlB,EAAAA,EAAY2O,cAAM,eAAE5C,aAAK,eAAE1kC,OAC5B24B,EAAY2O,OAAOuW,cAAc,OAAD,wBAC3BllB,EAAY2O,OAAOwW,iBAAe,CACrCC,sBAAuB,6BAO1BhhF,GAGF,oCACL,GAAmC,SAAhCvE,KAAK+hF,YAAYrqB,WAClB,OAGF13D,KAAKoc,IAAI,qCAIT,MAAMuH,EAKF,CACF6hE,aAAc,2BACdrd,YAAa,GACbsd,mBAAoB,CAACC,UAAW,GAChCC,iBAAkB,IAGpB,IAAI,MAAMh8B,KAAS3pD,KAAKm2E,YAAY1sB,QAAS,CAC3C,GAAuB,aAApBE,EAAMmW,WAA2C,UAAfnW,EAAMt+C,KACzC,SAGF,MAAM,SAAC20D,GAAYrW,EACnBhmC,EAAIgiE,iBAAiBn6E,KAAKw0D,GAC1Br8C,EAAIwkD,YAAYnI,GAAY,CAC1B4lB,UAAW,IACXF,UAAW,KAIf1lF,KAAK6lF,oBAAoBliE,GAErBA,EAAIgiE,iBAAiBjjF,OAKd1C,KAAKiiF,4BACdjiF,KAAKiiF,0BAA4Bl+D,OAAO3jB,YAAYJ,KAAKgiF,kCAAkChtE,KAAKhV,MAAO,MALpGA,KAAKiiF,4BACNzuB,cAAcxzD,KAAKiiF,2BACnBjiF,KAAKiiF,+BAA4Bh+E,GAOhC,oBAAoBqkE,GAKvBtoE,KAAKmlE,UAAU2gB,qBAAqBxd,EAAQtoE,KAAKqL,MAGnDrL,KAAKioE,cAAcO,UAAUF,EAAQ,SACrCtoE,KAAK6pE,4B,yWI9VM,MAAM,UAA0B,IAuB7C,YAAY35C,GAMVk7B,QAEA,OAAA26B,EAAA,GAAW/lF,KAAMkwB,GAEblwB,KAAKoc,MACPpc,KAAKoc,IAAM,OAAA0G,EAAA,GAAO,eAGhB9iB,KAAK6mE,cACP7mE,KAAK6mE,YAAc,IAGjB7mE,KAAKgmF,gBACPhmF,KAAKgmF,cAAgB,IAAI3jE,KAG3BriB,KAAKimF,cAAgB,GACrBjmF,KAAKkmF,kBAAoB,IAAI7jE,IAC7BriB,KAAKmmF,qBAAuB,IAAIjiF,IAChClE,KAAKomF,wBAA0B,OAAAv7B,EAAA,GAAS,KACtC7qD,KAAKgB,cAAc,SAAUhB,KAAKqmF,eACjC,GAAG,GAENrmF,KAAKM,iBAAiB,QAAUkC,IAC3BA,IAAU,IAAiBumE,QAC5B/oE,KAAKsmF,YAKX,sBACE,OAAOtmF,KAAK6mE,YAAYC,KAAK7G,WAAWuJ,mBAG1C,YACE,MAAM,gBAACwb,GAAmBhlF,KAC1B,GAAuB,WAApBglF,EACD,OAAO,IAAiBjc,OACnB,GAAuB,cAApBic,GAAqC,KAAiC,cAApBA,EAErD,CACL,MAAM,YAACrxC,GAAe3zC,KACtB,OAAI2zC,EAAY/tC,OAAOkgE,gBAEbnyB,EAAY/tC,OAAOye,MACpB,IAAiBkiE,MAEjB,IAAiBC,QAJjB,IAAiBC,eAJ1B,OAAO,IAAiBC,WAa5B,mBACE,OAAO1lD,EAAA,EAAqB2kC,sBAAsB3lE,KAAKkC,IAGzD,sBACE,QAASlC,KAAK6mE,YAAYjC,aAG5B,mBACE,OAAO5kE,KAAKimF,cAAcjmF,KAAKimF,cAAcvjF,OAAS,GAGxD,cACE,OAAO1C,KAAKwC,QAAU,IAAiBgkF,QAGzC,gBACE,MAAM,MAAChkF,GAASxC,KAChB,OAAOwC,IAAU,IAAiBumE,OAGpC,oBACE,OAAO/oE,KAAK6mE,YAAYC,KAAKmB,cAG/B,kBACE,OAAOjoE,KAAK6mE,YAAYC,KAAKqP,YAGxB,UAAU9V,GACf,OAAAh5D,EAAA,GAAiBrH,KAAKimF,cAAe5lB,GACrCrgE,KAAKimF,cAAcz6E,KAAK60D,GACxBrgE,KAAKomF,0BAGA,YAAY/lB,GACjBrgE,KAAKmmF,qBAAqBziF,OAAO28D,GACjC,OAAAh5D,EAAA,GAAiBrH,KAAKimF,cAAe5lB,GACrCrgE,KAAKomF,0BAGA,WACLpmF,KAAKimF,cAAcvjF,OAAS,EAC5B1C,KAAKomF,0BAGA,uBAAuBjjF,GAC5B,OAAO,MAAiBA,EAASnD,KAAK2zC,YAAc3zC,KAAKu5C,aAAazwB,IAAI3lB,GAGrE,cACL,OAAOnD,KAAK2mF,oBAAmB,GAAMpkF,KAAK,IAAMy+B,EAAA,EAAqB4lD,eAGhE,WAAW5mB,GAChB,OAAO5U,MAAMy7B,WAAW7mB,GAGnB,qCAAqCrsB,EAAmCtoC,GAC7E,IAAIg1D,EACJ,GAAG1sB,EAAY/tC,OAAOC,KAAM,CAE1Bw6D,EADyD,UAATh1D,EAAmB,OAAS,mBAEvE,CAELg1D,EADc1sB,EAAYtoC,GACXs5D,cAAc,GAAGpE,QAAQ,GAG1C,MAAM/7B,EAAUxkC,KAAK6mF,WAAWxmB,GAChC,IAAI77B,EAAS,OAEb,MAAMsiD,EAAQtiD,EAAQkwB,YAEtB,OADAoyB,EAAMC,UAAYviD,EAAQuiD,UACnB,CAAC5lD,MAAO2lD,EAAOzmB,UAGjB,yBAAyBnwC,GAK9B,OAAOlwB,KAAK6mE,YAAY32C,EAAQ7kB,MAAQ,IAAI,EAA4B,OAAD,QACrE85D,UAAWnlE,KACXoc,IAAKpc,KAAKoc,IAAIysD,WAAW34C,EAAQ7kB,OAC9B6kB,IAIA,gBAAgB82D,GACrB,OAAOhmD,EAAA,EAAqB0pC,gBAAgB1qE,KAAKkC,GAAIlC,KAAK2zC,YAAa,CAAC8yB,UAAWugB,IAGxE,6B,yCACX,IACE,MAAM37E,EAAgC,eAEhCi9D,QAAe,OAAA4Y,EAAA,GAAgB,OAAAF,EAAA,MAC/B/Y,EAAgB,IAAI,IAEpBkB,EAAqBnpE,KAAKopE,yBAAyB,CACvDnB,gBACA58D,OACA6kB,QAAS,CACP7kB,UAIe89D,EAAmBE,uBAC3B/oE,iBAAiB,oBAAqB,KAC/C6oE,EAAmBG,cAGrBhB,EAAO+Y,iBAAiB,GAAG/gF,iBAAiB,QAAS,KAChDN,KAAK6mE,YAAYjC,cAClB5kE,KAAKinF,qBAEN,CAACrjC,MAAM,IAEVulB,EAAmBQ,oBACnBR,EAAmB+d,oBAAoB5e,GACvC,MAAMt6D,GACNhO,KAAKoc,IAAIjR,MAAM,6BAA8B6C,OAI1C,qBACL,OAAOhO,KAAKmnF,4BAA8BnnF,KAAKmnF,0BAA4BnnF,KAAKonF,6BAA6B17D,QAAQ,KACnH1rB,KAAKmnF,+BAA4BljF,KAI9B,oBACL,MAAMklE,EAAqBnpE,KAAK6mE,YAAYjC,aAC5C,OAAIuE,UAIGnpE,KAAK6mE,YAAYjC,aACxB5kE,KAAKqnF,YAAY,gBACjBle,EAAmBme,0BAAyB,UAErCtnF,KAAK2zC,YAAYixB,aACxB5jC,EAAA,EAAqBslC,mBAAmBtmE,KAAKkC,GAAIlC,KAAK2zC,aAE/C,IAAWnvC,UAAU,mCAAoC,CAC9D08B,KAAMF,EAAA,EAAqBgmC,kBAAkBhnE,KAAKkC,MACjDK,KAAK+K,IACNvF,EAAA,EAAkBwF,qBAAqBD,MAbhCvI,QAAQ7B,UAiBZ,sBACL,OAAGlD,KAAKunF,gBACCvnF,KAAKinF,oBAELjnF,KAAKwnF,qBAIH,4B,yCACX,MAAMrf,EAAsC,CAC1ChnC,MAAO,OAAAknC,EAAA,MAGT,IACE,MAAMC,QAAe,OAAAC,EAAA,GAAUJ,GAAa,GACjBnoE,KAAK6mE,YAAYC,KACzBogB,oBAAoB5e,SAEjCtnC,EAAA,EAAqB0pC,gBAAgB1qE,KAAKkC,GAAIlC,KAAK2zC,YAAa,CACpEyzB,aAAa,EACbT,cAAc,IAEhB,MAAM34D,GACNhO,KAAKoc,IAAIjR,MAAM,0BAA2B6C,EAAKm6D,OAI5C,oBACL,OAAOnoE,KAAKynF,2BAA6BznF,KAAKynF,yBAA2BznF,KAAK0nF,4BAA4Bh8D,QAAQ,KAChH1rB,KAAKynF,8BAA2BxjF,KAIvB,mB,yCACX,MAAMklE,EAAqBnpE,KAAK6mE,YAAYC,KACtCoF,EAAQ/C,EAAmBlB,cAAcQ,YAAY4Y,iBAAiB,GACxEnV,IAIJ,OAAAD,EAAA,GAAUC,GACV/C,EAAmBlB,cAAc0f,mBAAmBxe,EAAmBgN,mBAEjEn1C,EAAA,EAAqB0pC,gBAAgB1qE,KAAKkC,GAAIlC,KAAK2zC,YAAa,CACpEgzB,cAAc,QAIX,qBACL,OAAG3mE,KAAK4nF,eACC5nF,KAAK6nF,mBAEL7nF,KAAK8nF,oBAIH,OAAOvd,GAAU,EAAOxC,GAAS,EAAOggB,GAAc,G,yCACjE,IAAI,MAAM18E,KAAQrL,KAAK6mE,YAAa,CACf7mE,KAAK6mE,YAAYx7D,GACzBi8E,0BAA0Bvf,GAKvC,GAFA/nE,KAAKgB,cAAc,QAAShB,KAAKwC,QAE9BulF,IAIChgB,EAAQ,CACV,IAAIxjE,EACJ,MAAMy+E,EAAiBhiD,EAAA,EAAqBgmC,kBAAkBhnE,KAAKkC,IAEnE,GAAGqoE,EACDvqE,KAAKoc,IAAI,6BAA6Bpc,KAAKkC,IAC3CqC,EAAU,IAAWC,UAAU,yBAA0B,CACvD08B,KAAM8hD,SAEH,GAAGhjF,KAAKumC,OAAQ,CACrBvmC,KAAKoc,IAAI,2BAA2Bpc,KAAKkC,IACzC,MAAMinE,EAAqBnpE,KAAK6mE,YAAYC,KAC5CviE,EAAU,IAAWC,UAAU,uBAAwB,CACrD08B,KAAM8hD,EACN3iB,OAAQ8I,EAAmB5I,QAAQtK,MAAMoK,cAG3CrgE,KAAKoc,IAAI,YAAYpc,KAAKkC,mBAC1BqC,EAAU,IAAWC,UAAU,sBAAuB,CACpD08B,KAAM8hD,EACNE,QAAS,CAAC3hF,EAAG,iBACb8iB,OAAO,EACPgjD,eAAe,EACfp9C,OAAQ,CACN1oB,EAAG,WACH8zD,KAAM,MAKZ,MAAM/nD,QAAgB/I,EACtBwD,EAAA,EAAkBwF,qBAAqBD,OAIpC,YAAY4iB,GACjB,MAAM,YAACimD,GAAen2E,KAChBqgE,EAASjV,MAAM48B,YAAY93D,GAEjC,GAAoB,WAAjBA,EAAQ7kB,KAAmB,CAC5B,MAAMs+C,EAAQwsB,EAAY8R,kBAAkB5nB,GACtC1sB,EAAc3zC,KAAKu5C,aAAazwB,IAAI6gC,EAAMxmD,QAC7CwwC,GACDtzC,EAAA,EAAUW,cAAc,yBAA0B,CAACikE,YAAajlE,KAAKkC,GAAIyxC,gBAI7E,OAAO0sB,EAGF,oBAAoB1sB,EAAmCsyB,GAC5D,MAAMkD,EAAqBnpE,KAAK6mE,YAAYC,MACtC,WAAC7G,EAAU,YAAEkW,GAAehN,EAE5BhmE,EAASC,EAAA,EAAgBkC,UAAUquC,EAAYpuC,MAC/CsgE,IAAYlyB,EAAY/tC,OAAO6O,KAC/ByzE,EAAWloF,KAAKkmF,kBAAkBp9D,IAAI3lB,IAAW,GAEvD,GAAGwwC,EAAYixB,eAAiBiB,EAAS,CACvC,MAAM,OAACxF,GAAUr/B,EAAA,EAAqByjC,wBAAwB9wB,EAAa,QAASA,EAAYixB,aAAaD,cAAehxB,EAAYixB,aAAa5E,UACjJhgE,KAAKmmF,qBAAqB1/E,IAAI45D,KAChCrgE,KAAKmmF,qBAAqB1gF,IAAI46D,GAC9BrgE,KAAKmoF,UAAUx0C,EAAY/tC,OAAOC,KAAO,eAAiBw6D,IAI9D,GAAG1sB,EAAY/tC,OAAOC,KAAM,CAC1B7F,KAAK2zC,YAAcA,EAEhBw1B,EAAmB5I,QAAQtK,MAAMoK,SAAW1sB,EAAY0sB,QACzDrgE,KAAKqlE,SAGP,IAAIn5B,GAAO,EAiBX,OAhBIyH,EAAY/tC,OAAOkgE,gBAIbnyB,EAAY/tC,OAAOye,QAC3B6nB,GAAO,IAJPlsC,KAAKinF,oBACLjnF,KAAK6nF,mBACL37C,GAAO,GAKNA,GACDlsC,KAAK+mE,UAAS,QAGbd,IAAmC9iE,GACpCnD,KAAKgB,cAAc,QAAShB,KAAKwC,QAMrC,MAAMi6E,EAAQ5W,EAAU,GAAK7kC,EAAA,EAAqBwjC,yBAAyB7wB,GAEvEkyB,EAGF7lE,KAAKkmF,kBAAkBxiF,OAAOP,GAF9BnD,KAAKkmF,kBAAkB1iF,IAAIL,EAAQs5E,GAOrC,MAAM2L,EAAqC,IAAIlkF,IAC/CgkF,EAASnlF,QAAQslF,IACf,MAAMC,EAAYD,EAAQhoB,OAE1B,IADgBoc,EAAMj9D,KAAKq5D,GAAQA,EAAKxY,SAAWioB,GACtC,CACXtoF,KAAKqnF,YAAYiB,GAEjB,MAAMC,EAAWpS,EAAY8R,iBAAiBK,GAC3CC,GAAmC,aAAvBA,EAASzoB,YACtByoB,EAASroB,aAAa,YACtBkoB,EAAc3iF,IAAI8iF,EAASl9E,UAKjCoxE,EAAM15E,QAAQ81E,IACZ,IAAIlvB,EAAQwsB,EAAY8R,iBAAiBpP,EAAKxY,QAC3C1W,EACsB,aAApBA,EAAMmW,YACPnW,EAAMuW,aAAavW,EAAMoW,mBACzBqoB,EAAc3iF,IAAIkkD,EAAMt+C,QAM5Bs+C,EAAQwsB,EAAY/U,YAAYyX,EAAKxtE,MACrC8qE,EAAY0M,eAAel5B,EAAOkvB,EAAKvY,cAAgBuY,EAAKxY,QAC5D8V,EAAY2M,eAAen5B,EAAOxmD,GAMlB,UAAd01E,EAAKxtE,MAAoBs+C,EAAM6+B,YAAY3P,EAAK7Y,UAChDrW,EAAMglB,kBAAkB1O,EAAY,CAACH,UAAW,aAGlDsoB,EAAc3iF,IAAIkkD,EAAMt+C,SASb+8E,EAAc3sE,OACtB2sE,EAAc3hF,IAAI,WACnB0iE,EAAmBgc,mBAAoB,GAGzChc,EAAmBsY,yB,+FCldV,MAAe,EAY5B,YAAYvxD,G,MACV,OAAA61D,EAAA,GAAW/lF,KAAMkwB,GAEblwB,KAAKoc,MACPpc,KAAKoc,KAAqB,QAAf,EAAApc,KAAKigE,kBAAU,eAAE7jD,MAAO,OAAA0G,EAAA,GAAO,yBAG5C9iB,KAAKugE,QAAU,GAGV,qBAAqB9/C,GAC1B,OAAOzgB,KAAKigE,aAAejgE,KAAKigE,WCnCrB,SAA8Bx/C,EAA0BrE,GACjEA,IACFA,EAAM,OAAA0G,EAAA,GAAO,sBAGf1G,EAAI,eAGJ,MAAM6jD,EAAa,IAAIwoB,kBAAkBhoE,GAyBzC,OAxBAw/C,EAAW3/D,iBAAiB,QAAU+uB,IACpCjT,EAAI,UAAWiT,KAEjB4wC,EAAW3/D,iBAAiB,uBAAwB,KAClD8b,EAAI,yBAA0B6jD,EAAW6kB,kBAE3C7kB,EAAW3/D,iBAAiB,wBAAyB,KACnD8b,EAAI,0BAA2B6jD,EAAW+kB,mBAE5C/kB,EAAW3/D,iBAAiB,oBAAqB,KAC/C8b,EAAI,sBAAuB6jD,EAAW6kB,kBAExC7kB,EAAW3/D,iBAAiB,eAAiB+uB,IAC3CjT,EAAI,iBAAkBiT,KAExB4wC,EAAW3/D,iBAAiB,2BAA4B,KACtD8b,EAAI,6BAA8B6jD,EAAWuJ,sBAE/CvJ,EAAW3/D,iBAAiB,cAAe,KACzC8b,EAAI,mBAGN6jD,EAAW7jD,IAAMA,EAEV,CAAC6jD,cDEuCoJ,CAAqB5oD,EAAQzgB,KAAKoc,IAAIysD,WAAW,eAAe5I,YAGxG,kBAAkByoB,GACvB,OAAO1oF,KAAK+hF,cAAgB/hF,KAAK+hF,YEvCtB,SAA2B9hB,EAA+ByoB,EAA2BtsE,GAG9FA,IACFA,EAAM,OAAA0G,EAAA,GAAO,mBAGf,MAAM9J,EAAUinD,EAAW2J,kBAAkB,OAAQ8e,GAcrD,OAZA1vE,EAAQ1Y,iBAAiB,UAAY0B,IACnCoa,EAAI,YAAapa,KAEnBgX,EAAQ1Y,iBAAiB,OAAQ,KAC/B8b,EAAI,YAENpD,EAAQ1Y,iBAAiB,QAAS,KAChC8b,EAAI,aAGNpD,EAAQoD,IAAMA,EAEPpD,EFkB0C4wD,CAAkB5pE,KAAKigE,WAAYyoB,EAAM1oF,KAAKoc,IAAIysD,WAAW,UAGvG,oBACL,OAAO7oE,KAAKm2E,cAAgBn2E,KAAKm2E,YAAc,IAAI,IAA2Bn2E,KAAKigE,aAG9E,2BACL,OAAOjgE,KAAKioE,cAAc0f,mBAAmB3nF,KAAKm2E,aAG7C,kBACL,MAAM,WAAClW,GAAcjgE,KACrB,GAAIigE,EAIJ,IACEA,EAAW7jD,IAAI,SACf6jD,EAAWxK,QACX,MAAMzzD,GACNhC,KAAKoc,IAAIjR,MAAMnJ,IAIZ,yBAAyB2mF,GAC9B3oF,KAAK4oF,kBACLD,GAAc3oF,KAAKioE,cAAcrV,OAK5B,YACL,IAAIruD,EAAUvE,KAAKklF,YACnB,OAAG3gF,IAIIvE,KAAKklF,YAAcllF,KAAK6oF,oBAAoBn9D,QAAQ,KACzD1rB,KAAKklF,iBAAcjhF,KAIhB,oBAAoBoxD,GACU,SAAhCr1D,KAAK+hF,YAAYrqB,YAIpB13D,KAAK+hF,YAAY5vD,KAAKowD,KAAKC,UAAUntB,O,6EGtFzC,MAAMyzB,EAAiE,CACrEhqD,EAAG,UACHC,EAAG,UACHnK,EAAG,QACH/gB,EAAG,OACH6gB,EAAG,SAEU,SAASyQ,EAAmB5Q,EAAkBoN,GAC3D,MAAMzgB,ECVO,SAAwBqT,EAAkBw0D,EAAW,GAC9Dx0D,IACFA,EAAW,GAGb,IAAI1gB,EAA8C,GAClD,MAAMvF,EAAI,CACR,CAACywB,EAAG,EAAGgH,EAAG,KACV,CAAChH,EAAG,GAAIgH,EAAG,KACX,CAAChH,EAAG,GAAIgH,EAAG,KACX,CAAChH,EAAG,GAAIgH,EAAG,KACX,CAAChH,EAAG,EAAGgH,EAAG,MAGZ,IAAIA,EADM,EAEVz3B,EAAEvL,QAAQ,CAACm1B,EAAGxmB,KAGZ,GAFAq0B,GAAK7N,EAAE6G,EAEJxK,EAAWwR,EACZ,OAGF,MAAMijD,EAAU16E,EAAEoD,IAASpD,EAAE5L,OAAS,EAAKgP,EAAMA,EAAM,GAAGqtB,EAC1DlrB,EAAErI,KAAK,CACL+oB,SAAWA,EAAWwR,EAAIijD,EAAU,EACpC39E,KAAM6sB,EAAE6N,MAIZ,MAAM7pB,EAAMrI,EAAE/O,OAAOikF,GAAUx1E,UAC/B,IAAI,IAAIxT,EAAImc,EAAIxZ,OAAS,EAAG3C,GAAK,IAAKA,EACb,IAApBmc,EAAInc,GAAGw0B,UACRrY,EAAItE,OAAO7X,EAAG,GAIlB,OAAOmc,ED1BG+sE,CAAe10D,EAAU,GACnC,GAAGoN,EAAO,CACR,MAAMunD,EAAUhoE,EAAExZ,IAAImM,GAAK,IAAK/N,OAAOgjF,EAAwBj1E,EAAExI,OAAO,EAAM,CAACwI,EAAE0gB,YACjF,OAAO,YAAK20D,GAAS,EAAOvnD,GAG9B,MAAMwnD,EAAWjoE,EAAExZ,IAAImM,GAAK,YAAKi1E,EAAwBj1E,EAAExI,MAAO,CAACwI,EAAE0gB,YAE/D2P,EAAWjQ,SAASkO,cAAc,QAGxC,OAFA+B,EAAS7B,UAAU,YAAK8mD,GAAU,IAE3BjlD,I,wCEvBM,QAFYjQ,SAASkO,cAAc,SAAS68C,YAAY,oBAAsB,KAAa,ICD1G,MAAMoK,EAA6B,IAAIllF,IAAI,CACzC,YACA,YACA,eAGC,GACDklF,EAA2B3jF,IAAI,mBAGlB,O,6ZCAA,SAAS4jF,IACtB,MAAMC,EASF,CACFxiB,KAAM,GACNyiB,OAAQ,IAGV,OAAar5D,GAOP,EAAD,gCACH,MAAM,SAACs5D,EAAQ,YAAErhB,GAAej4C,EAC1B80B,EAAQskC,EAAOE,EAAW,SAAW,QAC3C,IAAIjlF,EAAgCygD,EAAMmjB,EAAYlS,MAAQ,QAAU,SAEpE1xD,IACFA,GAAWilF,EAAWtI,EAAA,EAAkB3Y,EAAA,GAAWJ,EAAcj4C,EAAgB7L,OAC9E8jD,EAAYlS,QAAUjR,EAAMiR,QAAOjR,EAAMiR,MAAQ1xD,EAAQmnB,QAAQ,IAAMs5B,EAAMiR,WAAQhyD,IACrFkkE,EAAYhnC,QAAU6jB,EAAM7jB,QAAO6jB,EAAM7jB,MAAQ58B,EAAQmnB,QAAQ,IAAMs5B,EAAM7jB,WAAQl9B,KAG1F,IACE,aAAaM,EAYb,MAAMyJ,GACN,MAAMA,MAKX+V,OAAeslE,gBAAkBA,E,+BCxCnB,MAAe,UAA2D,IAYvF,cACEj+B,OAAM,GAEN,MAAMq+B,EAASzpF,KAAKypF,OAASx1D,SAASkO,cAAc,OACpDsnD,EAAOplD,UAAU5+B,IAAI,eACrBgkF,EAAO7xC,MAAMkhB,QAAU,OACvB7kC,SAASy+B,KAAKrwB,OAAOonD,GAErBzpF,KAAKmpF,SAAW,IAAI9mE,IAGpB,MAAM4zC,EAAQj2D,KAAKi2D,MAAQ,IAAI6qB,MAC/B7qB,EAAMxS,UAAW,EACjBwS,EAAMjF,OAAS,EACfhxD,KAAKypF,OAAOpnD,OAAO4zB,GACnBj2D,KAAKmpF,SAAS3lF,IAAI,QAASyyD,GAE3Bj2D,KAAK8oE,iBAEL9oE,KAAKuoE,UAAY8gB,IAGnB,qBACE,QAASrpF,KAAKioE,cAAcyhB,kBAAkB,SAGhD,qBACE,QAAS1pF,KAAKioE,cAAcyhB,kBAAkB,SAMzC,iBAEL1pF,KAAKi2D,MAAM4qB,OAAOpqD,MAAMkzD,EAAA,GAInB,mBAAmBtlE,GACxB,OAAOrkB,KAAK4pF,oBAAmB,GAAM,EAAOvlE,GAGvC,mBAAmB4xC,EAAgB90B,EAAgB9c,GACxD,MAAM,cAAC4jD,GAAiBjoE,KACxB,GAAGioE,EAAe,CAChB,MAAM4hB,GAAe5zB,GAASj2D,KAAKwmE,eAC7BsjB,GAAe3oD,GAASnhC,KAAK4nF,eACnC,GAAGiC,GAAeC,EAChB,OAAO/kF,QAAQ7B,UAInB,MAAMilE,EAAsC,CAC1ClS,MAAOA,GAAS,OAAAmS,EAAA,KAChBjnC,MAAOA,GAAS,OAAAknC,EAAA,MAGlB,OAAOroE,KAAKuoE,UAAU,CACpBJ,cACA9jD,UACC9hB,KAAM+lE,IACPtoE,KAAK+pF,cAAczhB,KAIhB,gBACL,OAAOtoE,KAAKuoE,UAAU,CACpBihB,UAAU,EACVrhB,YAAa,OAAA6Y,EAAA,IAAqB,KACjCz+E,KAAM+lE,IACPtoE,KAAK+pF,cAAczhB,KAIhB,WAAWtI,GAChB,OAAOhgE,KAAKmpF,SAASrgE,IAAI,GAAKk3C,GAOzB,UACLhgE,KAAKypF,OAAOnmB,YAAc,GAC1BtjE,KAAKypF,OAAO5oE,SACZ7gB,KAAKmpF,SAAShpF,QAGdH,KAAKioE,cAAcrV,OAEnBxH,MAAMk7B,UAGD,QAAQj3D,GACbrvB,KAAKgoF,YAAY,CACf1f,OAAQj5C,EAAMm/C,QAAQ,GACtBtC,MAAO78C,EAAM68C,MACb7gE,KAAM,WAIH,qBAAqBi9D,EAAqBj9D,GAC/C,MAAM6gE,EAAQ5D,EAAO+Y,iBAAiB,GACtCrhF,KAAKgoF,YAAY,CACf1f,SACA4D,QACA7gE,KAAM,QACNg1D,OAAQh1D,GAAQ,SAIb,aAAY,OAACi9D,EAAM,MAAE4D,EAAK,KAAE7gE,EAAI,OAAEg1D,IACnCA,IACFA,EAAS,IAAc0N,UAAUzF,EAAQj9D,IAG3CrL,KAAKoc,IAAI,cAAeksD,EAAQ4D,EAAO7gE,EAAMg1D,GAE7C,MAAM2pB,EAAoB,WAAT3+E,GAEX,OAACo+E,EAAM,SAAEN,EAAQ,cAAElhB,GAAiBjoE,KAEpCiqF,EAAU/d,EAAM1kC,KAChB0iD,EAAsB,UAAZD,EAEVE,EAAkBD,EAAU7pB,EAAS4pB,EAC3C,IAAIzlD,EAAU2kD,EAASrgE,IAAIqhE,GAExBD,GACDhe,EAAM5rE,iBAAiB,QAAS,KAC9BN,KAAKoc,IAAI,mBACT+sE,EAASzlF,OAAOymF,IAEf,CAACvmC,MAAM,IAGTomC,GACD/hB,EAAc6F,SAASxF,EAAQ4D,EAAO7gE,GAGxC,MAAM++E,EAAYF,EAAU5hB,EAASL,EAAcyF,aACnD,GAAIlpC,EAuBCA,EAAQ6lD,QACT7lD,EAAQq8C,OAAOpqD,MAAMkzD,EAAA,GAKrBnlD,EAAQuiD,UAAYqD,MA7BX,CAMX,GALA5lD,EAAUvQ,SAASkO,cAAc8nD,GACjCzlD,EAAQif,UAAW,EACnBjf,EAAQuiD,UAAYqD,EACpB5lD,EAAQwsB,OAAS,EAEc,cAA3BxsB,EAAgB8lD,OAAwB,CAC1C,MAAM,eAACC,GAAkBvqF,KACtBuqF,GACA/lD,EAAgBgmD,UAAUD,GAI3BL,GAGF1lD,EAAQK,aAAa,cAAe,QACpCL,EAAQngB,OAAQ,GAHhBolE,EAAOgB,YAAYjmD,GAOrB2kD,EAAS3lF,IAAI2mF,EAAiB3lD,GAYhC,OAAO67B,EAGF,SAASh8C,GACdrkB,KAAKioE,cAAcQ,YAAYiiB,iBAAiB3nF,QAASmpE,IACpC,WAAhBA,aAAK,EAALA,EAAO1kC,QACR0kC,EAAM53B,aAAoBrwC,IAAVogB,GAAuB6nD,EAAM53B,SAAWjwB,KAKpD,cAAcikD,GACtB,GAAItoE,KAAK2qF,UAaPriB,EAAOuF,YAAY9qE,QAAQmpE,IACzB,OAAAD,EAAA,GAAUC,SAdM,CACE5D,EAAO+Y,iBACZ3+E,QACb1C,KAAK8lF,qBAAqBxd,EAAQ,QAGpC,MAAM,cAACL,EAAa,YAAEkO,GAAen2E,KACrCioE,EAAcO,UAAUF,EAAQ,SAE7B6N,GACDlO,EAAc0f,mBAAmBxR,O,6BCvO1B,SAAS/N,IACtB,MAAMD,EAAqC,CACzCyiB,aAAc,GAgBhB,MAb8D,CAC5D,mBACA,mBACA,mBAGQ7nF,QAAQ8nF,KCRL,SAA6BA,G,MAC1C,UAAiC,QAAvB,EAAS,OAAT14B,gBAAS,IAATA,eAAS,EAATA,UAAWskB,oBAAY,eAAEqU,4BAAsED,IDQpGE,CAAoBF,KAErB1iB,EAAY0iB,IAAc,KAIvB1iB,E","file":"6.3fcd156db2ca66c7e6d0.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport filterUnique from \"../../helpers/array/filterUnique\";\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { formatFullSentTimeRaw, tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { isRestricted } from \"../../helpers/restrictions\";\nimport { Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser({\n ...user, \n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n findAndSplice(users, (user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n return this.processResolvedPeer(resolvedPeer);\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return apiManager.invokeApi('contacts.resolvePhone', {phone}).then(resolvedPeer => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {_: 'userEmpty', id, pFlags: {deleted: true}, access_hash: ''} as any as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n \n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number, \n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return apiManager.invokeApi('contacts.getLocated', {\n geo_point, \n background\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then(results => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map(p => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map(p => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = RichTextProcessor.parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(RichTextProcessor.wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public isRestricted(userId: UserId) {\n const user: MTUser.user = this.getUser(userId);\n const restrictionReasons = user.restriction_reason;\n\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\nimport { getRestrictionReason } from \"../../helpers/restrictions\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText: true, onlyFirstName?: boolean, _limitSymbols?: number): string;\r\n public getPeerTitle(peerId: PeerId, plainText?: false, onlyFirstName?: boolean, _limitSymbols?: number): DocumentFragment;\r\n public getPeerTitle(peerId: PeerId, plainText: boolean, onlyFirstName?: boolean, _limitSymbols?: number): DocumentFragment | string;\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false, _limitSymbols?: number): DocumentFragment | string {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n\r\n if(_limitSymbols !== undefined) {\r\n title = limitSymbols(title, _limitSymbols, _limitSymbols);\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerInitials(peerId: PeerId) {\r\n const peer: Chat | User = this.getPeer(peerId);\r\n return RichTextProcessor.getAbbreviation(\r\n (peer as Chat.chat).title ?? [(peer as User.user).first_name, (peer as User.user).last_name].filter(Boolean).join(' ')\r\n );\r\n }\r\n\r\n public getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n const userId = (peerId as Peer.peerUser).user_id;\r\n if(userId !== undefined) {\r\n return userId.toPeerId(false);\r\n }\r\n\r\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\r\n if(chatId !== undefined) {\r\n return chatId.toPeerId(true);\r\n }\r\n\r\n return rootScope.myId; // maybe it is an inputPeerSelf\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return NULL_PEER_ID;\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? appUsersManager.isRestricted(peerId.toUserId()) : appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport rootScope from \"../rootScope\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\nimport AppStorage from \"../storage\";\nimport type DATABASE_STATE from \"../../config/databases/state\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\nimport defineNotNumerableProperties from \"../../helpers/object/defineNotNumerableProperties\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processDialogForFilters(dialog);\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, -1);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' \n // || chat._ === 'chatForbidden' \n || (chat as Chat.chat).pFlags.left \n // || (chat as any).pFlags.kicked\n ) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { DialogFilter, Update } from \"../../layer\";\nimport type { ArgumentTypes, Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { AppStateManager } from \"../appManagers/appStateManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport copy from \"../../helpers/object/copy\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear(true);\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n } else {\n this.filters = {};\n this.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => this.appPeersManager.getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { randomLong } from \"../../helpers/random\";\nimport { Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions } from \"../../layer\";\nimport { ArgumentTypes, InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\nimport './appGroupCallsManager';\nimport appGroupCallsManager from \"./appGroupCallsManager\";\nimport appReactionsManager from \"./appReactionsManager\";\nimport { getRestrictionReason, isRestricted } from \"../../helpers/restrictions\";\nimport copy from \"../../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport escapeRegExp from \"../../helpers/string/escapeRegExp\";\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport splitStringByLength from \"../../helpers/string/splitStringByLength\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n \n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true,\n sendAsPeerId: PeerId,\n }> = {}) {\n if(!text.trim()) {\n return Promise.resolve();\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n //this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n //this.log('sendText sent', message.mid);\n //if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n //assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(error);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n return Promise.all(promises).then(inputs => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n sendAsPeerId: PeerId, \n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n promise: options.groupId === undefined ? deferredPromise() : undefined\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n \n if(fromId.isUser()) {\n const userFull = appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === rootScope.myId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n // fullfillLeft();\n // resolve();\n }, (err) => {\n // fullfillLeft();\n // resolve();\n // reject(err);\n }).finally(() => {\n fullfillLeft();\n resolve();\n \n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getGroupsFirstMessage(message: Message.message): Message.message {\n if(!message.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return storage.get(minMid);\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message) {\n if((message as Message.message)?.grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(isMessage && message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id.toPeerId();\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from as MessageFwdHeader;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find(entity => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n if(isMessage && message.media) {\n let unsupported = false;\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = message.media.document;\n message.media.document = appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!message.media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n unsupported = true;\n message.media = {_: 'messageMediaUnsupported'};\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n\n if(unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed'\n ? 'missed'\n : 'cancelled'\n )\n );\n break;\n }\n \n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n \n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const isRestricted = this.isRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = this.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n }\n \n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] as string));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name));\n }\n \n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(RichTextProcessor.wrapPlainText(text, entities));\n } else {\n // let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n \n if(found) {\n RichTextProcessor.sortEntities(entities);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n ...this.getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n }\n\n public wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n }\n\n private wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = RichTextProcessor.wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n }\n\n private wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain)),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n try {\n return this.wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n this.log.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peer_id._ !== 'peerChannel' && \n message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.pFlags.out \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise {\n if(appPeersManager.isRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n return this.filterMessagesByInputFilter(inputFilter, history.map(mid => storage.get(mid)), limit);\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && \n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) || \n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(appPeersManager.isRestricted(peerId)) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0] as Message.message, message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then(messages => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private getNotifyPeerSettings(peerId: PeerId) {\n return Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: appNotificationsManager.isPeerLocalMuted(peerId, true),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = appMessagesIdsManager.generateMessageId(msg_id);\n const peerId = appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n appPeersManager.getPeerId(recentReaction.peer_id) !== rootScope.myId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions || \n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n \n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n return;\n }\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n rootScope.dispatchEvent('service_notification', update);\n return;\n }\n \n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, muteUntil: number) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(appPeersManager.isRestricted(peerId)) {\n return false;\n }\n \n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = appDownloadManager.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type && \n oldDoc.type !== 'sticker' && \n oldDoc.mime_type !== 'image/gif' && \n oldCacheContext.url\n ) {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public getMessageReactionsListAndReadParticipants(\n message: Message.message, \n limit?: number, \n reaction?: string, \n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch(err => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map(userId => userId.toPeerId());\n \n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some(reaction => appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: string}[] = messageReactionsList.reactions.map(reaction => ({peerId: appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map(readPeerId => ({peerId: readPeerId})));\n \n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(userIds => { // ! convert long to number\n return userIds.map(userId => userId.toUserId());\n });\n }\n\n public canViewMessageReadParticipants(message: Message) {\n if(\n message._ !== 'message' || \n message.pFlags.is_outgoing || \n !message.pFlags.out || \n !appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(message.peerId.toChatId());\n return chat.participants_count <= rootScope.appConfig.chat_read_mark_size_threshold && \n (tsNow(true) - message.date) < rootScope.appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(appPeersManager.isRestricted(peerId)) {\n return;\n }\n\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n\n if(options.peerReaction) {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n RichTextProcessor.fixEmoji(options.peerReaction.reaction), // can be plain heart\n notificationMessage\n ];\n \n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n \n notificationMessage = I18n.format(langPackKey, true, args);\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(options.peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const notificationFromPeerId = options.peerReaction ? appPeersManager.getPeerId(options.peerReaction.peer_id) : message.fromId;\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(notificationFromPeerId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread || options.peerReaction) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public isRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(appPeersManager.isRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n \n return {\n count: 0,\n history: slice,\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message._ === 'message' && !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E, \n callback: C, \n key: string, \n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message: Message.message | Message.messageEmpty = this.getMessageByPeer(peerIdStr.toPeerId(), +mid);\n if(message._ === 'messageEmpty') {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter(reactionCount => {\n const previousReactionCount = previousResults.find(_reactionCount => _reactionCount.reaction === reactionCount.reaction);\n return (\n message.pFlags.out && (\n !previousReactionCount || \n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.pFlags.chosen && (\n !previousReactionCount || \n !previousReactionCount.pFlags.chosen\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';//'\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n let overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach(part => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n \n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport copy from \"../../helpers/object/copy\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport { isRestricted } from \"../../helpers/restrictions\";\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n findAndSplice(chats, (chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n // || (chat as any).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: Array) {\n return apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public isRestricted(chatId: ChatId) {\n const chat: Chat.channel = this.getChat(chatId);\n const restrictionReasons = chat.restriction_reason;\n\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public getSendAs(channelId: ChatId) {\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs', \n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n appUsersManager.saveApiUsers(sendAsPeers.users);\n appChatsManager.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport limitSymbols from \"../helpers/string/limitSymbols\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean,\r\n limitSymbols?: number\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public fromName: string;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n public limitSymbols: number;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n let fromName = this.fromName;\r\n if(fromName !== undefined) {\r\n if(this.limitSymbols !== undefined) {\r\n fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols);\r\n }\r\n\r\n setInnerHTML(this.element, RichTextProcessor.wrapEmojiText(fromName));\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n setInnerHTML(this.element, appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols));\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceArrayInObject from \"../../helpers/object/safeReplaceArrayInObject\";\nimport bytesToDataURL from \"../../helpers/bytes/bytesToDataURL\";\nimport { REPLIES_HIDDEN_CHANNEL_ID } from \"../mtproto/mtproto_config\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n return bytesToDataURL(arr, mimeType);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n \n return {image: element, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.width;\n const fullHeight = windowSize.height;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto && \n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n rootScope.addEventListener('chat_full_update', (chatId) => {\n rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n rootScope.addEventListener('user_full_update', (userId) => {\n rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override) {\n return this.usersFull[id];\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n appChatsManager.saveApiChats(usersUserFull.chats, true);\n appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n //appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return fullChat as ChatFull;\n }\n }\n \n return apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n \n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n // chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n if(this.chatsFull[id] !== undefined && !override) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then(chatFull => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n \n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find(size => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...appUsersManager.getSelf(), \n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(chatId: ChatId) {\n const chat: Chat = appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[chatId];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(chatId);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n rootScope.dispatchEvent('user_full_update', userId);\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach(langCode?: string) {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n \n text = pre + text;\n \n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n \n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n \n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n \n }\n }\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport DATABASE_STATE from '../../config/databases/state';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n \n constructor() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {}; \n this.sounds = {};\n\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.resolve(apiManager.getAppConfig(overwrite)).then(appConfig => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n \n const doc = appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: rootScope.config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg',\n size: 1\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(): Promise> {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const stickerSet = this.storage.getFromCache(isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID);\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n \n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]);\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji, true);\n if(doc) {\n const soundDoc = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n appDocsManager.downloadDoc(doc),\n soundDoc ? appDocsManager.downloadDoc(soundDoc) : undefined\n ]);\n }\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets', \n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable({\n method: 'messages.getAllStickers', \n processResult: (allStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n }\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable({\n method: 'messages.getStickers', \n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if(sticker.sticker === 3 && !IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = findAndSplice(stickers, _doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!IS_WEBM_SUPPORTED) {\n return;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n const result = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker));\n promise = result.promise.then(() => {\n cacheContext.url = result.canvas.toDataURL();\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public isSavingLottiePreview(doc: MyDocument, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n return !!this.savingLottiePreview[key];\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from \"../../environment/ctx\";\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\nimport noop from \"../noop\";\r\n\r\nexport type DebounceReturnType = { \r\n (...args: Parameters): Promise>>; \r\n clearTimeout(): void; \r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n \r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport findAndSplice from \"../helpers/array/findAndSplice\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise\r\n};\r\n\r\ntype LazyLoadElement = Omit & {\r\n load: (target?: HTMLElement) => Promise,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n protected lockPromise: Promise = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return findAndSplice(this.queue, item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: () => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', (err) => {\n console.error('Render image from url failed:', err, url, loader);\n callback();\n });\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T, \n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): PromiseLike | R {\n if(values.some(value => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport callbackifyAll from \"../../helpers/callbackifyAll\";\nimport copy from \"../../helpers/object/copy\";\nimport { AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Update, Updates } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appDocsManager from \"./appDocsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appProfileManager from \"./appProfileManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n constructor() {\n rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && appDocsManager.downloadDoc(availableReaction.around_animation),\n availableReaction.static_icon && appDocsManager.downloadDoc(availableReaction.static_icon),\n availableReaction.appear_animation && appDocsManager.downloadDoc(availableReaction.appear_animation),\n availableReaction.center_icon && appDocsManager.downloadDoc(availableReaction.center_icon)\n ]);\n }\n });\n }, 7.5e3);\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n \n reaction[key] = appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter(availableReaction => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? [];\n\n const filteredChatAvailableReactions = chatAvailableReactions.map(reaction => {\n return activeAvailableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }).filter(Boolean);\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction.availableReaction[], quickReaction: AvailableReaction.availableReaction) {\n const availableReaction = findAndSplice(availableReactions, availableReaction => availableReaction.reaction === quickReaction.reaction);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction.availableReaction[] | PromiseLike, \n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n const peerId = (message.fwd_from?.channel_post && appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n apiManager.getAppConfig(),\n this.getAvailableReactions()\n ], ([appConfig, availableReactions]) => {\n return availableReactions.find(reaction => reaction.reaction === appConfig.reactions_default);\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find(availableReaction => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n peer: appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find(update => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: string, offset?: string) {\n return apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: appPeersManager.getInputPeerById(peerId),\n id: appMessagesIdsManager.getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: string) {\n return apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(value => {\n if(value) {\n const appConfig = rootScope.appConfig;\n if(appConfig) {\n appConfig.reactions_default = reaction;\n } else { // if no config or loading it - overwrite\n apiManager.getAppConfig(true);\n }\n\n rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public sendReaction(message: Message.message, reaction?: string, onlyLocal?: boolean) {\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = rootScope.myId;\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n let chosenReactionIdx = reactions ? reactions.results.findIndex((reactionCount) => reactionCount.pFlags.chosen) : -1;\n let chosenReaction = chosenReactionIdx !== -1 && reactions.results[chosenReactionIdx];\n if(chosenReaction) { // clear current reaction\n --chosenReaction.count;\n delete chosenReaction.pFlags.chosen;\n\n if(reaction === chosenReaction.reaction) {\n reaction = undefined;\n }\n\n if(!chosenReaction.count) {\n reactions.results.splice(chosenReactionIdx, 1);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n }\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(!appPeersManager.isBroadcast(message.peerId)) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionCount.reaction === reaction);\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction,\n pFlags: {}\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.pFlags.chosen = true;\n\n if(!reactions.recent_reactions && reactions.pFlags.can_see_list) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const userReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!appPeersManager.isMegagroup(peerId)) {\n reactions.recent_reactions.push(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n return (b.count - a.count) || (indexes.get(a.reaction) - indexes.get(b.reaction));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = appMessagesIdsManager.getServerMessageId(mid);\n const promise = apiManager.invokeApi('messages.sendReaction', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction\n }).then((updates) => {\n assumeType(updates);\n \n const editMessageUpdateIdx = updates.updates.findIndex(update => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }).catch(err => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReaction?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n \n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n\nconst appReactionsManager = new AppReactionsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appReactionsManager = appReactionsManager);\nexport default appReactionsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\r\nimport { MUTE_UNTIL } from \"../mtproto/mtproto_config\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n noIncrement: boolean;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n rootScope.dispatchEvent('updateNotifySettings', {\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = window.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n appStateManager.getState().then(state => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n if(!data.noIncrement) {\r\n ++this.notificationsCount;\r\n }\r\n\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n \r\n \r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport pause from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\r\n return promise;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n //if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n //}\n }\n \n return wasObject;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: Parameters[1], color: string, icon: string) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false, isBig?: boolean) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? RichTextProcessor.getAbbreviation(title) : appPeersManager.getPeerInitials(peerId);\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appAvatarsManager = appAvatarsManager);\nexport default appAvatarsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackify, R>(\n smth: T, \n callback: (result: Awaited) => R\n): PromiseLike | R {\n if(smth instanceof Promise) {\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport documentFragmentToHTML from \"../../helpers/dom/documentFragmentToHTML\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = documentFragmentToHTML(RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities}));\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT } from './sdpBuilder';\nimport { AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec } from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n \n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n \n return {\n endpoint,\n type,\n source,\n sourceGroups,\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n \n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n \n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n \n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find(entry => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n \n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map(query => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map(o => o.what));\n\n return newFoundObjs2;\n }\n}\n","export default function flatten(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n","\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n //const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d');\n context.font = font;\n }\n\n //context.font = font;\n const metrics = context.measureText(text);\n //console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n //return Math.round(metrics.width);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getTextWidth from \"../helpers/canvas/getTextWidth\";\r\nimport mediaSizes, { MediaSize } from \"../helpers/mediaSizes\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet pendingTest = false;\r\n\r\nfunction setTestQueue() {\r\n if(pendingTest) {\r\n return;\r\n }\r\n\r\n pendingTest = true;\r\n fastRaf(() => {\r\n pendingTest = false;\r\n testQueueElements();\r\n });\r\n}\r\n\r\nfunction testQueueElements() {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n}\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nfunction getElementWidth(element: HTMLElement) {\r\n const type = element.dataset.sizeType;\r\n if(type) {\r\n const mediaSize = mediaSizes.active;\r\n // @ts-ignore\r\n const size: MediaSize = mediaSize[type];\r\n return size.width;\r\n } \r\n \r\n return element.getBoundingClientRect().width;\r\n}\r\n\r\nfunction testElement(element: HTMLElement) {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = getElementWidth(element);\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = getElementWidth(element);\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = getElementWidth(element);\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n if(this.dataset.sizeType) {\r\n testElement(this);\r\n } else {\r\n testQueue.add(this);\r\n setTestQueue();\r\n }\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n testQueue.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { GroupCall, GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup, InputGroupCall, Peer, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport GroupCallInstance from \"../calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../calls/groupCallState\";\nimport createMainStreamManager from \"../calls/helpers/createMainStreamManager\";\nimport { generateSsrc } from \"../calls/localConferenceDescription\";\nimport { WebRTCLineType } from \"../calls/sdpBuilder\";\nimport StreamManager from \"../calls/streamManager\";\nimport { Ssrc } from \"../calls/types\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nlet IS_MUTED = true;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\n\nexport class AppGroupCallsManager {\n private log: ReturnType;\n \n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n \n // private audioAsset: AudioAsset;\n \n private currentGroupCall: GroupCallInstance;\n private connectionAudio: HTMLAudioElement;\n private doNotDispatchParticipantUpdate: PeerId;\n private audioAsset: AudioAssetPlayer;\n\n constructor() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n rootScope.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.hangUp(false, false, true);\n }\n\n this.participants.delete(groupCall.id);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const {currentGroupCall} = this;\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n const isCurrentGroupCall = currentGroupCall?.id === groupCallId;\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n if(isCurrentGroupCall) {\n currentGroupCall.onParticipantUpdate(participant, this.doNotDispatchParticipantUpdate);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant && this.doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach(p => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n let processUpdate = true;\n if(participant) {\n const {currentGroupCall} = this;\n const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !currentGroupCall.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = this.generateSelfVideo(currentGroupCall.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n currentGroupCall.setMuted(false);\n }\n\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n }\n\n rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : appPeersManager.getPeerId(participant.peer);\n const updates = await apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: appGroupCallsManager.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? appPeersManager.getInputPeerSelf() : appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n if(!processUpdate) this.doNotDispatchParticipantUpdate = appPeersManager.getPeerId(participant.peer);\n apiUpdatesManager.processUpdateMessage(updates);\n if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n appUsersManager.saveApiUsers(groupCall.users);\n appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n \n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n \n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n rootScope.dispatchEvent('group_call_instance', groupCall);\n }\n /* TdLibController.clientUpdate({\n '@type': 'clientUpdateGroupCall',\n call\n }); */\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await apiManager.invokeApi('phone.createGroupCall', {\n peer: appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n \n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n \n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\n }\n\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n \n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n \n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n \n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n \n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n \n case 'completed': {\n break;\n }\n \n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n \n this.getGroupCallParticipants(groupCallId).then(({participants}) => {\n this.saveApiParticipants(groupCallId, [...participants.values()]);\n });\n }\n \n break;\n }\n \n case 'disconnected': {\n break;\n }\n \n case 'failed': {\n //TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n \n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n \n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n public generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n }\n \n public generateSelfParticipant(): GroupCallParticipant {\n const mainSources = this.currentGroupCall.connections.main.sources;\n const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n return {\n _: 'groupCallParticipant',\n pFlags: {\n can_self_unmute: true,\n self: true\n },\n source: mainSources.audio.source,\n video: this.generateSelfVideo(mainSources.video),\n presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n date: tsNow(true),\n peer: appPeersManager.getOutputPeer(rootScope.myId)\n };\n }\n\n public makeSsrcsFromParticipant = (participant: GroupCallParticipant) => {\n return [\n this.makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && this.makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && this.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n };\n\n public makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n appChatsManager.saveApiChats(groupCallParticipants.chats);\n appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public async hangUp(groupCallId: GroupCallId, discard = false, rejoin = false) {\n this.log(`hangUp start id=${groupCallId} discard=${discard} rejoin=${rejoin}`);\n const {currentGroupCall} = this;\n if(currentGroupCall?.id !== groupCallId) return;\n\n currentGroupCall.hangUp(discard, rejoin);\n }\n\n public toggleMuted(muted?: boolean) {\n return this.changeUserMuted(NULL_PEER_ID, muted);\n }\n \n public changeUserMuted(peerId: PeerId, muted?: boolean) {\n const {currentGroupCall} = this;\n if(!currentGroupCall) return;\n\n const participant = currentGroupCall.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(currentGroupCall.id, participant, {muted});\n }\n}\n\nconst appGroupCallsManager = new AppGroupCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appGroupCallsManager = appGroupCallsManager);\nexport default appGroupCallsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../constants\";\nimport StreamManager from \"../streamManager\";\nimport getAudioConstraints from \"./getAudioConstraints\";\nimport getStream from \"./getStream\";\nimport getVideoConstraints from \"./getVideoConstraints\";\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n \n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","export default function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\n const sortProperty: number = element[property];\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n \n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= array[len - 1][property]) {\n return array.push(element) - 1;\n } else if(sortProperty >= array[0][property]) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > array[i][property]) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport copy from \"../../helpers/object/copy\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\r\n","import simulateEvent from \"../../../helpers/dom/dispatchEvent\";\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { fixMediaLineType, WebRTCLineType } from './sdpBuilder';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach(track => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find(item => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter(x => x.type === 'input');\n const audioItems = filteredItems.filter(x => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n rootScope.dispatchEvent('group_call_amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach(track => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n \n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map(type => {\n return [\n type, \n /* type === 'video' || type === 'screencast' ? \n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry(entry => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find(transceiver => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex(track => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch(err => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach(track => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\n","export default function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport compareValue from \"./compareValue\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number | string;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n // new(...items: T[]): Slice;\r\n new(length: number): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as ItemType[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: T[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: T[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(compareValue(slice[0], s[0]) === 1) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: T) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: T) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; ++offset) {\r\n if(compareValue(maxId, slice[offset]) >= 0) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: T[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: T[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: T) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","import compareLong from \"./long/compareLong\";\n\nexport default function compareValue(val1: string | number, val2: typeof val1) {\n if((val1 as number).toExponential) {\n const diff = (val1 as number) - (val2 as number);\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n return compareLong(val1 as string, val2 as string);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function compareLong(str1: string, str2: string) {\n const str1Length = str1.length;\n if(str1Length !== str2.length) {\n const diff = str1Length - str2.length;\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n const maxPartLength = 15;\n for(let i = 0; i < str1Length; i += maxPartLength) {\n const v1 = +str1.slice(i, i + maxPartLength);\n const v2 = +str2.slice(i, i + maxPartLength);\n const diff = v1 - v2;\n if(diff) {\n return diff;\n }\n }\n\n return 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { ArgumentTypes } from \"../types\";\r\n\r\ntype HeavyQueue> = {\r\n items: ArgumentTypes[], \r\n process: (...args: any[]) => ReturnType,\r\n context: any,\r\n promise?: CancellablePromise[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]) as typeof promise;\r\n }\r\n \r\n const promise = queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk>(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([] as any);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: ReturnType[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: typeof results[0];\r\n // @ts-ignore\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!IS_CANVAS_FILTER_SUPPORTED) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(\r\n img: HTMLImageElement, \r\n radius: number, \r\n iterations: number, \r\n canvas: HTMLCanvasElement = document.createElement('canvas')\r\n) {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(IS_CANVAS_FILTER_SUPPORTED) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\r\nconst cache: Map = new Map();\r\nconst CACHE_SIZE = 150;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n throw 'no dataUri for blur: ' + dataUri;\r\n }\r\n\r\n if(cache.size > CACHE_SIZE) {\r\n cache.clear();\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.className = 'canvas-thumbnail';\r\n \r\n let cached = cache.get(dataUri);\r\n if(!cached) {\r\n const promise: CacheValue['promise'] = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n // if(IS_CANVAS_FILTER_SUPPORTED) {\r\n // resolve(processBlurNext(img, radius, iterations));\r\n // } else {\r\n const promise = addHeavyTask({\r\n items: [[img, radius, iterations, canvas]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift');\r\n \r\n promise.then(() => {\r\n resolve();\r\n });\r\n // }\r\n };\r\n img.src = dataUri;\r\n });\r\n });\r\n \r\n cache.set(dataUri, cached = {\r\n canvas,\r\n promise\r\n });\r\n } else {\r\n canvas.width = cached.canvas.width;\r\n canvas.height = cached.canvas.height;\r\n cached.promise.then(() => {\r\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\r\n });\r\n }\r\n\r\n return {\r\n ...cached,\r\n canvas\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from \"../config/latinizeMap\";\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n й: 'q',\n ц: 'w',\n у: 'e',\n к: 'r',\n е: 't',\n н: 'y',\n г: 'u',\n ш: 'i',\n щ: 'o',\n з: 'p',\n х: '[',\n ъ: ']',\n ф: 'a',\n ы: 's',\n в: 'd',\n а: 'f',\n п: 'g',\n р: 'h',\n о: 'j',\n л: 'k',\n д: 'l',\n ж: ';',\n э: '\\'',\n я: 'z',\n ч: 'x',\n с: 'c',\n м: 'v',\n и: 'b',\n т: 'n',\n ь: 'm',\n б: ',',\n ю: '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join(\".\");\n}\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n // delete apiWebPage.description\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public wrapTitle(webPage: WebPage.webPage) {\r\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n return RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n }\r\n\r\n public wrapDescription(webPage: WebPage.webPage) {\r\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\r\n // const siteName = webPage.site_name;\r\n // let contextHashtag = '';\r\n // if(siteName === 'GitHub') {\r\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n // if(matches) {\r\n // contextHashtag = matches[0] + '/issues/{1}';\r\n // }\r\n // }\r\n return RichTextProcessor.wrapRichText(shortDescriptionText/* , {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n } */);\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\r\n if(html instanceof DocumentFragment) return html;\r\n const template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n \n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach(x => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport LocalConferenceDescription, { ConferenceEntry } from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport { GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n \n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n \n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach(ssrcGroup => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n \n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n \n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n \n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map(type => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`,\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n \n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach(hdrext => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n \n payloadTypes.forEach(type => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n \n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n \n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach(fb => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n \n public addConference(options: {\n conference: LocalConferenceDescription, \n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean, \n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n \n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find(line => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map(section => section.lines))\n .map(line => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach(str => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter(line => line.key === 'o').map(line => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach(lineStr => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach(ssrc => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport appStickersManager from \"../appManagers/appStickersManager\";\nimport { Photo } from \"../../layer\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \"../sdp\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { toTelegramSource } from \"../utils\";\nimport { parseSourceGroups } from \"./parseSourceGroups\";\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n fingerprint: true,\n setup: true,\n ssrc: true,\n mid: true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find(line => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipantVideoSourceGroup } from \"../../../layer\";\nimport { toTelegramSource } from \"../utils\";\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map(str => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map(ssrc => +ssrc)\n sources: rest.map(ssrc => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex(g => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n //const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach(name => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker : Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.createObjectURL(dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\n(window as any).IS_WEBM_SUPPORTED = IS_WEBM_SUPPORTED;\nexport default IS_WEBM_SUPPORTED;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key \n * @param wasObject \n * @param newObject \n */\n export default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n \n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamConstraints = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n \n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { Updates, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, JoinGroupCallJsonPayload } from \"../appManagers/appGroupCallsManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport GroupCallInstance from \"./groupCallInstance\";\nimport filterServerCodecs from \"./helpers/filterServerCodecs\";\nimport fixLocalOffer from \"./helpers/fixLocalOffer\";\nimport processMediaSection from \"./helpers/processMediaSection\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({ \n iceServers: [], \n iceTransportPolicy: 'all', \n bundlePolicy: 'max-bundle', \n rtcpMuxPolicy: 'require', \n iceCandidatePoolSize: 0, \n // sdpSemantics: \"unified-plan\", \n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach(type => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map(section => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n let promise: Promise;\n const audioChannel = processedChannels.find(channel => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find(channel => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach(entry => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n \n const groupCallInput = appGroupCallsManager.getGroupCallInput(groupCallId);\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n \n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer, \n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter(media => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n \n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n \n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find(section => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle, \n entries, \n isAnswer\n })\n };\n\n entriesToDelete.forEach(entry => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find(transceiver => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n \n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n \n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { DataJSON } from \"../../../layer\";\nimport { JoinGroupCallJsonPayload } from \"../../appManagers/appGroupCallsManager\";\nimport SDP from \"../sdp\";\nimport { Ssrc } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n fingerprints: [sectionInfo.fingerprint],\n pwd: sectionInfo.pwd,\n ssrc: sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n ufrag: sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params, \n source: sectionInfo.source, \n media, \n sourceGroups: sectionInfo.sourceGroups, \n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { UpdateGroupCallConnectionData, Codec } from \"../types\";\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map(data => {\n return */['audio' as const, 'video' as const].filter(type => data[type]).map(type => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find(line => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec[\"rtp-hdrexts\"], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport copy from \"../../../helpers/object/copy\";\nimport { ConferenceEntry } from \"../localConferenceDescription\";\nimport { parseSdp, addSimulcast } from \"../sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"../sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find(line => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map(payload => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCall, GroupCallParticipant, Updates } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, GroupCallId, GroupCallOutputSource } from \"../appManagers/appGroupCallsManager\";\nimport appPeersManager from \"../appManagers/appPeersManager\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport CallInstanceBase, { TryAddTrackOptions } from \"./callInstanceBase\";\nimport GroupCallConnectionInstance from \"./groupCallConnectionInstance\";\nimport GROUP_CALL_STATE from \"./groupCallState\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getScreenStream from \"./helpers/getScreenStream\";\nimport getStream from \"./helpers/getStream\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription from \"./localConferenceDescription\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n \n // will be set with negotiation\n public joined: boolean;\n \n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections']\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : this.participants.get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => appGroupCallsManager.toggleMuted());\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return appGroupCallsManager.editParticipant(this.id, this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise || (this.startScreenSharingPromise = this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n }));\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: appGroupCallsManager.getGroupCallInput(this.id)\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise || (this.startVideoSharingPromise = this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n }));\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let promise: Promise;\n const groupCallInput = appGroupCallsManager.getGroupCallInput(this.id);\n\n if(discard) {\n this.log(`[api] discardGroupCall id=${this.id}`);\n promise = apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(this.joined) {\n this.log(`[api] leaveGroupCall id=${this.id}`);\n const connectionInstance = this.connections.main;\n promise = apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: connectionInstance.sources.audio.source\n });\n } else {\n this.log(`[api] id=${this.id} payload=null`);\n promise = apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n \n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n const participant = this.participants.get(entry.peerId);\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n }\n\n return source;\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = appGroupCallsManager.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : appGroupCallsManager.makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach(oldSsrc => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find(ssrc => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport { logger } from \"../logger\";\nimport createDataChannel from \"./helpers/createDataChannel\";\nimport createPeerConnection from \"./helpers/createPeerConnection\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map(d => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from \"./getScreenStream\";\nimport getStream from \"./getStream\";\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true, \n constraints: DisplayMediaStreamConstraints,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints, \n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then(stream => out.audio = stream),\n constraints.video && cache.video.then(stream => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\nimport noop from \"../../helpers/noop\";\nimport { logger } from \"../logger\";\nimport getAudioConstraints from \"./helpers/getAudioConstraints\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getStreamCached from \"./helpers/getStreamCached\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager, { StreamItem } from \"./streamManager\";\n\nexport type TryAddTrackOptions = {\n stream: MediaStream, \n track: MediaStreamTrack, \n type: StreamItem['type'], \n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n \n return this.getStream({\n constraints, \n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0], \n track: event.track, \n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream, \n track, \n type: 'input', \n source: type || 'main'\n });\n }\n \n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n \n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n \n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n \n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n \n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach(track => {\n stopTrack(track);\n });\n }\n }\n}\n","import constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../../environment/constraintSupport\";\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach(constraint => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean, \n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/61.6db21d20aefa6b93eca2.chunk.js b/public/61.6db21d20aefa6b93eca2.chunk.js new file mode 100644 index 000000000..45f48fd5a --- /dev/null +++ b/public/61.6db21d20aefa6b93eca2.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var t,e,n,r,a,o,f={2061:(t,e,n)=>{let r,a;const o=null;function f(t){return JSON.parse(JSON.stringify(t))}function c(t,e,n,a,o){for(r=0;r=0;--n)e=f(d(t[n],e));return e}function g(t){if(!t)throw Error("assert :P")}const P=function(){function t(t){return t==Ee||t==je||t==Ce||t==Fe}function e(t){return A(t,1)}function n(t,e){const n=1+((t.la-1)*e>>8),r=n<<8;let a=0;for(t.Z>=r?(a=1,t.la-=n,t.Z-=r):(a=0,t.la=n);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return a}function P(t,e,n,r){(r-=n)>=2?(t.Z=e[n+0]<<8|e[n+1],t.qa=e,t.Ia=n+2,t.bc=r-2):(t.Z=0,t.qa=o,t.bc=0),t.la=255,t.gc=0}function A(t,e){var r=0,a=0;for(a=e-1;a>=0;a--)r|=n(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function S(t){t.g>=8&&w(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function T(t,e){let n=0;if(g(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return n;n=t.T>>t.g&fn[e],t.g+=e,t.g>=8&&t.g>=8&&w(t)}else t.fa=1;return n}function y(t){return t.Pa==t.gb}function R(t,e){return g(t!=o),0==e?0:(t.gb=2*e-1,t.Y=p(t.gb,En),t.Y==o?0:(t.Y[0].s=-1,t.Pa=1))}function V(t){t!=o&&(t.Y=o,t.Y=o,t.gb=0,t.Pa=0)}function O(t,e,n,r){for(var a=t.Y,o=0,f=+t.gb;r-- >0;){if(o>=f)return 0;if(a[o].s<0){if(y(t))return 0;const e=t,n=e.Y,r=+e.Pa;a[o].s=r-o,e.Pa+=2,n[r+0].s=-1,n[r+1].s=-1}else if(0==a[o].s)return 0;o+=a[o].s+(n>>r&1)}if(a[o].s<0)a[o].s=0;else if(0!=a[o].s)return 0;return a[o].kc=e,1}function I(t,e,n){var r=0;let a=0,f=0;for(g(t!=o),g(e!=o),r=0;r0&&(++a,f=r);if(!R(t,a))return 0;if(1==a)return f<0||f>=n?(V(t),0):O(t,f,0,0);if(a=0,f=d(n,0),f==o)return(a=a&&y(t))||V(t),a;var c=0;c=0,r=d(gn+1,0);let i=0;const u=d(gn+1,0);let b=0;for(g(e!=o),g(n>0),g(f!=o),c=0;cb&&(b=e[c]);if(b>gn)r=0;else{for(c=0;c0?u[e[c]]++:Cn;r=1}if(!r)return(a=a&&y(t))||V(t),a;for(r=0;r0&&!O(t,r,f[r],e[r]))return(a=a&&y(t))||V(t),a;return(a=y(t))||V(t),a}function _(t,e,n,r,a,o,f){var c=0;for(c=0;ct.P.v)&&(n=0==e)){t:{let e=t.Ga;var a=t.G,i=t.ub;n=t.P.l;let h=t.P.v;const p=t.Xb;var u=[o];let v=o,P=h*n;var b=o,s=o;s="WEBP_FILTER_TYPE";let A=0;u=0;var l=0;let k=0;if(g(n>0&&h>0&&r>=n),g(e!=o&&p!=o),i<=yn)n=0;else if(k=e[a+0]>>0&3,s=e[a+0]>>2&3,A=e[a+0]>>4&3,u=e[a+0]>>6&3,kVn||s>=Tr||A>On||0!=u)n=0;else{if(k==Rn)l=i>=P,u=e,v=a+yn;else{if(u=d(P,0),v=0,u==o){n=0;break t}l=a+yn,i-=yn,a=u,b=f(tn);let t=0;const r=qt();r==o?l=0:(r.l=n,r.v=h,r.N=b,st(Oe),b.put=Pe,b.Mb=ge,b.Pb=Ae,b.ka=o,b.ka=a,b.fd=0,b.width=n,b.height=h,r.a=ze,m(r.o,e,l,i),r.Wa=Ar,Jt(n,h,1,r,o)&&Yt(r,n)&&(r.Wa=Pr,t=Ht(r,r.V,r.Ha,r.l,r.v,xt)),r!=o&&Kt(r),l=t)}if(l){for(e=yr[s],e!=o?(b=d(P,0),b==o&&(l=0,k!=Rn&&(v=u=o)),e(u,v,n,h,1,n,b,s=0),P=b,k=s):(P=u,k=v),e=0;h-- >0;)c(p,e,P,k,n),k+=n,e+=r;A==On&&(l=u==o||v<=0||n<=0?0:1)}n=l}}n=!n}return n?o:0==e?t.Xb:+e*r}function U(t,e,n,r){if(r==o||t<=0||e<=0)return Ke;if(n!=o){if(n.Ua){const r=n.wc,a=n.vc,o=-2&n.t,f=-2&n.k;if(o<0||f<0||r<=0||a<=0||o+r>t||f+a>e)return Ke;t=r,e=a}if(n.I){if(n.Ba<=0||n.Aa<=0)return Ke;t=n.Ba,e=n.Aa}}return r.width=t,r.height=e,function(t){let e=t.width;const n=t.height;let r=t.J;if(e<=0||n<=0||!(r>=Ie&&r=Ie&&f=c*Rr[f],r&=t.ma!=o):(u=(t=t.c.Va).nb*parseInt((i+1)/2,10),b=t.rb*parseInt((i+1)/2,10),s=t.Fa*i,r&=t.F*i<=t.Wc,r&=u<=t.Rc,r&=b<=t.Uc,r&=s<=t.Wb,r&=t.F>=c,r&=t.nb>=parseInt((c+1)/2,10),r&=t.rb>=parseInt((c+1)/2,10),r&=t.y!=o,r&=t.c!=o,r&=t.S!=o,f==Ne&&(r&=t.Fa>=c,r&=s<=t.Wb,r&=t.p!=o)):r=0,r?ze:Ke}(r)}function M(t){return-256&t?t<0?0:255:t}function B(t,e,n,r){const a=d(16,0);let o,f;for(o=0,f=0;f<4;++f){var c=t[e+0]+t[e+8],i=t[e+0]-t[e+8],u=(t[e+4]*Br>>16)-(t[e+12]*Mr>>16),b=(t[e+4]*Mr>>16)+(t[e+12]*Br>>16);a[o+0]=c+b,a[o+1]=i+u,a[o+2]=i-u,a[o+3]=c-b,o+=4,e++}for(f=o=0;f<4;++f)c=(t=a[o+0]+4)+a[o+8],i=t-a[o+8],u=(a[o+4]*Br>>16)-(a[o+12]*Mr>>16),b=(a[o+4]*Mr>>16)+(a[o+12]*Br>>16),n[r+0+0*nr]=M(n[r+0+0*nr]+(c+b>>3)),n[r+1+0*nr]=M(n[r+1+0*nr]+(i+u>>3)),n[r+2+0*nr]=M(n[r+2+0*nr]+(i-u>>3)),n[r+3+0*nr]=M(n[r+3+0*nr]+(c-b>>3)),o++,r+=nr}function D(t,e,n,r,a){B(t,e,n,r),a&&B(t,e+16,n,r+4)}function E(t,e,n,r){Cr(t,e+0,n,r+0,1),Cr(t,e+32,n,r+4*nr,1)}function C(t,e,n,r){let a;for(t=t[e+0]+4,a=0;a<4;++a)for(e=0;e<4;++e)n[r+e+a*nr]=M(n[r+e+a*nr]+(t>>3))}function F(t,e,n,r){t[e+0]&&C(t,e+0,n,r+0),t[e+16]&&C(t,e+16,n,r+4),t[e+32]&&C(t,e+32,n,r+4*nr),t[e+48]&&C(t,e+48,n,r+4*nr+4)}function G(t,e,n){const r=e-nr,a=Wr,o=255-t[r-1];let f;for(f=0;f>2}function H(t,e,n){let r,a;for(r=0;r<8;++r)for(a=0;a<8;++a)e[n+a+r*nr]=t}function z(t,e,n){const r=t[e-n],a=t[e+0],o=3*(a-r)+Ir[1020+t[e-2*n]-t[e+n]],f=_r[112+(o+4>>3)];t[e-n]=Wr[255+r+_r[112+(o+3>>3)]],t[e+0]=Wr[255+a-f]}function q(t,e,n,r){const a=t[e+0],o=t[e+n];return Vr[255+t[e-2*n]-t[e-n]]>r||Vr[255+o-a]>r}function K(t,e,n,r,a){const o=t[e-3*n],f=t[e-2*n],c=t[e-n],i=t[e+0],u=t[e+n],b=t[e+2*n],s=t[e+3*n];return 2*Vr[255+c-i]+Or[255+f-u]>r?0:Vr[255+t[e-4*n]-o]<=a&&Vr[255+o-f]<=a&&Vr[255+f-c]<=a&&Vr[255+s-b]<=a&&Vr[255+b-u]<=a&&Vr[255+u-i]<=a}function J(t,e,n,r){let a;for(a=0;a<16;++a)2*Vr[255+t[e+a-n]-t[e+a+0]]+Or[255+t[e+a-2*n]-t[e+a+n]]<=r&&z(t,e+a,n)}function Y(t,e,n,r){let a;for(a=0;a<16;++a)2*Vr[255+t[e+a*n-1]-t[e+a*n+0]]+Or[255+t[e+a*n-2]-t[e+a*n+1]]<=r&&z(t,e+a*n,1)}function x(t,e,n,r){let a;for(a=3;a>0;--a)J(t,(e+=4*n)+0,n,r)}function Q(t,e,n,r){let a;for(a=3;a>0;--a)Y(t,(e+=4)+0,n,r)}function $(t,e,n,r,a,o,f,c){for(;a-- >0;){if(K(t,e+0,n,o,f))if(q(t,e+0,n,c))z(t,e+0,n);else{const r=t,a=e+0,o=n,f=r[a-2*o],c=r[a-o],u=r[a+0],b=r[a+o],s=r[a+2*o];var i=Ir[1020+3*(u-c)+Ir[1020+f-b]];const l=27*i+63>>7,h=18*i+63>>7;i=9*i+63>>7,r[a-3*o]=Wr[255+r[a-3*o]+i],r[a-2*o]=Wr[255+f+h],r[a-o]=Wr[255+c+l],r[a+0]=Wr[255+u-l],r[a+o]=Wr[255+b-h],r[a+2*o]=Wr[255+s-i]}e+=r}}function X(t,e,n,r,a,o,f,c){for(;a-- >0;){if(K(t,e+0,n,o,f))if(q(t,e+0,n,c))z(t,e+0,n);else{const r=t,a=e+0,o=n,f=r[a-o],c=r[a+0],u=r[a+o];var i=3*(c-f);const b=_r[112+(i+4>>3)];i=_r[112+(i+3>>3)];const s=b+1>>1;r[a-2*o]=Wr[255+r[a-2*o]+s],r[a-o]=Wr[255+f+i],r[a+0]=Wr[255+c-b],r[a+o]=Wr[255+u-s]}e+=r}}function Z(t,e,n,r,a,o){$(t,e+0,n,1,16,r,a,o)}function tt(t,e,n,r,a,o){$(t,e+0,1,n,16,r,a,o)}function et(t,e,n,r,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4*n)+0,n,1,16,r,a,o)}function nt(t,e,n,r,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4)+0,1,n,16,r,a,o)}function rt(t,e,n,r,a,o,f,c){$(t,e,a,1,8,o,f,c),$(n,r,a,1,8,o,f,c)}function at(t,e,n,r,a,o,f,c){$(t,e,1,a,8,o,f,c),$(n,r,1,a,8,o,f,c)}function ot(t,e,n,r,a,o,f,c){X(t,e+4*a,a,1,8,o,f,c),X(n,r+4*a,a,1,8,o,f,c)}function ft(t,e,n,r,a,o,f,c){X(t,e+4,1,a,8,o,f,c),X(n,r+4,1,a,8,o,f,c)}function ct(t,e){return e==Gn?0==t.i?0==t.d?Jn:Kn:0==t.d?qn:Gn:e}function it(t,e,n,a){for(r=0;r<4;++r)t[e+r]=n[a+r]}function ut(t,e){return t<0?0:t>e?e:t}function bt(t){t.a="VP8_STATUS_OK",t.xc="OK"}function st(t){t>>>8!=Oe>>>8&&alert("mismatch error")}function lt(t,e,n){return t.a==ze&&(t.a=e,t.xc=n,t.za=0),0}function ht(t,a){let c=[0],i=0;var u=[0],b=f(cr),s=f(ir);let l=f(rn);if(u="VP8StatusCode",b=f(nn),t==o)return alert("(dec == null)"),0;if(bt(t),a==o)return lt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(b.data=a.data,b.b=a.b,b.e=a.e,b.b=[b.b],b.e=[b.e],(u=Se(b=[b]))!=ze)return lt(t,u,"Incorrect/incomplete header.");if((b=b[0]).b=b.b[0],b.e=b.e[0],b.ia)return lt(t,Je,"Unexpected lossless format encountered.");if(t.Ga==o&&(g(0==t.ub),t.Ga=b.$,t.G=b.G,t.ub=b.pa),i=b.data,c=b.b+b.offset,u=b.e-b.offset,g(b.e>=b.offset),u[0]<4)return lt(t,$e,"Truncated header.");if(l=i[c+0]|i[c+1]<<8|i[c+2]<<16,(b=t.Ac).fb=!(1&l)+0,b.Jc=l>>1&7,b.Nc=l>>4&1,b.Ra=l>>5,b.Jc>3)return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!b.Nc)return lt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(c+=3,u-=3,s=t.P,b.fb){if(u<7)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(u>=3&&157==i[c+0]&&1==i[c+1]&&42==i[c+2]))return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(s.l=16383&(i[c+4]<<8|i[c+3]),s.gd=i[c+4]>>6,s.v=16383&(i[c+6]<<8|i[c+5]),s.hd=i[c+6]>>6,c+=7,u-=7,t.Ma=s.l+15>>4,t.hb=s.v+15>>4,a.width=s.l,a.height=s.v,a.I=0,a.Ua=0,a.k=0,a.t=0,a.Ka=a.width,a.K=a.height,a.m=a.width,a.h=a.height,l=t.R,r=0;ru)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");l=t.o,P(l,i,c,c+b.Ra),c+=b.Ra,u-=b.Ra,b.fb&&(s.uc=e(l),s.$c=e(l)),s=l;var h=t.Ca;let d=t.R;if(g(s!=o),g(h!=o),h.pb=e(s),h.pb){if(h.ob=e(s),e(s)){var p;for(h.tb=e(s),p=0;p0)if(t.Ca.pb)for(d=0;du&&(w=s),P(t.ic[+m],d,p,S),d=w,p=S,h+=3}P(t.ic[+v],d,p,u),u=p0){t.yb[w]=t.yb[0];continue}S=u}const e=t.yb[w];e.sc[0]=oa[ut(S+s,127)],e.sc[1]=fa[ut(S+0,127)],e.sb[0]=2*oa[ut(S+h,127)],e.sb[1]=101581*fa[ut(S+d,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=oa[ut(S+p,117)],e.qc[1]=fa[ut(S+v,127)]}if(!b.fb)return lt(t,Ye,"Not a key frame.");for(t.Zc=259,e(l),u=t.R,s=0;s0)+0],16==o||!n(t,c[0]))return o}else c=e[sa[o]][0];if(16==o)return 16}}function pt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*va&4278190080)>>e}function vt(t,e){let a,f=0;if(t==o)return 0;if(e==o)return lt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ht(t,e))return 0;if(g(t.za),e.Mb&&!e.Mb(e))lt(t,Qe,"Frame setup failed"),a=t.a;else{e.Za&&(t.A=0);const n=ea[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-n>>4,t.mb=e.k-n>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+n>>4,t.wb=e.Ka+15+n>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),a=ze}if(f=a==ze){if(f){let n,r;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){n=lt(t,qe,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?na:na-1}else t.jb=ra;n=1}if(!(r=!n)){let e;t:{const n=t.jb,r=t.Ma,a=4*r,f=32*r,c=r+1,i=t.A>0?r*(t.qb?2:1):0,s=rr,l=f*(16*n+parseInt(3*ea[t.A]/2,10)),h=t.Ga!=o?t.P.l*t.P.v:0,p=a+f+c+i+s+384+l+h+ta;if(p!=p)e=0;else{if(p>t.Gb){if(t.ib=0,t.Gb=0,t.ib==o){e=lt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=p}t.dc=205,t.Xc=b(205,16*r),t.Sc=b(205,8*r),t.Vc=b(205,8*r),t.M=i?u(lr,i):o,t.Sd=i?0:o,t.oa.ha=0,t.oa.M=t.M,g(0==(s&ta)),t.Ea=b(205,1*s),t.z=-12851,t.H=16*r,t.r=8*r;const f=ea[t.A],v=f*t.H,P=f/2*t.r;t.ca=d(l,205),t.da=+v,t.aa=t.ca,t.ba=t.da+16*n*t.H+P,t.ra=t.aa,t.sa=t.ba+8*n*t.r+P,t.Xb=h?d(h,0):o,t.La=u(hr,c),t.dc=b(Gn,a),e=1}}r=!e}if(r)f=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=o,e.q=o,!Ur){let t;for(t=-255;t<=255;++t)Vr[255+t]=t<0?-t:t,Or[255+t]=Vr[255+t]>>1;for(t=-1020;t<=1020;++t)Ir[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)_r[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)Wr[255+t]=t<0?0:t>255?255:t;Ur=1}Cr=D,Fr=E,Gr=C,Nr=F,Lr=Z,Hr=tt,zr=rt,qr=at,Kr=et,Jr=nt,Yr=ot,xr=ft,Qr=J,$r=Y,Xr=x,Zr=Q,f=1}}if(f)t:{for(t.d=0;t.d0&&u.d>=u.mb&&u.d<=u.Ya)+0,t.i=0;t.i0);A=-k,W[W[W.length-1]+P]=A,h[p]=A,p++}D[v]=A}}else{for(A=n(u,156)?n(u,128)?zn:Hn:n(u,163)?Ln:Nn,e.Eb[0]=A,k=0;k<4;++k)W[k+W[W.length-1]]=A;for(k=0;k<4;++k)D[k]=A}if(e.Tc=n(u,142)?n(u,114)?n(u,183)?zn:Hn:Ln:Nn,u.Ab)s=0;else{if(g.Nb)l.X=g.X=0,e.wa||(l.ua=g.ua=0),e.ja=0,e.Oa=0;else{let t=0,n=0;var m=0,w=da;const r=e.yb[e.Lb];var S=e.z;const a=e.La[0],f=d(4,0),c=d(4,0);let u=d(4,0),s=d(4,0),l=0,h=0;var T=0;let p=0,v=0;if(S=b(0,384),e.wa)m=0,w=e.R.z[3];else{const t=d(16,0);var y=g.ua+a.ua;g.ua=a.ua=(dt(o,e.R.z[1],y,r.sb,0,t)>0)+0,m=1,w=e.R.z[0];var R=t,V=S,O=d(16,0),I=0;for(I=0;I<4;++I){var _=R[0+I]+R[12+I],U=R[4+I]+R[8+I],M=R[4+I]-R[8+I],B=R[0+I]-R[12+I];O[0+I]=_+U,O[8+I]=_-U,O[4+I]=B+M,O[12+I]=B-M}for(I=0;I<4;++I){const t=V[V.length-1],e=O[0+4*I]+3;_=e+O[3+4*I],U=O[1+4*I]+O[2+4*I],M=O[1+4*I]-O[2+4*I],B=e-O[3+4*I],V[t+0]=_+U>>3,V[t+16]=B+M>>3,V[t+32]=_-U>>3,V[t+48]=B-M>>3,V[V.length-1]+=64}S[S.length-1]=0}for(u=i(pa[15&g.X]),s=i(pa[15&a.X]),p=0;p<4;++p){var j=s[p];for(T=0;T<4;++T){y=j+u[T];var G=dt(o,w,y,r.sc,m,S);u[T]=j=(G>0)+0,c[T]=(0!=S[S[S.length-1]+0])+0,f[T]=(G>1)+0,S[S.length-1]+=16}s[p]=j,h|=pt(c,24-4*p),l|=pt(f,24-4*p)}for(t=pt(u,24),n=pt(s,24),u=i(pa[g.X>>4]),s=i(pa[a.X>>4]),v=0;v<4;v+=2){for(p=0;p<2;++p){for(j=s[v+p],T=0;T<2;++T)y=j+u[v+T],G=dt(o,e.R.z[2],y,r.qc,0,S),u[v+T]=j=(G>0)+0,c[2*p+T]=(0!=S[S[S.length-1]+0])+0,f[2*p+T]=(G>1)+0,S[S.length-1]+=16;s[v+p]=j}h|=pt(c,8-2*v),l|=pt(f,8-2*v)}t|=pt(u,20),n|=pt(s,20),g.X=t,a.X=n,e.z=S,e.Oa=l+0,e.ja=l|h,g.Nb=!e.ja+0}s=!o.Ab}if(!s){f=lt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const E=t,C=E.Ea,F=ar,J=E.Ea,Y=or,x=E.Ea,Q=fr;if(E.i>0){var N=0;for(N=-1;N<16;++N)it(C,F+N*nr-4,C,F+N*nr+12);for(N=-1;N<8;++N)it(J,Y+N*nr-4,J,Y+N*nr+4),it(x,Q+N*nr-4,x,Q+N*nr+4)}else{for(N=0;N<16;++N)C[F+N*nr-1]=129;for(N=0;N<8;++N)J[Y+N*nr-1]=129,x[Q+N*nr-1]=129;E.d>0&&(C[F-1-nr]=J[Y-1-nr]=x[Q-1-nr]=129)}const Z=E.Xc,tt=16*+E.i,et=E.Sc,nt=8*+E.i,rt=E.Vc,at=8*+E.i,ot=E.z;let ft=0;if(E.d>0)c(C,F-nr,Z,tt,16),c(J,Y-nr,et,nt,8),c(x,Q-nr,rt,at,8);else if(0==E.i){for(r=0;r<21;++r)C[F-nr-1+r]=127;for(r=0;r<9;++r)J[Y-nr-1+r]=127;for(r=0;r<9;++r)x[Q-nr-1+r]=127}if(E.wa){const t=F-nr+16;E.d>0&&(E.i>=E.Ma-1?C[t+0]=C[t+1]=C[t+2]=C[t+3]=Z[tt+15]:c(C,t+0,Z,tt+16,4));for(let e=0;e<4;++e)C[e+t+4*nr]=C[e+t+4*nr]=C[e+t+8*nr]=C[e+t+12*nr]=C[e+t+0];for(ft=0;ft<16;ft++){var L=C,H=F+aa[ft];Dr[E.Eb[ft]](L,H),E.Oa&1<0){const t=ht.M[1+ht.i],e=ht.La[1+ht.i].Nb;let n=ht.Zb[ht.Lb];ht.ga.oc&&(n+=ht.ga.Lc[0],ht.wa&&(n+=ht.ga.Gc[0])),n=n<0?0:n>63?63:n,t.zc=n,ht.ga.kb>0&&(n=ht.ga.kb>4?n>>2:n>>1,n>9-ht.ga.kb&&(n=9-ht.ga.kb)),t.yc=n<1?1:n,t.ab=(!e||ht.wa)+0}var K=0,$=8*ht.Ja*ht.r,X=ht.ca,ut=ht.da+16*ht.i+16*ht.Ja*ht.H,bt=ht.aa,st=ht.ba+8*ht.i+$,vt=ht.ra,Pt=ht.sa+8*ht.i+$;for(K=0;K<16;++K)c(X,ut+K*ht.H,ht.Ea,+ar+K*nr,16);for(K=0;K<8;++K)c(bt,st+K*ht.r,ht.Ea,+or+K*nr,8),c(vt,Pt+K*ht.r,ht.Ea,+fr+K*nr,8)}const E=t,C=e;var At=1;const F=E.oa;if(E.qb){const t=E.rc;if(At&=WebPWorkerSync(t),g(t.a==OK),At){if(F.N=C,F.ha=E.Ja,F.d=E.d,F.W=E.W,F.W){const t=F.M;F.M=E.M,E.M=t}WebPWorkerLaunch(t),++E.Ja==E.jb&&(E.Ja=0)}}else{F.d=E.d,F.W=E.W;e:{let t=1;const e=E.oa,n=ea[E.A],r=n*E.H,a=parseInt(n/2)*E.r,f=16*e.ha*E.H,i=8*e.ha*E.r,u=E.ca,b=E.da-r+f,s=E.aa,l=E.ba-a+i,h=E.ra,d=E.sa-a+i,p=0==e.d,v=(e.d>=E.hb-1)+0;var kt=16*e.d;let P=16*(e.d+1);if(e.W){const t=E;let e=0;const n=t.oa.d;for(g(t.oa.W),e=t.lb;e0&&$r(u,b,c,h+4),i.ab&&Zr(u,b,c,h),o>0&&Qr(u,b,c,h+4),i.ab&&Xr(u,b,c,h);else{const t=r.r,e=r.aa,n=r.ba+8*f.ha*t+8*a,d=r.ra,p=r.sa+8*f.ha*t+8*a,v=r.Ac.fb?s>=40?2:s>=15?1:0:s>=40?3:s>=20?2:s>=15?1:0;a>0&&(Hr(u,b,c,h+4,l,v),qr(e,n,d,p,t,h+4,l,v)),i.ab&&(Jr(u,b,c,h,l,v),xr(e,n,d,p,t,h,l,v)),o>0&&(Lr(u,b,c,h+4,l,v),zr(e,n,d,p,t,h+4,l,v)),i.ab&&(Kr(u,b,c,h,l,v),Yr(e,n,d,p,t,h,l,v))}}}if(C.put){if(p?(C.y=E.ca,C.D=E.da+f,C.c=E.aa,C.B=E.ba+i,C.S=E.ra,C.C=E.sa+i):(kt-=n,C.y=u,C.D=b,C.c=s,C.B=l,C.S=h,C.C=d),v||(P-=n),P>C.K&&(P=C.K),E.Ga!=o&&kt>1),C.C+=E.r*(t>>1),C.p!=o&&(C.q+=C.width*t)}kt>1,C.C+=C.t>>1,C.p!=o&&(C.q+=C.t),C.w=kt-C.k,C.m=C.Ka-C.t,C.h=P-kt,t=C.put(C))}e.ha+1==E.jb&&!v&&(c(E.ca,E.da-r,u,b+16*E.H,r),c(E.aa,E.ba-a,s,l+8*E.r,a),c(E.ra,E.sa-a,h,d+8*E.r,a)),At=t}}if(!At){f=lt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let a;if(!(a=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(g(t),g(t.fc>0),e=!1),a=e}f=a?0:1}const a=f;e.Pb&&e.Pb(e),f=1&a}return f?(t.za=0,f):(gt(t),0)}function gt(t){t!=o&&(t.ib&&(t.ib=0),t.ib=o,t.Gb=0,t.za=0)}function Pt(t,e){return t+(1<>e}function At(t,e,n,r,a){const o=Ga[n]+Na[e]>>ga;e=Fa[e],r[a+0]=La[t+Ca[n]-Pa],r[a+1]=La[t+o-Pa],r[a+2]=La[t+e-Pa]}function kt(t,e,n,r,a){const o=Ga[n]+Na[e]>>ga;e=Fa[e],r[a+0]=248&La[t+Ca[n]-Pa]|La[t+o-Pa]>>5,r[a+1]=La[t+o-Pa]<<3&224|La[t+e-Pa]>>3}function mt(t,e,n,r,a){r[a+0]=255,At(t,e,n,r,a+1)}function wt(t,e,n,r,a){const o=Fa[e];r[a+0]=Ha[t+Ca[n]-Pa]<<4|Ha[t+(Ga[n]+Na[e]>>ga)-Pa],r[a+1]=15|Ha[t+o-Pa]<<4}function St(t,e,n,r,a){const o=Ca[n];n=Ga[n]+Na[e]>>ga,r[a+0]=La[t+Fa[e]-Pa],r[a+1]=La[t+n-Pa],r[a+2]=La[t+o-Pa]}function Tt(t,e,n,r,a){St(t,e,n,r,a),r[a+3]=255}function yt(t,e,n,r,a){At(t,e,n,r,a),r[a+3]=255}function Rt(t,e,n){t[e]=((((4278255360&t[e])>>>0)+((4278255360&n)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&n)&16711935)>>>0}function Vt(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Ot(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function It(t,e){return Ot(t+parseInt((t-e)/2,10))}function _t(){return pn}function Wt(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Ut(t,e,n,r,a,o,f){var c=0;const i=8>>t.n,u=t.U,b=t.u;if(i<8){t=(1<>8&255),o[f++]=b[e&s],e>>=i}}else for(c=e;c>8&255]}function Mt(t,e,n,r,a){for(n=e+n;e>16&255,r[a++]=n>>8&255,r[a++]=n>>0&255,r[a++]=n>>24&255}}function Bt(t,e,n,r,a){for(n=e+n;e>16&240|n>>12&15,r[a++]=n>>0&240|n>>28&15}}function Dt(t,e,n,r,a){for(n=e+n;e>24&255,r[a++]=n>>16&255,r[a++]=n>>8&255,r[a++]=n>>0&255}}function Et(t,e,n,r){return T(t,8)!=un?0:(e[0]=T(t,bn)+1,n[0]=T(t,bn)+1,r[0]=T(t,1),T(t,sn),1)}function jt(t,e){let n=0;return t<4?t+1:(n=t-2>>1,(2+(1&t)<e.ya){var n=t.Y,r=0;for(g(n!=o);0!=n[r].s;){var a=n,f=e;const t=f.T>>f.g&1;f.L?f.fa=1:(++f.g,f.g>=8&&w(f),f.Q==f.ya&&32==f.g&&(f.L=1)),r=r+a[r].s+t}return n[r].kc}for(r=0,g((n=t.Y)!=o);0!=n[r].s;)a=n,f=e.T>>e.g&1,++e.g,r=r+a[r].s+f;return n[r].kc}function Ft(t,e){if(t!=o){var n=0,r=0;for(n=0;n>t.eb)+(e>>t.eb)])0;){e=t.nc[a];let V=i;var h=b,d=l;switch(l=r,b=n,g(V<(p=u)),g(p<=e.Vb),e.Qc){case Sn:for(h=0,e=b+(p-V)*e.U;b>8&255,P=16711935&(P=(P=(16711935&p[d])>>>0)+(v<<16|v));l[b++]=((4278255360&p[d])>>>0|P)>>>0,32==V&&h++}break;case mn:var A=V;if(h=p,d=l,v=b,P=(T=e).U,0==A){var k=0;for(Rt(d,v,pn),k=1;k>T.n)*w;A>8&15],k=1;k>8&15]),e=t(d[v+k-1],d,v+k-P),Rt(d,v+k,e)}v+=P,0==(++A&m)&&(T+=w)}p!=e.Vb&&c(l,b-(e=e.U),l,b+(p-V-1)*e,e);break;case wn:for(h=e.U,d=(1<>e.n)*v;V>0&255,T.Bc=S>>8&255,T.Kc=S>>16&255),T=(S=l[b+w])>>>8,y=S>>>16,R=S,y+=Wt(m.Cc,T),y&=255,R+=Wt(m.Bc,T),R+=Wt(m.Kc,y),R&=255,l[b+w]=(4278255360&S|y<<16|R)>>>0;b+=h,++V,0==(V&d)&&(e+=v)}break;case Tn:h==l&&e.n>0?(h=(p-V)*Pt(e.U,e.n),s(l,d=b+(p-V)*e.U-h,l,b,h),Ut(e,V,p,l,d,l,b)):Ut(e,V,p,h,d,l,b)}b=r,l=n}}function Lt(t,e){var n=t.V,r=t.Ha+t.l*t.O;if(!((o=e-t.O)<=0)){Nt(t,o,n,r);var a=t.N;n=t.Xa;let l=[t.vb];r=t.O;var o=e,f=l,c=a.width;if(g(ra.K&&(o=a.K),r=o?r=0:(f[0]+=a.t,a.w=r-a.k,a.m=a.Ka-a.t,a.h=o-r,r=1),r){if(l=l[0],r=t.Ib,o=a.width,r.J0;){const t=n;let r=l,a=i;const b=f;let h=e;switch(c){case Ie:for(a=r+a;r>16&255,b[h++]=s>>8&255,b[h++]=s>>0&255}break;case _e:Mt(t,r,a,b,h);break;case Ee:Mt(t,r,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case We:for(a=r+a;r>0&255,b[h++]=s>>8&255,b[h++]=s>>16&255;break;case Ue:Dt(t,r,a,b,h);break;case je:Dt(t,r,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case Me:Dt(t,r,a,b,h);break;case Ce:Dt(t,r,a,b,h),WebPApplyAlphaMultiply(b,1,a,1,0);break;case Be:Bt(t,r,a,b,h);break;case Fe:Bt(t,r,a,b,h),WebPApplyAlphaMultiply4444(b,a,1,0);break;case De:for(a=r+a;r>16&248|s>>13&7,b[h++]=s>>5&224|s>>3&31;break;default:g(0)}l+=o,e+=u}n=a}t.xa+=n}else t.xa=a.I?EmitRescaledRowsYUVA(t,n,l,o,a.h):EmitRowsYUVA(t,n,l,o,a.m,a.h);g(t.xa<=r.height)}t.O=e,g(t.O<=t.v)}}function Ht(t,e,n,r,a,f){let c=1,i=0,u=0;const b=t.o,s=t.cb;let l=s.Db,h=n,d=n;n+=r*a;const p=(a=Pn+An)+s.xb,v=s.xb>0?s.Yb:o,P=s.Dc;let A=!1;for(g(l!=o);!b.L&&h>>0)+(A<<16)+(c<<8)+k}if(A=!1,++h,++i,i>=r&&(i=0,++u,f!=o&&u%wa==0&&f(t,u),v!=o))for(;d>>v.bb]=c}else if(wDa?k-=Da:(w=Ea[k-1],w=(w>>4)*r+(8-(15&w)),k=w>=1?w:1),w=0,w=0;w=r;)i-=r,++u,f!=o&&u%wa==0&&f(t,u);if(h>>v.bb]=c}else if(w>>v.bb]=w;w=e,k=h,g(A<=-1>>>(m=v).bb),w[k]=m.ea[A],A=!0;continue}(c=!b.fa)||End}return f!=o&&f(t,u),b.fa||!c||b.L&&h16?0:h>4?1:h>2?2:3,l[0]=Pt(c.U,v),c.n=v,l=v=Jt(h,1,0,_,c.u))if(l=h,v=0,h=1<<(8>>>(_=c).n)>>>0,(P=Array(h))==o)l=0;else{A=_.u[0];var k=_.b;for(P[0]=_.u[0][_.b+0],v=1;v>>0)+((4278255360&P[v-1])>>>0)&4278255360)>>>0|(16711935&A[k+v])+(16711935&P[v-1])&16711935)>>>0;for(;v=1&&s<=hn)){r.a=Je;break}if(c)t:{c=r;var m=t[0],w=e[0],_=(l=s,k=A=0,k=c.o,c.cb);if(v=[o],h=o,P=1,n&&T(k,1)){if(w=(m=Pt(m,A=T(k,3)+2))*(W=Pt(w,A)),!Jt(m,W,0,c,v)){c.a=Je,Ft(h,P),c=0;break t}for(v=v[0],_.eb=A,A=0;A>>8&65535,v[A]=m,m>=P&&(P=m+1)}if(k.fa)Ft(h,P),c=0;else if(g(P<=65536),(h=p(P,mr))==o)c.a=qe,Ft(h,P),c=0;else{for(A=0;A0&&(m+=1<=t){(E=E&&y(e))||V(e),U=E;break n}if(!O(e,M[j],B[j],D[j])){(E=E&&y(e))||V(e),U=E;break n}}(E=(E=1)&&y(e))||V(e),U=E}else U=0}}else{if(U=0,B=[],(M=T(W,4)+4)>Ma){m.a=Je,m=0;break e}if(D=Array(t),D==o){m.a=qe,m=0;break e}for(U=0;UB){U.a=Je,V(a),U=E;break n}}else n=B;for(e=0;eB){U.a=Je,V(a),U=E;break n}for(C=C?r:0;F-- >0;)M[e++]=C}}E=1,V(a),U=E}else U.a=Je,U=0}U&&(U=I(e,D,t))}(U=U&&!W.fa)?m=1:(m.a=Je,m=0)}if(!m){Ft(h,P),c=0;break t}}_.ac=v,_.hc=P,_.Db=h,c=1}}if(!c){r.a=Je;break}if(s>0){if(u.xb=1<0),l.ea=d(_,0),l.ea==o?s=0:(l.bb=32-s,s=1),!s){r.a=qe,c=0;break}}else u.xb=0;if(s=r,l=t[0],_=e[0],h=(v=s.cb).eb,s.l=l,s.v=_,v.Ec=Pt(l,h),v.Dc=0==h?-1:(1<>>8&255;t.O=t.xa=e}}function ut(t,e){return t<0?0:t>e?e:t}function Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,g,P){let A;const k=v-1>>1;let m=a[o+0]|f[c+0]<<16,w=i[u+0]|b[s+0]<<16;if(t){var S=3*m+w+131074>>2;g(t[e+0],255&S,S>>16,l,h)}for(n&&(S=3*w+m+131074>>2,g(n[r+0],255&S,S>>16,d,p)),A=1;A<=k;++A){const v=a[o+A]|f[c+A]<<16,k=i[u+A]|b[s+A]<<16;S=m+v+w+k+524296;const T=S+2*(v+w)>>3,y=S+2*(m+k)>>3;t&&(S=T+m>>1,m=y+v>>1,g(t[e+2*A-1],255&S,S>>16,l,h+(2*A-1)*P),g(t[e+2*A-0],255&m,m>>16,l,h+(2*A-0)*P)),n&&(S=y+w>>1,m=T+k>>1,g(n[r+2*A-1],255&S,S>>16,d,p+(2*A-1)*P),g(n[r+2*A+0],255&m,m>>16,d,p+(2*A+0)*P)),m=v,w=k}1&v||(t&&(S=3*m+w+131074>>2,g(t[e+v-1],255&S,S>>16,l,h+(v-1)*P)),n&&(S=3*w+m+131074>>2,g(n[r+v-1],255&S,S>>16,d,p+(v-1)*P)))}function $t(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,At,3)}function Xt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,St,3)}function Zt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,yt,4)}function te(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,Tt,4)}function ee(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,mt,4)}function ne(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,wt,2)}function re(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,kt,2)}function ae(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d){let p;for(p=0;p0;){var f=t,c=e+(n?1:0),i=t,u=e+(n?0:3),b=0;for(b=0;b>1)*n.nb,i=n.S,u=n.C+(t.w>>1)*n.rb,b=t.m,s=t.h,l=parseInt((b+1)/2,10),h=parseInt((s+1)/2,10);let d;for(d=0;d>4;b[s+2*h]=240&b[s+2*h]|t,l&=t}a+=e.width,s+=i.f}15!=l&&t(c)&&WebPApplyAlphaMultiply4444(b,f,o,u,i.f)}return 0}function ge(e){let n=e.ka;const r=n.j.J,a=r>1,r=e.m+2*t;let a;const f=[];for(a=0;a>ga,Na[e]=-22014*(e-128)+ja,Ga[e]=-45773*(e-128),Fa[e]=113618*(e-128)+ja>>ga;for(e=Pa;e>ga,La[e-Pa]=ut(n,255),Ha[e-Pa]=ut(n+8>>4,15);za=1}return 1}function Pe(t){const e=t.ka;let n=t.m;const r=t.h;return g(!(1&t.w)),n<=0||r<=0?0:(n=e.$a(t,e),e.ec+=n,e.zb&&e.zb(t,e),1)}function Ae(t){(t=t.ka).memory="",t.memory=o}function ke(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function me(t,e){return(ke(t,e)|t[e+3]<<24)>>>0}function we(t,e,n,r,a,c,i){var u=0,b=[0],s="VP8StatusCode";const l=f(nn);if(t==o||n[0]=Wn&&!h(t,e[0],"RIFF",In)){if(h(t,e[0]+8,"WEBP",In)){s=Je;break t}if((P=me(t,e[0]+In))0,P=[0];t:if(s=_n+Un,g(t!=o),g(n!=o),g(b!=o),b[0]=0,n[0]<_n)s=$e;else{if(!h(t,e[0],"VP8X",In)){var d=0,p=0,v=0;if(me(t,e[0]+In)!=Un){s=Je;break t}if(n[0]=Bn){s=Je;break t}P!=o&&(P[0]=v),r!=o&&(r[0]=d),a!=o&&(a[0]=p),e[0]+=s,n[0]-=s,b[0]=1}s=ze}if(s!=ze)return s;if(!u&&b[0])return Je;if(c!=o&&(c[0]=!!(P[0]&Mn)),b&&i==o)return ze;if(n0&&r>b){s=Je;break t}if(v=d&&p>b-d){s=Je;break t}u[0]=p,e[0]+=_n,n[0]-=_n,P[0]=s}else P[0]=n>=1&&t[e+0]==un,u[0]=n[0];s=ze}if(l.ta=l.ta[0],l.ia=l.ia[0],s!=ze)return s;if(l.ta>Dn)return Je;if(l.ia){if(n[0]=3&&157==t[b+3+0]&&1==t[b+3+1]&&42==t[b+3+2]?(u=t[b+0]|t[b+1]<<8|t[b+2]<<16,P=16383&(t[b+7]<<8|t[b+6]),t=16383&(t[b+9]<<8|t[b+8]),!(!(1&u)+0)||(u>>1&7)>3||!(u>>4&1)||u>>5>=l.ta?t=0:(r&&(r[0]=P),a&&(a[0]=t),t=1)):t=0}return t?(c!=o&&(c[0]|=l.$!=o),i!=o&&(i[0]=l,i[0].offset=e[0]-i[0].b,g(e[0]-i[0].b0,e.Ua&&(i=t.wc,u=t.vc,f=t.t,c=t.k,nr||c+u>a))return 0;if(e.t=f,e.k=c,e.Ka=f+i,e.K=c+u,e.m=i,e.h=u,e.I=t!=o&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==o||!t.ed,e.I&&(e.Za=e.Ba<3*r/4&&e.Aa<3*a/4,e.Bb=0),1}var Oe=512,Ie=0,_e=1,We=2,Ue=3,Me=4,Be=5,De=6,Ee=7,je=8,Ce=9,Fe=10,Ge=11,Ne=12,Le=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var He={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:d(4,0),Jb:o,jc:0},ze=0,qe=1,Ke=2,Je=3,Ye=4,xe=5,Qe=6,$e=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var Xe={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:d(3,0)};this.WebPGetFeatures=this.Md=function(t,e,n){let r="VP8StatusCode";return Oe>>>8!=Oe>>>8||n==o?t=Ke:(r=Re(t,[0],e=[e],n),t=r==$e?Je:r),t};const Ze={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:d(6,0)};this.WebPDecoderConfig=this.Kd={input:f(Xe),j:f(He),options:f(Ze)},this.WebPInitDecoderConfig=this.Nd=function(t){return Oe>>>8!=Oe>>>8||t==o?t=0:(g((t=t.input)!=o),t.tc=0,t=1),t};var tn={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},en={j:f(He),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:f(Ze),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},nn={data:0,b:0,e:0,offset:0,$:o,G:0,pa:0,ta:0,na:0,ia:0},rn={qa:0,Ia:o,Pd:0,Ab:0,la:0,Z:0,gc:0},an={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},on=25,fn=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],cn=10,un=47,bn=14,sn=3,ln=5,hn=11,dn=5,pn=4278190080,vn=8,gn=15,Pn=256,An=24,kn=4,mn=0,wn=1,Sn=2,Tn=3,yn=1,Rn=0,Vn=1,On=1,In=4,_n=8,Wn=12,Un=10,Mn=16,Bn=1*Math.pow(2,32),Dn=-1-_n-1>>>0,En={kc:0,s:0},jn={Y:"HuffmanTreeNode*",gb:0,Pa:0},Cn=-1;var Fn=506832829,Gn=0,Nn=Gn,Ln=2,Hn=3,zn=1,qn=4,Kn=5,Jn=6,Yn=3,xn=4,Qn=4,$n=4,Xn=4,Zn=8,tr=3,er=11,nr=32,rr=17*nr+9*nr,ar=1*nr+8,or=ar+16*nr+nr,fr=or+16,cr={fb:0,Jc:0,Nc:0,Ra:0},ir={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const ur={pb:0,ob:0,tb:0,Kb:d(xn,0),Cb:d(xn,0)},br={Ta:d(Yn,0),z:v([Xn,Zn,tr,er],0)},sr={Oc:0,Fb:0,kb:0,oc:0,Lc:d(Qn,0),Gc:d(Qn,0)};var lr={zc:0,yc:0,ab:0},hr={X:0,ua:0,Nb:0};const dr=d(2,0),pr={sc:f(dr),sb:f(dr),qc:f(dr)},vr={ha:0,d:0,W:0,M:lr,N:tn};var gr={a:"VP8StatusCode",za:0,xc:0,o:f(rn),Ac:f(cr),P:f(ir),ga:f(sr),Ca:f(ur),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:vr,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:p(8,rn),Zc:0,yb:p(xn,pr),R:f(br),pc:0,Pc:0,dc:0,cc:d(4,0),Xc:0,Sc:0,Vc:0,La:f(hr),M:f(lr),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:d(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:d(xn,0),Ga:o,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},Pr=0,Ar=1,kr=2;var mr={va:p(dn,jn)};const wr={xb:0,Yb:f({ea:0,bb:0}),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var Sr={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:f(an),l:0,v:0,O:0,xa:0,cb:f(wr),Na:0,nc:p(kn,{Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0}),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Tr=4,yr=[o,function(t,e,n,r,a,f,i,u){let b=0,s=u;for(g(t!=o),g(i!=o),g(n>0),g(r>0),g(a>0),g(f>=n*a),b=0;b0),g(r>0),g(a>0),g(f>=n*a),c(i,u,t,e,a),_(t,e+a,i,s,i,u+a,a*(n-1)),b=1;b0),g(r>0),g(a>0),g(f>=n*a),c(i,u,t,e,a),_(t,e+a,i,b,i,u+a,a*(n-1)),s=1;s255?255:n)&255}}}],Rr=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=o&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=o)},a=this;var Vr=d(511,0),Or=d(511,0),Ir=d(2041,0),_r=d(225,0),Wr=d(766,0),Ur=0,Mr=85627,Br=35468,Dr=[function(t,e){let n,r=4;for(n=0;n<4;++n)r+=t[e+n-nr]+t[e-1+n*nr];for(r>>=3,n=0;n<4;++n)l(t,e+n*nr,r,4)},function(t,e){G(t,e,4)},function(t,e){let n=e-nr;const r=[];for(r.push(L(t[n-1],t[n+0],t[n+1])),r.push(L(t[n+0],t[n+1],t[n+2])),r.push(L(t[n+1],t[n+2],t[n+3])),r.push(L(t[n+2],t[n+3],t[n+4])),n=0;n<4;++n)c(t,e+n*nr,r,0,4)},function(t,e){const n=t[e-1],r=t[e-1+nr],a=t[e-1+2*nr],o=t[e-1+3*nr];t[e+0+0*nr]=t[e+1+0*nr]=t[e+2+0*nr]=t[e+3+0*nr]=L(t[e-1-nr],n,r),t[e+0+1*nr]=t[e+1+1*nr]=t[e+2+1*nr]=t[e+3+1*nr]=L(n,r,a),t[e+0+2*nr]=t[e+1+2*nr]=t[e+2+2*nr]=t[e+3+2*nr]=L(r,a,o),t[e+0+3*nr]=t[e+1+3*nr]=t[e+2+3*nr]=t[e+3+3*nr]=L(a,o,o)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1-nr],f=t[e+0-nr],c=t[e+1-nr],i=t[e+2-nr],u=t[e+3-nr];t[e+0+3*nr]=L(r,a,t[e-1+3*nr]),t[e+0+2*nr]=t[e+1+3*nr]=L(n,r,a),t[e+0+1*nr]=t[e+1+2*nr]=t[e+2+3*nr]=L(o,n,r),t[e+0+0*nr]=t[e+1+1*nr]=t[e+2+2*nr]=t[e+3+3*nr]=L(f,o,n),t[e+1+0*nr]=t[e+2+1*nr]=t[e+3+2*nr]=L(c,f,o),t[e+2+0*nr]=t[e+3+1*nr]=L(i,c,f),t[e+3+0*nr]=L(u,i,c)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1-nr],f=t[e+0-nr],c=t[e+1-nr],i=t[e+2-nr],u=t[e+3-nr];t[e+0+0*nr]=t[e+1+2*nr]=o+f+1>>1,t[e+1+0*nr]=t[e+2+2*nr]=f+c+1>>1,t[e+2+0*nr]=t[e+3+2*nr]=c+i+1>>1,t[e+3+0*nr]=i+u+1>>1,t[e+0+3*nr]=L(a,r,n),t[e+0+2*nr]=L(r,n,o),t[e+0+1*nr]=t[e+1+3*nr]=L(n,o,f),t[e+1+1*nr]=t[e+2+3*nr]=L(o,f,c),t[e+2+1*nr]=t[e+3+3*nr]=L(f,c,i),t[e+3+1*nr]=L(c,i,u)},function(t,e){const n=t[e+1-nr],r=t[e+2-nr],a=t[e+3-nr],o=t[e+4-nr],f=t[e+5-nr],c=t[e+6-nr],i=t[e+7-nr];t[e+0+0*nr]=L(t[e+0-nr],n,r),t[e+1+0*nr]=t[e+0+1*nr]=L(n,r,a),t[e+2+0*nr]=t[e+1+1*nr]=t[e+0+2*nr]=L(r,a,o),t[e+3+0*nr]=t[e+2+1*nr]=t[e+1+2*nr]=t[e+0+3*nr]=L(a,o,f),t[e+3+1*nr]=t[e+2+2*nr]=t[e+1+3*nr]=L(o,f,c),t[e+3+2*nr]=t[e+2+3*nr]=L(f,c,i),t[e+3+3*nr]=L(c,i,i)},function(t,e){const n=t[e+0-nr],r=t[e+1-nr],a=t[e+2-nr],o=t[e+3-nr],f=t[e+4-nr],c=t[e+5-nr],i=t[e+6-nr],u=t[e+7-nr];t[e+0+0*nr]=n+r+1>>1,t[e+1+0*nr]=t[e+0+2*nr]=r+a+1>>1,t[e+2+0*nr]=t[e+1+2*nr]=a+o+1>>1,t[e+3+0*nr]=t[e+2+2*nr]=o+f+1>>1,t[e+0+1*nr]=L(n,r,a),t[e+1+1*nr]=t[e+0+3*nr]=L(r,a,o),t[e+2+1*nr]=t[e+1+3*nr]=L(a,o,f),t[e+3+1*nr]=t[e+2+3*nr]=L(o,f,c),t[e+3+2*nr]=L(f,c,i),t[e+3+3*nr]=L(c,i,u)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1+3*nr],f=t[e-1-nr],c=t[e+0-nr],i=t[e+1-nr],u=t[e+2-nr];t[e+0+0*nr]=t[e+2+1*nr]=n+f+1>>1,t[e+0+1*nr]=t[e+2+2*nr]=r+n+1>>1,t[e+0+2*nr]=t[e+2+3*nr]=a+r+1>>1,t[e+0+3*nr]=o+a+1>>1,t[e+3+0*nr]=L(c,i,u),t[e+2+0*nr]=L(f,c,i),t[e+1+0*nr]=t[e+3+1*nr]=L(n,f,c),t[e+1+1*nr]=t[e+3+2*nr]=L(r,n,f),t[e+1+2*nr]=t[e+3+3*nr]=L(a,r,n),t[e+1+3*nr]=L(o,a,r)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1+3*nr];t[e+0+0*nr]=n+r+1>>1,t[e+2+0*nr]=t[e+0+1*nr]=r+a+1>>1,t[e+2+1*nr]=t[e+0+2*nr]=a+o+1>>1,t[e+1+0*nr]=L(n,r,a),t[e+3+0*nr]=t[e+1+1*nr]=L(r,a,o),t[e+3+1*nr]=t[e+1+2*nr]=L(a,o,o),t[e+3+2*nr]=t[e+2+2*nr]=t[e+0+3*nr]=t[e+1+3*nr]=t[e+2+3*nr]=t[e+3+3*nr]=o}],Er=[function(t,e){let n,r=16;for(n=0;n<16;++n)r+=t[e-1+n*nr]+t[e+n-nr];N(r>>5,t,e)},function(t,e){G(t,e,16)},function(t,e){let n;for(n=0;n<16;++n)c(t,e+n*nr,t,e-nr,16)},function(t,e){let n;for(n=16;n>0;--n)l(t,e+0,t[e-1],16),e+=nr},function(t,e){let n,r=8;for(n=0;n<16;++n)r+=t[e-1+n*nr];N(r>>4,t,e)},function(t,e){let n,r=8;for(n=0;n<16;++n)r+=t[e+n-nr];N(r>>4,t,e)},function(t,e){N(128,t,e)}],jr=[function(t,e){let n,r=8;for(n=0;n<8;++n)r+=t[e+n-nr]+t[e-1+n*nr];H(1*(r>>4),t,e)},function(t,e){G(t,e,8)},function(t,e){let n;for(n=0;n<8;++n)c(t,e+n*nr,t,e-nr,8)},function(t,e){let n;for(n=0;n<8;++n)l(t,e+0,t[e-1],8),e+=nr},function(t,e){let n,r=4;for(n=0;n<8;++n)r+=t[e-1+n*nr];H(1*(r>>3),t,e)},function(t,e){let n,r=4;for(n=0;n<8;++n)r+=t[e+n-nr];H(1*(r>>3),t,e)},function(t,e){H(128,t,e)}];let Cr,Fr,Gr,Nr,Lr,Hr,zr,qr,Kr,Jr,Yr,xr,Qr,$r,Xr,Zr;var ta=31,ea=[0,2,8],na=3,ra=1,aa=[0+0*nr,4+0*nr,8+0*nr,12+0*nr,0+4*nr,4+4*nr,8+4*nr,12+4*nr,0+8*nr,4+8*nr,8+8*nr,12+8*nr,0+12*nr,4+12*nr,8+12*nr,12+12*nr],oa=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],fa=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],ca=[-Gn,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],ia=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],ua=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],ba=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var sa=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],la=[[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]],ha=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],da=v([tr,er],"");d(4,0);var pa=[[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]],va=134480385,ga=16,Pa=-227,Aa=482,ka=[_t,function(t){return t},function(t,e,n){return e[n+0]},function(t,e,n){return e[n+1]},function(t,e,n){return e[n-1]},function(t,e,n){return Vt(Vt(t,e[n+1]),e[n+0])},function(t,e,n){return Vt(t,e[n-1])},function(t,e,n){return Vt(t,e[n+0])},function(t,e,n){return Vt(e[n-1],e[n+0])},function(t,e,n){return Vt(e[n+0],e[n+1])},function(t,e,n){return Vt(Vt(t,e[n-1]),Vt(e[n+0],e[n+1]))},function(t,e,n){return Math.abs((t>>24&255)-(e[n-1]>>24&255))-Math.abs((e[n+0]>>24&255)-(e[n-1]>>24&255))+(Math.abs((t>>16&255)-(e[n-1]>>16&255))-Math.abs((e[n+0]>>16&255)-(e[n-1]>>16&255)))+(Math.abs((t>>8&255)-(e[n-1]>>8&255))-Math.abs((e[n+0]>>8&255)-(e[n-1]>>8&255)))+(Math.abs((255&t)-(255&e[n-1]))-Math.abs((255&e[n+0])-(255&e[n-1])))<=0?e[n+0]:t},function(t,e,n){return(Ot((t>>24&255)+(e[n+0]>>24&255)-(e[n-1]>>24&255))<<24|Ot((t>>16&255)+(e[n+0]>>16&255)-(e[n-1]>>16&255))<<16|Ot((t>>8&255)+(e[n+0]>>8&255)-(e[n-1]>>8&255))<<8|Ot((255&t)+(255&e[n+0])-(255&e[n-1])))>>>0},function(t,e,n){const r=e[n-1];return(It((t=Vt(t,e[n+0]))>>24&255,r>>24&255)<<24|It(t>>16&255,r>>16&255)<<16|It(t>>8&255,r>>8&255)<<8|It(t>>0&255,r>>0&255))>>>0},_t,_t],ma={Cc:0,Bc:0,Kc:0},wa=16,Sa=16,Ta=16,ya=[2,3,7],Ra=[3,3,11],Va=0,Oa=1,Ia=2,_a=3,Wa=4,Ua=[Pn+An,Pn,Pn,Pn,40],Ma=19,Ba=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Da=120,Ea=[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],ja=1<{var e;e=t.data,m.push(e),S()}))}},c={};function i(t){var e=c[t];if(void 0!==e)return e.exports;var n=c[t]={exports:{}};return f[t].call(n.exports,n,n.exports,i),n.exports}i.m=f,i.x=()=>{var t=i.O(void 0,[699,866,158],(()=>i(2061)));return i.O(t)},t=[],i.O=(e,n,r,a)=>{if(!n){var o=1/0;for(b=0;b=a)&&Object.keys(i.O).every((t=>i.O[t](n[c])))?n.splice(c--,1):(f=!1,a0&&t[b-1][2]>a;b--)t[b]=t[b-1];t[b]=[n,r,a]},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.f={},i.e=t=>Promise.all(Object.keys(i.f).reduce(((e,n)=>(i.f[n](t,e),e)),[])),i.u=t=>({158:"npm.iobuffer",699:"npm.pako",866:"npm.fast-png"}[t]+"."+{158:"ae3638de6414621ea67b",699:"f16d6f756c34f3914132",866:"f6db8063094ac9670661"}[t]+".chunk.js"),i.miniCssF=t=>{},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;i.g.importScripts&&(t=i.g.location+"");var e=i.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");n.length&&(t=n[n.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=t})(),e=i.u,n=i.e,r=new Map,a=new Map,i.u=function(t){return e(t)+(r.has(t)?"?"+r.get(t):"")},i.e=function(t){return n(t).catch((function(n){var o=a.has(t)?a.get(t):999999;if(o<1){var f=e(t);throw n.message="Loading chunk "+t+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(e){setTimeout((function(){var n=Date.now();r.set(t,n),a.set(t,o-1),e(i.e(t))}),3e3)}))}))},(()=>{var t={61:1};i.f.i=(e,n)=>{t[e]||importScripts(i.p+i.u(e))};var e=this.webpackChunktweb=this.webpackChunktweb||[],n=e.push.bind(e);e.push=e=>{var[r,a,o]=e;for(var f in a)i.o(a,f)&&(i.m[f]=a[f]);for(o&&o(i);r.length;)t[r.pop()]=1;n(e)}})(),o=i.x,i.x=()=>Promise.all([699,866,158].map(i.e,i)).then(o),i.x()})(); +//# sourceMappingURL=61.6db21d20aefa6b93eca2.chunk.js.map \ No newline at end of file diff --git a/public/61.6db21d20aefa6b93eca2.chunk.js.map b/public/61.6db21d20aefa6b93eca2.chunk.js.map new file mode 100644 index 000000000..6e4a4e596 --- /dev/null +++ b/public/61.6db21d20aefa6b93eca2.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"61.6db21d20aefa6b93eca2.chunk.js","mappings":"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D,CAAC,IAAK,IACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAE1C,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [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];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { webp2png } from './webp';\r\nimport type { ConvertWebPTask } from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: ConvertWebPTask[] = [];\r\n//let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n //isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n //if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n //isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n \r\n ctx.postMessage({\r\n type: 'convertWebp', \r\n payload: {\r\n fileName, \r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: ConvertWebPTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n \r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { WebPDecoder } from '../../vendor/libwebp-0.2.0';\r\nimport { encode } from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8,\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"ae3638de6414621ea67b\",\"699\":\"f16d6f756c34f3914132\",\"866\":\"f6db8063094ac9670661\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","Map","has","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","set","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file diff --git a/public/641.682761bd5f38717396f1.chunk.js b/public/641.682761bd5f38717396f1.chunk.js new file mode 100644 index 000000000..d59751f03 --- /dev/null +++ b/public/641.682761bd5f38717396f1.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";(()=>{if("undefined"!=typeof __webpack_require__){var e=__webpack_require__.u,t=__webpack_require__.e,r=new Map,i=new Map;__webpack_require__.u=function(t){return e(t)+(r.has(t)?"?"+r.get(t):"")},__webpack_require__.e=function(n){return t(n).catch((function(t){var o=i.has(n)?i.get(n):999999;if(o<1){var a=e(n);throw t.message="Loading chunk "+n+" failed after 999999 retries.\n("+a+")",t.request=a,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();r.set(n,t),i.set(n,o-1),e(__webpack_require__.e(n))}),3e3)}))}))}}})();const e="undefined"!=typeof window?window:self,t=navigator?navigator.userAgent:null,r=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&e.MSStream,!!("safari"in e)||!(!t||!(/\b(iPad|iPhone|iPod)\b/.test(t)||t.match("Safari")&&!t.match("Chrome"))));let i;if(navigator.userAgent.toLowerCase().indexOf("firefox"),navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),r)try{i=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){i=!1}else i=!0;const n=i;const o=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]];let a=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const s=self.Module;class h{constructor(e,t,r){this.reqId=e,this.width=t,this.height=r}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=c.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=c.Api.loadFromData(this.handle,this.stringOnWasmHeap),c.Api.resize(this.handle,this.width,this.height),f("loaded",this.reqId,this.frameCount,this.fps)}catch(e){console.error("init RLottieItem error:",e),f("error",this.reqId,e)}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{const r=new FileReader;r.addEventListener("loadend",(e=>{t(e.target.result)})),r.readAsText(e)}))}(e)})(t).then((t=>{try{if("number"==typeof n&&n>=1&&n<=5){const e=JSON.parse(t);(function(e,t){const r=o[Math.max(t-1,0)],i=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,i=a(t[2])|a(t[1])<<8|a(t[0])<<16,n=r.find((e=>e[0]===i));n&&(t[0]=(n[1]>>16&255)/255,t[1]=(n[1]>>8&255)/255,t[2]=(255&n[1])/255)})(e)}e.hasOwnProperty("it")&&n(e.it)},n=e=>{for(const t of e)i(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?n(e.it):i(e)}catch(r){console.warn("cant apply replacements",r,e,t)}})(e,n),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),r=+(null==e?void 0:e[1])||60;s.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),f("error",e,r)}}))},destroy:function(e){const t=d[e];t&&(t.destroy(),delete d[e])},renderFrame:function(e,t,r){d[e].render(t,r)}};function f(...e){if(arguments.length<1)throw new TypeError("reply - not enough arguments");if(e=Array.prototype.slice.call(arguments,1),n){const t=[];for(let r=0;r {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337],\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f],\n ]\n];\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find((p) => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\r\nimport readBlobAsText from \"../../helpers/blob/readBlobAsText\";\r\nimport applyReplacements from \"./applyReplacements\";\r\n\r\nimportScripts('rlottie-wasm.js');\r\n//import Module, { allocate, intArrayFromString } from './rlottie-wasm';\r\n\r\nconst _Module = (self as any).Module as any;\r\n\r\nconst DEFAULT_FPS = 60;\r\n\r\ntype LottieHandlePointer = number;\r\n\r\n// throw new Error('test');\r\n\r\nexport class RLottieItem {\r\n private stringOnWasmHeap: number;\r\n private handle: LottieHandlePointer;\r\n private frameCount: number;\r\n private fps: number;\r\n\r\n private dead: boolean;\r\n //private context: OffscreenCanvasRenderingContext2D;\r\n\r\n constructor(\r\n private reqId: number, \r\n private width: number, \r\n private height: number/* , \r\n private canvas: OffscreenCanvas */\r\n ) {\r\n\r\n }\r\n\r\n public init(json: string, fps: number) {\r\n if(this.dead) {\r\n return;\r\n }\r\n\r\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\r\n\r\n //this.context = canvas.getContext('2d');\r\n /* let frame = 0;\r\n setInterval(() => {\r\n if(frame >= this.frameCount) frame = 0;\r\n let _frame = frame++;\r\n this.render(_frame, null);\r\n }, 1000 / this.fps); */\r\n\r\n try {\r\n this.handle = worker.Api.init();\r\n \r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\r\n \r\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\r\n \r\n worker.Api.resize(this.handle, this.width, this.height);\r\n\r\n reply('loaded', this.reqId, this.frameCount, this.fps);\r\n } catch(e) {\r\n console.error('init RLottieItem error:', e);\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\r\n if(this.dead || this.handle === undefined) return;\r\n //return;\r\n \r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n \r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n \r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n \r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n \r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n //this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n \r\n reply('frame', this.reqId, frameNo, clamped);\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n if(this.handle !== undefined) {\r\n worker.Api.destroy(this.handle);\r\n }\r\n }\r\n}\r\n\r\nclass RLottieWorker {\r\n public Api: {\r\n init: () => LottieHandlePointer,\r\n destroy: (handle: LottieHandlePointer) => void,\r\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\r\n buffer: (handle: LottieHandlePointer) => number,\r\n render: (handle: LottieHandlePointer, frameNo: number) => void,\r\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\r\n } = {} as any;\r\n\r\n public initApi() {\r\n this.Api = {\r\n init: _Module.cwrap('lottie_init', '', []),\r\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\r\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\r\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\r\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\r\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\r\n };\r\n }\r\n\r\n public init() {\r\n this.initApi();\r\n reply('ready');\r\n }\r\n}\r\n\r\nconst worker = new RLottieWorker();\r\n\r\n_Module.onRuntimeInitialized = function() {\r\n worker.init();\r\n};\r\n\r\nconst items: {[reqId: string]: RLottieItem} = {};\r\nconst queryableFunctions = {\r\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number/* , canvas: OffscreenCanvas */) {\r\n const item = items[reqId] = new RLottieItem(reqId, width, height/* , canvas */);\r\n readBlobAsText(blob).then((json) => {\r\n try {\r\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(json);\r\n applyReplacements(newAnimationData, toneIndex);\r\n json = JSON.stringify(newAnimationData);\r\n }\r\n\r\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\r\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\r\n throw new Error('Invalid file');\r\n } */\r\n\r\n /* let perf = performance.now();\r\n let json = JSON.parse(jsString);\r\n console.log('sticker decode:', performance.now() - perf); */\r\n\r\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\r\n const frameRate = +match?.[1] || DEFAULT_FPS;\r\n\r\n //console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\r\n\r\n item.init(json, frameRate);\r\n } catch(err) {\r\n console.error('Invalid file for sticker:', json);\r\n reply('error', reqId, err);\r\n }\r\n });\r\n },\r\n destroy: function(reqId: number) {\r\n const item = items[reqId];\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.destroy();\r\n delete items[reqId];\r\n },\r\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\r\n //console.log('worker renderFrame', reqId, frameNo, clamped);\r\n items[reqId].render(frameNo, clamped);\r\n }\r\n};\r\n\r\nfunction reply(...args: any[]) {\r\n if(arguments.length < 1) { \r\n throw new TypeError('reply - not enough arguments'); \r\n }\r\n\r\n //if(arguments[0] === 'frame') return;\r\n\r\n args = Array.prototype.slice.call(arguments, 1);\r\n\r\n if(!CAN_USE_TRANSFERABLES) {\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args});\r\n } else {\r\n const transfer: ArrayBuffer[] = [];\r\n for(let i = 0; i < args.length; ++i) {\r\n if(args[i] instanceof ArrayBuffer) {\r\n transfer.push(args[i]);\r\n }\r\n \r\n if(args[i].buffer && args[i].buffer instanceof ArrayBuffer) {\r\n transfer.push(args[i].buffer);\r\n }\r\n }\r\n\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args}, transfer);\r\n }\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","Map","countMap","chunkId","has","get","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","console","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","then","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","hasOwnProperty","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","arguments","length","TypeError","Array","prototype","slice","call","transfer","i","ArrayBuffer","push","postMessage","queryMethodListener","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/642.f2d4e67ea15d5329cd0b.chunk.js b/public/642.f2d4e67ea15d5329cd0b.chunk.js new file mode 100644 index 000000000..cb12fc8d5 --- /dev/null +++ b/public/642.f2d4e67ea15d5329cd0b.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[642],{4642:(e,a,s)=>{s.r(a),s.d(a,{default:()=>f});const c="zero",r="one",t="two",n="few",u="many";function i(e,a){switch(e){case 27764:if(a%10==1&&(a%100<11||a%100>19))return r;if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return n;break;case 27766:if(0==a)return c;if(a%10==1&&a%100!=11)return r;break;case 25465:if(2==a)return t;if(3==a)return n;if(0==a)return c;if(1==a)return r;if(6==a)return u;break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return u;break;case 7041896:if(0==a)return c;if(1==a)return r;break;case 7563369:if(a>=2&&a<=10)return n;if(a>=0&&a<=1)return r;break;case 26725:if(2==a)return t;if(1==a)return r;if(0!=a&&a%10==0)return u;break;case 25459:case 29547:if(1==a)return r;if(a>=2&&a<=4)return n;break;case 25202:if(0!=a&&a%1e6==0)return u;if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return r;if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return t;if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return n;break;case 29548:if(a%100==2)return t;if(a%100==1)return r;if(a%100>=3&&a%100<=4)return n;break;case 7102823:if(0==a)return c;if(a>=0&&a<=2&&0!=a&&2!=a)return r;break;case 28780:if(1==a)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return u;break;case 26468:if(2==a||12==a)return t;if(1==a||11==a)return r;if(a>=3&&a<=10||a>=13&&a<=19)return n;break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return r;break;case 28011:if(a%10==1&&11!=a)return r;break;case 28020:if(1==a)return r;if(a%100>=11&&a%100<=19)return u;if(0==a||a%100>=2&&a%100<=10)return n;break;case 28015:case 29295:if(1==a)return r;if(0==a||1!=a&&a%100>=1&&a%100<=19)return n;break;case 26465:if(2==a)return t;if(1==a)return r;if(a>=3&&a<=6)return n;if(a>=7&&a<=10)return u;break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return r;break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return t;if(1==a)return r;break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return r;break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return r;break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return r;break;case 24946:if(2==a)return t;if(1==a)return r;if(0==a)return c;if(a%100>=3&&a%100<=10)return n;if(a%100>=11&&a%100<=99)return u}return"other"}const f={PluralRules:class{constructor(e){this.select=i.bind(null,function(e){let a=0;for(let s=0;s 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set2\r\n case 0x6c76: // lv\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set3\r\n case 0x6379: // cy\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set5\r\n case 0x6b7368: // ksh\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set6\r\n case 0x736869: // shi\r\n if ((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if ((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set7\r\n case 0x6865: // he\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set9\r\n case 0x6272: // br\r\n if ((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if (((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if (((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if ((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set10\r\n case 0x736c: // sl\r\n if ((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if ((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set11\r\n case 0x6c6167: // lag\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set12\r\n case 0x706c: // pl\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set13\r\n case 0x6764: // gd\r\n if ((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if ((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set14\r\n case 0x6776: // gv\r\n if ((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set15\r\n case 0x6d6b: // mk\r\n if (((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set16\r\n case 0x6d74: // mt\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if ((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set18\r\n case 0x6761: // ga\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if ((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if (((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if ((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set22\r\n case 0x747a6d: // tzm\r\n if (((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set24\r\n case 0x6172: // ar\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if (((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n \r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"names":["NumberPluralizationFormZero","NumberPluralizationFormOne","NumberPluralizationFormTwo","NumberPluralizationFormFew","NumberPluralizationFormMany","numberPluralizationForm","lc","n","PluralRules","constructor","code","this","select","bind","i","length","charCodeAt","languageCodehash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/7.5f548bb1b833747ed1cb.chunk.js b/public/7.5f548bb1b833747ed1cb.chunk.js deleted file mode 100644 index 8b1acbbe2..000000000 --- a/public/7.5f548bb1b833747ed1cb.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[7],{195:function(e,t,o){"use strict";o.r(t);t.default={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off",PrivacyPhoneInfo4:"This public link opens a chat with you:",ReportChatIllegalDrugs:"Illegal Drugs",ReportChatPersonalDetails:"Personal Details",VoipPeerIncompatible:"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.",TelegramFeaturesUrl:"https://t.me/TelegramTips",ScamMessage:"SCAM",FakeMessage:"FAKE",TextCopied:"Text copied to clipboard","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","UsernameSettings.ChangeDescription":"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); -//# sourceMappingURL=7.5f548bb1b833747ed1cb.chunk.js.map \ No newline at end of file diff --git a/public/7.5f548bb1b833747ed1cb.chunk.js.map b/public/7.5f548bb1b833747ed1cb.chunk.js.map deleted file mode 100644 index 363c19e10..000000000 --- a/public/7.5f548bb1b833747ed1cb.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"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","file":"7.5f548bb1b833747ed1cb.chunk.js","sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterMenuDelete\": \"Delete Folder\",\n \"FilterHeaderEdit\": \"Edit Folder\",\n \"FilterAllGroups\": \"All Groups\",\n \"FilterAllContacts\": \"All Contacts\",\n \"FilterAllNonContacts\": \"All Non-Contacts\",\n \"FilterAllChannels\": \"All Channels\",\n \"FilterAllBots\": \"All Bots\",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\"\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\"\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.TimeFormat\": \"Time Format\",\n \"General.TimeFormat.h12\": \"12-hour\",\n \"General.TimeFormat.h23\": \"24-hour\",\n \"ChatBackground.UploadWallpaper\": \"Upload Wallpaper\",\n \"ChatBackground.Blur\": \"Blur Wallpaper Image\",\n \"Notifications.Sound\": \"Notification Sound\",\n \"NewPrivateChat\": \"New Private Chat\",\n \"NewPoll.OptionLabel\": \"Option %d\",\n \"Message.Context.Selection.Copy\": \"Copy selected\",\n \"Message.Context.Selection.Clear\": \"Clear selection\",\n \"Message.Context.Selection.Delete\": \"Delete selected\",\n \"Message.Context.Selection.Forward\": \"Forward selected\",\n \"Message.Context.Selection.SendNow\": \"Send Now selected\",\n \"Message.Unsupported.Desktop\": \"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__\",\n \"Message.Unsupported.Mobile\": \"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__\",\n \"Checkbox.Enabled\": \"Enabled\",\n \"Checkbox.Disabled\": \"Disabled\",\n \"Error.PreviewSender.CaptionTooLong\": \"Caption is too long.\",\n \"PreviewSender.GroupItems\": \"Group items\",\n \"PreviewSender.SendAlbum\": {\n \"one_value\": \"Send Album\",\n \"other_value\": \"Send %d Albums\"\n },\n \"Presence.YourChat\": \"chat with yourself\",\n \"Privacy.Devices\": {\n \"one_value\": \"%1$d device\",\n \"other_value\": \"%1$d devices\"\n },\n \"Privacy.SensitiveContent\": \"Sensitive Content\",\n \"PrivacyModal.Search.Placeholder\": \"Add Users or Groups...\",\n \"Permissions.NoExceptions\": \"No exceptions\",\n \"Permissions.ExceptionsCount\": {\n \"one_value\": \"%d exception\",\n \"other_value\": \"%d exceptions\"\n },\n \"Link.Available\": \"Link is available\",\n \"Link.Taken\": \"Link is already taken\",\n \"Link.Invalid\": \"Link is invalid\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n //it is from iOS\n \"VoiceChat.DiscussionGroup\": \"discussion group\",\n\n // * android\n \"AccDescrEditing\": \"Editing\",\n \"ActionCreateChannel\": \"Channel created\",\n \"ActionCreateGroup\": \"un1 created the group\",\n \"ActionChangedTitle\": \"un1 changed the group name to un2\",\n \"ActionRemovedPhoto\": \"un1 removed the group photo\",\n \"ActionChangedPhoto\": \"un1 changed the group photo\",\n \"ActionChangedVideo\": \"un1 changed the group video\",\n \"ActionAddUser\": \"un1 added un2\",\n \"ActionAddUserSelf\": \"un1 returned to the group\",\n \"ActionAddUserSelfYou\": \"You returned to the group\",\n \"ActionAddUserSelfMega\": \"un1 joined the group\",\n \"ActionLeftUser\": \"un1 left the group\",\n \"ActionKickUser\": \"un1 removed un2\",\n \"ActionInviteUser\": \"un1 joined the group via invite link\",\n \"ActionPinnedNoText\": \"un1 pinned a message\",\n \"ActionMigrateFromGroup\": \"This group was upgraded to a supergroup\",\n \"ActionYouScored\": \"You scored %1$s\",\n \"ActionUserScored\": \"un1 scored %1$s\",\n \"ActionYouScoredInGame\": \"You scored %1$s in un2\",\n \"ActionUserScoredInGame\": \"un1 scored %1$s in un2\",\n \"AndOther\": {\n \"one_value\": \"and %1$d other\",\n \"other_value\": \"and %1$d others\"\n },\n \"AttachPhoto\": \"Photo\",\n \"AttachVideo\": \"Video\",\n \"AttachGif\": \"GIF\",\n \"AttachLocation\": \"Location\",\n \"AttachLiveLocation\": \"Live Location\",\n \"AttachContact\": \"Contact\",\n //\"AttachDocument\": \"File\",\n \"AttachSticker\": \"Sticker\",\n \"AttachAudio\": \"Voice message\",\n \"AttachRound\": \"Video message\",\n \"AttachGame\": \"Game\",\n \"Bot\": \"bot\",\n //\"ChannelJoined\": \"You joined this channel\",\n \"ChannelMegaJoined\": \"You joined this group\",\n \"EnterChannelName\": \"Channel name\",\n \"DescriptionOptionalPlaceholder\": \"Description (optional)\",\n \"DescriptionPlaceholder\": \"Description\",\n \"DiscussionStarted\": \"Discussion started\",\n \"Draft\": \"Draft\",\n \"FilterAlwaysShow\": \"Include Chats\",\n \"FilterNeverShow\": \"Exclude Chats\",\n \"FilterInclude\": \"Included Chats\",\n \"FilterExclude\": \"Excluded Chats\",\n \"FilterChatTypes\": \"Chat types\",\n \"FilterChats\": \"Chats\",\n \"FilterNew\": \"New Folder\",\n \"Filters\": \"Folders\",\n \"FilterRecommended\": \"Recommended Folders\",\n \"FilterShowMoreChats\": {\n \"one_value\": \"Show %1$d More Chat\",\n \"other_value\": \"Show %1$d More Chats\"\n },\n \"ForwardedMessageCount\": {\n \"one_value\": \"Forwarded message\",\n \"other_value\": \"%1$d forwarded messages\"\n },\n \"FromYou\": \"You\",\n \"Add\": \"Add\",\n \"Chats\": {\n \"one_value\": \"%1$d chat\",\n \"other_value\": \"%1$d chats\"\n },\n \"Channels\": {\n \"one_value\": \"%1$d channel\",\n \"other_value\": \"%1$d channels\"\n },\n \"Comments\": {\n \"one_value\": \"%1$d Comment\",\n \"other_value\": \"%1$d Comments\"\n },\n \"Groups\": {\n \"one_value\": \"%1$d group\",\n \"other_value\": \"%1$d groups\"\n },\n \"Users\": {\n \"one_value\": \"%1$d user\",\n \"other_value\": \"%1$d users\"\n },\n \"Members\": {\n \"one_value\": \"%1$d member\",\n \"other_value\": \"%1$d members\"\n },\n \"messages\": {\n \"one_value\": \"%1$d message\",\n \"other_value\": \"%1$d messages\"\n },\n \"UsernameHelpLink\": \"This link opens a chat with you:\\n%1$s\",\n \"NewChannel\": \"New Channel\",\n \"NewGroup\": \"New Group\",\n \"Contacts\": \"Contacts\",\n \"SavedMessages\": \"Saved Messages\",\n \"Settings\": \"Settings\",\n \"SettingsHelp\": \"Help\",\n \"General\": \"General\",\n \"TextSize\": \"Message Text Size\",\n \"ChatBackground\": \"Chat Background\",\n \"EnableAnimations\": \"Enable Animations\",\n \"AutoDownloadMedia\": \"Auto-Download Media\",\n \"AutodownloadContacts\": \"Contacts\",\n \"AutodownloadPrivateChats\": \"Private Chats\",\n \"AutodownloadGroupChats\": \"Group Chats\",\n \"AutodownloadChannels\": \"Channels\",\n \"AutoplayGIF\": \"GIFs\",\n \"AutoplayVideo\": \"Videos\",\n \"NotificationsForGroups\": \"Notifications for groups\",\n \"NotificationsForPrivateChats\": \"Notifications for private chats\",\n \"NotificationsForChannels\": \"Notifications for channels\",\n \"NotificationsPrivateChats\": \"Private Chats\",\n \"NotificationsGroups\": \"Groups\",\n \"NotificationsChannels\": \"Channels\",\n \"NotificationsOther\": \"Other\",\n \"MarkAsUnread\": \"Mark as unread\",\n \"MarkAsRead\": \"Mark as read\",\n \"ContactJoined\": \"Contact joined Telegram\",\n \"Loading\": \"Loading...\",\n \"Unblock\": \"Unblock\",\n \"BlockedUsers\": \"Blocked Users\",\n \"BlockedUsersInfo\": \"Blocked users will not be able to contact you and will not see your Last Seen time.\",\n \"BlockedEmpty\": \"None\", \n \"TwoStepVerification\": \"Two-Step Verification\",\n \"TwoStepVerificationTitle\": \"Two-Step Verification\",\n \"PinnedMessage\": \"Pinned Message\",\n \"PinnedMessagesCount\": {\n \"one_value\": \"Pinned Message\",\n \"other_value\": \"%1$d Pinned Messages\"\n },\n //\"PreviousPinnedMessage\": \"Previous Message\",\n \"PrivacyExceptions\": \"Exceptions\",\n \"PrivacyLastSeen\": \"Last Seen & Online\",\n \"PrivacySettings\": \"Privacy and Security\",\n \"PrivacyTitle\": \"Privacy\",\n \"PrivacyPhone\": \"Phone Number\",\n \"PrivacyPhoneTitle\": \"Who can see my phone number?\",\n \"PrivacyPhoneTitle2\": \"Who can find me by my number?\",\n \"PrivacyPhoneInfo\": \"Users who have your number saved in their contacts will also see it on Telegram.\",\n \"PrivacyPhoneInfo3\": \"Users who add your number to their contacts will see it on Telegram only if they are your contacts.\",\n \"PrivacyProfilePhoto\": \"Profile Photos\",\n \"PrivacyProfilePhotoTitle\": \"Who can see my profile photos & videos?\",\n \"PrivacyP2PHeader\": \"Peer-to-Peer\",\n \"PrivacyForwardsTitle\": \"Who can add a link to my account when forwarding my messages?\",\n \"Reminders\": \"Reminders\",\n \"ScheduledMessages\": \"Scheduled Messages\",\n \"LastSeenTitle\": \"Who can see your Last Seen time?\",\n \"SessionsTitle\": \"Active Sessions\",\n \"CurrentSession\": \"This device\",\n \"TerminateAllSessions\": \"Terminate All Other Sessions\",\n \"TerminateSessionText\": \"Are you sure you want to terminate this session?\",\n \"OtherSessions\": \"Active sessions\",\n \"AreYouSureDeleteSingleMessage\": \"Are you sure you want to delete this message?\",\n \"AreYouSureDeleteFewMessages\": \"Are you sure you want to delete these messages?\",\n \"AreYouSureDeleteSingleMessageMega\": \"Are you sure you want to delete this message for everyone?\",\n \"AreYouSureDeleteFewMessagesMega\": \"Are you sure you want to delete these messages for everyone?\",\n \"AreYouSureDeleteAndExitName\": \"Are you sure you want to delete and leave the group **%1$s**?\",\n \"AreYouSureDeleteThisChatSavedMessages\": \"Are you sure you want to delete **Saved Messages**?\",\n \"AreYouSureDeleteThisChatWithUser\": \"Are you sure you want to delete the chat with **%1$s**?\",\n \"AreYouSureSessionTitle\": \"Terminate session\",\n \"AreYouSureSessionsTitle\": \"Terminate sessions\",\n \"AreYouSureSessions\": \"Are you sure you want to terminate all other sessions?\",\n \"Terminate\": \"Terminate\",\n \"WhoCanCallMe\": \"Who can call me?\",\n \"WhoCanAddMe\": \"Who can add me to group chats?\",\n \"ArchivedChats\": \"Archived Chats\",\n \"Cancel\": \"Cancel\",\n \"HistoryCleared\": \"History was cleared\",\n \"Archive\": \"Archive\",\n \"Unarchive\": \"Unarchive\",\n \"Delete\": \"Delete\",\n \"Reply\": \"Reply\",\n \"Edit\": \"Edit\",\n \"Forward\": \"Forward\",\n \"CopyLink\": \"Copy Link\",\n \"Copy\": \"Copy\",\n \"Search\": \"Search\",\n \"LinkCopied\": \"Link copied to clipboard\",\n \"LinkCopiedPrivateInfo\": \"This link will only work for members of this chat.\",\n \"GroupAddMembers\": \"Add Members\",\n \"SendMessageTo\": \"Add people...\",\n //\"SelectChat\": \"Select Chat\",\n \"JumpToDate\": \"Jump to Date\",\n \"Caption\": \"Caption\",\n \"Message\": \"Message\",\n \"Poll\": \"Poll\",\n \"SharedFilesTab2\": \"Files\",\n \"SharedMediaTab2\": \"Media\",\n //\"SharedMediaTabFull2\": \"Shared Media\",\n //\"SharedGroupsTab2\": \"Groups\",\n \"SharedLinksTab2\": \"Links\",\n \"SharedMusicTab2\": \"Music\",\n \"SharedVoiceTab2\": \"Voice\",\n //\"SharedGIFsTab2\": \"GIFs\",\n \"NewPoll\": \"New Poll\",\n \"PollOptions\": \"Poll options\",\n \"AskAQuestion\": \"Ask a Question\",\n \"AddAnExplanationInfo\": \"Users will see this text after choosing the wrong answer, good for educational purposes.\",\n \"AccDescrQuizExplanation\": \"Explanation\",\n \"PhoneCopied\": \"Phone copied to clipboard\",\n \"UsernameCopied\": \"Username copied to clipboard.\",\n //\"HashtagCopied\": \"Hashtag copied to clipboard.\",\n \"BioCopied\": \"Bio copied to clipboard.\",\n \"UserBio\": \"Bio\",\n \"Username\": \"Username\",\n \"Phone\": \"Phone\",\n \"Notifications\": \"Notifications\",\n \"AreYouSureDeleteContact\": \"Are you sure you want to delete this contact?\",\n \"AreYouSureDeleteAndExit\": \"Are you sure you want to delete and leave the group?\",\n \"AreYouSureDeleteAndExitChannel\": \"Do you want to delete and leave the channel?\",\n \"DeleteContact\": \"Delete contact\",\n \"GroupType\": \"Group Type\",\n \"ChannelType\": \"Channel Type\",\n \"TypePrivate\": \"Private\",\n \"TypePublic\": \"Public\",\n \"TypePrivateGroup\": \"Private\",\n \"TypePublicGroup\": \"Public\",\n \"GroupMembers\": \"Members\",\n \"DeleteMega\": \"Delete Group\",\n \"DeleteMegaMenu\": \"Delete group\",\n \"DeleteAndExitButton\": \"Delete and Leave Group\",\n \"ChannelDelete\": \"Delete Channel\",\n \"ChannelDeleteMenu\": \"Delete channel\",\n \"ChannelPermissions\": \"Permissions\",\n \"ChannelPermissionsHeader\": \"What can members of this group do?\",\n \"ChannelAddException\": \"Add Exception\",\n \"ChannelBlockedUsers\": \"Removed users\",\n \"NoBlockedUsers\": \"No removed users\",\n \"UserRestrictions\": \"User Permissions\",\n \"UserRestrictionsDisabled\": \"This option is disabled for all members in Group Permissions\",\n \"UserRestrictionsCanDo\": \"What can this user do?\",\n \"UserRestrictionsRead\": \"Read Messages\",\n \"UserRestrictionsSend\": \"Send Messages\",\n \"UserRestrictionsSendMedia\": \"Send Media\",\n \"UserRestrictionsSendPolls\": \"Send Polls\",\n \"UserRestrictionsSendStickers\": \"Send Stickers and GIFs\",\n \"UserRestrictionsEmbedLinks\": \"Embed Links\",\n \"UserRestrictionsChangeInfo\": \"Change Chat Info\",\n \"UserRestrictionsPinMessages\": \"Pin Messages\",\n \"UserRestrictionsInviteUsers\": \"Add Users\",\n //\"UserRestrictionsNoRead\": \"can't read\",\n \"UserRestrictionsNoSend\": \"can't send messages\",\n \"UserRestrictionsNoSendMedia\": \"no media\",\n \"UserRestrictionsNoSendPolls\": \"no polls\",\n \"UserRestrictionsNoSendStickers\": \"no stickers & GIFs\",\n \"UserRestrictionsNoEmbedLinks\": \"no embed links\",\n \"UserRestrictionsNoChangeInfo\": \"can't change Info\",\n \"UserRestrictionsNoPinMessages\": \"no pins\",\n \"UserRestrictionsNoInviteUsers\": \"can't add users\",\n \"UserRestrictionsBlock\": \"Ban and remove from group\",\n \"ChannelPublic\": \"Public Channel\",\n \"MegaPublic\": \"Public Group\",\n //\"MegaLocation\": \"Location-based Group\",\n \"ChannelPublicInfo\": \"Public channels can be found in search, anyone can join them.\",\n \"MegaPublicInfo\": \"Public groups can be found in search, chat history is available to everyone and anyone can join.\",\n \"ChannelPrivate\": \"Private Channel\",\n \"MegaPrivate\": \"Private Group\",\n \"ChannelPrivateInfo\": \"Private channels can only be joined via an invite link.\",\n \"MegaPrivateInfo\": \"Private groups can only be joined if you were invited or have an invite link.\",\n \"ChannelPrivateLinkHelp\": \"People can join your channel by following this link. You can revoke the link any time.\",\n \"MegaPrivateLinkHelp\": \"People can join your group by following this link. You can revoke the link any time.\",\n \"RevokeButton\": \"Revoke\",\n \"RevokeLink\": \"Revoke Link\",\n \"RevokeAlert\": \"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.\",\n \"SetUrlPlaceholder\": \"Link\",\n \"Subscribers\": {\n \"one_value\": \"%1$d subscriber\",\n \"other_value\": \"%1$d subscribers\"\n },\n \"SearchGifsTitle\": \"Search GIFs\",\n \"PinMessageAlert\": \"Pin this message in the group?\",\n \"PinMessageAlertTitle\": \"Pin message\",\n \"PinMessageAlertChannel\": \"Do you want to pin this message in this channel?\",\n \"PinMessageAlertChat\": \"Do you want to pin this message at the top of the chat?\",\n \"UnpinMessageAlertTitle\": \"Unpin message\",\n \"UnpinMessageAlert\": \"Do you want to unpin this message?\",\n \"PinNotify\": \"Notify all members\",\n \"PinMessage\": \"Pin\",\n \"UnpinMessage\": \"Unpin\",\n \"PinAlsoFor\": \"Also pin for %1$s\",\n \"DeleteMessagesTitle\": \"Delete %1$s\",\n \"DeleteSingleMessagesTitle\": \"Delete message\",\n \"DeleteMessagesOption\": \"Unsend My Messages\",\n \"DeleteMessagesOptionAlso\": \"Also delete for %1$s\",\n \"DeleteForAll\": \"Delete for all members\",\n \"DeleteMessagesTextGroup\": \"You can also delete the %1$s you sent from the inboxes of other group members by checking \\\"Unsend my messages\\\".\",\n \"LeaveChannel\": \"Leave Channel\",\n \"LeaveChannelMenu\": \"Leave channel\",\n \"ChannelLeaveAlertWithName\": \"Are you sure you want to leave **%1$s**?\",\n \"LeaveMegaMenu\": \"Leave group\",\n \"DeleteChatUser\": \"Delete chat\",\n \"PleaseEnterCurrentPassword\": \"Enter your password\",\n \"PleaseEnterFirstPassword\": \"Enter a password\",\n \"PleaseReEnterPassword\": \"Re-enter your password\",\n \"Continue\": \"Continue\",\n \"YourEmailSkip\": \"Skip\",\n \"YourEmailSkipWarning\": \"Warning\",\n \"YourEmailSkipWarningText\": \"No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.\",\n \"TurnPasswordOffQuestionTitle\": \"Disable password\",\n \"TurnPasswordOffQuestion\": \"Are you sure you want to disable your password?\",\n \"Disable\": \"Disable\",\n \"TwoStepVerificationSetPassword\": \"Set Password\",\n \"TwoStepVerificationPasswordSet\": \"Password Set!\",\n \"TwoStepVerificationPasswordSetInfo\": \"This password will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepVerificationPasswordReturnSettings\": \"Return to Settings\",\n \"RecoveryEmail\": \"Recovery email\",\n \"RecoveryEmailTitle\": \"Recovery Email\",\n \"ResendCode\": \"Resend code\",\n \"PasswordAsHintError\": \"Hint must be different from your password\",\n \"AddStickersCount\": \"ADD %1$s\",\n \"RemoveStickersCount\": \"REMOVE %1$s\",\n \"Stickers\": {\n \"one_value\": \"%1$d sticker\",\n \"other_value\": \"%1$d stickers\"\n },\n \"HidAccount\": \"The account was hidden by the user\",\n \"TelegramFeatures\": \"Telegram Features\",\n \"SetColor\": \"Set a color\",\n \"Open\": \"Open\",\n \"OpenUrlTitle\": \"Open Link\",\n \"OpenUrlAlert2\": \"Do you want to open %1$s?\",\n \"FilterNoChatsToDisplay\": \"Folder is empty\",\n \"FilterNoChatsToDisplayInfo\": \"No chats currently belong to this folder.\",\n \"SupportStatus\": \"support\",\n \"Lately\": \"last seen recently\",\n \"WithinAWeek\": \"last seen within a week\",\n \"WithinAMonth\": \"last seen within a month\",\n \"ALongTimeAgo\": \"last seen a long time ago\",\n \"Online\": \"online\",\n \"MessageScheduleSend\": \"Send Now\",\n \"MessageScheduleEditTime\": \"Reschedule\",\n \"YouLeft\": \"You left this group\",\n \"Recent\": \"Recent\",\n \"Of\": \"%1$d of %2$d\",\n \"NoResult\": \"No results\",\n \"Updating\": \"Updating...\",\n \"Emoji\": \"Emoji\",\n \"AddContactTitle\": \"Add Contact\",\n \"HiddenName\": \"Deleted Account\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can't add this user to groups because of user's privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can't add this user to channels because of user's privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can't pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n \"GlobalSearch\": \"Global search\",\n \"SearchMessages\": \"Messages\",\n \"SearchAllChatsShort\": \"Chats\",\n \"ClearButton\": \"Clear\",\n \"FilterAllChats\": \"All Chats\",\n \"FilterAllChatsShort\": \"All\",\n \"Call\": \"Call\",\n \"VideoCall\": \"Video Call\",\n \"CallMessageOutgoing\": \"Outgoing Call\",\n \"CallMessageIncoming\": \"Incoming Call\",\n \"CallMessageVideoOutgoing\": \"Outgoing Video Call\",\n \"CallMessageVideoIncoming\": \"Incoming Video Call\",\n \"VoipExchangingKeys\": \"Exchanging encryption keys\",\n \"VoipUnmute\": \"Unmute\",\n \"SavingContentTitle\": \"Saving content\",\n \"RestrictSavingContent\": \"Restrict saving content\",\n \"RestrictSavingContentInfoGroup\": \"Members won't be able to copy, save and forward content from this group.\",\n \"RestrictSavingContentInfoChannel\": \"Subscribers won't be able to copy, save and forward content from this channel.\",\n \"ClearOtherSessionsHelp\": \"Logs out all devices except for this one.\",\n \"SessionsListInfo\": \"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.\",\n \"SponsoredMessage\": \"sponsored\",\n \"OpenChannelPost\": \"VIEW POST\",\n \"FilterNameHint\": \"Folder name\",\n \"BotStart\": \"START\",\n \"BotUnblock\": \"RESTART\",\n \"BotStop\": \"Stop bot\",\n \"BotRestart\": \"Restart bot\",\n \"ShareYouPhoneNumberTitle\": \"Share your phone number?\",\n \"AreYouSureShareMyContactInfoBot\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n \"DistanceUnitsTitle\": \"Distance units\",\n \"DistanceUnitsKilometers\": \"Kilometers\",\n \"DistanceUnitsMiles\": \"Miles\",\n \"PeopleNearby\": \"People Nearby\",\n \"MakeMyselfVisible\": \"Make Myself Visible\",\n \"MakeMyselfVisibleTitle\": \"Show Your Profile?\",\n \"MakeMyselfVisibleInfo\": \"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.\",\n \"StopShowingMe\": \"Stop Showing Me\",\n \"PeopleNearbyInfo2\": \"Exchange contact info with people nearby and find new friends.\",\n \"NearbyCreateGroup\": \"Create a Local group\",\n \"AwayTo\": \"%1$s away\",\n \"MessagePreview\": \"Message Preview\",\n \"KMetersAway2\": \"%1$s km away\",\n \"MetersAway2\": \"%1$s m away\",\n \"MilesAway\": \"%1$s mi away\",\n \"FootsAway\": \"%1$s ft away\",\n \"PeopleNearbyHeader\": \"People nearby\",\n \"ChatsNearbyHeader\": \"Groups nearby\",\n \"ChatLocation\": \"Location\",\n \"RequestToJoinGroupDescription\": \"This group accepts new members only after they are approved by its admins.\",\n \"RequestToJoinChannelDescription\": \"This channel accepts new subscribers only after they are approved by its admins.\",\n \"RequestToJoinSent\": \"Join request sent\",\n \"RequestToJoinGroupApproved\": \"Your request to join the group was approved\",\n \"RequestToJoinChannelApproved\": \"Your request to join the channel was approved\",\n \"Update\": \"UPDATE\",\n \"Reactions\": \"Reactions\",\n \"DoubleTapSetting\": \"Quick Reaction\",\n \"EnableReactions\": \"Enable Reactions\",\n \"EnableReactionsChannelInfo\": \"Allow subscribers to react to channel posts.\",\n \"EnableReactionsGroupInfo\": \"Allow members to react to group messages.\",\n \"AvailableReactions\": \"Available reactions\",\n \"NobodyViewed\": \"Nobody viewed\",\n \"MessageSeen\": {\n \"one_value\": \"Seen\",\n \"other_value\": \"%1$d Seen\"\n },\n // \"Close\": \"Close\",\n \"DataSettings\": \"Data and Storage\",\n \"GroupsAndChannelsHelp\": \"Change who can add you to groups and channels.\",\n \"SessionsInfo\": \"Control your sessions on other devices.\",\n \"StickersBotInfo\": \"Artists are welcome to add their own sticker sets using our @stickers bot.\",\n \"AutomaticMediaDownload\": \"Automatic media download\",\n \"AutoDownloadPhotos\": \"Photos\",\n \"AutoDownloadVideos\": \"Videos\",\n \"AutoDownloadFiles\": \"Files\",\n \"AutoDownloadOnAllChats\": \"On in all chats\",\n \"AutoDownloadUpToOnAllChats\": \"Up to %1$s in all chats\",\n \"AutoDownloadOff\": \"Off\",\n \"AutoDownloadOnUpToFor\": \"Up to %1$s for %2$s\",\n \"AutoDownloadOnFor\": \"On for %1$s\",\n \"AutoDownloadContacts\": \"Contacts\",\n \"AutoDownloadPm\": \"PM\",\n \"AutoDownloadGroups\": \"Groups\",\n \"AutoDownloadChannels\": \"Channels\",\n \"AutoDownloadAudioInfo\": \"Voice messages are tiny, so they're always downloaded automatically.\",\n \"AutoplayMedia\": \"Auto-play media\",\n \"AutoDownloadPhotosTitle\": \"Auto-download photos\",\n \"AutoDownloadVideosTitle\": \"Auto-download videos and GIFs\",\n \"AutoDownloadFilesTitle\": \"Auto-download files and music\",\n \"AutoDownloadMaxFileSize\": \"Maximum file size\",\n \"AutodownloadSizeLimitUpTo\": \"up to %1$s\",\n \"ResetAutomaticMediaDownload\": \"Reset Auto-Download Settings\",\n \"ResetAutomaticMediaDownloadAlertTitle\": \"Reset settings\",\n \"ResetAutomaticMediaDownloadAlert\": \"Are you sure you want to reset auto-download settings?\",\n \"Reset\": \"Reset\",\n \"SendMessageAsTitle\": \"Send message as...\",\n \"Devices\": \"Devices\",\n \"LanguageName\": \"English\",\n \"EditCantEditPermissionsPublic\": \"This permission is not available in public groups.\",\n \"VoipUserMicrophoneIsOff\": \"%s\\'s microphone is off\",\n \"VoipUserCameraIsOff\": \"%s\\'s camera is off\",\n \"PrivacyPhoneInfo4\": \"This public link opens a chat with you:\",\n \"ReportChatIllegalDrugs\": \"Illegal Drugs\",\n \"ReportChatPersonalDetails\": \"Personal Details\",\n \"VoipPeerIncompatible\": \"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.\",\n \"TelegramFeaturesUrl\": \"https://t.me/TelegramTips\",\n \"ScamMessage\": \"SCAM\",\n \"FakeMessage\": \"FAKE\",\n \"TextCopied\": \"Text copied to clipboard\",\n\n // * macos\n \"AccountSettings.Filters\": \"Chat Folders\",\n \"AccountSettings.Notifications\": \"Notifications and Sounds\",\n \"AccountSettings.PrivacyAndSecurity\": \"Privacy and Security\",\n \"AccountSettings.Language\": \"Language\",\n \"Alert.UserDoesntExists\": \"Sorry, this user doesn't seem to exist.\",\n \"Alert.Confirm.Discard\": \"Discard\",\n \"Appearance.Reset\": \"Reset to Defaults\",\n \"AutoDownloadSettings.Delimeter\": \", \",\n \"AutoDownloadSettings.LastDelimeter\": \" and \",\n \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\n \"Call.Accept\": \"Accept\",\n \"Call.Decline\": \"Decline\",\n \"Call.End\": \"End\",\n \"Call.Camera\": \"Camera\",\n \"Call.Mute\": \"Mute\",\n \"Call.Recall\": \"Recall\",\n \"Call.Close\": \"Close\",\n \"Call.Screen\": \"Screen\",\n \"Call.Confirm.Discard.Voice.Header\": \"Video Chat in Progress\",\n \"Call.Confirm.Discard.Voice.ToVoice.Text\": \"Leave video chat in \\\"%1$@\\\" and start a new one in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Voice.ToCall.Text\": \"Leave video chat in \\\"%1$@\\\" and start a call with \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.Header\": \"Call in Progress\",\n \"Call.Confirm.Discard.Call.ToVoice.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.ToCall.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.PrivacyErrorMessage\": \"Sorry, you cannot call %@ because of their privacy settings.\",\n \"Call.StatusRequesting\": \"Contacting...\",\n \"Call.StatusRinging\": \"Ringing...\",\n \"Call.StatusConnecting\": \"Connecting...\",\n \"Call.StatusEnded\": \"Call Ended\",\n \"Call.StatusFailed\": \"Call Failed\",\n \"Call.StatusBusy\": \"Busy\",\n \"Call.StatusCalling\": \"is calling you...\",\n \"Contacts.PhoneNumber.NotRegistred\": \"The person with this phone number is not registered on Telegram yet.\",\n \"Channel.UsernameAboutChannel\": \"People can share this link with others and can find your channel using Telegram search.\",\n \"Channel.UsernameAboutGroup\": \"People can share this link with others and find your group using Telegram search.\",\n \"Chat.Accessory.Forward\": {\n \"one_value\": \"Forward Message\",\n \"other_value\": \"Forward %d Messages\"\n },\n \"Chat.Accessory.Forward.You\": \"You\",\n \"Chat.Accessory.Forward.From\": \"From\",\n \"Chat.Accessory.Hidden\": {\n \"one_value\": \"Forward Message (sender's name hidden)\",\n \"other_value\": \"Forward %d Messages (senders' names hidden)\"\n },\n \"Chat.Alert.Forward.Action.Another\": \"Forward to Another Chat\",\n \"Chat.Alert.Forward.Action.Hide1\": {\n \"one_value\": \"Hide Sender's Name\",\n \"other_value\": \"Hide Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.Show1\": {\n \"one_value\": \"Show Sender's Name\",\n \"other_value\": \"Show Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.ShowCaption\": {\n \"one_value\": \"Show Caption\",\n \"other_value\": \"Show Captions\"\n },\n \"Chat.Alert.Forward.Action.HideCaption\": {\n \"one_value\": \"Hide Caption\",\n \"other_value\": \"Hide Captions\"\n },\n \"Chat.CopySelectedText\": \"Copy Selected Text\",\n \"Chat.Confirm.Unpin\": \"Would you like to unpin this message?\",\n \"Chat.Context.Reacted\": \"%1$@/%2$@ Reacted\",\n \"Chat.Context.ReactedFast\": {\n \"other_value\": \"%d Reacted\"\n },\n \"Chat.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.Call.Cancelled\": \"Cancelled\",\n \"Chat.Service.Call.Missed\": \"Missed\",\n \"Chat.Service.PeerJoinedTelegram\": \"%@ joined Telegram\",\n \"Chat.Service.Channel.UpdatedTitle\": \"Channel renamed to \\\"%@\\\"\",\n \"Chat.Service.Channel.UpdatedPhoto\": \"Channel photo updated\",\n \"Chat.Service.Channel.RemovedPhoto\": \"Channel photo removed\",\n \"Chat.Service.Channel.UpdatedVideo\": \"Channel video updated\",\n \"Chat.Service.BotPermissionAllowed\": \"You allowed this bot to message you when you logged in on %@\",\n \"Chat.Service.Group.UpdatedPinnedMessage\": \"%@ pinned \\\"%@\\\"\",\n \"Chat.Service.VoiceChatStarted\": \"%1$@ started a [video chat](open)\",\n \"Chat.Service.VoiceChatStartedYou\": \"You started a [video chat](open)\",\n \"Chat.Service.VoiceChatStarted.Channel\": \"[Live Stream](open) started\",\n \"Chat.Service.VoiceChatFinished\": \"%1$@ ended the video chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the video chat (%@)\",\n \"Chat.Service.VoiceChatFinished.Channel\": \"Live Stream ended (%1$@)\",\n \"Chat.Service.VoiceChatInvitation\": \"%1$@ invited %2$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationByYou\": \"You invited %1$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationForYou\": \"%1$@ invited you to the [video chat](open)\",\n \"ChatService.UserJoinedGroupByRequest\": \"%@ was accepted to the group\",\n \"ChatService.UserJoinedChannelByRequest\": \"%@ joined the channel by request\",\n \"ChatList.Service.VoiceChatScheduled\": \"%1$@ scheduled a video chat for %2$@\",\n \"ChatList.Service.VoiceChatScheduledYou\": \"You scheduled a video chat for %2$@\",\n \"Chat.Poll.Unvote\": \"Retract Vote\",\n \"Chat.Poll.Stop\": \"Stop Poll\",\n \"Chat.Poll.ViewResults\": \"View Results\",\n \"Chat.Poll.SubmitVote\": \"Vote\",\n \"Chat.Poll.Type.Anonymous\": \"Anonymous Poll\",\n \"Chat.Poll.Type.Public\": \"Poll\",\n \"Chat.Poll.Type.AnonymousQuiz\": \"Anonymous Quiz\",\n \"Chat.Poll.Type.Quiz\": \"Quiz\",\n \"Chat.Poll.Type.Closed\": \"Final Results\",\n \"Chat.Poll.TotalVotes1\": {\n \"one_value\": \"%d vote\",\n \"other_value\": \"%d votes\"\n },\n \"Chat.Quiz.TotalVotes\": {\n \"one_value\": \"%d answer\",\n \"other_value\": \"%d answers\"\n },\n \"Chat.Poll.TotalVotesEmpty\": \"No votes yet\",\n \"Chat.Poll.TotalVotesResultEmpty\": \"No votes\",\n \"Chat.Quiz.TotalVotesEmpty\": \"No answers yet\",\n \"Chat.Quiz.TotalVotesResultEmpty\": \"No answers\",\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n \"Chat.Pinned.DontShow\": \"Don't Show Pinned Messages\",\n \"Chat.Title.Comments\": {\n \"one_value\": \"%d Comment\",\n \"other_value\": \"%d Comments\"\n },\n \"ChatTitle.ReportMessages\": \"Report Messages\",\n \"Chat.Send.WithoutSound\": \"Send Without Sound\",\n \"Chat.Send.SetReminder\": \"Set a Reminder\",\n \"Chat.Send.ScheduledMessage\": \"Schedule Message\",\n \"Chat.SendAs.PersonalAccount\": \"personal account\",\n \"Chat.UnpinAllMessagesConfirmation\": {\n \"one_value\": \"Do you want to unpin %d message in this chat?\",\n \"other_value\": \"Do you want to unpin all %d messages in this chat?\"\n },\n \"Chat.Message.Ad.Text\": \"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.\",\n \"Chat.Message.Ad.ReadMore\": \"Read More\",\n \"Chat.Message.ViewChannel\": \"VIEW CHANNEL\",\n \"Chat.Message.ViewBot\": \"VIEW BOT\",\n \"Chat.Message.ViewGroup\": \"VIEW GROUP\",\n \"Chat.Message.Sponsored.What\": \"What are sponsored messages?\",\n \"Chat.Message.Sponsored.Link\": \"https://promote.telegram.org\",\n \"ChatList.Context.Mute\": \"Mute\",\n \"ChatList.Context.Unmute\": \"Unmute\",\n \"ChatList.Context.Pin\": \"Pin\",\n \"ChatList.Context.Unpin\": \"Unpin\",\n \"ChatList.Context.DeleteChat\": \"Delete Chat\",\n \"ChatList.Context.DeleteAndExit\": \"Delete and Leave\",\n \"ChatList.Context.LeaveChannel\": \"Leave Channel\",\n \"ChatList.Context.LeaveGroup\": \"Leave Group\",\n \"ChatList.Service.Call.incoming\": \"Incoming Call (%@)\",\n \"ChatList.Service.Call.outgoing\": \"Outgoing Call (%@)\",\n \"ChatList.Service.VideoCall.incoming\": \"Incoming Video Call (%@)\",\n \"ChatList.Service.VideoCall.outgoing\": \"Outgoing Video Call (%@)\",\n \"ChatList.Service.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed Call\",\n \"ChatList.Service.VideoCall.Cancelled\": \"Cancelled Video Call\",\n \"ChatList.Service.VideoCall.Missed\": \"Missed Video Call\",\n \"ChatList.Service.VoiceChatScheduled.Channel\": \"Voice chat scheduled for %@\",\n \"ChatList.Filter.Header\": \"Create folders for different groups of chats and quickly switch between them.\",\n \"ChatList.Filter.NewTitle\": \"Create Folder\",\n \"ChatList.Filter.List.Title\": \"Chat Folders\",\n \"ChatList.Filter.Include.AddChat\": \"Add Chats\",\n \"ChatList.Filter.Exclude.AddChat\": \"Add Chats\",\n //\"ChatList.Filter.All\": \"All\",\n \"ChatList.Filter.Contacts\": \"Contacts\",\n \"ChatList.Filter.NonContacts\": \"Non-Contacts\",\n \"ChatList.Filter.Groups\": \"Groups\",\n \"ChatList.Filter.Channels\": \"Channels\",\n \"ChatList.Filter.Bots\": \"Bots\",\n \"ChatList.Filter.MutedChats\": \"Muted\",\n \"ChatList.Filter.ReadChats\": \"Read\",\n \"ChatList.Filter.Archive\": \"Archived\",\n \"ChatList.Filter.Include.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Exclude.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Confirm.Remove.Header\": \"Remove Folder\",\n \"ChatList.Filter.Confirm.Remove.Text\": \"Are you sure you want to remove this folder? Your chats will not be deleted.\",\n \"ChatList.Mute.1Hour\": \"For 1 Hour\",\n \"ChatList.Mute.4Hours\": \"For 4 Hours\",\n \"ChatList.Mute.8Hours\": \"For 8 Hours\",\n \"ChatList.Mute.1Day\": \"For 1 Day\",\n \"ChatList.Mute.3Days\": \"For 3 Days\",\n \"ChatList.Mute.Forever\": \"Forever\",\n \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"FileSize.B\": \"%@ B\",\n \"FileSize.KB\": \"%@ KB\",\n \"FileSize.MB\": \"%@ MB\",\n \"FileSize.GB\": \"%@ GB\",\n \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\n \"LastSeen.HoursAgo\": {\n \"one_value\": \"last seen %d hour ago\",\n \"other_value\": \"last seen %d hours ago\"\n },\n \"Login.Register.LastName.Placeholder\": \"Last Name\",\n \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"Modal.Send\": \"Send\",\n \"NewPoll.Anonymous\": \"Anonymous Voting\",\n \"NewPoll.Explanation.Placeholder\": \"Add a Comment (Optional)\",\n \"NewPoll.OptionsAddOption\": \"Add an Option\",\n \"NewPoll.MultipleChoice\": \"Multiple Answers\",\n \"NewPoll.Quiz\": \"Quiz Mode\",\n \"Notification.Contact.Reacted\": \"%1$@ to your \\\"%2$@\\\"\",\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \\\"%3$@\\\"\",\n \"Peer.Activity.User.PlayingGame\": \"playing a game\",\n \"Peer.Activity.User.TypingText\": \"typing\",\n \"Peer.Activity.User.SendingPhoto\": \"sending a photo\",\n \"Peer.Activity.User.RecordingVideo\": \"recording video\",\n \"Peer.Activity.User.SendingVideo\": \"sending a video\",\n \"Peer.Activity.User.RecordingAudio\": \"recording voice\",\n \"Peer.Activity.User.SendingFile\": \"sending file\",\n \"Peer.Activity.User.ChoosingSticker\": \"choosing a sticker\",\n \"Peer.Activity.User.EnjoyingAnimations\": \"watching %@\",\n \"Peer.Activity.Chat.PlayingGame\": \"%@ is playing a game\",\n \"Peer.Activity.Chat.TypingText\": \"%@ is typing\",\n \"Peer.Activity.Chat.SendingPhoto\": \"%@ is sending a photo\",\n \"Peer.Activity.Chat.RecordingVideo\": \"%@ is recording video\",\n \"Peer.Activity.Chat.SendingVideo\": \"%@ is sending a video\",\n \"Peer.Activity.Chat.RecordingAudio\": \"%@ is recording voice\",\n \"Peer.Activity.Chat.SendingFile\": \"%@ is sending a file\",\n \"Peer.Activity.Chat.ChoosingSticker\": \"%@ is choosing a sticker\",\n \"Peer.Activity.Chat.EnjoyingAnimations\": \"%@ is watching %@\",\n \"Peer.Activity.Chat.Multi.PlayingGame1\": \"%@ and %d others are playing a game\",\n \"Peer.Activity.Chat.Multi.TypingText1\": \"%@ and %d others are typing\",\n \"Peer.Activity.Chat.Multi.SendingPhoto1\": \"%@ and %d others are sending photos\",\n \"Peer.Activity.Chat.Multi.RecordingVideo1\": \"%@ and %d others are recording video\",\n \"Peer.Activity.Chat.Multi.SendingVideo1\": \"%@ and %d others are sending videos\",\n \"Peer.Activity.Chat.Multi.RecordingAudio1\": \"%@ and %d others are recording voice\",\n //\"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n \"Peer.Activity.Chat.Multi.SendingFile1\": \"%@ and %d others are sending files\",\n \"Peer.Activity.Chat.Multi.ChoosingSticker1\": \"%@ and %d others are choosing stickers\",\n \"Peer.ServiceNotifications\": \"service notifications\",\n \"Peer.RepliesNotifications\": \"Reply Notifications\",\n \"Peer.Status.justNow\": \"last seen just now\",\n \"Peer.Status.Today\": \"today\",\n \"Peer.Status.Yesterday\": \"yesterday\",\n \"Peer.Status.LastSeenAt\": \"last seen %@ at %@\",\n \"Peer.Status.minAgo\": {\n \"one_value\": \"last seen %d minute ago\",\n \"other_value\": \"last seen %d minutes ago\"\n },\n \"Peer.Status.Member\": {\n \"one_value\": \"%d member\",\n \"other_value\": \"%d members\"\n },\n \"Peer.Status.Subscribers\": {\n \"one_value\": \"%d subscriber\",\n \"other_value\": \"%d subscribers\"\n },\n \"PeerInfo.Administrators\": \"Administrators\",\n \"PeerInfo.DeleteChannel\": \"Delete Channel\",\n \"PeerInfo.Discussion\": \"Discussion\",\n \"PeerInfo.Discussion.Add\": \"Add\",\n \"PeerInfo.SignMessages\": \"Sign Messages\",\n \"PeerInfo.SharedMedia\": \"Shared Media\",\n \"PeerInfo.Subscribers\": \"Subscribers\",\n \"PeerInfo.DeleteContact\": \"Delete Contact\",\n //\"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n \"PeerInfo.Action.VoiceChat\": \"Video Chat\",\n \"PeerInfo.Action.LiveStream\": \"Live Stream\",\n \"PeerMedia.Members\": \"Members\",\n \"PollResults.Title.Poll\": \"Poll Results\",\n \"PollResults.Title.Quiz\": \"Quiz Results\",\n \"PollResults.LoadMore\": {\n \"other_value\": \"Show More (%d)\"\n },\n //\"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n \"Preview.Dragging.AddItems\": {\n \"one_value\": \"Add Item\",\n \"other_value\": \"Add Items\"\n },\n \"PreviewSender.CaptionPlaceholder\": \"Add a caption...\",\n \"PreviewSender.CompressFile\": \"Send compressed\",\n \"PreviewSender.SendFile\": {\n \"one_value\": \"Send File\",\n \"other_value\": \"Send %d Files\"\n },\n \"PreviewSender.SendPhoto\": {\n \"one_value\": \"Send Photo\",\n \"other_value\": \"Send %d Photos\"\n },\n \"PreviewSender.SendVideo\": {\n \"one_value\": \"Send Video\",\n \"other_value\": \"Send %d Videos\"\n },\n \"PrivacyAndSecurity.Item.On\": \"On\",\n \"PrivacyAndSecurity.Item.Off\": \"Off\",\n \"PrivacyAndSecurity.SensitiveText\": \"Disable filtering\",\n \"PrivacyAndSecurity.SensitiveDesc\": \"Display sensitive media in public channels on all your Telegram devices.\",\n \"PrivacySettings.VoiceCalls\": \"Calls\",\n \"PrivacySettings.Forwards\": \"Forwarded Messages\",\n \"PrivacySettings.Groups\": \"Groups and Channels\",\n \"PrivacySettingsController.AddUsers\": \"Add Users\",\n \"PrivacySettingsController.GroupDescription\": \"You can restrict who can add you to groups and channels with granular precision.\",\n \"PrivacySettingsController.Forwards.CustomHelp\": \"You can restrict who can add a link to your account when forwarding your messages.\",\n \"PrivacySettingsController.P2p.Desc\": \"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.\",\n \"PrivacySettingsController.PhoneCallDescription\": \"You can restrict who can call you with granular precision.\",\n \"PrivacySettingsController.ProfilePhoto.CustomHelp\": \"You can restrict who can see your profile photo with granular precision.\",\n \"PrivacySettingsController.LastSeenDescription\": \"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).\",\n \"PrivacySettingsController.PeerInfo\": \"You can add users or entire groups as exceptions that will override the settings above.\",\n \"PrivacySettingsController.Everbody\": \"Everybody\",\n \"PrivacySettingsController.MyContacts\": \"My Contacts\",\n \"PrivacySettingsController.Nobody\": \"Nobody\",\n \"PrivacySettingsController.NeverShare\": \"Never Share With\",\n \"PrivacySettingsController.AlwaysShare\": \"Always Share With\",\n \"PrivacySettingsController.NeverAllow\": \"Never Allow\",\n \"PrivacySettingsController.AlwaysAllow\": \"Always Allow\",\n \"PrivacySettingsController.UserCount\": {\n \"one_value\": \"%d user\",\n \"other_value\": \"%d users\"\n },\n \"RecentSessions.Error.FreshReset\": \"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.\",\n \"RequestJoin.Button\": \"Request to Join\",\n \"Stickers.SearchAdd\": \"Add\",\n \"Stickers.SearchAdded\": \"Added\",\n \"Stickers.SuggestStickers\": \"Suggest Stickers by Emoji\",\n \"ShareModal.Search.Placeholder\": \"Share to...\",\n \"ShareModal.Search.ForwardPlaceholder\": \"Forward to...\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\n \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"Search.Confirm.ClearHistory\": \"Are you sure you want to clear your search history?\",\n \"Separator.ShowMore\": \"show more\",\n \"Separator.ShowLess\": \"show less\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"StickerSet.DontExist\": \"Sorry, this sticker set doesn't seem to exist.\",\n \"Text.Context.Copy.Username\": \"Copy Username\",\n \"Text.Context.Copy.Hashtag\": \"Copy Hashtag\",\n \"Time.TomorrowAt\": \"tomorrow at %@\",\n \"TwoStepAuth.SetPasswordHelp\": \"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepAuth.GenericHelp\": \"You have enabled Two-Step verification.\\nYou'll need the password you set up here to log in to your Telegram account.\",\n \"TwoStepAuth.ChangePassword\": \"Change Password\",\n \"TwoStepAuth.RemovePassword\": \"Turn Password Off\",\n \"TwoStepAuth.SetupEmail\": \"Set Recovery Email\",\n \"TwoStepAuth.ChangeEmail\": \"Change Recovery Email\",\n \"TwoStepAuth.ConfirmEmailCodeDesc\": \"Please enter the code we've just emailed to %@.\",\n \"TwoStepAuth.RecoveryTitle\": \"Email Code\",\n \"TwoStepAuth.RecoveryCode\": \"Code\",\n \"TwoStepAuth.RecoveryCodeInvalid\": \"Invalid code. Please try again.\",\n \"TwoStepAuth.RecoveryCodeExpired\": \"Code Expired\",\n \"TwoStepAuth.SetupHintTitle\": \"Password Hint\",\n \"TwoStepAuth.SetupHintPlaceholder\": \"Hint\",\n \"UsernameSettings.ChangeDescription\": \"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\",\n \"VoiceChat.Chat.StartNew\": \"Video chat ended. Start a new one?\",\n \"VoiceChat.Chat.StartNew.OK\": \"Start\",\n \"VoiceChat.Chat.Ended\": \"Video chat ended.\",\n \"VoiceChat.Invite.InviteMembers\": \"Invite members\",\n \"VoiceChat.Status.Connecting\": \"Connecting...\",\n \"VoiceChat.Status.Members\": {\n \"one_value\": \"%d participant\",\n \"other_value\": \"%d participants\"\n },\n \"VoiceChat.Status.MutedForYou\": \"muted for you\",\n \"VoiceChat.Status.Speaking\": \"speaking\",\n \"VoiceChat.Status.Listening\": \"listening\",\n \"VoiceChat.Status.WantsSpeak\": \"wants to speak\",\n \"VoiceChat.Status.Muted\": \"muted\",\n \"VoiceChat.Status.You\": \"This is you\",\n \"VoiceChat.Video.Stream.Video\": \"video\",\n \"VoiceChat.Video.Stream.Screencast\": \"screen\",\n \"VoiceChat.Video.Stream.More\": \"more\",\n \"VoiceChat.Leave\": \"Leave\",\n \"VoiceChat.End.Title\": \"Leave video chat\",\n \"VoiceChat.End.Text\": \"Are you sure you want to leave this video chat?\",\n \"VoiceChat.End.Third\": \"End Video Chat\",\n \"VoiceChat.End.OK\": \"Leave\",\n \"VoiceChat.MutePeer\": \"Mute\",\n \"VoiceChat.UnmutePeer\": \"Allow To Speak\",\n \"VoiceChat.RemovePeer\": \"Remove\",\n \"VoiceChat.OpenProfile\": \"Open Profile\",\n \"VoiceChat.MuteForMe\": \"Mute For Me\",\n \"VoiceChat.UnmuteForMe\": \"Unmute For Me\",\n \"VoiceChat.RemovePeer.Confirm.Channel\": \"Do you want to remove %1$@ from the channel?\",\n \"VoiceChat.RemovePeer.Confirm\": \"Are you sure you want to remove %1$@ from the group?\",\n \"VoiceChat.RemovePeer.Confirm.OK\": \"Remove\"\n};\n\nexport default lang;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/709.dec2bf42c5cce33bde28.chunk.js b/public/709.dec2bf42c5cce33bde28.chunk.js new file mode 100644 index 000000000..702eefc81 --- /dev/null +++ b/public/709.dec2bf42c5cce33bde28.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[709],{4494:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2325),r=n(1405);const a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),(0,r.Z)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append((0,i.ag)(t.text)),n}},9638:(e,t,n)=>{n.d(t,{Z:()=>p});var i=n(3910),r=n(2738),a=n(4541),s=n(2325),o=n(3512),d=n(4494),l=n(279);let c,u=!1;function p(e){u||(c||(c=o.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==s.ZP.lastRequestedLangCode?Promise.all([e,s.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),s.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const c=[];n.forEach((e=>{const t=s.ZP.strings.get(e.key);t&&(c.push(t),s.ZP.strings.set(e.key,e))}));const p="Login.ContinueOnLanguage",m=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:p});m.lastElementChild.classList.remove("i18n"),(0,a.Z)({text:[s.ZP.format(p,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(m)}))})),o.Z.addEventListener("language_change",(()=>{m.remove()}),{once:!0}),c.forEach((e=>{s.ZP.strings.set(e.key,e)})),(0,r.fc)(m,(e=>{(0,i.Z)(e),u=!0,m.disabled=!0,(0,l.y)(m),s.ZP.getLangPack(t.suggested_lang_code)}))}))}},279:(e,t,n)=>{function i(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function r(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,i(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}n.d(t,{p:()=>r,y:()=>i}),n(410).GO.putPreloader=i},1405:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(8497),r=n(9674),a=n(5432),s=n(3512),o=n(5975);let d=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,c=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u,p=document.createElement("div");p.classList.add("c-ripple"),e.classList.contains("rp-square")&&p.classList.add("is-square"),e[l?"prepend":"append"](p);const m=(e,i)=>{const s=Date.now(),o=document.createElement("div"),l=d++,c=1e3*+window.getComputedStyle(p).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let e=Date.now()-s;const t=()=>{r.Z.mutate((()=>{o.remove()})),n&&n(l)};if(eo.classList.add("hiding")),Math.max(n-c/2,0)),setTimeout(t,n)}else o.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",u),u=null,h=!1},t&&t(l),window.requestAnimationFrame((()=>{const t=p.getBoundingClientRect();o.classList.add("c-ripple__circle");const n=e-t.left,r=i-t.top,a=Math.sqrt(Math.pow(Math.abs(r-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),s=n-a/2,d=r-a/2;o.style.width=o.style.height=a+"px",o.style.left=s+"px",o.style.top=d+"px",p.append(o)}))},g=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,i.Z)(t.target,"c-ripple")!==p)&&(c===e||!(0,o.Z)(t.target,c));let h=!1;if(a.Z){let e=()=>{u&&u()};c.addEventListener("touchstart",(t=>{if(!s.Z.settings.animationsEnabled)return;if(t.touches.length>1||h||g(t))return;h=!0;let{clientX:n,clientY:i}=t.touches[0];m(n,i),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!s.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||g(e))return;if(h)return void(h=!1);let{clientX:t,clientY:n}=e;m(t,n),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})}),{passive:!0})}},4484:(e,t,n)=>{function i(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ii})},2738:(e,t,n)=>{n.d(t,{EN:()=>o,fc:()=>s,pf:()=>a,tH:()=>d});var i=n(5432),r=n(6669);const a=i.Z?"mousedown":"click";function s(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(a,t,n)}function o(e,t,n){e.removeEventListener(a,t,n)}function d(e){(0,r.Z)(e,a)}},9674:(e,t,n)=>{n.d(t,{Z:()=>d});var i=n(3035),r=n(3725),a=n(410),s=n(8487);const o=new class{constructor(){this.promises={},this.raf=i.T2.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=(0,r.Z)()),void 0!==t&&n.then((()=>t())),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=(0,s.Z)(e),i=n?this.mutate():Promise.resolve();return void 0!==t&&(n?t():i.then((()=>t()))),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=o);const d=o},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var i=n(4874),r=n(4159),a=n(4494),s=n(2325),o=n(3512),d=n(279),l=n(9638),c=n(5418),u=n(4484);function p(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var m=function(e,t,n,i){return new(n||(n=Promise))((function(r,a){function s(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,o)}d((i=i.apply(e,t||[])).next())}))};let g;const h=new i.Z("page-signQR",!0,(()=>g),(()=>{g||(g=m(void 0,void 0,void 0,(function*(){const e=h.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const i=document.createElement("div");i.classList.add("input-wrapper");const v=(0,a.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});i.append(v),(0,l.Z)(i);const f=e.parentElement,w=document.createElement("h4");(0,s.$d)(w,"Login.QR.Title");const y=document.createElement("ol");y.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,s.ag)(e)),y.append(t)})),f.append(w,y,i),v.addEventListener("click",(()=>{Promise.all([n.e(458),n.e(445),n.e(53)]).then(n.bind(n,810)).then((e=>e.default.mount())),E=!0}));const L=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let E=!1;o.Z.addEventListener("user_auth",(()=>{E=!0,g=null}),{once:!0});let Z,b={ignoreErrors:!0};const P=i=>m(void 0,void 0,void 0,(function*(){try{let a=yield o.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:r.Z.id,api_hash:r.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===a._&&(b.dcId||(b.dcId=a.dc_id,o.Z.managers.apiManager.setBaseDcId(a.dc_id)),a=yield o.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:a.token},b)),"auth.loginTokenSuccess"===a._){const e=a.authorization;return o.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!Z||!(0,u.Z)(Z,a.token)){Z=a.token;let n="tg://login?token="+function(e){let t,n="";for(let i=e.length,r=0,a=0;a>>t&24),2!==t&&i-a!=1||(n+=String.fromCharCode(p(r>>>18&63),p(r>>>12&63),p(r>>>6&63),p(63&r)),r=0);return n.replace(/A(?=A$|$)/g,"=")}(a.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),r=i.getPropertyValue("--surface-color").trim(),s=i.getPropertyValue("--primary-text-color").trim(),o=i.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${o}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)}))})),l=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:s,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:r},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([(0,c.Z)(1e3),new Promise((e=>{l._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield u.then((()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout((()=>{n.style.display=""}),150),setTimeout((()=>{n.style.animation=""}),500),t=void 0}else Array.from(e.children).slice(0,-1).forEach((e=>{e.remove()}))}))}if(i){let e=Date.now()/1e3,t=a.expires-e-(yield o.Z.managers.timeManager.getServerTimeOffset());yield(0,c.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,Promise.all([n.e(458),n.e(442)]).then(n.bind(n,9437)).then((e=>e.default.mount())),E=!0,g=null):(console.error("pageSignQR: default error:",e),E=!0),!0}return!1}));return()=>m(void 0,void 0,void 0,(function*(){for(E=!1;!E&&!(yield P(!0)););}))}))),g.then((e=>{e()})),o.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),v=h}}]); +//# sourceMappingURL=709.dec2bf42c5cce33bde28.chunk.js.map \ No newline at end of file diff --git a/public/709.dec2bf42c5cce33bde28.chunk.js.map b/public/709.dec2bf42c5cce33bde28.chunk.js.map new file mode 100644 index 000000000..319259d20 --- /dev/null +++ b/public/709.dec2bf42c5cce33bde28.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"709.dec2bf42c5cce33bde28.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./putPreloader\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport Page from './page';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then((m) => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then((res) => res.text())\r\n .then((text) => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","lastElementChild","remove","window","requestAnimationFrame","once","e","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","touches","length","cancelBubble","stopPropagation","passive","dataset","bytesCmp","bytes1","bytes2","len","i","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","sequentialDom","promises","raf","scheduled","do","kind","promise","this","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","uint6ToBase64","nUint6","imageDiv","pageEl","preloader","inputWrapper","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","ignoreErrors","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","diff","expires","err","console","warn","handled","error","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/765.d96ae842524025af79ef.chunk.js b/public/765.d96ae842524025af79ef.chunk.js new file mode 100644 index 000000000..d9ee4c8b6 --- /dev/null +++ b/public/765.d96ae842524025af79ef.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[765],{9818:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(410),s=n(4762),o=n(5003),a=n(8799),r=n(3910),h=n(3444),c=n(1655);const d=new class{constructor(){if(this.onPopState=e=>{let t=window.location.hash;const n=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),n===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!n||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(n!==this.id&&(this.pushState(),!this.navigations.length))return;const i=this.navigations.pop();i?(this.manual=!this.isPossibleSwipe,this.handleItem(i)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,h.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,o.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.overriddenHash=this.currentHash=e,this.replaceState(),this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||(0,a.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...n){this.navigations.splice(e,t,...n),n.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,c.Z)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0&&(this.navigations[n].type!==e||(this.navigations.splice(n,1),!t));--n);}};i.GO.appNavigationController=d;const l=d},6765:(e,t,n)=>{n.d(t,{Z:()=>h});var i=n(1168),s=n(2325),o=n(2738),a=n(7084),r=n(2312);class h extends i.Z{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,s.$d)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,a.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let n,i,s,o={},a=0,r=0,h=0,c=0,d=0;function l(){e.classList.add("crop-blur"),e.draggable=!1,s=new Image,s.src=e.src,s.draggable=!1,s.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),i=document.createElement("div"),i.classList.add("crop-overlay");const o=document.createElement("div");o.classList.add("crop-overlay-color"),n.appendChild(i),e.parentNode.appendChild(n),n.appendChild(s),n.appendChild(e),n.appendChild(o),i.appendChild(s),s.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const a=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(a,r),m(a,r),i.addEventListener("mousedown",b,!1),i.addEventListener("touchstart",b,!1),i.addEventListener("wheel",g,!1),document.addEventListener("keypress",f,!1)}function u(e,t){h=e*d,c=t*d,i.style.width=e+"px",i.style.height=t+"px"}function p(e,t){r=t*d,a=e*d,s.style.top=-t+"px",s.style.left=-e+"px"}function m(e,t){i.style.top=t+"px",i.style.left=e+"px"}function v(e){e=e*Math.PI*2;let t,n,o,a,r=Math.floor(i.clientWidth+e),h=Math.floor(i.clientHeight+e),c=s.clientWidth,d=s.clientHeight;r<50||r>c||(t=i.offsetLeft-e/2,n=i.offsetTop-e/2,o=t+r,a=n+h,t<0&&(t=0),n<0&&(n=0),o>c||a>d||(u(r,r),p(t,n),m(t,n)))}function f(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":v(4);break;case"-":v(-4)}}function g(e){e.preventDefault(),v(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){o.container_width=i.offsetWidth,o.container_height=i.offsetHeight,o.container_left=i.offsetLeft,o.container_top=i.offsetTop,o.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,o.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",E),document.addEventListener("touchmove",E),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E)}function E(e){let t,n,a,r,h={x:0,y:0};e.preventDefault(),e.stopPropagation(),h.x=e.pageX||e.touches&&e.touches[0].pageX,h.y=e.pageY||e.touches&&e.touches[0].pageY,t=h.x-(o.mouse_x-o.container_left),n=h.y-(o.mouse_y-o.container_top),a=i.offsetWidth,r=i.offsetHeight,t<0?t=0:t>s.offsetWidth-a&&(t=s.offsetWidth-a),n<0?n=0:n>s.offsetHeight-r&&(n=s.offsetHeight-r),p(t,n),m(t,n)}return e.complete?l():e.onload=l,{crop:function(){t.width=h,t.height=c,t.getContext("2d").drawImage(e,a,r,h,c,0,0,h,c)},removeHandlers:function(){i.removeEventListener("mousedown",b),i.removeEventListener("touchstart",b),i.removeEventListener("wheel",g),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E),document.removeEventListener("keypress",f),n.remove(),i.remove(),s.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,o.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},1168:(e,t,n)=>{n.d(t,{Z:()=>E,x:()=>w});var i=n(1405),s=n(5814),o=n(9818),a=n(2325),r=n(8497),h=n(8799),c=n(3699),d=n(2738),l=n(6299),u=n(3910),p=n(3241),m=n(6733),v=n(1655),f=n(3815);const g=document.body;let b=g;const y=()=>{b=(0,m.W7)()||g,E.reAppend()};(0,m.Ms)(g,y);class E extends p.Z{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{o.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new c.Z,this.managers=E.MANAGERS,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,d.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&(0,d.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append((0,a.ag)(n.withConfirm)),this.header.append(this.btnConfirm),(0,i.Z)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let s=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),(0,i.Z)(t),e.text?t.innerHTML=e.text:t.append((0,a.ag)(e.langKey,e.langArgs)),(0,d.fc)(t,(()=>{e.callback&&e.callback(),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!s&&2===t.length){const e=t.find((e=>!e.isCancel));e&&(s=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=s,this.element.append(this.container),E.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},o.Z.pushItem(this.navigationItem),(0,h.Z)(),b.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(f.Z.isOverlayActive=!0,s.Z.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout((()=>{this.listenerSetter.add(document.body)("keydown",(e=>{(this.confirmShortcutIsSendShortcut?(0,l.Z)(e):"Enter"===e.key)&&((0,d.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(f.Z.isOverlayActive=!1),o.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,v.Z)(E.POPUPS,this),y(),setTimeout((()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.Z.checkAnimations(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:n}=e,i=t.parentElement;i&&i!==b&&b!==n&&b.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}E.POPUPS=[];const w=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},7084:(e,t,n)=>{function i(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsDataURL(e)}))}(e)}n.d(t,{Z:()=>i})},6733:(e,t,n)=>{function i(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function s(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function o(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{i(e,t,!1)}))}function a(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!a()}n.d(t,{C8:()=>s,Dj:()=>i,Ms:()=>o,W7:()=>a,rB:()=>r})},6299:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(3512),s=n(4762);function o(e){if("Enter"===e.key&&!s.IS_MOBILE&&!e.isComposing){if("enter"===i.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=s.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(s.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(4762);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}}}]); +//# sourceMappingURL=765.d96ae842524025af79ef.chunk.js.map \ No newline at end of file diff --git a/public/765.d96ae842524025af79ef.chunk.js.map b/public/765.d96ae842524025af79ef.chunk.js.map new file mode 100644 index 000000000..296dd805b --- /dev/null +++ b/public/765.d96ae842524025af79ef.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"765.d96ae842524025af79ef.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array;\r\n private id: number;\r\n private manual: boolean;\r\n private log: ReturnType;\r\n private debug: boolean;\r\n private currentHash: string; // have to start with # if not empty\r\n private overriddenHash: string; // have to start with # if not empty\r\n private isPossibleSwipe: boolean;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n this.navigations = [];\r\n this.id = Date.now();\r\n this.manual = false;\r\n this.log = logger('NC');\r\n this.debug = true;\r\n this.currentHash = window.location.hash;\r\n this.overriddenHash = '';\r\n this.isPossibleSwipe = false;\r\n\r\n window.addEventListener('popstate', this.onPopState);\r\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', this.onTouchStart, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private onPopState = (e: PopStateEvent) => {\r\n let hash = window.location.hash;\r\n const id: number = e.state;\r\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\r\n if(hash !== this.currentHash) {\r\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\r\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\r\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\r\n this.overrideHash(this.overriddenHash);\r\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\r\n this.overrideHash();\r\n } else {\r\n this.currentHash = hash;\r\n this.onHashChange && this.onHashChange();\r\n // this.replaceState();\r\n return;\r\n }\r\n }\r\n\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n\r\n if(!this.navigations.length) {\r\n return;\r\n }\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !this.isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n };\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n };\r\n\r\n private onTouchStart = (e: TouchEvent) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n this.isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n this.isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n };\r\n\r\n public overrideHash(hash: string = '') {\r\n if(hash && hash[0] !== '#') hash = '#' + hash;\r\n else if(hash === '#') hash = '';\r\n\r\n this.overriddenHash = this.currentHash = hash;\r\n this.replaceState();\r\n this.pushState();\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('onItemAdded', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\r\n this.navigations.splice(index, length, ...items);\r\n items.forEach((item) => {\r\n this.onItemAdded(item);\r\n });\r\n }\r\n\r\n private pushState() {\r\n this.debug && this.log('push');\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n this.debug && this.log.warn('replace');\r\n\r\n const url = location.origin + location.pathname + this.overriddenHash;\r\n history.replaceState(this.id, '', url);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppDownloadManager } from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then((contents) => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob((blob) => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ripple from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\r\nimport { addFullScreenListener, getFullScreenElement } from \"../../helpers/dom/fullScreen\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport overlayCounter from \"../../helpers/overlayCounter\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: boolean, \r\n overlayClosable: boolean, \r\n withConfirm: LangPackKey | boolean, \r\n body: boolean,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): T;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n public static MANAGERS: AppManagers;\r\n\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n protected managers: AppManagers;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n this.managers = PopupElement.MANAGERS;\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map((b) => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find((button) => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: () => this.destroy(),\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n protected destroy() {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach((popup) => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\r\n }\r\n\r\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\r\n const popup = new ctor(...args);\r\n return popup;\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find((b) => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach((eventName) => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n"],"names":["appNavigationController","constructor","onPopState","e","hash","window","location","id","state","this","debug","log","isPossibleSwipe","currentHash","warn","overriddenHash","overrideHash","onHashChange","pushState","navigations","length","item","pop","manual","handleItem","onKeyDown","key","onEscape","back","type","onTouchStart","touches","addEventListener","setTimeout","passive","once","Date","now","capture","IS_MOBILE_SAFARI","options","history","scrollRestoration","replaceState","good","onPop","undefined","pushItem","noBlurOnPop","findItemByType","i","index","ret","backByItem","indexOf","splice","onItemAdded","noHistory","push","unshiftItem","unshift","spliceItems","items","forEach","url","origin","pathname","removeItem","removeByType","single","PopupAvatar","super","closable","withConfirm","image","Image","cropper","crop","removeHandlers","h6","document","createElement","btnClose","classList","remove","header","append","cropContainer","add","input","style","display","listenerSetter","file","target","files","readBlobAsDataURL","then","contents","src","onload","show","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","draggable","overlayColor","appendChild","parentNode","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","getContext","drawImage","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","open","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","element","title","navigationItem","managers","MANAGERS","confirmShortcutIsSendShortcut","prepend","withoutOverlay","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","destroy","find","isCancel","POPUPS","dispatchEvent","removeAll","cleanup","static","popup","parentElement","popupConstructor","filter","ctor","args","addCancelButton","method","Promise","reader","FileReader","result","readBlobAs","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","bind","split","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","isSendShortcutPressed","IS_MOBILE","isComposing","shiftKey","ctrlKey","metaKey","secondaryKey","IS_APPLE","isSwipingBackSafari","TouchEvent"],"sourceRoot":""} \ No newline at end of file diff --git a/public/77.808c5b447b007ee7aa9d.chunk.js b/public/77.808c5b447b007ee7aa9d.chunk.js new file mode 100644 index 000000000..13254ddb6 --- /dev/null +++ b/public/77.808c5b447b007ee7aa9d.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[77],{7077:(t,a,e)=>{e.r(a),e.d(a,{default:()=>o});const r=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],f=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function o(t,a,e,o,u,s,i){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(i)&&(i=1),(i|=0)>3&&(i=3),i<1&&(i=1);const n=t.getImageData(a,e,o,u),b=n.data;let c,N,h,k,m,p,w,d,g,l,C,D,I=o-1,j=u-1,q=s+1,v=[],x=[],y=[],z=r[s],A=f[s],B=[],E=[];for(;i-- >0;){for(D=C=0,m=0;mI?I:p)<<2),c+=b[w++],N+=b[w++],h+=b[w++];for(k=0;k0?w<<2:0),d=D+B[k],g=D+E[k],c+=b[d++]-b[g++],N+=b[d++]-b[g++],h+=b[d++]-b[g++],C++;D+=o<<2}for(k=0;kj?0:o,c+=v[l],N+=x[l],h+=y[l];for(C=k<<2,m=0;m>>A,b[C+1]=N*z>>>A,b[C+2]=h*z>>>A,0==k&&(B[m]=((w=m+q)0?w*o:0),d=k+B[m],g=k+E[m],c+=v[d]-v[g],N+=x[d]-x[g],h+=y[d]-y[g],C+=o<<2}}t.putImageData(n,a,e)}}}]); +//# sourceMappingURL=77.808c5b447b007ee7aa9d.chunk.js.map \ No newline at end of file diff --git a/public/24.3dbb6c36f540f3e15be0.chunk.js.map b/public/77.808c5b447b007ee7aa9d.chunk.js.map similarity index 66% rename from public/24.3dbb6c36f540f3e15be0.chunk.js.map rename to public/77.808c5b447b007ee7aa9d.chunk.js.map index 9d00eb130..41f02d703 100644 --- a/public/24.3dbb6c36f540f3e15be0.chunk.js.map +++ b/public/77.808c5b447b007ee7aa9d.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/vendor/fastBlur.js"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"mappings":"uFAAA,+CAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAA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","file":"24.3dbb6c36f540f3e15be0.chunk.js","sourcesContent":["/*\r\nSuperfast Blur - a fast Box Blur For Canvas\r\n\r\nVersion: 0.5\r\nAuthor: Mario Klingemann\r\nContact: mario@quasimondo.com\r\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\r\nTwitter: @quasimondo\r\n\r\nIn case you find this class useful - especially in commercial projects -\r\nI am not totally unhappy for a small donation to my PayPal account\r\nmario@quasimondo.de\r\n\r\nOr support me on flattr:\r\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\r\n\r\nCopyright (c) 2011 Mario Klingemann\r\n\r\nPermission is hereby granted, free of charge, to any person\r\nobtaining a copy of this software and associated documentation\r\nfiles (the \"Software\"), to deal in the Software without\r\nrestriction, including without limitation the rights to use,\r\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following\r\nconditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n// eslint-disable-next-line max-len\r\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\r\n// eslint-disable-next-line max-len\r\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\r\n\r\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\r\n if (Number.isNaN(radius) || radius < 1) return;\r\n\r\n radius |= 0;\r\n\r\n if (Number.isNaN(iterations)) iterations = 1;\r\n iterations |= 0;\r\n if (iterations > 3) iterations = 3;\r\n if (iterations < 1) iterations = 1;\r\n\r\n const imageData = context.getImageData(top_x, top_y, width, height);\r\n\r\n const pixels = imageData.data;\r\n\r\n let rsum;\r\n let gsum;\r\n let bsum;\r\n let x;\r\n let y;\r\n let i;\r\n let p;\r\n let p1;\r\n let p2;\r\n let yp;\r\n let yi;\r\n let yw;\r\n let wm = width - 1;\r\n let hm = height - 1;\r\n let rad1 = radius + 1;\r\n\r\n let r = [];\r\n let g = [];\r\n let b = [];\r\n\r\n let mul_sum = mul_table[radius];\r\n let shg_sum = shg_table[radius];\r\n\r\n let vmin = [];\r\n let vmax = [];\r\n\r\n while (iterations-- > 0) {\r\n yw = yi = 0;\r\n\r\n for (y = 0; y < height; y++) {\r\n rsum = pixels[yw] * rad1;\r\n gsum = pixels[yw + 1] * rad1;\r\n bsum = pixels[yw + 2] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n p = yw + (((i > wm ? wm : i)) << 2);\r\n rsum += pixels[p++];\r\n gsum += pixels[p++];\r\n bsum += pixels[p++];\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n r[yi] = rsum;\r\n g[yi] = gsum;\r\n b[yi] = bsum;\r\n\r\n if (y == 0) {\r\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\r\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\r\n }\r\n\r\n p1 = yw + vmin[x];\r\n p2 = yw + vmax[x];\r\n\r\n rsum += pixels[p1++] - pixels[p2++];\r\n gsum += pixels[p1++] - pixels[p2++];\r\n bsum += pixels[p1++] - pixels[p2++];\r\n\r\n yi++;\r\n }\r\n yw += (width << 2);\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n yp = x;\r\n rsum = r[yp] * rad1;\r\n gsum = g[yp] * rad1;\r\n bsum = b[yp] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n yp += (i > hm ? 0 : width);\r\n rsum += r[yp];\r\n gsum += g[yp];\r\n bsum += b[yp];\r\n }\r\n\r\n yi = x << 2;\r\n for (y = 0; y < height; y++) {\r\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\r\n\r\n if (x == 0) {\r\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\r\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\r\n }\r\n\r\n p1 = x + vmin[y];\r\n p2 = x + vmax[y];\r\n\r\n rsum += r[p1] - r[p2];\r\n gsum += g[p1] - g[p2];\r\n bsum += b[p1] - b[p2];\r\n\r\n yi += width << 2;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, top_x, top_y);\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"77.808c5b447b007ee7aa9d.chunk.js","mappings":"wHAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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","sources":["webpack://tweb/./src/vendor/fastBlur.js"],"sourcesContent":["/*\r\nSuperfast Blur - a fast Box Blur For Canvas\r\n\r\nVersion: 0.5\r\nAuthor: Mario Klingemann\r\nContact: mario@quasimondo.com\r\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\r\nTwitter: @quasimondo\r\n\r\nIn case you find this class useful - especially in commercial projects -\r\nI am not totally unhappy for a small donation to my PayPal account\r\nmario@quasimondo.de\r\n\r\nOr support me on flattr:\r\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\r\n\r\nCopyright (c) 2011 Mario Klingemann\r\n\r\nPermission is hereby granted, free of charge, to any person\r\nobtaining a copy of this software and associated documentation\r\nfiles (the \"Software\"), to deal in the Software without\r\nrestriction, including without limitation the rights to use,\r\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following\r\nconditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n// eslint-disable-next-line max-len\r\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\r\n// eslint-disable-next-line max-len\r\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\r\n\r\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\r\n if (Number.isNaN(radius) || radius < 1) return;\r\n\r\n radius |= 0;\r\n\r\n if (Number.isNaN(iterations)) iterations = 1;\r\n iterations |= 0;\r\n if (iterations > 3) iterations = 3;\r\n if (iterations < 1) iterations = 1;\r\n\r\n const imageData = context.getImageData(top_x, top_y, width, height);\r\n\r\n const pixels = imageData.data;\r\n\r\n let rsum;\r\n let gsum;\r\n let bsum;\r\n let x;\r\n let y;\r\n let i;\r\n let p;\r\n let p1;\r\n let p2;\r\n let yp;\r\n let yi;\r\n let yw;\r\n let wm = width - 1;\r\n let hm = height - 1;\r\n let rad1 = radius + 1;\r\n\r\n let r = [];\r\n let g = [];\r\n let b = [];\r\n\r\n let mul_sum = mul_table[radius];\r\n let shg_sum = shg_table[radius];\r\n\r\n let vmin = [];\r\n let vmax = [];\r\n\r\n while (iterations-- > 0) {\r\n yw = yi = 0;\r\n\r\n for (y = 0; y < height; y++) {\r\n rsum = pixels[yw] * rad1;\r\n gsum = pixels[yw + 1] * rad1;\r\n bsum = pixels[yw + 2] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n p = yw + (((i > wm ? wm : i)) << 2);\r\n rsum += pixels[p++];\r\n gsum += pixels[p++];\r\n bsum += pixels[p++];\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n r[yi] = rsum;\r\n g[yi] = gsum;\r\n b[yi] = bsum;\r\n\r\n if (y == 0) {\r\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\r\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\r\n }\r\n\r\n p1 = yw + vmin[x];\r\n p2 = yw + vmax[x];\r\n\r\n rsum += pixels[p1++] - pixels[p2++];\r\n gsum += pixels[p1++] - pixels[p2++];\r\n bsum += pixels[p1++] - pixels[p2++];\r\n\r\n yi++;\r\n }\r\n yw += (width << 2);\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n yp = x;\r\n rsum = r[yp] * rad1;\r\n gsum = g[yp] * rad1;\r\n bsum = b[yp] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n yp += (i > hm ? 0 : width);\r\n rsum += r[yp];\r\n gsum += g[yp];\r\n bsum += b[yp];\r\n }\r\n\r\n yi = x << 2;\r\n for (y = 0; y < height; y++) {\r\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\r\n\r\n if (x == 0) {\r\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\r\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\r\n }\r\n\r\n p1 = x + vmin[y];\r\n p2 = x + vmax[y];\r\n\r\n rsum += r[p1] - r[p2];\r\n gsum += g[p1] - g[p2];\r\n bsum += b[p1] - b[p2];\r\n\r\n yi += width << 2;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, top_x, top_y);\r\n}\r\n"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"sourceRoot":""} \ No newline at end of file diff --git a/public/774.04c4656f821730d3e97b.chunk.js b/public/774.04c4656f821730d3e97b.chunk.js new file mode 100644 index 000000000..42b8670fb --- /dev/null +++ b/public/774.04c4656f821730d3e97b.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[774],{4425:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2384);class a{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(3910),a=i(503);class n extends a.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const a=this.toggleVisible=document.createElement("span");a.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(a),a.addEventListener("click",this.onVisibilityClick),a.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},2582:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325);class a{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var s=i(279),a=i(4755),n=i(4874),r=i(4494),o=i(6830),l=i(4425),d=i(2325),p=i(2582),c=i(3910),h=i(2738),m=i(2614),u=i(5565),b=i(1656),g=i(8115),w=i(3512);let y;const v=new n.Z("page-password",!0,(()=>{const e=new p.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),n=new d.ZP.IntlElement({key:"Login.Next"});t.append(n.element);const v=new o.Z({label:"LoginPassword",name:"password"});let L;y=v.input,e.inputWrapper.append(v.container,t);let Z,k=()=>(L||(L=window.setInterval(k,1e4)),w.Z.managers.passwordManager.getState().then((e=>{Z=e,Z.hint?(0,u.Z)(v.label,(0,m.Z)((0,g.Z)(Z.hint))):v.setLabel()})));const E=e=>{if(e&&(0,c.Z)(e),!y.value.length)return void y.classList.add("error");const a=(0,b.Z)([y,t],!0);let r=y.value;n.update({key:"PleaseWait"});const o=(0,s.y)(t);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,Z).then((e=>{"auth.authorization"===e._?(clearInterval(L),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),F&&F.remove()):(t.removeAttribute("disabled"),n.update({key:e._}),o.remove())})).catch((e=>{a(),v.input.classList.add("error"),e.type,n.update({key:"PASSWORD_HASH_INVALID"}),y.select(),o.remove(),k()}))};(0,h.fc)(t,E),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),n.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const V=a.Z.isMobile?100:166,F=new l.Z(v,V);return e.imageDiv.append(F.container),Promise.all([F.load(),k()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); +//# sourceMappingURL=774.04c4656f821730d3e97b.chunk.js.map \ No newline at end of file diff --git a/public/774.04c4656f821730d3e97b.chunk.js.map b/public/774.04c4656f821730d3e97b.chunk.js.map new file mode 100644 index 000000000..52cc99ad0 --- /dev/null +++ b/public/774.04c4656f821730d3e97b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"774.04c4656f821730d3e97b.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","state","getState","window","setInterval","_state","hint","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","Promise","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/781.f96ab4e55bded41d4d3c.chunk.js b/public/781.f96ab4e55bded41d4d3c.chunk.js new file mode 100644 index 000000000..c664fb4d8 --- /dev/null +++ b/public/781.f96ab4e55bded41d4d3c.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[781,436],{5436:(e,a,t)=>{t.r(a),t.d(a,{default:()=>l});var n=t(8799),s=t(4541),g=t(2325),h=t(3512);const u=new(t(4874).Z)("page-chats",!1,(()=>(h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),g.ZP.requestedServerLanguage||g.ZP.getCacheLangPack().then((e=>{e.local&&g.ZP.getLangPack(e.lang_code)})),u.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.all([t.e(458),t.e(445),t.e(765),t.e(339),t.e(853)]).then(t.bind(t,7853))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),l=u}}]); +//# sourceMappingURL=781.f96ab4e55bded41d4d3c.chunk.js.map \ No newline at end of file diff --git a/public/781.f96ab4e55bded41d4d3c.chunk.js.map b/public/781.f96ab4e55bded41d4d3c.chunk.js.map new file mode 100644 index 000000000..003771817 --- /dev/null +++ b/public/781.f96ab4e55bded41d4d3c.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"781.f96ab4e55bded41d4d3c.chunk.js","mappings":"yKAoDA,MAAMA,EAAO,I,QAAI,GAAK,cAAc,GAxCjB,KACjB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,mFACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.15a67f69d99bd6da42da.chunk.js b/public/8.15a67f69d99bd6da42da.chunk.js new file mode 100644 index 000000000..55cb19bec --- /dev/null +++ b/public/8.15a67f69d99bd6da42da.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[8],{9179:(X,e,o)=>{o.r(e),o.d(e,{default:()=>t});const t={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); +//# sourceMappingURL=8.15a67f69d99bd6da42da.chunk.js.map \ No newline at end of file diff --git a/public/8.15a67f69d99bd6da42da.chunk.js.map b/public/8.15a67f69d99bd6da42da.chunk.js.map new file mode 100644 index 000000000..628020efa --- /dev/null +++ b/public/8.15a67f69d99bd6da42da.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"8.15a67f69d99bd6da42da.chunk.js","mappings":"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","sources":["webpack://tweb/./src/countries.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { HelpCountriesList } from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"X XXXXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d'Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\"}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"country_code\":\"961\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"country_code\":\"60\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\",\"97 XXXX XXXXX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"country_code\":\"378\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"country_code\":\"685\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find((c) => c.name === 'United States'),\n '44': Countries.find((c) => c.name === 'United Kingdom'),\n '61': Countries.find((c) => c.name === 'Australia'),\n '64': Countries.find((c) => c.name === 'New Zealand'),\n '246': Countries.find((c) => c.name === 'Diego Garcia'),\n '255': Countries.find((c) => c.name === 'Tanzania'),\n '262': Countries.find((c) => c.name === 'Reunion'),\n '500': Countries.find((c) => c.name === 'Falkland Islands'),\n '590': Countries.find((c) => c.name === 'Guadeloupe'),\n '672': Countries.find((c) => c.name === 'Norfolk Island'),\n '1 268': Countries.find((c) => c.name === 'Antigua & Barbuda'),\n}; */\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"names":["_","countries","hash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.f44261a125fd436f2604.chunk.js b/public/8.f44261a125fd436f2604.chunk.js deleted file mode 100644 index 748ab43a1..000000000 --- a/public/8.f44261a125fd436f2604.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[8],{196:function(e,n,o){"use strict";o.r(n);n.default={"Login.Title":"Sign in to Telegram","Login.CountrySelectorLabel":"Country","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Link Desktop Device**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); -//# sourceMappingURL=8.f44261a125fd436f2604.chunk.js.map \ No newline at end of file diff --git a/public/8.f44261a125fd436f2604.chunk.js.map b/public/8.f44261a125fd436f2604.chunk.js.map deleted file mode 100644 index 4ec168b5c..000000000 --- a/public/8.f44261a125fd436f2604.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/langSign.ts"],"names":[],"mappings":"sFAAA,OAuCe,UAvCF,CACX,cAAe,sBACf,6BAA8B,UAC9B,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAGlB,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","file":"8.f44261a125fd436f2604.chunk.js","sourcesContent":["const lang = {\r\n \"Login.Title\": \"Sign in to Telegram\",\r\n \"Login.CountrySelectorLabel\": \"Country\",\r\n \"Login.PhoneLabel\": \"Phone Number\",\r\n \"Login.PhoneLabelInvalid\": \"Phone Number Invalid\",\r\n \"Login.KeepSigned\": \"Keep me signed in\",\r\n \"Login.StartText\": \"Please confirm your country and\\nenter your phone number.\",\r\n \"Login.Code.SentSms\": \"We have sent you an SMS\\nwith the code.\",\r\n \"Login.Code.SentInApp\": \"We have sent you a message in Telegram\\nwith the code.\",\r\n \"Login.Code.SentCall\": \"We will call you and voice\\nthe code.\",\r\n \"Login.Code.SentUnknown\": \"Please check everything\\nfor a code (type: %s)\",\r\n \"Login.Password.Title\": \"Enter Your Password\",\r\n \"Login.Password.Subtitle\": \"Your account is protected with\\nan additional password\",\r\n \"Login.Register.Subtitle\": \"Enter your name and add\\na profile picture\",\r\n \"PleaseWait\": \"Please wait...\",\r\n\r\n // * android\r\n \"Code\": \"Code\",\r\n \"LoginPassword\": \"Password\",\r\n \"YourName\": \"Your Name\",\r\n \"FirstName\": \"First name (required)\",\r\n \"LastName\": \"Last name (optional)\",\r\n \"StartMessaging\": \"Start Messaging\",\r\n\r\n // * macos\r\n \"Contacts.PhoneNumber.Placeholder\": \"Phone Number\",\r\n \"Login.Next\": \"Next\",\r\n \"Login.ContinueOnLanguage\": \"Continue in English\",\r\n \"Login.QR.Title\": \"Log in to Telegram by QR Code\",\r\n \"Login.QR.Help1\": \"Open Telegram on your phone\",\r\n \"Login.QR.Help2\": \"Go to **Settings** > **Devices** > **Link Desktop Device**\",\r\n \"Login.QR.Help3\": \"Point your phone at this screen to confirm login\",\r\n \"Login.QR.Cancel\": \"Log in by phone Number\",\r\n \"Login.QR.Login\": \"Log in by QR Code\",\r\n \"PHONE_CODE_INVALID\": \"Invalid code\",\r\n \"PHONE_CODE_EXPIRED\": \"Code expired\",\r\n \"PASSWORD_HASH_INVALID\": \"Incorrect password\"\r\n};\r\n\r\nexport default lang;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/810.fa9733cf38d84f48fd4e.chunk.js b/public/810.fa9733cf38d84f48fd4e.chunk.js new file mode 100644 index 000000000..a87b6c33e --- /dev/null +++ b/public/810.fa9733cf38d84f48fd4e.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[810,53],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>O});var a=n(279),o=n(8805),s=n(4874),i=n(503),r=n(9807),c=n(4494),d=n(4789),l=n(5432),u=n(4159),p=n(2325),h=n(2384),m=n(1405),g=n(4668),f=n(8497),v=n(144),y=n(9709),Z=n(9638),L=n(3910),E=n(2738),b=n(5565),w=n(1656),_=n(7487),k=n(2398),S=n(671),x=n(6669),C=n(7922),T=n(3512),N=n(709),P=n(9976),M=n(130),A=n(8115),I=n(3789);let B,D=null;const V=new s.Z("page-sign",!0,(()=>{const e=()=>{t=p.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let t;e(),T.Z.addEventListener("language_change",(()=>{e()}));const s=new Map;let m,O;const R=document.createElement("div");R.classList.add("input-wrapper");const W=new i.Z({label:"Login.CountrySelectorLabel",name:(0,v.a)()});W.container.classList.add("input-select");const $=W.input,j=document.createElement("div");j.classList.add("select-wrapper","z-depth-3","hide");const q=document.createElement("span");q.classList.add("arrow","arrow-down"),W.container.append(q);const F=document.createElement("ul");j.appendChild(F),new o.ZP(j);let K=()=>{K=null,t.forEach((e=>{const t=(0,S.Ml)(e.iso2),n=[];e.country_codes.forEach((a=>{const o=document.createElement("li");let s=(0,A.Z)(t);if(P.Z){const e=document.createElement("span");(0,M.Z)(e,s),o.append(e)}else(0,M.Z)(o,s);const i=(0,p.ag)(e.default_name);i.dataset.defaultName=e.default_name,o.append(i);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+a.country_code,o.appendChild(r),n.push(o),F.append(o)})),s.set(e.iso2,n)})),F.addEventListener("mousedown",(e=>{if(0!==e.button)return;const t=(0,g.Z)(e.target,"LI");z(t)})),W.container.appendChild(j)};const z=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,o=a.replace(/\D/g,"");(0,b.Z)($,(0,p.ag)(n)),(0,x.Z)($,"input"),m=t.find((e=>e.default_name===n)),O=m.country_codes.find((e=>e.country_code===o)),J.value=J.lastValue=a,G(),setTimeout((()=>{X.focus(),(0,k.Z)(X,!0)}),0)};let H;K(),$.addEventListener("focus",(function(e){K?K():t.forEach((e=>{s.get(e.iso2).forEach((e=>e.style.display=""))})),clearTimeout(H),H=void 0,j.classList.remove("hide"),j.offsetWidth,j.classList.add("active"),W.select(),(0,d.Z)({container:V.pageEl.parentElement.parentElement,element:$,position:"start",margin:4}),setTimeout((()=>{Q||(document.addEventListener("mousedown",U,{capture:!0}),Q=!0)}),0)}));let Q=!1;const U=e=>{(0,f.Z)(e.target,"input-select")||e.target!==$&&(G(),document.removeEventListener("mousedown",U,{capture:!0}),Q=!1)},G=()=>{void 0===H&&(j.classList.remove("active"),H=window.setTimeout((()=>{j.classList.add("hide"),H=void 0}),200))};$.addEventListener("keyup",(e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=W.value.toLowerCase(),o=[];t.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const n=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");n.length>1&&t.push(n)}));let n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(a)));s.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&o.push(e)})),0===o.length?t.forEach((e=>{s.get(e.iso2).forEach((e=>e.style.display=""))})):1===o.length&&"Enter"===n&&z(s.get(o[0].iso2)[0])})),q.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),$.matches(":focus")?$.blur():$.focus()}));const J=new N.Z({onInput:e=>{h.Z.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===W.value||m&&t&&n&&(m===t||O.country_code===n.country_code)||((0,b.Z)($,t?(0,p.ag)(t.default_name):a),m=t,O=n),t||J.value.length-1>1?D.style.visibility="":D.style.visibility="hidden"}}),X=J.input;X.addEventListener("keypress",(e=>{if(!D.style.visibility&&"Enter"===e.key)return ee()}));const Y=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});Y.input.addEventListener("change",(()=>{const e=Y.checked;T.Z.managers.appStateManager.pushToState("keepSigned",e),I.Z.toggleStorages(e,!0)})),I.Z.getState().then((e=>{C.Z.isAvailable()?Y.checked=e.keepSigned:(Y.checked=!1,Y.label.classList.add("checkbox-disabled"))})),D=(0,c.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),D.style.visibility="hidden";const ee=e=>{e&&(0,L.Z)(e);const t=(0,w.Z)([D,B],!0);(0,b.Z)(D,(0,p.ag)("PleaseWait")),(0,a.y)(D);let o=J.value;T.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:o,api_id:u.Z.id,api_hash:u.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:o}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(J.setError(),(0,b.Z)(J.label,(0,p.ag)("Login.PhoneLabelInvalid")),X.classList.add("error"),(0,b.Z)(D,(0,p.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),D.innerText=e.type)}))};(0,E.fc)(D,ee),B=(0,c.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),B.addEventListener("click",(()=>{y.default.mount()})),R.append(W.container,J.container,Y.label,D,B);const te=document.createElement("h4");te.classList.add("text-center"),(0,p.$d)(te,"Login.Title");const ne=document.createElement("div");ne.classList.add("subtitle","text-center"),(0,p.$d)(ne,"Login.StartText"),V.pageEl.querySelector(".container").append(te,ne,R),l.Z||setTimeout((()=>{X.focus()}),0),(0,Z.Z)(R),T.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=C.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&p.ZP.getLangPack(n.lang_code).then((()=>{(0,x.Z)(X,"input")}));const a=new Set([1,2,3,4,5]),o=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=T.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{o.push(e.nearest_dc)}))),(s||Promise.resolve()).then((()=>{o.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,s=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield _.Z.get(a))return t();setTimeout((()=>{T.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{c(s.next(e))}catch(e){t(e)}}function r(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,r)}c((s=s.apply(n,a||[])).next())}));var n,a,o,s};t()})),e})).then((e=>{W.value.length||J.value.length||z(s.get(e.country)[0])}))}),(()=>{D&&((0,b.Z)(D,(0,p.ag)("Login.Next")),(0,m.Z)(D,void 0,void 0,!0),D.removeAttribute("disabled")),B&&B.removeAttribute("disabled"),T.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),O=V}}]); +//# sourceMappingURL=810.fa9733cf38d84f48fd4e.chunk.js.map \ No newline at end of file diff --git a/public/810.fa9733cf38d84f48fd4e.chunk.js.map b/public/810.fa9733cf38d84f48fd4e.chunk.js.map new file mode 100644 index 000000000..65aa24f32 --- /dev/null +++ b/public/810.fa9733cf38d84f48fd4e.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"810.fa9733cf38d84f48fd4e.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/putPreloader\";\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter((country) => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n setInnerHTML(spanEmoji, wrapped);\r\n li.append(spanEmoji);\r\n } else {\r\n setInnerHTML(li, wrapped);\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find((c) => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach((li) => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach((name) => {\r\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach((li) => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach((li) => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","setCountries","countries","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","document","createElement","classList","add","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","spanEmoji","el","dataset","defaultName","span","innerText","country_code","push","set","addEventListener","e","button","target","selectCountryByTarget","childNodes","phoneCode","querySelector","replace","find","_countryCode","telInputField","value","lastValue","hidePicker","setTimeout","telEl","focus","hideTimeout","get","style","display","clearTimeout","undefined","remove","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","window","key","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","length","good","str","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","subtitle","nearestDcResult","langPack","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/813.30b0b1677b13ee5fdef9.chunk.js b/public/813.30b0b1677b13ee5fdef9.chunk.js new file mode 100644 index 000000000..e0a114db6 --- /dev/null +++ b/public/813.30b0b1677b13ee5fdef9.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[813],{2582:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(2325);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(4494),i=a(503),s=a(279),r=a(6765),p=a(2325),l=a(2582),u=a(4874),c=a(8799),o=a(5565),m=a(1168),d=a(8115),h=a(3512);let g=null;const v=new u.Z("page-signUp",!0,(()=>{const e=new l.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const u=document.createElement("span");let v;u.className="tgico tgico-cameraadd",e.imageDiv.append(t,u),e.imageDiv.addEventListener("click",(()=>{m.Z.createPopup(r.Z).open(t,(e=>{v=e}))}));const b=t=>{const a=L.value||"",n=y.value||"",i=a||n?(a+" "+n).trim():"";i?(0,o.Z)(e.title,(0,d.Z)(i)):(0,o.Z)(e.title,(0,p.ag)("YourName"))},L=new i.Z({label:"FirstName",maxLength:70}),y=new i.Z({label:"LastName",maxLength:64}),Z=(0,n.Z)("btn-primary btn-color-primary"),w=new p.ZP.IntlElement({key:"StartMessaging"});return Z.append(w.element),e.inputWrapper.append(L.container,y.container,Z),L.input.addEventListener("input",b),y.input.addEventListener("input",b),Z.addEventListener("click",(function(e){if(L.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!L.value.length)return L.input.classList.add("error"),!1;this.disabled=!0;const t=L.value.trim(),n=y.value.trim(),i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,first_name:t,last_name:n};w.update({key:"PleaseWait"});const r=(0,s.y)(this);h.Z.managers.apiManager.invokeApi("auth.signUp",i).then((e=>{"auth.authorization"===e._?(h.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!v)return e();v().then((a=>{h.Z.managers.appProfileManager.uploadProfilePhoto(a).then(e,t)}),t)})).finally((()=>{a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()}))}))):(w.update({key:e._}),this.removeAttribute("disabled"),r.remove())})).catch((e=>{this.removeAttribute("disabled"),r.remove(),e.type,w.update({key:e.type})}))})),(0,c.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}),(e=>{g=e,h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); +//# sourceMappingURL=813.30b0b1677b13ee5fdef9.chunk.js.map \ No newline at end of file diff --git a/public/813.30b0b1677b13ee5fdef9.chunk.js.map b/public/813.30b0b1677b13ee5fdef9.chunk.js.map new file mode 100644 index 000000000..d1c012755 --- /dev/null +++ b/public/813.30b0b1677b13ee5fdef9.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"813.30b0b1677b13ee5fdef9.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, { i18n } from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","classList","add","avatarPreview","id","addIco","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","then","response","_","user","Promise","resolve","reject","inputFile","finally","m","default","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/853.5062ae3867f3575462eb.chunk.js b/public/853.5062ae3867f3575462eb.chunk.js new file mode 100644 index 000000000..b4a23d57f --- /dev/null +++ b/public/853.5062ae3867f3575462eb.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[853],{4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);const a=(e,t={})=>{const i=document.createElement(t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2384);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2384);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([s.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),s.Z.waitForFirstFrame(e)))),s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let h,u=document.createElement("div");u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const p=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{n.Z.mutate((()=>{r.remove()})),i&&i(c)};if(er.classList.add("hiding")),Math.max(i-d/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,d/2);a.Z||window.removeEventListener("contextmenu",h),h=null,g=!1},t&&t(c),window.requestAnimationFrame((()=>{const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,l=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=l+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(d===e||!(0,r.Z)(t.target,d));let g=!1;if(a.Z){let e=()=>{h&&h()};d.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;let{clientX:i,clientY:s}=t.touches[0];p(i,s),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else d.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(g)return void(g=!1);let{clientX:t,clientY:i}=e;p(t,i),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})}),{passive:!0})}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>l,gV:()=>c});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function l(e,t=!0){return c(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function c(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>l});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e);i.touchMouseDown=!0,s(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function l(e){(0,n.Z)(e,a)}},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?t():s.then((()=>t()))),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=r);const l=r},7853:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>jp,DIALOG_LIST_ELEMENT_TAG:()=>Vp,default:()=>$p});var s=i(3512),n=i(2738),a=i(3910),o=i(2341),r=i(130),l=i(4755),c=i(3719),d=i(2312),h=i(5814),u=i(8805),p=i(5565),m=i(2325);class g{constructor(e,t,i=!0,s,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=i,this.autonomous=a,this.onFound=o,this.list=$p.createChatList(),this.container=document.createElement("div"),s&&(this.container.className=s),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,m.ag)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&$p.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class v{constructor(e,t,i,s){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new u.ZP(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout((()=>{this.searchMore(),this.searchTimeout=0}),0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=s.Z.managers.appMessagesManager.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:i,history:s}=t;s.length&&s[0].mid===this.minMsgId&&s.shift();const n=this.searchGroups.messages;s.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;$p.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:54,meAsSaved:!1,message:t,query:e})}catch(e){console.error("[appSearch] render search result",e)}})),n.toggle(),this.minMsgId=s.length&&s[s.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=s.length,-1===this.foundCount&&(this.foundCount=i,n.nameEl&&(0,p.Z)(n.nameEl,(0,m.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}var f=i(503);class y{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout((()=>{this.onChange(e)}),200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new f.Z({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const i=document.createElement("i");i.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(i,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var b=i(426),w=i(9818),S=i(3241),C=i(3699),L=i(4494);const I=(e,t={})=>(0,L.Z)("btn-icon",Object.assign({icon:e||void 0},t));class M{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=I("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new u.ZP(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider&&this.slider.addTab(this),this.listenerSetter=new C.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append((0,m.ag)(e))}}class E extends M{constructor(e){super(e),this.eventListener=new S.Z}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}var P=i(1655),k=i(5953);class T{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{w.Z.findItemByType(this.navigationType)?w.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof M?n.container:n:this.canHideFirst?-1:0,t),!0},(0,k.Z)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,b.v)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach((e=>{(0,n.fc)(e,this.onCloseBtnClick)}))}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof M?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout((()=>{t.onOpenAfterTimeout()}),250)),w.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof M?e.container:e),!0}removeTabFromHistory(e){(0,P.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){i||w.Z.removeByType(this.navigationType,!0);const s=e instanceof M?e:this.tabs.get(e);s&&(s.onClose&&s.onClose(),s.onCloseAfterTimeout&&setTimeout((()=>{s.onCloseAfterTimeout()}),250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}createTab(e,t){const i=new e(t?void 0:this,!0);return i.managers=this.managers,i}}var x=i(1168),A=i(6765);class Z{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,n.fc)(this.container,(()=>{x.Z.createPopup(A.Z).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}const D=(e={})=>(0,L.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);var F=i(410);const _=["January","February","March","April","May","June","July","August","September","October","November","December"],B=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],R=86400,N=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/R+1)/7)};function U(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):_[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},G=2013,W=new RegExp("20[0-9]{1,2}"),j=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),K=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),$=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),q=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Q=[31,29,31,30,31,30,31,31,30,31,30,31];function Y(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===se(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const l=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const c=e.getTime()-1;return void t.push({title:se(l),minDate:l,maxDate:c})}let n;if(null===(n=$.exec(i)))if(null===(n=q.exec(i)))if(null===(n=W.exec(i))){if(null!==(n=j.exec(i))){const e=n[1],i=n[2],s=ae(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void J(t,e-1,s);if(e>=G)return void X(t,s,e)}}if(null!==(n=K.exec(i))){const e=n[1],i=ae(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void J(t,s-1,i);s>=G&&X(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const l=(new Date).getFullYear();if(ne(a-1,o)&&r>=G&&r<=l){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:ie(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=G&&s<=12)return void X(t,s-1,a);a<=12&&J(t,s-1,a-1)}else s>=G&&a<=12&&X(t,a-1,s)}}function X(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=G&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:ee(a),minDate:a,maxDate:o})}}function J(e,t,i){if(ne(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=G;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const l=r.getTime();if(l>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const c=r.getTime()-1;o===n?e.push({title:te(l),minDate:l,maxDate:c}):e.push({title:ie(l),minDate:l,maxDate:c})}}var s}function ee(e){const t=new Date(e);return _[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function te(e){const t=new Date(e);return _[t.getMonth()].slice(0,3)+" "+t.getDate()}function ie(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function se(e){const t=new Date(e);return B[t.getDay()]}function ne(e,t){return t>=0&&t<12&&e>=0&&e{this.uploadAvatar=e}));const e=new Uo({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new f.Z({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new f.Z({label:"ChatLocation",name:"location",canBeEdited:!1}),t.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.groupNameInputField.input.addEventListener("input",(()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)})),this.nextBtn=D({icon:"arrow_next"}),this.nextBtn.addEventListener("click",(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{Vo.removeTabFromHistory(this),Vo.selectTab(0),dp.setInnerPeer({peerId:e.toPeerId(!0)})}))}));const i=new Uo({name:"Members",nameArgs:[this.peerIds.length]}),s=this.list=$p.createChatList({new:!0});i.content.append(s),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,i.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const i=super.open();return i.then((()=>(t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(m.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=$p.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(re(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n})))))),i}startLocating(){navigator.geolocation.getCurrentPosition((e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then((e=>e.json())).then((e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)}))}),(e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")}))}}var ce=i(5003),de=i(6008);class he{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach((e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),i[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))})),i.forEach((t=>{e(t.target,t.visible)}))}))}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}function ue(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}var pe=i(4064),me=i(4421);class ge extends me.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){ue(this.queue,(t=>t.div===e)),this.intersector.unobserve(e)}}class ve extends ge{constructor(e){super(e),this.onVisibilityChange=(e,t)=>{t&&(ue(this.queue,(t=>t.div===e)).forEach((e=>{e.wasSeen=!0,this.queue.unshift(e)})),this.setProcessQueueTimeout())},this.intersector=new he(this.onVisibilityChange)}getItem(){return(0,pe.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}var fe=i(279),ye=i(1405),be=i(7530),we=i(9897);function Se(e,t=0,i=0,s=!1,n=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let a={_:"photoSizeEmpty",type:""},o=e.sizes||e.thumbs;if(n&&o&&"document"===e._&&(o=o.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==o?void 0:o.length){for(let e=0,s=o.length;e=t||n.height>=i)break}s&&"photoSizeEmpty"===a._&&"photoStrippedSize"===o[0]._&&(a=o[0])}return a}function Ce(e,t){return e.reduce(((e,t)=>e+t),t)}var Le=i(3228);class Ie{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Ie.countRatios(e),this.proportions=Ie.countProportions(this.ratios),this.averageRatio=Ce(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Me(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class Me{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Me.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Le.Z)(e,1,2.75):(0,Le.Z)(e,.6667,1)))}layout(){let e=new Array(this.count),t=[];const i=(e,t)=>{const i=Ce(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{let s=[],n=0;for(let t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=Ce(t,0)+this.spacing*(s-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/s*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/s*100+"%",8&i&&1&i&&(l.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(l.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(l.style.borderTopRightRadius="inherit"),2&i&&4&i&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}}))}var Pe=i(9674);const ke={},Te=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function xe(e,t,i,s=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(i&&i());if(ke[t]&&s||e instanceof HTMLVideoElement)e&&Te(e,t),i&&i();else{const s=e instanceof HTMLImageElement,n=s?e:new Image;n.src=t,n.addEventListener("load",(()=>{!s&&e&&Te(e,t),ke[t]=!0,i&&i()}),{once:!0}),i&&n.addEventListener("error",(e=>{console.error("Render image from url failed:",e,t,n),i()}))}}function Ae(e,t,i){return new Promise((s=>{xe(e,t,s,i)}))}function Ze(e,t,i,s,n=e,a){return s&&t.classList.add("fade-in"),new Promise((o=>{xe(t,i,(()=>{Pe.Z.mutateElement(e,(()=>{n.append(t),o(),s&&t.addEventListener("animationend",(()=>{Pe.Z.mutate((()=>{t.classList.remove("fade-in"),a&&a.remove()}))}),{once:!0})}))}))}))}var De=i(9099),Fe=i(3035),_e=i(8487);class Be{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,k.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,n.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const n=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;n{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,Fe.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>s(null))).catch((e=>s(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i),this.detached||this.preloader.parentElement!==e){const t=(0,_e.Z)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),(0,De.Z)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&(0,De.Z)(this.preloader,"is-visible",!1,200,(()=>{this.preloader.remove()}),1))}setProgress(e){if(this.totalLength||(0,_e.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}var Re=i(3725),Ne=i(8594);const Ue=[];let Oe=!1;function He(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,Re.Z)();return Ue[t](e),ze(),i}function ze(){Oe||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,n)=>{const a=()=>{return o=this,r=void 0,c=function*(){const o=performance.now();do{yield(0,Ne.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void n(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-o<6);t.length>0?(0,Fe.T2)(a):s(i)},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(o,r||[])).next())}));var o,r,l,c};(0,Fe.T2)(a)})).then(e.promise.resolve,e.promise.reject)}(Ue.shift()).finally((()=>{Oe=!1,Ue.length&&ze()}))}var Ve=i(6663);let Ge,We;function je(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return Ve.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),We(n,0,0,s.width,s.height,t,i)),s}Ge=Ve.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{We=e.default}));const Ke=new Map;function $e(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;Ke.size>150&&Ke.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=Ke.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{Ge.then((()=>{const a=new Image;a.onload=()=>{He({items:[[a,t,i,s]],context:null,process:je},"unshift").then((()=>{n()}))},a.src=e}))}));Ke.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}var qe=i(4762),Qe=i(3306);const Ye=(0,Qe.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),Xe=(0,Qe.Z)("ffd9");function Je(e,t=!1){let i,s;return t?i=e instanceof Uint8Array?e:new Uint8Array(e):(i=new Uint8Array(Ye.concat(Array.from(e.slice(3)),Xe)),i[164]=e[1],i[166]=e[2]),s=t?qe.IS_SAFARI?"image/png":"image/webp":"image/jpeg",function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,s)}function et(e,t,i=!1){return Je(t.bytes,i)}function tt(e,t,i){const s=et(0,t,!1);let n,a;if(i){const e=$e(s);n=e.canvas,a=e.promise}else n=new Image,a=Ae(n,s);return n.classList.add("thumbnail"),{image:n,loadPromise:a}}function it(e,t,i,s=!1){if(!t.downloaded||["video","gif"].includes(e.type)||s){if("document"===e._&&t.downloaded&&!s)return null;const n=e.sizes||e.thumbs,a=(null==n?void 0:n.length)?n.find((e=>"photoStrippedSize"===e._)):null;if(a&&"bytes"in a)return tt(0,a,i)}return null}var st=i(9405);function nt(e,t,i,s,n=!0,a,o,r){let l;r||(r=Se(e,i,s,void 0,o));const c="document"===e._;l=c?(0,st.C)(e.w||r.w||512,e.h||r.h||512):(0,st.C)(r.w||100,r.h||100);let d=(0,st.C)(i,s);d=l=l.aspect(d,n);let h=!0;return c&&!["video","gif"].includes(e.type)||(d.width<200&&d.height<200&&(d=l=l.aspectCovered((0,st.C)(200,200))),a&&(a.message||a.reply_to_mid||a.media.webpage||a.replies&&a.replies.pFlags.comments&&a.replies.channel_id.toChatId()!==oe.IA)&&d.width<320&&(d=(0,st.C)(320,d.height),h=!1),h&&d.width<120&&a&&(d=(0,st.C)(120,d.height),h=!1)),t.style.width=d.width+"px",t.style.height=d.height+"px",{photoSize:r,size:l,isFit:h}}var at=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function ot({photo:e,message:t,container:i,boxWidth:n,boxHeight:a,withTail:o,isOut:r,lazyLoadQueue:c,middleware:h,size:u,withoutPreloader:p,loadPromises:m,autoDownloadSize:g,noBlur:v,noThumb:f,noFadeIn:y,blurAfter:b,managers:w=s.Z.managers}){return at(this,void 0,void 0,(function*(){if(!e.sizes&&!e.thumbs)return n&&a&&!u&&"document"===e._&&nt(e,i,n,a,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};let S=0===g;u||(void 0===n&&(n=l.Z.active.regular.width),void 0===a&&(a=l.Z.active.regular.height)),i.classList.add("media-container");let C,L,I,M=i,E=!0,P=Promise.resolve();const k="document"===e._&&"image/gif"===e.mime_type&&!u;if(L=new Image,n&&a&&!u){const s=nt(e,i,n,a,void 0,t,void 0,k?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(u=s.photoSize,E=s.isFit,I=yield w.thumbsStorage.getCacheContext(e,u.type),!E){M=document.createElement("div"),M.classList.add("media-container-aspecter"),M.style.width=s.size.width+"px",M.style.height=s.size.height+"px";const n=it(e,I,!v,!0);if(n){P=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield ot({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:u,lazyLoadQueue:c,isOut:r,loadPromises:m,middleware:h,withoutPreloader:p,withTail:o,autoDownloadSize:g,noBlur:v,noThumb:!0,blurAfter:!0,managers:w})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(M)}}else u||(u=Se(e,n,a,!0)),I=yield w.thumbsStorage.getCacheContext(e,null==u?void 0:u.type);if(!f){const t=it(e,I,!v);t&&(P=Promise.all([P,t.loadPromise]),C=t.image,C.classList.add("media-photo"),M.append(C))}L.classList.add("media-photo");const T=(C||!I.downloaded)&&s.Z.settings.animationsEnabled&&!y;let x;const A=null==t?void 0:t.uploadingFileName;p||(I.downloaded&&!A||(x=new Be({attachMethod:"prepend",isUpload:!!A})),A&&(x.attachPromise(d.Z.getUpload(A)),x.attach(i),S=void 0));const Z=e=>Ze(i,L,e,T,M,C),D=e=>at(this,void 0,void 0,(function*(){if(!h||h()){if(b){const t=$e(e,12);return t.promise.then((()=>Z(t.canvas.toDataURL())))}return Z(e)}}));let F;const _=u.w>=150&&u.h>=150||S,B=()=>at(this,void 0,void 0,(function*(){S&&!p&&x&&(x.construct(),x.setManual());const t=(()=>{const t=k&&!u;return d.Z.downloadMediaURL({media:e,thumb:u,queueId:null==c?void 0:c.queueId,onlyCache:t?void 0:S})})(),s=yield w.thumbsStorage.getCacheContext(e,null==u?void 0:u.type);x&&!s.downloaded&&!p&&_&&x.attach(i,!1,t),S=void 0;const n=t.then(D);return n.catch((()=>{})),{download:t,render:n}}));return x&&x.setDownloadFunction(B),I.downloaded?P=F=(yield B()).render:c?c.push({div:i,load:()=>B().then((({download:e})=>e))}):F=(yield B()).render,m&&P&&m.push(P),yield P,{loadPromises:{thumb:P,full:F||Promise.resolve()},images:{thumb:C,full:L},preloader:x,aspecter:M}}))}var rt=i(5296);function lt(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}var ct=i(925);function dt(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(Fe.T2,e)}function ht(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}var ut=i(3013),pt=i(319),mt=i(8497);let gt;function vt(e,t){if(!gt){const e=document.createElement("canvas");gt=e.getContext("2d"),gt.font=t}return gt.measureText(e).width}const ft=new Map,yt=new Set,bt='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let wt=!1;function St(){wt||(wt=!0,(0,Fe.T2)((()=>{wt=!1,yt.forEach(Lt),yt.clear()})))}function Ct(e){const t=e.dataset.sizeType;return t?l.Z.active[t].width:e.getBoundingClientRect().width}function Lt(e){let t=ft.get(e);const i=!t;let{text:s,textLength:n,from:a,multiplier:o,font:r,textWidth:l,elementWidth:c}=t||{};i&&(s=e.textContent,n=s.length,a=50,o=a>0&&a/100,r=`${e.dataset.fontWeight||400} 16px ${bt}`,l=vt(s,r),c=Ct(e),t={text:s,textLength:n,from:a,multiplier:o,font:r,textWidth:l,elementWidth:c},ft.set(e,t));const d=Ct(e),h=i||c!==d;if(!i&&h&&(t.elementWidth=c=d),h)if(l>c){e.setAttribute("title",s);let i=s,n=c;for(;i.length>3;){let t=i.length;const s=o&&(0,Le.Z)(o*t<<0,1,t-2)||Math.max(t+a-1,1),l=i.substr(0,s).replace(/\s*$/,""),d=i.substr(s+1).replace(/^\s*/,"");if(i=l+d,n=vt(i+"…",r),n{for(const[e]of ft)yt.add(e);St()}),{capture:!0,passive:!0});class It extends HTMLElement{connectedCallback(){ft.set(this,null),this.dataset.sizeType?Lt(this):(yt.add(this),St())}disconnectedCallback(){ft.delete(this),yt.delete(this)}}function Mt(e,t=2){if(0===e)return(0,m.ag)("FileSize.B",[0]);const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1024));return(0,m.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][s],[parseFloat((e/Math.pow(1024,s)).toFixed(i))])}function Et(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),s&&s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}customElements.define("middle-ellipsis-element",It);class Pt{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,k.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=Et(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,Le.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,Le.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let n=this.min+s/i*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=(0,Le.Z)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}class kt extends Pt{constructor(e,t,i,s){super({step:1e3/60/1e3,min:0,max:1,withTransition:i,useTransform:s},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{i=!this.media.paused,i&&this.media.pause()},onMouseUp:e=>{i&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(ut.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let s=0,n=0;for(let a=0;a=t&&t>=s&&(s=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(ut.Z.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}var Tt=i(8115);function xt(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}var At=i(8456),Zt=i(493);const Dt=new WeakMap;s.Z.addEventListener("peer_title_edit",(e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach((e=>{const t=Dt.get(e);t&&t.update()}))}));class Ft{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),e&&this.update(e),Dt.set(this.element,this)}setOptions(e){if(e)for(const t in e){const i=e[t];"object"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0"),this[t]=i}}update(e){var t,i,n,a,o;return i=this,n=void 0,o=function*(){this.setOptions(e);let i=this.fromName;if(void 0!==i)return void 0!==this.limitSymbols&&(i=(0,At.Z)(i,this.limitSymbols,this.limitSymbols)),void(0,r.Z)(this.element,(0,Tt.Z)(i));if(void 0===this.peerId&&(this.peerId=oe.NM),this.peerId===s.Z.myId&&this.dialog)(0,p.Z)(this.element,(0,m.ag)(this.onlyFirstName?"Saved":"SavedMessages"));else{const e=null!==(t=this.managers)&&void 0!==t?t:s.Z.managers;(0,r.Z)(this.element,yield(0,Zt.Z)(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols,e))}},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}))}}function _t(e){return t=this,i=void 0,a=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===s.Z.myId&&e.peerId!==s.Z.myId;if(t.append(i?(0,m.ag)("FromYou"):new Ft(Object.assign(Object.assign({},xt(e)),{dialog:e.peerId===s.Z.myId})).element),(yield s.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=new Ft({peerId:e.peerId}).element;t.append(" ➝ ",i)}return t},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(t,i||[])).next())}));var t,i,n,a}function Bt(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(U(new Date(1e3*e.date))),t}var Rt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Nt(e=!0){const t=new Be({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}s.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const Ut=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,mt.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const l=r.join(", "),c=Array.from(a.querySelectorAll(l)),d=c.indexOf(e),h=c.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,d),s=h.slice(d+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class Ot extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new C.Z}render(){var e,t,i;return Rt(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=s.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const o=(0,be.Z)(this.message),c="voice"===o.type,h=!this.voiceAsMusic&&c,u=this.message.pFlags.is_outgoing,p=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,g=ht(0|o.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const v=this.firstElementChild,f=document.createElement("div");f.classList.add("audio-download"),"audio"!==o.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),p&&(this.classList.add("is-outgoing"),this.append(f));const y=yield h?function(e){return Rt(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,be.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:o,container:r,availW:c}=function(e,t){const i=l.Z.isMobile?16:23,s=l.Z.isMobile?152:190,n=l.Z.isMobile?190:256,a=(0,Le.Z)(t/60*n,s,n),o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.classList.add("audio-waveform-bars"),o.setAttributeNS(null,"width",""+a),o.setAttributeNS(null,"height",""+i),o.setAttributeNS(null,"viewBox",`0 0 ${a} ${i}`);const r=Math.max(...e),c=e.length?e.length:100,d=Math.min(a/4|0,c);let h=0;const u=i-4;let p="";for(let t=0,s=0,n=0;t=c){n=n+d-c,n<(d+1)/2&&h\n `,s+=4,h=n<(d+1)/2?0:a}else h{let t=e.audio;const i=()=>{d.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=dt(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,rt.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/c*t.duration;t.currentTime=s}p.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),p.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),p.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),p.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,n.fc)(p,(e=>{(0,a.Z)(e),t.paused||s(e)}))}),pt.Z),()=>{p.remove(),p=null,t=null}}}))}(this):function(e){var t;return Rt(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,be.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const l=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==l?void 0:l.performer)&&t.push((0,Tt.Z)(l.performer)),i?t.push(H(s.date)):t.length||t.push(Mt(n.size)),e.showSender&&t.push(yield _t(s)),o.append(...(0,m.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const c=e.querySelector(".audio-title"),d=new It;d.dataset.fontWeight=e.dataset.fontWeight,d.dataset.sizeType=e.dataset.sizeType,a?d.append(yield _t(s)):(0,r.Z)(d,(0,Tt.Z)(null!==(t=null==l?void 0:l.title)&&void 0!==t?t:n.file_name)),c.append(d),e.showSender&&c.append(Bt(s));const h=e.querySelector(".audio-subtitle");return h.append(o),()=>{let t=!1,i=new kt(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),h.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&h.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),b=this.querySelector(".audio-time");b.innerHTML=g;const w=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=ut.Z.addMedia(this.message,e),i=this.readyPromise=(0,Re.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=y();const s=()=>ht(0|t.currentTime)+(h?" / "+g:""),o=()=>{b.innerText=s(),v.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&o();const r=(e,i=t.paused)=>{if(e&&(0,a.Z)(e),i){const e=!!this.searchContext;if(ut.Z.setSearchContext(this.searchContext||{peerId:oe.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?Ut(this,this.message.mid):[];ut.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,n.fc)(v,(e=>r(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{v.classList.remove("playing"),b.innerText=g})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||ut.Z.isSafariBuffering(t)||(b.innerText=s())})),this.addAudioListener("pause",(()=>{v.classList.remove("playing")})),this.addAudioListener("play",o),r};if(null===(t=o.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield ot({photo:o,message:null,container:v,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});v.style.width=v.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach((e=>e.classList.add("audio-thumb")))}if(u)p&&(this.preloader=Nt(!1),this.preloader.attachPromise(d.Z.getUpload(p)),this.dataset.isOutgoing="1",this.preloader.attach(f,!1));else{let e=this.preloader;const t="audio"!==o.type;w(t);const s=t=>{if(this.audio.src)return;ut.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(ut.Z.willBePlayed(this.audio),qe.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(o.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=Nt(!1),s=(0,Re.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),ut.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=pt.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(f,!1,s),e=this.addAudioListener("pause",(()=>{s.cancel()}),{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then((()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)}))}else{e=Nt(),t||(this.readyPromise=(0,Re.Z)());const s=()=>{i();const s=d.Z.downloadMediaURL({media:o});return t||s.then((()=>{this.readyPromise.resolve()})),e.attach(f,!1,s),{download:s}};e.setDownloadFunction(s),s()}this.classList.contains("corner-download")?v.append(f):this.append(f),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),f.classList.add("downloaded"),setTimeout((()=>{f.remove()}),200),ut.Z.willBePlayedMedia===this.audio&&(this.audio.play(),ut.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?s(!1):(0,n.fc)(v,(()=>{s(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",Ot);var Ht=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};let zt=0;function Vt({doc:e,container:t,message:i,boxWidth:o,boxHeight:r,withTail:c,isOut:u,middleware:p,lazyLoadQueue:m,noInfo:g,group:v,onlyPreview:f,withoutPreloader:y,loadPromises:b,noPlayButton:w,size:S,searchContext:C,autoDownload:L,managers:I=s.Z.managers}){var M;return Ht(this,void 0,void 0,(function*(){const E=null==L?void 0:L.video;let P=0===E;const k=!(o&&r),T=("video"!==e.type||e.size<=52428800&&!k)&&("gif"===e.type?s.Z.settings.autoPlay.gifs:s.Z.settings.autoPlay.videos);let x,A;if(!g){x=document.createElement("span"),x.classList.add("video-time"),t.append(x);let i=!1;"gif"!==e.type?(x.innerText=ht(e.duration,!1),w||"round"===e.type||(T&&!P?x.classList.add("tgico","can-autoplay"):i=!0)):(x.innerText="GIF",T||w||(i=!0,P=void 0)),i&&(A=document.createElement("span"),A.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(A))}let Z,D={};if("image/gif"===e.mime_type){const s=yield ot({photo:e,message:i,container:t,boxWidth:o,boxHeight:r,withTail:c,isOut:u,lazyLoadQueue:m,middleware:p,withoutPreloader:y,loadPromises:b,autoDownloadSize:E,size:S,managers:I});return D.thumb=s,D.loadPromise=s.loadPromises.full,D}const F=lt();if(F.classList.add("media-video"),F.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const o=l.Z.active.round,r=o.width/2,c=3.5,d=r-2*c;s.innerHTML=`\n \n `;const h=s.firstElementChild.firstElementChild;zt||(zt=2*Math.PI*d),h.style.strokeDasharray=zt+" "+zt,h.style.strokeDashoffset=""+zt,x.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const u=document.createElement("canvas");u.width=u.height=e.w,s.prepend(u,x),s.append(F),t.append(s);const p=u.getContext("2d"),m=()=>{const e=s.message,t=ut.Z.addMedia(e,!P),i=()=>{(dp.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,_e.Z)(t)||(t.removeEventListener("play",c),t.removeEventListener("timeupdate",l),t.removeEventListener("pause",d),t.removeEventListener("ended",m))}))},o=()=>{p.drawImage(t,0,0);const e=zt-t.currentTime/t.duration*zt;return h.style.strokeDashoffset=""+e,!t.paused},r=()=>{t.duration&&((0,_e.Z)(t)?(t.paused&&o(),x.innerText=ht(t.duration-t.currentTime,!1)):i())},l=dt(r),c=()=>{F.classList.add("hide"),s.classList.remove("is-paused"),(0,rt.cK)(o,u),Z&&Z.preloader&&Z.preloader.classList.contains("manual")&&Z.onClick()},d=()=>{(0,_e.Z)(t)?s.classList.add("is-paused"):i()},m=()=>{F.classList.remove("hide"),s.classList.add("is-paused"),F.currentTime=0,x.innerText=ht(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",c),t.addEventListener("timeupdate",l),t.addEventListener("pause",d),t.addEventListener("ended",m),(0,n.fc)(u,(i=>{if((0,a.Z)(i),Z&&!Z.detached&&Z.onClick(),t.paused){const i=!!C;if(ut.Z.setSearchContext(C||{peerId:oe.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?Ut(s,e.mid):[];ut.Z.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(o(),r(),F.classList.add("hide")):d():c()};i.pFlags.is_outgoing?(s.onLoad=m,s.dataset.isOutgoing="1"):m()}else F.autoplay=!0;let _,B;if(i){if(_=yield ot({photo:e,message:i,container:t,boxWidth:o,boxHeight:r,withTail:c,isOut:u,lazyLoadQueue:m,middleware:p,withoutPreloader:!0,loadPromises:b,autoDownloadSize:null==L?void 0:L.photo,size:S,managers:I}),D.thumb=_,!T&&"gif"!==e.type||f)return D.loadPromise=_.loadPromises.full,D;if(c){const e=(_.images.thumb||_.images.full).parentElement;F.width=+e.getAttributeNS(null,"width"),F.height=+e.getAttributeNS(null,"height"),e.append(F)}}!F.parentElement&&t&&((null==_?void 0:_.aspecter)||t).append(F);const R=()=>Ht(this,void 0,void 0,(function*(){return B=yield I.thumbsStorage.getCacheContext(e)}));yield R();const N=null==i?void 0:i.uploadingFileName;N?(Z=new Be({attachMethod:"prepend",isUpload:!0}),Z.attachPromise(d.Z.getUpload(N)),Z.attach(t,!1),P=void 0):B.downloaded||e.supportsStreaming||y?e.supportsStreaming&&(Z=new Be({cancelable:!1,attachMethod:"prepend"})):Z=new Be({attachMethod:"prepend"});const U=(0,Re.Z)();if(F.addEventListener("error",(e=>{4!==F.error.code&&console.error("Error "+F.error.code+"; details: "+F.error.message),Z&&!N&&Z.detach(),U.isFulfilled||U.resolve()}),{once:!0}),(0,ct.Z)(F).then((()=>{v&&h.Z.addAnimation(F,v),Z&&!N&&Z.detach(),U.resolve()})),"video"===e.type){const e=dt((()=>{F.videoWidth&&(x.innerText=ht(F.duration-F.currentTime,!1))}));F.addEventListener("timeupdate",e),A&&F.addEventListener("timeupdate",(()=>{Pe.Z.mutateElement(A,(()=>{A.remove()}))}),{once:!0})}F.muted=!0,F.loop=!0,F.autoplay=!0;let O=P&&(null===(M=null==_?void 0:_.preloader)||void 0===M?void 0:M.loadFunc);const H=()=>Ht(this,void 0,void 0,(function*(){Z&&P&&!y&&(Z.construct(),Z.setManual()),yield R();let s=Promise.resolve();if(Z&&!N||y)if(B.downloaded||e.supportsStreaming)e.supportsStreaming&&(P?s=Promise.reject():!B.downloaded&&Z&&(Z.attach(t,!1,null),F.addEventListener(qe.IS_SAFARI?"timeupdate":"canplay",(()=>{Z.detach()}),{once:!0})));else{const i=s=I.apiFileManager.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId,onlyCache:P});Z&&Z.attach(t,!1,i)}return!P&&O&&(O(),O=null),P=void 0,s.then((()=>Ht(this,void 0,void 0,(function*(){!p||p()?("round"===e.type&&ut.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield R(),xe(F,B.url)):U.resolve()}))),(()=>{})),{download:s,render:U}}));return Z&&!N&&Z.setDownloadFunction(H),"gif"!==e.type||T?D.loadPromise=m?(m.push({div:t,load:()=>H().then((({render:e})=>e))}),Promise.resolve()):(yield H()).render:(0,n.fc)(t,(e=>{(0,a.Z)(e),A.remove(),H()}),{capture:!0,once:!0}),D}))}l.Z.addEventListener("changeScreen",((e,t)=>{if(t===l._.mobile||e===l._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=l.Z.active.round.width,i=t/2,s=i-7;zt=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=zt+" "+zt,n.style.strokeDashoffset=""+zt}))}}));function Gt({groupId:e,attachmentDiv:t,middleware:i,uploading:n,lazyLoadQueue:a,isOut:o,chat:r,loadPromises:c,autoDownload:d,managers:h=s.Z.managers}){return u=this,p=void 0,g=function*(){const s=[],n=yield h.appMessagesManager.getMidsByAlbum(e),u=yield Promise.all(n.map((e=>r.getMessage(e))));for(const e of u){const t=(0,be.Z)(e),i="photo"===t._?Se(t,480,480):{w:t.w,h:t.h};s.push({size:i,media:t,message:e})}Ee({container:t,items:s.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:l.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0}),s.forEach(((e,s)=>{const{size:n,media:r,message:l}=e,u=t.children[s];u.dataset.mid=""+l.mid,u.dataset.peerId=""+l.peerId;const p=u.firstElementChild;"photo"===r._?ot({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:i,size:n,loadPromises:c,autoDownloadSize:d.photo,managers:h}):Vt({doc:l.media.document,container:p,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:i,loadPromises:c,autoDownload:d,managers:h})}))},new((m=void 0)||(m=Promise))((function(e,t){function i(e){try{n(g.next(e))}catch(e){t(e)}}function s(e){try{n(g.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof m?n:new m((function(e){e(n)}))).then(i,s)}n((g=g.apply(u,p||[])).next())}));var u,p,m,g}var Wt=i(467),jt=i(4211),Kt=i(2491),$t=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function qt({message:e,withTime:t,fontWeight:i,voiceAsMusic:a,showSender:r,searchContext:l,loadPromises:c,autoDownloadSize:h,lazyLoadQueue:u,sizeType:p,managers:g=s.Z.managers,cacheContext:v}){var f;return $t(this,void 0,void 0,(function*(){i||(i=500),p||(p="");const y=0===h,b=e.media.document||e.media.webpage.document,w=null==e?void 0:e.uploadingFileName;if("audio"===b.type||"voice"===b.type||"round"===b.type){const s=new Ot;return s.withTime=t,s.message=e,s.noAutoDownload=y,s.lazyLoadQueue=u,s.loadPromises=c,a&&(s.voiceAsMusic=a),l&&(s.searchContext=l),r&&(s.showSender=r),s.dataset.fontWeight=""+i,s.dataset.sizeType=p,yield s.render(),s}let S=b.file_name?b.file_name.split("."):"",C="";C=S.length>1&&Array.isArray(S)?(0,Wt.ST)(S.pop().split(" ",1)[0].toLowerCase()):"file";let L=document.createElement("div");L.classList.add("document",`ext-${C}`),L.dataset.docId=""+b.id;const I=document.createElement("div");I.classList.add("document-ico");const M=!!v,E=()=>M?v:g.thumbsStorage.getCacheContext(b);if(v=yield E(),(null===(f=b.thumbs)||void 0===f?void 0:f.length)||e.pFlags.is_outgoing&&v.url&&"photo"===b.type){L.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(b.type))I.innerHTML=``,t.push(I.firstElementChild);else{const e=performance.now(),i=yield ot({photo:b,message:null,container:I,boxWidth:54,boxHeight:54,loadPromises:c,withoutPreloader:!0,lazyLoadQueue:u,size:Se(b,54,54,!0),managers:g});console.log("was wrapping photo",performance.now()-e),I.style.width=I.style.height="",i.images.thumb&&t.push(i.images.thumb),i.images.full&&t.push(i.images.full)}t.forEach((e=>e.classList.add("document-thumb")))}else I.innerText=C;let P=b.file_name?(0,Kt.Z)(b.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const k=[Mt(b.size)];t&&k.push(H(e.date)),r&&k.push(yield _t(e)),L.innerHTML=`\n ${v.downloaded&&!w||!e.mid?"":'
'}\n
\n
\n `;const T=L.querySelector(".document-name"),x=new It;if(x.dataset.fontWeight=""+i,x.dataset.sizeType=p,x.textContent=P,T.append(x),r&&T.append(Bt(e)),L.querySelector(".document-size").append(...(0,m.A1)(k," · ")),L.prepend(I),!w&&e.pFlags.is_outgoing&&!e.mid)return L;let A,Z=null;const D=()=>{if(A){A.classList.add("downloaded");const e=A;setTimeout((()=>{e.remove()}),200),A=null}Z&&(Z=null)},F=e=>$t(this,void 0,void 0,(function*(){var t;const i=!e||e.isTrusted,n=yield g.appDocsManager.getDoc(L.dataset.docId);let a;const r=dp.chat.bubbles?dp.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!Z||Z.detached;a=d.Z.downloadMediaURL({media:n,queueId:r}),e&&a.then((()=>{setTimeout((()=>$t(this,void 0,void 0,(function*(){const e=(yield E()).url;window.open(e)}))),s.Z.settings.animationsEnabled?250:0)}))}else a=o.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?d.Z.downloadMediaURL({media:n,queueId:r}):d.Z.downloadToDisc({media:n,queueId:r});else a=d.Z.downloadMediaVoid({media:n,queueId:r});A&&(a.then(D,pt.Z),Z.attach(A,!0,a))})),{fileName:_}=(0,jt.Z)({media:b});if(yield g.apiFileManager.isDownloading(_)){A=L.querySelector(".document-download");const e=d.Z.downloadMediaVoid({media:b});Z=new Be,Z.attach(A,!1,e),Z.setDownloadFunction(F)}else if(!v.downloaded||w)if(A=L.querySelector(".document-download"),Z=new Be({isUpload:!!w}),w){const e=d.Z.getUpload(w);Z.attachPromise(e),Z.attach(A),e.then(D,pt.Z)}else Z.construct(),Z.setManual(),Z.attach(A),Z.setDownloadFunction(F),void 0!==h&&h>=b.size&&(0,n.tH)(Z.preloader);return(0,n.fc)(L,(e=>{Z?Z.onClick(e):F(e)})),L}))}s.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,n.tH)(e)}))}));var Qt=i(5159),Yt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))},Xt=i(5269),Jt=i(8938);const ei={};function ti(e,t,i){return n=this,a=void 0,r=function*(){const n=e.id+"-"+i,{width:a,height:o}=t;let r=ei[n];if(r&&r.width>=a&&r.height>=o)return;r=ei[n]={width:a,height:o};const l=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(ei[n]!==r)return;if(l&&l.w>=a&&l.h>=o)return;const c=new Promise((e=>{t.toBlob((t=>e(t)))})),d=yield c;ei[n]===r&&(s.Z.managers.appDocsManager.saveLottiePreview(e.id,d,a,o,i),delete ei[n])},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}));var n,a,o,r}var ii=i(6724),si=i(2790),ni=i(2384),ai=i(7730),oi=i(671),ri=i(2131);function li({size:e,doc:t,middleware:i,target:s,side:n,skipRatio:a,play:o,managers:r}){const l=document.createElement("div");l.classList.add("emoji-animation"),l.style.width=e+"px",l.style.height=e+"px";const c=di({div:l,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!1,width:e,height:e,play:o,group:"none",skipRatio:a,managers:r}).then((({render:e})=>e)).then((e=>((0,Jt.Z)(e),e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(e.remove(),l.remove(),dp.chat.bubbles.scrollable.container.removeEventListener("scroll",g))})),ri.Z&&e.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),e))),d=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},h=d(16),u=d(4),p=e/8*("right"===n?1:-1),m=()=>{if(!(0,_e.Z)(s))return;const t=s.getBoundingClientRect(),i=("right"===n?t.right:t.left)+("center"===n?(t.width-e)/2:("right"===n?-e:0)+p+h),a=t.top+(t.height-e)/2+("center"===n?0:u);l.style.top=a+"px",l.style.left=i+"px"},g=dt(m);return dp.chat.bubbles.scrollable.container.addEventListener("scroll",g),m(),dp.emojiAnimationContainer.append(l),{animationDiv:l,stickerPromise:c}}var ci=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function di({doc:e,div:t,middleware:i,lazyLoadQueue:o,group:r,play:l,onlyThumb:c,emoji:u,width:p,height:m,withThumb:g,loop:v,loadPromises:f,needFadeIn:y,needUpscale:b,skipRatio:w,static:S,managers:C=s.Z.managers}){var L;return ci(this,void 0,void 0,(function*(){const I=e.sticker;if(1===I&&(S=!0),p||(p=u?void 0:200),m||(m=u?void 0:200),2===I&&ni.Z.loadLottieWorkers(),!I)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");let M;t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper");let E=(t=(null==M?void 0:M.type))=>ci(this,void 0,void 0,(function*(){return M=yield C.thumbsStorage.getCacheContext(e,t)}));if(S&&1!==I){const t=Se(e,p,m,!1);yield E(t.type)}else yield E();const P=u?(0,oi.tB)(u):-1,k=M.downloaded&&!y,T=!S&&(2===I||3===I),x=T,A=2===I||3===I?yield C.appDocsManager.getLottieCachedThumb(e.id,P):void 0;let Z=(0,Re.Z)(),D=!1;if(((null===(L=e.thumbs)||void 0===L?void 0:L.length)||A)&&!t.firstElementChild&&(!k||x||c)&&!1!==g){let s,n=A||e.thumbs[0];const a=()=>{t.childElementCount||(s.classList.add("media-sticker","thumbnail"),Pe.Z.mutateElement(t,(()=>{t.append(s),Z.resolve()})))};if("url"in n)s=new Image,xe(s,n.url,a),D=!0;else if("bytes"in n)if("photoPathSize"===n._)if(n.bytes.length){const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("rlottie-vector","media-sticker","thumbnail"),s.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const a=document.createElementNS("http://www.w3.org/2000/svg","path");a.setAttributeNS(null,"d",i),s.append(a),t.append(s)}else n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n;else P<=0&&(s=new Image,Xt.Z||e.pFlags.stickerThumbConverted||M.url?(xe(s,et(0,n,!0),a),D=!0):ai.Z.convert("main-"+e.id,n.bytes).then((o=>{C.appDocsManager.saveWebPConvertedStrippedThumb(e.id,o),n.bytes=o,e.pFlags.stickerThumbConverted=!0,i&&!i()||t.childElementCount||xe(s,et(0,n,!0),a)})).catch((()=>{})));else if((2===I&&P<=0||3===I)&&(g||c)){const e=()=>ci(this,void 0,void 0,(function*(){if(t.childElementCount||i&&!i())return;const e=()=>{t.childElementCount||i&&!i()||xe(s,M.url,a)};if(yield E(),M.url)e();else{const t=tt(0,n,!0);s=t.image,t.loadPromise.then(e)}}));if(o&&c)return void o.push({div:t,load:e});e(),n.url&&(D=!0)}}if(f&&D&&f.push(Z),c)return;const F=()=>ci(this,void 0,void 0,(function*(){if(!i||i()){if(2===I&&!S)return yield d.Z.downloadMedia({media:e,queueId:null==o?void 0:o.queueId}).then((o=>ci(this,void 0,void 0,(function*(){if(i&&!i())throw new Error("wrapSticker 2 middleware");let c=yield ni.Z.loadAnimationWorker({container:t,loop:v&&!u,autoplay:l,animationData:o,width:p,height:m,name:"doc"+e.id,needUpscale:b,skipRatio:w,toneIndex:P},r,i);if(c.addEventListener("firstFrame",(()=>{const i=t.firstElementChild;!1!==y&&(y=(y||!i||"svg"===i.tagName)&&s.Z.settings.animationsEnabled);const n=()=>{i&&i!==c.canvas&&i.remove()};y?Pe.Z.mutate((()=>{c.canvas.classList.add("fade-in"),i&&i.classList.add("fade-out"),c.canvas.addEventListener("animationend",(()=>{Pe.Z.mutate((()=>{c.canvas.classList.remove("fade-in"),n()}))}),{once:!0})})):i&&Pe.Z.mutate(n),!1!==g&&ti(e,c.canvas,P)}),{once:!0}),u){const e={a:[],v:1};let s;C.appStickersManager.preloadAnimatedEmojiStickerAnimation(u),(0,n.fc)(t,(n=>ci(this,void 0,void 0,(function*(){(0,a.Z)(n);const o=ni.Z.getAnimation(t);if(o.paused){const e=yield C.appStickersManager.getAnimatedEmojiSoundDocument(u);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield d.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,ct.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}if(!dp.chat.peerId.isUser())return;const r=yield C.appStickersManager.getAnimatedEmojiSticker(u,!0);if(!r)return;const l=(0,mt.Z)(t,"bubble"),c=l.classList.contains("is-out"),{animationDiv:h}=li({doc:r,middleware:i,side:c?"right":"left",size:280,target:t,play:!0});l&&(c?h.classList.add("is-out"):h.classList.add("is-in")),s||(s=(0,ii.Z)((()=>{if(!e.a.length)return;const i=e.a[0].t;e.a.forEach((e=>{e.t=(e.t-i)/1e3}));const s=(0,mt.Z)(t,"bubble");C.appMessagesManager.setTyping(dp.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,si.Z)(+s.dataset.mid),emoticon:u,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0}),1e3,!1)),n.isTrusted&&(e.a.push({i:1,t:Date.now()}),s())}))))}return c}))));if(S||3===I){let n;S?n=new Image:(n=lt(),n.muted=!0,l&&(n.autoplay=!0,n.loop=!0));const a=t.firstElementChild!==n&&t.firstElementChild;return!1!==y&&(y=(y||!k||(S?a:!a||"svg"===a.tagName))&&s.Z.settings.animationsEnabled),n.classList.add("media-sticker"),y&&n.classList.add("fade-in"),new Promise(((s,l)=>ci(this,void 0,void 0,(function*(){const l=()=>ci(this,void 0,void 0,(function*(){if(i&&!i())return s();const o=()=>{Pe.Z.mutateElement(t,(()=>{if(t.append(n),a&&a.classList.add("fade-out"),3===I&&!function(e,t){const i=e.id+"-"+t;return!!ei[i]}(e,P)){(0,Jt.Z)(n);const t=document.createElement("canvas");t.width=p*window.devicePixelRatio,t.height=m*window.devicePixelRatio,t.getContext("2d").drawImage(n,0,0,t.width,t.height),ti(e,t,P)}3===I&&r&&h.Z.addAnimation(n,r),s(),y&&n.addEventListener("animationend",(()=>{n.classList.remove("fade-in"),a&&a.remove()}),{once:!0})}))};yield E(),S?xe(n,M.url,o):(n.src=M.url,(0,ct.Z)(n).then(o))}));if(yield E(),M.url)l();else{let t;if(2===I&&S){const i=Se(e,p,m,!1);t=d.Z.downloadMediaURL({media:e,thumb:i,queueId:null==o?void 0:o.queueId})}else t=d.Z.downloadMediaURL({media:e,queueId:null==o?void 0:o.queueId});t.then(l,s)}}))))}}})),_=!o||k&&!T?F():(o.push({div:t,load:F}),Promise.resolve());return k&&S&&(Z=_,f&&f.push(Z)),{render:_}}))}var hi=i(5432);class ui{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,k.Z)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=D({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()})),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach((e=>{this.listenerSetter.add(e.input)("input",this.handleChange)})),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach((t=>t.input.toggleAttribute("disabled",e))),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then((()=>{t&&(this.disabled=!1)}),(()=>{this.disabled=!1}))}}function pi(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}class mi{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?(0,r.Z)(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append((0,m.ag)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),t=!0),e.checkboxField){this.checkboxField=e.checkboxField;const i=e.checkboxField.label.classList.contains("checkbox-field-toggle");i?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(t=!0,this.container.append(this.checkboxField.label)),e.noCheckboxSubtitle||i||this.checkboxField.input.addEventListener("change",(()=>{(0,p.Z)(this.subtitle,(0,m.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))}))}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?"string"==typeof e.title?this.title.innerHTML=e.title:this.title.append(e.title):this.title.append((0,m.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),"string"==typeof i?s.innerHTML=i:s.append(i),t.append(s)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",(t=>{this.freezed||e.clickable(t)})),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,ye.Z)(this.container,void 0,void 0,!0))}createMedia(e){this.container.classList.add("row-with-padding");const t=this.media=document.createElement("div");return t.classList.add("row-media"),e&&t.classList.add("row-media-"+e),this.container.append(t),t}}const gi=(e,t)=>pi(e.map((e=>({container:e.container,input:e.radioField.input}))),t);function vi(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var fi=i(144),yi=i(9750),bi=i(3789);class wi{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(bi.Z.getState().then((t=>{i.checked=(0,yi.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{s.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const n=this.main=document.createElement("div");n.classList.add("radio-field-main"),e.text?n.innerHTML=e.text:e.langKey&&(0,m.$d)(n,e.langKey),t.append(i,n)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const Si=document.createElement("div");function Ci(e){(0,p.Z)(Si,e),document.body.append(Si),Si.dataset.timeout&&clearTimeout(+Si.dataset.timeout),Si.dataset.timeout=""+setTimeout((()=>{Si.remove(),delete Si.dataset.timeout}),3e3)}function Li(e){Ci((0,m.ag)(e.langPackKey,e.langPackArguments))}Si.classList.add("toast");var Ii=i(5701);function Mi(e){return(e.length>=5&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class Ei extends f.Z{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,Ii.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(f.I.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());Mi(e)?this.setState(f.I.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)}))}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.checkUsernamePromise=this.managers.appUsersManager.checkUsername(e),this.checkUsernamePromise.then((t=>{this.getValue()===e&&(t?this.setState(f.I.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&"USERNAME_INVALID"===t.type&&this.setError(this.options.invalidText)})).then((()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&Mi(t)&&this.checkUsername(t)})))}}var Pi=i(9807);class ki extends x.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&(0,x.x)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){const e=new Mp;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,m.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,m.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!1;const t=new Pi.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}var Ti=i(1656);class xi extends E{init(){return e=this,t=void 0,a=function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new Uo({name:e?"ChannelType":"GroupType"}),i=(0,fi.a)(),a=new mi({radioField:new wi({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new mi({radioField:new wi({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=gi([a,o],(e=>{const t=[c,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),v()})),l=yield this.managers.appChatsManager.getChat(this.chatId);t.content.append(r);const c=new Uo({}),d=new mi({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{vi(this.chatFull.exported_invite.link),Ci(m.ZP.format("LinkCopied",!0))}}),h=(0,L.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,n.fc)(h,(()=>{new ki("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,Ti.Z)([h],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),d.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),c.content.append(d.container,h);const u=new Uo({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),p=document.createElement("div");p.classList.add("input-wrapper");const g="t.me/",v=()=>{const e=a.radioField.checked&&y!==g||f.isValidToChange()&&f.input.classList.contains("valid");b.classList.toggle("is-visible",e)},f=new Ei({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:v,peerId:this.chatId.toPeerId(!0),head:g},this.managers),y=g+(l.username||"");p.append(f.container),u.content.append(p);const b=D({icon:"check",className:"is-visible"});this.content.append(b),(0,n.fc)(b,(()=>{(0,fe.p)(b);const e=o.radioField.checked?f.getValue():"";this.managers.appChatsManager.migrateChat(this.chatId).then((t=>this.managers.appChatsManager.updateUsername(t,e))).then((()=>{this.close()}))}),{listenerSetter:this.listenerSetter}),(y!==g?o:a).radioField.checked=!0,f.setOriginalValue(y),this.scrollable.append(t.container,c.container,u.container);{const t=new Uo({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new Pi.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const n=()=>{i.setValueSilently(!!l.pFlags.noforwards)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()})),n(),t.content.append(i.label),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}}var Ai=i(4668);class Zi{constructor(e){this.loading=!1,this.loaded=!1,(0,k.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}var Di=i(8479),Fi=i(7120),_i=i(2946),Bi=i(4789),Ri=i(8763),Ni=i(1352);const Ui=new class{constructor(){if(Ni.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}},Oi=Ui;var Hi=i(6690),zi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Vi(e,t){return zi(this,void 0,void 0,(function*(){const i=e.map(((e,i,s)=>zi(this,void 0,void 0,(function*(){if(yield t(e,i,s))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}var Gi=i(2566);function Wi(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}function ji(e,t=s.Z.managers){var i,n,a,o,r,l;return a=this,o=void 0,l=function*(){const s=yield t.appChatsManager.getChat(e);if("chatForbidden"===s._)return(0,m.ag)("YouWereKicked");const a=yield t.appProfileManager.getCachedFullChat(e);let o;o=a?"channelFull"===a._?a.participants_count:null===(i=a.participants.participants)||void 0===i?void 0:i.length:s.participants_count||(null===(n=s.participants)||void 0===n?void 0:n.participants.length),o=o||1;let r=s.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,m.ag)(r,[Wi(o)])},new((r=void 0)||(r=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}))}var Ki=i(8493),$i=i(8050),qi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Qi{constructor(e){this.container=document.createElement("div"),this.list=$p.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=$p.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,k.Z)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>qi(this,void 0,void 0,(function*(){return this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=yield Vi(e,(e=>qi(this,void 0,void 0,(function*(){if(e.isPeerId()&&!(yield this.managers.appPeersManager.getPeer(e)).deleted)for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,m.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,m.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new Uo({});e.innerContainer.classList.add("selector-search-section");let t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new u.ZP(t),(0,n.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,mt.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?s.click():this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new Uo({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new u.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,n.fc)(this.chatsContainer,(e=>{const t=(0,Ri.Z)(e.target,"data-peer-id");if((0,a.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const s=(0,Ii.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",s),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(Ho()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{let t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return qi(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([s.Z.myId]))}))}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return qi(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=Oi.height/72*1.25|0,t=this.getTempId("dialogs"),i=this.managers.appMessagesManager.getConversations(this.query,this.offsetIndex,e,this.folderId,!0);this.promise=i;const n=yield i;if(this.tempIds.dialogs!==t)return;this.promise=null;let a=n.dialogs;if(a.length){const e=(0,$i.Z)(a[a.length-1])||0;a=a.slice(),(0,pe.Z)(a,(e=>e.peerId===s.Z.myId)),this.chatRightsAction&&(a=yield Vi(a,(e=>this.filterByRights(e.peerId)))),yield this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),n.isEnd){if(!this.loadedWhat.dialogs)return yield this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return qi(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,Ki.Z)(t):!!(0,Fi.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return qi(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);this.promise=i;let[n,a]=yield i;if(this.tempIds.contacts!==t)return;if(a){let t=e?a.my_results.concat(a.results):a.my_results;this.chatRightsAction&&(t=yield Vi(t,(e=>this.filterByRights(e)))),this.peerType.includes("dialogs")||(t=t.filter((e=>e.isUser()))),this.cachedContacts=(0,Hi.Z)(n.concat(t))}else this.cachedContacts=n.slice();(0,P.Z)(this.cachedContacts,s.Z.myId),this.promise=null}const t=Oi.height/72*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return qi(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),i=yield t;if(this.tempIds.channelParticipants!==e)return;const n=i.participants.map((e=>(0,Gi.Z)(e)));(0,P.Z)(n,s.Z.myId),this.renderResultsFunc(n),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){return qi(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield Vi(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>qi(this,void 0,void 0,(function*(){const{dom:t}=$p.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new Pi.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield ji(e.toChatId()):e===s.Z.myId?(0,m.ag)(this.selfPresence):re(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const s=document.createElement("div");s.classList.add("selector-user","scale-in");const n=new Mp;return n.classList.add("selector-user-avatar","tgico","avatar-32"),n.isDialog=!0,s.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Ft({peerId:e.toPeerId(),dialog:!0}).element),n.updateWithOptions({peerId:e})),t&&("string"==typeof t?s.innerHTML=t:((0,p.Z)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(s,this.input),this.onChange&&this.onChange(this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),s}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};s.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:Bi.f.Static})}))}}class Yi extends x.Z{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new Qi({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),hi.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.title.append(this.selector.input)}}var Xi=i(6848);class Ji extends E{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new Uo({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=$p.createChatList({new:!0});i.append(s);const{dom:n}=$p.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(re(yield this.managers.appUsersManager.getUser(this.userId)));const a=new ts({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,Xi.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new Uo({});if("channelParticipantBanned"===this.participant._){const i=(0,L.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,n.fc)(i,(()=>{const t=(0,Ti.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,L.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,n.fc)(i,(()=>{(0,Ti.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var es=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ts{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return es(this,void 0,void 0,(function*(){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,Di.Z)(t);const i=e.default_banned_rights.pFlags;for(let e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,a=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const o of this.v){const r=o.flags[0];o.checkboxField=new Pi.Z({text:o.text,checked:(0,Fi.Z)(t,r,s),restriction:!0,withRipple:!0}),(e.participant&&i.pFlags[r]||t.username&&(o.flags.includes("pin_messages")||o.flags.includes("change_info")))&&(o.checkboxField.input.disabled=!0,(0,n.fc)(o.checkboxField.label,(e=>{Ci(m.ZP.format(a,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[r]&&e.listenerSetter.add(o.checkboxField.input)("change",(()=>{o.checkboxField.checked||this.v.filter((e=>this.toggleWith[r].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(o.checkboxField.label)}}))}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v)!t.checkboxField.checked&&t.flags.forEach((t=>{e.pFlags[t]=!0}));return e}}class is extends E{init(){return es(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new Uo({name:"ChannelPermissionsHeader"});e=new ts({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new Uo({name:"PrivacyExceptions"}),i=new mi({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Yi({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{a(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),a=e=>es(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void Ci("User is no longer participant")}const i=this.slider.createTab(Ji);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const o=t.generateContentElement();o.classList.add("chatlist-container");const r=$p.createChatList({new:!0});o.append(r),(0,n.fc)(r,(e=>{const t=(0,Ai.Z)(e.target,Vp);if(!t)return;const i=t.dataset.peerId.toPeerId();a(i)}),{listenerSetter:this.listenerSetter});const l=(t,i)=>es(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...(0,m.v_)(a.map((e=>(0,m.ag)(e))),!1))),o.classList.toggle("hide",!a.length)})),c=(e,t)=>{const{dom:i}=$p.addDialogNew({peerId:(0,_i.Z)(e.peer),container:r,rippleEnabled:!0,avatarSize:48,append:t});l(i.listEl,e)},d=()=>{(0,p.Z)(i.subtitle,(0,m.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const g=()=>(h=new Zi({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,r.childElementCount).then((e=>{for(const t of e.participants)c(t,!0);return u=e.count,d(),e.participants.length<50||e.count===r.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield g():(d(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,g())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class ss{constructor(e,t,i){this.peerId=e,this.peerType=t,this.onSelect=i,this.construct()}construct(){return e=this,t=void 0,s=function*(){let{peerId:e,peerType:t,onSelect:i}=this;const s=new Ft({peerId:e}).element,n=x.Z.MANAGERS;void 0===t&&(t=yield n.appPeersManager.getDialogType(e));const a=(t,s=h&&!!t.size)=>{let a=n.appChatsManager.leave(e.toChatId());s&&(a=a.finally((()=>n.appMessagesManager.flushHistory(e)))),i&&i(a)},o=t=>{let s;if(e.isUser())s=n.appMessagesManager.flushHistory(e,!1,h?!!t.size:void 0);else{if(!t.size)return a(t);s=n.appChatsManager.delete(e.toChatId())}i&&i(s)};let r,l,c,d,h;switch(t){case"channel":(yield n.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(r="ChannelDeleteMenu",l="AreYouSureDeleteAndExitChannel",d=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:o}],h=[{text:"DeleteChannelForAll"}]):(r="LeaveChannelMenu",l="ChannelLeaveAlertWithName",c=[s],d=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":r="DeleteChatUser",l="AreYouSureDeleteThisChatWithUser",c=[s],d=[{langKey:"DeleteChatUser",isDanger:!0,callback:o}],h=[{text:"DeleteMessagesOptionAlso",textArgs:[new Ft({peerId:e}).element]}];break;case"saved":r="DeleteChatUser",l="AreYouSureDeleteThisChatSavedMessages",d=[{langKey:"DeleteChatUser",isDanger:!0,callback:o}];break;case"megagroup":case"group":(yield n.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(r="DeleteMegaMenu",l="AreYouSureDeleteAndExit",d=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:o}],h=[{text:"DeleteChat.DeleteGroupForAll"}]):(r="LeaveMegaMenu",l="AreYouSureDeleteAndExitName",c=[s],d=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new ki("popup-delete-chat",{peerId:e,titleLangKey:r,descriptionLangKey:l,descriptionLangArgs:c,buttons:d,checkboxes:h}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var ns=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class as extends E{init(){var e;return ns(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId);let s=null!==(e=i.available_reactions)&&void 0!==e?e:[];const n=new Set(s),a=new Uo({caption:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),o=new Pi.Z({toggle:!0,checked:!!n.size}),r=new mi({checkboxField:o,titleLangKey:"EnableReactions"});a.content.append(r.container);const l=new Uo({name:"AvailableReactions"}),c=t.map((e=>{const t=new Pi.Z({toggle:!0,checked:n.has(e.reaction)});this.listenerSetter.add(t.input)("change",(()=>{t.checked?(n.add(e.reaction),o.checked||o.setValueSilently(!0)):(n.delete(e.reaction),!n.size&&o.checked&&o.setValueSilently(!1)),h()}));const i=new mi({checkboxField:t,title:e.title,havePadding:!0});return Pn({row:i,doc:e.static_icon,size:"small"}),l.content.append(i.container),t}));this.listenerSetter.add(r.checkboxField.input)("change",(()=>{o.checked?c.every((e=>!e.checked))&&(c.forEach((e=>e.checked=!0)),h()):(c.forEach((e=>e.checked=!1)),h())}));const d=()=>ns(this,void 0,void 0,(function*(){const e=Array.from(n);if([...e].sort().join()===[...s].sort().join())return;const t=yield this.managers.appProfileManager.getCachedFullChat(this.chatId);t&&(t.available_reactions=e),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,e),s=e})),h=(0,Ii.Z)(d,3e3,!1,!0);this.eventListener.addEventListener("destroy",d,{once:!0}),this.scrollable.append(a.container,l.container)}))}}var os=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class rs extends M{_init(){var e;return os(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",null!==(e=this.tempId)&&void 0!==e||(this.tempId=0);const t=++this.tempId;this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let i=yield this.managers.appProfileManager.getChatFull(this.chatId,!0);const a=yield this.managers.appChatsManager.getChat(this.chatId),o=yield this.managers.appChatsManager.isBroadcast(this.chatId),r=yield this.managers.appChatsManager.isChannel(this.chatId),l=[],c=e=>{l.push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&l.forEach((e=>e()))})),this.listenerSetter.add(s.Z)("chat_full_update",(e=>os(this,void 0,void 0,(function*(){this.chatId===e&&(i=(yield this.managers.appProfileManager.getCachedFullChat(e))||i)}))));const d=this.chatId.toPeerId(!0),h=yield this.managers.appChatsManager.hasRights(this.chatId,"change_type"),u=yield this.managers.appChatsManager.hasRights(this.chatId,"change_permissions");{const e=new Uo({noDelimiter:!0}),r=[],l=document.createElement("div");if(l.classList.add("input-wrapper"),this.chatNameInputField=new f.Z({label:o?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new f.Z({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(a.title),this.descriptionInputField.setOriginalValue(i.about),l.append(this.chatNameInputField.container,this.descriptionInputField.container),r.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new ui({peerId:d,inputFields:r,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.content.append(this.editPeer.avatarEdit.container,l),h){const t=new mi({titleLangKey:o?"ChannelType":"GroupType",clickable:()=>{const e=this.slider.createTab(xi);e.chatId=this.chatId,e.chatFull=i,e.open(),this.listenerSetter.add(e.eventListener)("destroy",s)},icon:"lock"}),s=()=>{let e;t.subtitle.textContent="",e=o?a.username?"TypePublic":"TypePrivate":a.username?"TypePublicGroup":"TypePrivateGroup",t.subtitle.append((0,m.ag)(e))};s(),e.content.append(t.container)}if(h||u){const s=new mi({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(as);e.chatId=this.chatId,e.open().then((()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)}))}}),n=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,a=()=>{var e;const t=null!==(e=i.available_reactions)&&void 0!==e?e:[];s.subtitle.innerHTML=t.length+"/"+n};a(),e.content.append(s.container)}if(u&&!o){const t=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new mi({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(is);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>os(this,void 0,void 0,(function*(){const e=yield this.managers.appChatsManager.getChatTyped(this.chatId);i.subtitle.innerHTML=t.reduce(((t,i)=>t+ +(0,Fi.Z)(e,i,e.default_banned_rights)),0)+"/"+t.length}));n(),e.content.append(i.container),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()}))}if(this.scrollable.append(e.container),(0,n.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),o&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const t=new Pi.Z({text:"PeerInfo.SignMessages",checked:!!a.pFlags.signatures,withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,t.checked).then((()=>{e()}))})),c((()=>{t.setValueSilently(!!a.pFlags.signatures)})),e.content.append(t.label)}}if(!o){const e=new Uo({});if(!o&&h){const t=new Pi.Z({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!t.checked).then((()=>{e()}))}));const s=()=>{t.setValueSilently(r&&!i.pFlags.hidden_prehistory)};s(),c(s),e.content.append(t.label)}e.content.childElementCount&&this.scrollable.append(e.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new Uo({}),t=(0,L.Z)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,n.fc)(t,(()=>{new ss(d,void 0,(e=>{const i=(0,Ti.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}r||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{d===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var ls=i(6272);function cs(e){return"+"+(0,ls.u)(e).formatted}var ds=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class hs extends M{init(){return ds(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));this.setTitle(e?"AddContactTitle":"Edit");{const t=new Uo({noDelimiter:!0}),i=[],a=document.createElement("div");if(a.classList.add("input-wrapper"),this.nameInputField=new f.Z({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new f.Z({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=yield this.managers.appUsersManager.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(a.append(this.nameInputField.container,this.lastNameInputField.container),i.push(this.nameInputField,this.lastNameInputField),this.editPeer=new ui({peerId:this.peerId,inputFields:i,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const i=document.createElement("div");i.classList.add("avatar-edit"),i.append(this.editPeer.avatarElem);const n=new Pi.Z({text:"Notifications"});n.input.addEventListener("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),this.listenerSetter.add(s.Z)("notify_settings",(e=>ds(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,_i.Z)(e.peer.peer);if(this.peerId===t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const o=document.createElement("div");o.classList.add("profile-name"),o.append(new Ft({peerId:this.peerId}).element);const r=document.createElement("div");if(r.classList.add("profile-subtitle"),r.append((0,m.ag)("EditContact.OriginalName")),t.content.append(i,o,r,a),e){const e=yield this.managers.appUsersManager.getUser(this.peerId),i=new mi({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?cs(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new Ft({peerId:this.peerId}).element]});t.content.append(i.container)}else{const e=new mi({checkboxField:n}),i=!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1));n.checked=i,t.content.append(e.container)}}else t.content.append(a);this.scrollable.append(t.container),(0,n.fc)(this.editPeer.nextBtn,(()=>ds(this,void 0,void 0,(function*(){this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(this.peerId)).phone).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}if(!e){const e=new Uo({}),t=(0,L.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,n.fc)(t,(()=>{new ki("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,x.x)([{langKey:"Delete",callback:()=>{const e=(0,Ti.Z)([t],!0);this.managers.appUsersManager.deleteContacts([this.peerId]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}))}}class us extends M{init(){this.container.classList.add("add-members-container"),this.nextBtn=D({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",(()=>{const e=this.selector.getSelected().map((e=>e.toPeerId()));if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}}))}attachToPromise(e){const t=(0,fe.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const i="privacy"===this.peerType;return this.selector=new Qi({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[i?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:i,filterPeerTypeBy:i?["isAnyGroup","isUser"]:void 0,managers:this.managers}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}var ps=i(2365);function ms(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,m.$d)(t,e?"ScamMessage":"FakeMessage"),t}function gs(e){var t,i,n,a,o;return i=this,n=void 0,o=function*(){const i=[],n=yield s.Z.managers.appPeersManager.getPeer(e);return(null===(t=null==n?void 0:n.pFlags)||void 0===t?void 0:t.verified)&&i.push(function(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const i=document.createElementNS("http://www.w3.org/2000/svg","use");return i.setAttributeNS(null,"href","#verified-check"),i.classList.add("verified-check"),e.append(t,i),e}()),(n.pFlags.fake||n.pFlags.scam)&&i.push(ms(n.pFlags.scam)),i},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}))}var vs=i(1708),fs=i(6074);const ys=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],bs=["red","green","yellow","blue","violet","pink","cyan","orange"],ws=[0,7,4,1,6,3,5];function Ss(e,t=!0){if(!e)return"";const i=ws[Math.abs(+e)%7];return(t?bs:ys)[i]}function Cs(e,t=!1){if(!e)return"";const i=e.trim().split(" ");if(!i[0])return"";const s=[...i[0]][0];if(t||1===i.length)return(0,Tt.Z)(s);const n=[...i[i.length-1]][0];return(0,Tt.Z)(s+n)}var Ls=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Is(e,t,i,n,a=new Image,o=!1){return Ls(this,void 0,void 0,(function*(){const o=yield s.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,n),r=o.result,l=o.cached;let c,d,h;if(a.classList.add("avatar-photo"),l)d=()=>{(0,p.Z)(e,a),e.dataset.color=""};else{const o=s.Z.settings.animationsEnabled;o&&a.classList.add("fade-in");let r=!1;if("photo_big"===n){const s=yield Is(e,t,i,"photo_small");c=s.loadPromise,h=s.thumbImage}else if(i.stripped_thumb){h=new Image,e.classList.add("avatar-relative"),h.classList.add("avatar-photo","avatar-photo-thumbnail");const t=Je(i.stripped_thumb);c=Ae(h,t).then((()=>{r||(0,p.Z)(e,h)}))}d=()=>{r=!0,h?e.append(a):(0,p.Z)(e,a),setTimeout((()=>{e.childElementCount&&Pe.Z.mutateElement(a,(()=>{e.dataset.color="",o&&a.classList.remove("fade-in"),h&&h.remove()}))}),o?200:0)}}const u=r.then((e=>Ae(a,e))).then(d);return yield c||u,{cached:l,loadPromise:c||u,thumbImage:h}}))}function Ms(e,t,i,s){(0,r.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),s&&e.classList.add(s)}function Es(e,t,i=!1,n="",a=!1,o){return Ls(this,void 0,void 0,(function*(){const r=s.Z.myId;if(t===r&&i)return void Ms(e,"","","tgico-saved");const l=s.Z.managers;if(t!==oe.NM&&t.isUser()){const i=yield l.appUsersManager.getUser(t);if(i&&i.pFlags&&i.pFlags.deleted)return void Ms(e,"",Ss(t),"tgico-deletedaccount")}const c=o?"photo_big":"photo_small",d=yield l.appPeersManager.getPeerPhoto(t),h=!!d,u=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!h||!u||!(yield l.appAvatarsManager.isAvatarCached(t,c))){let a="";if(!t||t===r&&i||(a=Ss(t)),t===oe.hj)return void Ms(e,"",a,"tgico-reply_filled");const o=yield n?Cs(n):function(e,t=s.Z.managers){var i,n,a,o,r;return n=this,a=void 0,r=function*(){const s=yield t.appPeersManager.getPeer(e);return Cs(null!==(i=s.title)&&void 0!==i?i:[s.first_name,s.last_name].filter(Boolean).join(" "))},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}))}(t,l);Ms(e,o,a,"")}return h?Is(e,t,d,c,void 0,a):void 0}))}class Ps extends S.Z{constructor(){super(),this.onMouseMove=e=>{let t=this.openedMenu.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.closeBtnMenu()},this.onClick=e=>{this.closeBtnMenu()},this.closeBtnMenu=()=>{this.openedMenu&&(this.openedMenu.classList.remove("active"),this.openedMenu.parentElement.classList.remove("menu-open"),this.menuOverlay&&this.menuOverlay.remove(),this.openedMenu=void 0,this.dispatchEvent("toggle",!1)),this.openedMenuOnClose&&(this.openedMenuOnClose(),this.openedMenuOnClose=void 0),hi.Z||(window.removeEventListener("mousemove",this.onMouseMove),window.removeEventListener("contextmenu",this.onClick)),document.removeEventListener(n.pf,this.onClick),qe.IS_MOBILE_SAFARI||w.Z.removeByType("menu")},l.Z.addEventListener("resize",(()=>{this.openedMenu&&this.closeBtnMenu()}))}isOpened(){return!!this.openedMenu}openBtnMenu(e,t){this.closeBtnMenu(),qe.IS_MOBILE_SAFARI||w.Z.pushItem({type:"menu",onPop:e=>{this.closeBtnMenu()}}),this.openedMenu=e,this.openedMenu.classList.add("active"),this.openedMenu.parentElement.classList.add("menu-open"),this.menuOverlay||(this.menuOverlay=document.createElement("div"),this.menuOverlay.classList.add("btn-menu-overlay"),this.menuOverlay.addEventListener(n.pf,(e=>{(0,a.Z)(e),this.onClick(e)}))),this.openedMenu.parentElement.insertBefore(this.menuOverlay,this.openedMenu),this.openedMenuOnClose=t,hi.Z||(window.addEventListener("mousemove",this.onMouseMove),window.addEventListener("contextmenu",this.onClick,{once:!0})),document.addEventListener(n.pf,this.onClick),this.dispatchEvent("toggle",!0)}}const ks=new Ps;const Ts=e=>e.touches?e.touches[0]:e,xs=window;let As=!1;ks.addEventListener("toggle",(e=>{As=e}));class Zs{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{hi.Z?xs.removeEventListener("touchmove",this.handleMove,{capture:!0}):(xs.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{return t=this,i=void 0,n=function*(){const t=Ts(e);if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,hi.Z?xs.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):xs.addEventListener("mousemove",this.handleMove,!1)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||As)return void this.reset();this.cancelEvent&&(0,a.Z)(e);const t=Ts(e),i=t.clientX,s=t.clientY,n=this.xDown-i,o=this.yDown-s;if(!this.hadMove){if(!n&&!o)return;this.hadMove=!0,hi.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const r=this.onSwipe(n,o,e);void 0!==r&&r&&this.reset()},(0,k.Z)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){hi.Z?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),xs.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),xs.addEventListener("mouseup",this.reset))}removeListeners(){hi.Z?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),xs.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),xs.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!hi.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var Ds=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Fs{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>Ds(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(Fs.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>Ds(this,void 0,void 0,(function*(){if(i){const e=yield ot({container:t,photo:i,size:Se(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield Is(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(Fs.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Fs.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Fs.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Fs.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Fs.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Fs.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Fs.BASE_CLASS+"-arrow",Fs.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new C.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let o=!1,r=!1;(0,n.fc)(this.container,(e=>Ds(this,void 0,void 0,(function*(){if(r)return void(0,a.Z)(e);if(o)return void(o=!1);if(!i())return;const t=this.container.getBoundingClientRect(),n=e.pageX,l=n-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||l>t.width*s&&l{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];r=!0,Cp(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),r=!1}else{const e=n>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(i),(0,Fe.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const l=()=>{o=!0,document.body.addEventListener(hi.Z?"touchend":"click",(e=>{o=!1}),{once:!0})};let c=0,d=0,h=0,u=0;this.swipeHandler=new Zs({element:this.avatars,onSwipe:(e,t)=>{h=e;let i=d+e*-Fs.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!r:(l(),(0,a.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();c=e.width,u=-c*(this.tabs.childElementCount-1),d=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Fs.TRANSLATE_TEMPLATE.replace("{x}",d+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(c/Fs.SCALE))*(h>=0?1:-1);l(),this.avatars.classList.remove("no-transition"),(0,Fe.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){return Ds(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new fs.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>Ds(this,void 0,void 0,(function*(){const t=e.pop();if((0,vs.Z)(t),!i.current){const s=e[0],n=(0,pe.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*Fs.SCALE*i;this.avatars.style.transform=Fs.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(Fs.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){this.listenerSetter.removeAll(),this.swipeHandler.removeListeners()}}Fs.BASE_CLASS="profile-avatars",Fs.SCALE=ps.Z?2:1,Fs.TRANSLATE_TEMPLATE=ps.Z?`translate3d({x}, 0, -1px) scale(${Fs.SCALE})`:"translate({x}, 0)";function _s(e){return t=this,i=void 0,n=function*(){const t=new Ft;return yield t.update(e),t.element},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}var Bs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};let Rs=(e,t)=>{(0,r.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class Ns{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,this.setPeerStatus=(e=!1)=>{const t=this.peerId;if(this.element.classList.toggle("is-me",t===s.Z.myId),t&&(s.Z.myId!==t||!this.isDialog))return dp.setPeerStatus(t,this.subtitle,e,!0,(()=>t===this.peerId),!this.isDialog).then((e=>{e&&e()}))},ps.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new C.Z)}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new Uo({noDelimiter:!0}),this.avatar=new Mp,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.isDialog=this.isDialog,this.avatar.attachClickEvent(),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new mi({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>Bs(this,void 0,void 0,(function*(){"A"!==e.target.tagName&&(vi((yield this.managers.appProfileManager.getProfileByPeerId(this.peerId)).about),Ci(m.ZP.format("BioCopied",!0)))}))}),this.bio.title.classList.add("pre-wrap"),this.username=new mi({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>Bs(this,void 0,void 0,(function*(){vi("@"+(yield this.managers.appPeersManager.getPeer(this.peerId)).username),Ci(m.ZP.format("UsernameCopied",!0))}))}),this.phone=new mi({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>Bs(this,void 0,void 0,(function*(){vi("+"+(yield this.managers.appUsersManager.getUser(this.peerId)).phone),Ci(m.ZP.format("PhoneCopied",!0))}))}),this.link=new mi({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{vi(this.link.title.textContent),Ci(m.ZP.format("LinkCopied",!0))}}),this.location=new mi({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new mi({checkboxField:new Pi.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),e.add(s.Z)("dialog_notify_settings",(e=>Bs(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),ps.Z&&this.element.append(Ho()),e.add(s.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(s.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)})),e.add(s.Z)("peer_title_edit",(e=>{e===this.peerId&&this.fillUsername()})),e.add(s.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(s.Z)("contacts_update",(e=>Bs(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(s.Z)("avatar_update",(e=>{this.peerId===e&&this.setAvatar()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==s.Z.myId||!this.isDialog}setAvatar(){return Bs(this,void 0,void 0,(function*(){if(this.canBeDetailed()&&(yield this.managers.appPeersManager.getPeerPhoto(this.peerId))){const e=this.avatars;return this.avatars=new Fs(this.scrollable,this.managers),yield this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(ps.Z&&this.scrollable.container.classList.add("parallax"))}ps.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),yield this.avatar.updateWithOptions({peerId:this.peerId}),this.section.content.prepend(this.avatar,this.name,this.subtitle)}))}fillUsername(){return Bs(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerUsername(e);return Rs(t,this.username)}}))}fillUserPhone(){return Bs(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appUsersManager.getUser(e);return Rs(t.phone?cs(t.phone):void 0,this.phone)}}))}fillNotifications(){return Bs(this,void 0,void 0,(function*(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else(0,Fe.T2)((()=>{e.container.style.display="none"}))}))}fillRows(){return Bs(this,void 0,void 0,(function*(){const e=this.peerId;yield Promise.all([this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(),(()=>Bs(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([_s({peerId:e,dialog:this.isDialog}),gs(e)]);(0,p.Z)(this.name,t),this.name.append(...i)})))(),this.setPeerStatus(!0)])}))}fillProfileElements(){return Bs(this,void 0,void 0,(function*(){this.cleaned&&(this.cleaned=!1,this.cleanupHTML(),yield Promise.all([this.setAvatar(),this.fillRows()]))}))}_setMoreDetails(e,t){return Bs(this,void 0,void 0,(function*(){if(Rs(t.about?(0,Qt.Z)(t.about):void 0,this.bio),!e.isUser()){const i=yield this.managers.appChatsManager.getChat(e.toChatId());if(i.username)Rs("https://t.me/"+i.username,this.link);else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&Rs(e.link,this.link)}}const i=t.location;"channelLocation"==(null==i?void 0:i._)&&Rs(i.address,this.location),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4)}))}setMoreDetails(e){return Bs(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const t=this.peerId,i=this.threadId;if(!t||(yield this.managers.appPeersManager.isRestricted(t))||!this.canBeDetailed())return;const s=yield this.managers.acknowledged.appProfileManager.getProfileByPeerId(t,e),n=s.result.then((e=>Bs(this,void 0,void 0,(function*(){this.peerId!==t||this.threadId!==i||(yield this.managers.appPeersManager.isRestricted(t))||(yield this._setMoreDetails(t,e))}))));s.cached&&(yield n)}))}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval)}}var Us=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Os={};class Hs extends M{constructor(e){super(e,!1),this.threadId=0}init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,L.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.title.append((0,m.ag)("Profile")),this.editBtn=I("edit"),a.append(this.title,this.editBtn);const o=document.createElement("div");o.classList.add("transition-item");const r=this.title.cloneNode();r.append((0,m.ag)("PeerInfo.SharedMedia")),o.append(r),i.append(a,o),this.header.append(i),this.profile=new Ns(this.managers,this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",e),this.searchSuper.container.classList.toggle("is-full-viewport",e),c(+e),e||this.searchSuper.cleanScrollPositions()},c=(0,b.v)(i,"slide-fade",400,null,!1);c(0),(0,n.fc)(this.closeBtn,(e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),c(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()})),(0,n.fc)(this.editBtn,(e=>{let t;t=this.peerId.isAnyChat()?this.slider.createTab(rs):this.slider.createTab(hs),t&&(t instanceof rs?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())})),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])})),this.searchSuper=new da({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{d.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const d=D({icon:"addmember_filled"});this.content.append(d),d.addEventListener("click",(()=>Us(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[(0,m.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new Ft({peerId:e}).element),t})),i||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Ft({peerId:t[0]}).element),r=[e],i||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Ft({peerId:t[0]}).element],checked:!0}])}r.push(new Ft({peerId:e}).element),new ki("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&Li({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(us);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Yi({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))))}renderNewMessages(e,t){return Us(this,void 0,void 0,(function*(){if(this.init)return;if(!Os[e])return;const i=yield Promise.all(t.map((t=>this.managers.appMessagesManager.getMessageByPeer(e,t))));t=t.slice().reverse();for(const t of this.searchSuper.mediaTabs){const s=t.inputFilter,n=Os[e][s];if(!n)continue;const a=this.searchSuper.filterMessagesByType(i,s).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[s]&&(this.searchSuper.usedFromHistory[s]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}))}deleteDeletedMessages(e,t){if(!this.init&&Os[e]){for(const i of t)for(const t of this.searchSuper.mediaTabs){const s=t.inputFilter,n=Os[e][s];if(!n)continue;const a=n.findIndex((e=>e.mid===i));if(-1!==a&&(n.splice(a,1),this.peerId===e)){const t=this.searchSuper.tabs[s].querySelector(`[data-mid="${i}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[s]>=a+1&&--this.searchSuper.usedFromHistory[s]}}this.scrollable.onScroll()}}cleanupHTML(){return Us(this,void 0,void 0,(function*(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",(yield this.searchSuper.canViewMembers())&&(yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")))}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var i;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(i=Os[e])&&void 0!==i?i:Os[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){return Us(this,void 0,void 0,(function*(){this.peerChanged&&(this.peerChanged=!1,yield this.cleanupHTML(),yield this.toggleEditBtn(),yield this.profile.fillProfileElements())}))}toggleEditBtn(){return Us(this,void 0,void 0,(function*(){let e;e=this.peerId.isUser()?this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId())):yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}destroy(){this.destroyable=!0,this.onCloseAfterTimeout(),this.profile.destroy()}}const zs="is-right-column-shown",Vs=new class extends T{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,l.Z.addEventListener("changeScreen",((e,t)=>{t===l._.medium&&e!==l._.mobile&&this.toggleSidebar(!1)})),l.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(Hs,!0);return e.slider=this,e}replaceSharedMediaTab(e){let t=this.sharedMediaTab;t?(t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):this.tabsContainer.prepend(e.container),this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(zs);let s;if(void 0!==e?e?i||(s=!0):i&&(s=!0):s=!0,!s)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=dp.selectTab(i?1:2,t);return document.body.classList.toggle(zs,e),n}};F.GO.appSidebarRight=Vs;const Gs=Vs;class Ws extends M{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=Object.create(null,{open:{get:()=>super.open}});return i=this,s=void 0,a=function*(){const i=t.open.call(this),s=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const n=document.createElement("h3");(0,r.Z)(n,(0,Tt.Z)(s.poll.question));const a=s.results.results.map((e=>e.voters/s.results.total_voters*100));qs(a);const o=document.createDocumentFragment();return s.results.results.forEach(((t,i)=>{if(!t.voters)return;const n=document.createElement("hr"),l=s.poll.answers[i],c=document.createElement("div");c.classList.add("poll-results-answer");const d=document.createElement("div");(0,r.Z)(d,(0,Tt.Z)(l.text));const h=document.createElement("div");h.innerText=Math.round(a[i])+"%",c.append(d,h);const u=$p.createChatList();u.classList.add("poll-results-voters"),$p.setListClickListener(u,(()=>{Gs.onCloseBtnClick()}),void 0,!0),u.style.minHeight=50*Math.min(t.voters,4)+"px",o.append(n,c,u);let p,g=4,v=!1,f=t.voters-4;const y=()=>{v||(v=!0,this.managers.appPollsManager.getVotes(e,l.option,p,g).then((e=>{e.votes.forEach((e=>{const{dom:t}=$p.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()})),p&&(f-=e.votes.length,b.lastElementChild.replaceWith((0,m.ag)("PollResults.LoadMore",[Math.min(20,f)]))),p=e.next_offset,g=20,f&&e.votes.length||b.remove()})).finally((()=>{v=!1})))};if(y(),f<=0)return;const b=document.createElement("div");b.classList.add("poll-results-more","show-more","rp-overflow"),b.addEventListener("click",y),(0,ye.Z)(b);const w=document.createElement("div");w.classList.add("tgico-down"),b.append(w,(0,m.ag)("PollResults.LoadMore",[Math.min(20,f)])),o.append(b)})),this.resultsDiv.append(n,o),Gs.toggleSidebar(!0).then((()=>{})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}const js="stacked-avatars";class Ks{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(js),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new Mp,a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}let $s=0;const qs=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};s.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),l.Z.addEventListener("resize",(()=>{tn.setMaxLength(),tn.resizePolls()})),l.Z.addEventListener("changeScreen",(()=>{tn.setMaxLength()}));const Qs=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),Ys===e&&Xs===t&&Js===i&&(Ys=Xs=null,Js=0)}),200)};let Ys,Xs,Js,en=!1;class tn extends HTMLElement{constructor(){super(...arguments),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Oi.width<=360?Oi.width-120:l.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,o=function*(){$s||($s=document.getElementById("poll-line").getTotalLength(),tn.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const o=this.isMultiple?'':"",l=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${o}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${l}`,(0,r.Z)(this.firstElementChild,(0,Tt.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,r.Z)(t,(0,Tt.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,m.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const n=2,a=7,o=2*Math.PI*a,r=document.createElementNS("http://www.w3.org/2000/svg","circle");r.classList.add("poll-quiz-timer-circle"),r.setAttributeNS(null,"cx","16"),r.setAttributeNS(null,"cy","16"),r.setAttributeNS(null,"r",""+a),r.setAttributeNS(null,"stroke-width",""+n),i.append(r),this.descDiv.append(i);const l=1e3*e.close_period,c=1e3*(e.close_date-(yield s.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(c-e)/l,s=(c-e)/1e3+1|0;t.innerHTML=ht(s),s<=5&&(t.style.color="#ee545c",r.style.stroke="#ee545c"),r.style.strokeDashoffset=o+i*o,r.style.strokeDasharray=`${o} ${o}`,e>=c&&(clearInterval(this.quizInterval),t.innerHTML="",r.style.strokeDashoffset=o,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const c=document.createElement("div");c.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,m.ag)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",c.append(this.viewResults,this.votersCountDiv),this.append(c),this.viewResults.addEventListener("click",(e=>{(0,a.Z)(e),Gs.isTabExists(Ws)||Gs.createTab(Ws).open(this.message)})),(0,ye.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,m.ag)("Chat.Poll.SubmitVote")),(0,ye.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,n.fc)(this.sendVoteBtn,(e=>{(0,a.Z)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),c.append(this.sendVoteBtn));const d=!(e.chosenIndexes.length||this.isClosed);d&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),d&&(this.setVotersCount(t),(0,n.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{l(o.next(e))}catch(e){n(e)}}function r(e){try{l(o.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}l((o=o.apply(e,t||[])).next())}));var e,t,i,o}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,n.fc)(t,(i=>{(0,a.Z)(i),t.classList.add("active"),((e,t,i)=>{Ys&&Qs(Ys,Xs,Js);const s=document.createElement("div");s.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),s.append(n),(0,r.Z)(a,(0,Qt.Z)(e,{entities:t})),dp.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),Ys=s,Xs=i,Js=window.setTimeout((()=>{Qs(s,i,Js)}),hi.Z?5e3:7e3),en||(en=!0,dp.addEventListener("peer_changed",(()=>{Ys&&Qs(Ys,Xs,Js)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&t.click()}}}clickHandler(e){const t=(0,mt.Z)(e.target,"poll-answer");if(!t)return;(0,a.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,i=!0){var a,o;if(s.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(a=e.results)||void 0===a?void 0:a.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(o=this.quizTimer)||void 0===o?void 0:o.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,p.Z)(this.typeDiv,(0,m.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,n.fc)(this,this.clickHandler):(0,n.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!i),i&&(0,De.Z)(this,"",!this.isRetracted,340),(0,Fe.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new Ks({avatarSize:16});i.render(t),(0,p.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,Fe.T2)(e):e()}let n;e=e.slice(),qs(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i,s=[t];i=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,p.Z)(this.votersCountDiv,(0,m.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*tn.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*tn.MAX_OFFSET)}}tn.MAX_OFFSET=-46.5,tn.MAX_LENGTH=0,customElements.define("poll-element",tn);var sn=i(2064);class nn{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function an(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}const on=new Set(["all","web","webk"]),rn=new Set;function ln(e){return e.find((e=>on.has(e.platform)&&!rn.has(e.reason)))}function cn(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function dn(e){return!(!e.restriction_reason||(t=e.restriction_reason,!ln(t)));var t}var hn=i(1346),un=i(2614);const pn={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function mn(e,t){const i=function(e,t=2){e||(e=1);let i=[];const s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach(((t,a)=>{if(n*=t.m,e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>m.ZP.format(pn[e.type],!0,[e.duration])));return(0,m.v_)(e,!1,t)}const s=i.map((e=>(0,m.ag)(pn[e.type],[e.duration]))),n=document.createElement("span");return n.append(...(0,m.v_)(s,!1)),n}var gn=i(3591);function vn(e){const t=e.action,{onclick:i,url:s}=(0,gn.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var fn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function yn(e,t){return i=this,n=void 0,o=function*(){try{return yield function(e,t){return fn(this,void 0,void 0,(function*(){const i=t?void 0:document.createElement("span"),n="action"in e&&e.action;if(n.message){const e=n.message;return t?(0,Kt.Z)(e):((0,r.Z)(i,(0,Qt.Z)(e,{noLinebreaks:!0})),i)}{let a,o,r=n._;const l=s.Z.managers,c=(e,t)=>fn(this,void 0,void 0,(function*(){return t?(0,Zt.Z)(e,t):new Ft({peerId:e}).element}));switch(n._){case"messageActionPhoneCall":r+="."+n.type,o=[mn(n.duration,t)];break;case"messageActionGroupCall":r+="."+n.type,o=[],r.endsWith("You")||e.pFlags.post||o.push(c(e.fromId,t)),void 0!==n.duration?o.push(mn(n.duration,t)):o.push(vn(e));break;case"messageActionInviteToGroupCall":{const i=[e.fromId,n.users[0].toPeerId()];let r="Chat.Service.VoiceChatInvitation";const l=s.Z.myId;i[0]===l?r+="ByYou":i[1]===l&&(r+="ForYou"),(0,P.Z)(i,l),a=r,o=i.map((e=>c(e,t))),o.push(vn(e));break}case"messageActionGroupCallScheduled":{const i=new Date,r=new Date(1e3*n.schedule_date),d=(r.getTime()-i.getTime())/864e5,h=new Date(i);h.setDate(h.getDate()+1);const u=yield l.appPeersManager.isBroadcast(e.peerId);a=u?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",o=[];const p=s.Z.myId;e.fromId===p?a+="You":u||o.push(c(e.fromId,t));let g,v=[];d<1&&r.getDate()===i.getDate()?g="TodayAtFormattedWithToday":d<2&&r.getDate()===h.getDate()?g="Time.TomorrowAt":(g="formatDateAtTime",v.push(new m.ZP.IntlDateElement({date:r,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),v.push(z(r));const f=(0,m.ag)(g,v);o.push(f);break}case"messageActionChatCreate":{const i=s.Z.myId;e.fromId===i?r+="You":o=[c(e.fromId,t)];break}case"messageActionPinMessage":{const i=e.peerId,n=yield l.appMessagesManager.getMessageByPeer(i,e.reply_to_mid);if(o=[c(e.fromId,t)],n){const e=document.createElement("i");e.dataset.savedFrom=n.peerId+"_"+n.mid,e.dir="auto",e.append(yield bn(n,void 0,void 0,t)),o.push(e)}else a="ActionPinnedNoText",e.reply_to_mid&&l.appMessagesManager.fetchMessageReplyTo(e).then((t=>fn(this,void 0,void 0,(function*(){t&&e&&(s.Z.dispatchEvent("message_edit",{storageKey:`${i}_history`,peerId:i,mid:e.mid,message:e}),l.appMessagesManager.isMessageIsTopMessage(e)&&s.Z.dispatchEvent("dialogs_multiupdate",{[i]:yield l.appMessagesManager.getDialogOnly(i)}))}))));break}case"messageActionChatJoinedByRequest":{const i=yield l.appPeersManager.isBroadcast(e.peerId);e.pFlags.out?a=i?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(a=i?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",o=[c(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":o=[c(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":o=[],"messageActionChatEditTitle"===n._&&o.push(c(e.fromId,t)),o.push(t?n.title:(0,un.Z)((0,Tt.Z)(n.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const i=n.users||[n.user_id];if(o=[c(e.fromId,t)],i.length>1){const e=(0,m.v_)(yield Promise.all(i.map((e=>c(e.toPeerId(),t)))),!1,t);if(t)o.push(...e);else{const t=document.createElement("span");t.append(...e),o.push(t)}}else o.push(c(i[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=(0,Qt.Z)(n.domain,{entities:[{_:"messageEntityUrl",length:n.domain.length,offset:0}]});o=[(0,un.Z)(e)];break}default:a=m.Hz[r]||`[${n._}]`}a||(a=m.Hz[r],void 0===a&&(a="["+r+"]"));const d=o&&(yield Promise.all(o));return t?m.ZP.format(a,!0,d):(0,m.$d)(i,a,d)}}))}(e,t)}catch(e){return console.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}));var i,n,a,o}function bn(e,t=e.message,i,n,a,o){return r=this,l=void 0,d=function*(){const r=[];let l=!1;const c=(e,t)=>{if(e){if(void 0===t&&l)return;t=n?m.ZP.format(e,!0):(0,m.ag)(e)}if(n)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}},d=s.Z.managers.appMessagesManager,h=dn(e);let u=e.totalEntities;if(e.media&&!h){(0,Jt.Z)(e);let s=!0;if(e.grouped_id){if(i){const t=yield d.getMidsByMessage(e);if(i.length===t.length){for(const e of t)if(!i.includes(e)){s=!1;break}}else s=!1}if(s){const i=yield d.getAlbumText(e.grouped_id);t=i.message,u=i.totalEntities,o||(c("AttachAlbum"),l=!0)}}else s=!1;if(!s&&!o||!t){const i=e.media;switch(i._){case"messageMediaPhoto":c("AttachPhoto");break;case"messageMediaDice":c(void 0,n?i.emoticon:(0,Tt.Z)(i.emoticon));break;case"messageMediaVenue":t=i.title,c("AttachLocation");break;case"messageMediaGeo":c("AttachLocation");break;case"messageMediaGeoLive":c("AttachLiveLocation");break;case"messageMediaPoll":const e="📊 "+(i.poll.question||"poll");c(void 0,n?e:(0,Tt.Z)(e));break;case"messageMediaContact":c("AttachContact");break;case"messageMediaGame":{const e="🎮 "+i.game.title;c(void 0,n?e:(0,Tt.Z)(e));break}case"messageMediaDocument":{const e=i.document;if("video"===e.type)c("AttachVideo");else if("voice"===e.type)c("AttachAudio");else if("gif"===e.type)c("AttachGif");else if("round"===e.type)c("AttachRound");else if("sticker"===e.type){const i=r.length;if(e.stickerEmojiRaw){const t=e.stickerEmojiRaw+" ";c(void 0,n?t:(0,Tt.Z)(t))}c("AttachSticker");const s=r.splice(i,2);if(n)r.push(s[0]+s[1]);else{const e=window.document.createElement("span");e.append(...s),r.push(e)}t=""}else if("audio"===e.type){const t=e.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);c(void 0,n?i:(0,Tt.Z)(i))}else c(void 0,n?e.file_name:(0,Tt.Z)(e.file_name));break}case"messageMediaUnsupported":c(m.nK)}}const a=r.length;for(let e=1;e{g&&!g()||(m.forEach((e=>e.remove())),r&&r.classList.toggle("is-round",u))})),h}))}class Ln extends nn{constructor(e){super(e,((e,t="",i)=>wn(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const s=yield Cn({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:i});this.container.classList.toggle("is-media",s),s?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e}}function In(e,t,i,s){const n=new Ln("reply"),a=n.fill(e,t,i);if(s){const e=Ss(s,!1),[t,i,a]=(0,sn.oo)(e);n.container.style.setProperty("--override-color",`${t}, ${i}, ${a}`),n.container.classList.add("is-overriding-color")}return{container:n.container,fillPromise:a}}var Mn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function En({set:e,lazyLoadQueue:t,container:i,group:n,autoplay:a,width:o,height:r,managers:l=s.Z.managers}){var c;return Mn(this,void 0,void 0,(function*(){if(null===(c=e.thumbs)||void 0===c?void 0:c.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>Mn(this,void 0,void 0,(function*(){const t=yield l.appStickersManager.getStickerSetThumbDownloadOptions(e),s=d.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return s.then((t=>{ni.Z.loadAnimationWorker({container:i,loop:!0,autoplay:a,animationData:t,width:o,height:r,needUpscale:!0,name:"setThumb"+e.id},n)}));{let t;return e.pFlags.videos?(t=lt(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),s.then((e=>{xe(t,URL.createObjectURL(e),(()=>{i.append(t)}))}))}}))});const s=l.appStickersManager.getStickerSet(e),h=yield s;"documentEmpty"!==h.documents[0]._&&di({doc:h.documents[0],div:i,group:n,lazyLoadQueue:t,managers:l})}))}function Pn({doc:e,row:t,size:i,managers:s}){const n=t.media,a=t.createMedia("small");n&&a.classList.add("hide");const o=n?[]:void 0,r="small"===i?32:48,l=di({div:a,doc:e,width:r,height:r,loadPromises:o,managers:s}).then((({render:e})=>e));return o&&Promise.all(o).then((()=>{a.classList.remove("hide"),n.remove()})),l}var kn=i(3624),Tn=i(2648);function xn(e,t,i,s){return void 0===s&&(s=e.parentElement===t?(0,Tn.Z)(e):-1),s!==i&&(-1!==s&&si?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}var An=i(6519);class Zn{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=(0,kn.k)(),(0,k.Z)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id,!0)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{if(!t()||void 0!==i&&!i)return e(!1);this._updateList(),e(!0)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,i,s=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,s,n,i),n}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=!1,i=this.get(e),s){return n=this,a=void 0,r=function*(){if(!i)return;i.index=yield this.getIndex(i),this.onUpdate&&this.onUpdate(i);const e=(0,An.Z)(this.sorted,i,"index");if(!t&&this.onSort){const t=this.middleware.get();(s||this.updateElementWith)((()=>{t()&&this.onSort(i,e)}))}},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}));var n,a,o,r}}var Dn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Fn extends Zn{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>Dn(this,void 0,void 0,(function*(){const t=re(yield this.managers.appUsersManager.getUser(e.id));(0,p.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;xn(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=$p.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:Fe.T2,updateListWith:e=>Dn(this,void 0,void 0,(function*(){return(0,_e.Z)(this.list)?(yield(0,Ne.e9)(),(0,_e.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,(0,k.Z)(this,e),this.list=$p.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),Fn.SORT_INTERVAL)};i()}}Fn.SORT_INTERVAL=3e4;let _n=!1,Bn=0;function Rn(){Bn&&clearTimeout(Bn),Bn=window.setTimeout((()=>{Bn=0,_n=!1}),400),_n=!0}function Nn(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e),n=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(qe.IS_APPLE&&hi.Z){let i;const o={capture:!0},r=()=>{clearTimeout(i),n("touchmove",r,o),n("touchend",r,o),n("touchcancel",r,o)};s("touchstart",(n=>{n.touches.length>1?r():(s("touchmove",r,o),s("touchend",r,o),s("touchcancel",r,o),i=window.setTimeout((()=>{_n?r():(t(n.touches[0]),r(),ks.isOpened()&&e.addEventListener("touchend",a.Z,{once:!0}))}),400))}))}else s("contextmenu",hi.Z?i=>{t(i),ks.isOpened()&&e.addEventListener("touchend",a.Z,{once:!0})}:t)}var Un=i(3444);function On(e){let t=!1;return new Zs(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,mt.Z)(t.target,"progress-line")&&!(0,Un.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,n)=>{if(!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,a.Z)(n),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Hn(e){return On(Object.assign(Object.assign({},e),{onSwipe:(t,i,s)=>{if(Math.abs(t)>50)return e.onSwipe(t,i,s),Rn(),!0}}))}const zn=e=>{if(e.element)return e.element;const{icon:t,text:i,onClick:s,checkboxField:o,noCheckboxClickListener:r}=e,l=document.createElement("div");l.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:"");let c=e.textElement;c||(c=e.textElement=i?(0,m.ag)(i,e.textArgs):document.createElement("span"),e.regularText&&(c.innerHTML=e.regularText)),c.classList.add("btn-menu-item-text"),l.append(c);const d=!!o||!!e.keepOpen;return s&&(0,n.fc)(l,(e=>{(0,a.Z)(e);const t=(0,mt.Z)(e.target,"btn-menu");t&&!t.classList.contains("active")||!1!==s(e)&&(d||ks.closeBtnMenu(),o&&!r&&(o.checked="radio"===o.input.type||!o.checked))}),e.options),o&&l.append(o.label),e.element=l},Vn=(e,t)=>{const i=document.createElement("div");i.classList.add("btn-menu"),t&&e.forEach((e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}}));const s=e.map(zn);return i.append(...s),i};class Gn extends Yi{constructor(e,t,i=!1){super({peerTypes:["dialogs","contacts"],onSelect:i?t:i=>{return s=this,n=void 0,o=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}dp.setInnerPeer({peerId:i}),dp.chat.input.initMessagesForward(e)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}var Wn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class jn{constructor(e,t,i,s){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.construct()}construct(){return Wn(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:n}=this;const a=new Ft({peerId:e}).element,o=x.Z.MANAGERS;t=t.slice();const r=(s,a)=>{n&&n(),"scheduled"===i?o.appMessagesManager.deleteScheduledMessages(e,t):o.appMessagesManager.deleteMessages(e,t,!!s.size||a)};let l,c,d,h,u,p=[];if(1===t.length?l="DeleteSingleMessagesTitle":(l="DeleteMessagesTitle",c=[(0,m.ag)("messages",[t.length])]),d=(yield o.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:r}],e===s.Z.myId||"scheduled"===i);else if(e.isUser())p.push({text:"DeleteMessagesOptionAlso",textArgs:[a]});else{const i=yield o.appChatsManager.getChat(e.toChatId()),n=(0,Fi.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield Vi(t,(t=>Wn(this,void 0,void 0,(function*(){return(yield o.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?p.push({text:"DeleteForAll"}):(p.push({text:"DeleteMessagesOption"}),d="DeleteMessagesTextGroup",h=[(0,m.ag)("messages",[i.length])]))}else u[0].callback=e=>r(e,!0)}(0,x.x)(u),new ki("popup-delete-chat",{peerId:e,titleLangKey:l,titleLangArgs:c,descriptionLangKey:d,descriptionLangArgs:h,buttons:u,checkboxes:p}).show()}))}}class Kn extends ki{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}var $n=i(8799);function qn(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var Qn=i(5975),Yn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Xn=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class Jn extends S.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,mt.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,o=t;const r=(e,t=!0)=>{const n=+e.dataset.mid;if(!n||!e.dataset.peerId)return;const a=e.dataset.peerId.toPeerId();(0,_e.Z)(o)||(o=e);let l=i.get(a);if(l||i.set(a,l=new Set),l.has(n))return;const c=this.isMidSelected(a,n);if(void 0===s&&(s=!c),l.add(n),s&&!c||!s&&c){const s=Xn(i);if(this.toggleByElement&&t){s<2&&(0,Qn.Z)(e,o)&&(o=e);const t=this.getElementsBetween(o,e);t.length&&t.forEach((e=>{r(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let l=!1;const c=e=>{l||(qn(),l=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",c),void this.listenerSetter.removeManual(document,"mouseup",d,h)):void r(t)},d=e=>{i.size&&(0,n.fc)(window,a.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",c),qn()},h={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",c),this.listenerSetter.add(document)("mouseup",d,h)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,mt.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);return n||([l,r]=[r,l]),o.slice(r+1,l)},this.cancelSelection=e=>Yn(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),qn(),e&&(this.doNotAnimate=void 0)})),(0,k.Z)(this,e),this.navigationType="multiselect-"+(0,fi.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return hi.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void Nn(e,(t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,a.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),qn();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)}),t)):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new Pi.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,De.Z)(e,"is-selected",!1,200));return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){return Yn(this,void 0,void 0,(function*(){const t=this.selectedMids.size;if(!t&&!e)return;let i=!t,s=!t,n=!t;for(const[e,t]of this.selectedMids){const n=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(n,Array.from(t));if(i=a.cantForward,s=a.cantDelete,i&&s)break}this.onUpdateContainer&&this.onUpdateContainer(i,s,n)}))}toggleSelection(e=!0,t=!1){const i=this.isSelecting,s=this.selectedMids.size;if(this.isSelecting=!!s||t,i===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),hi.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),i&&qn()),(0,$n.Z)();const n=!!s||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),qe.IS_MOBILE_SAFARI||(n?w.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):w.Z.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,De.Z)(e,"is-selected",t,200)}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Xn(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class ea extends Jn{constructor(e,t){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,mt.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,p.Z)(this.selectionCountEl,(0,m.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,De.Z)(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)})),(0,De.Z)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=I(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",(()=>this.cancelSelection()),{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=I(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,n.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),dp.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=I(`forward ${e}-forward`),(0,n.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new Gn(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=I(`delete danger ${e}-delete`),(0,n.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new jn(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,new C.Z)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class ta extends Jn{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,mt.Z)(e,"grouped-item")||(0,mt.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,mt.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>Yn(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>Yn(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:a}=yield this.chat.input.center(t);(0,De.Z)(this.listenElement,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)}));const o=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,L.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,m.ag)("MessageScheduleSend")),(0,n.fc)(this.selectionSendNowBtn,(()=>{new Kn(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,L.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,m.ag)("Forward")),(0,n.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new Gn(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,L.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,m.ag)("Delete")),(0,n.fc)(this.selectionDeleteBtn,(()=>{new jn(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==o&&(i.style.transform=`translateX(${-o}px)`,s.style.transform=`translateX(${o}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==o&&(this.selectionLeft.style.transform=`translateX(-${o}px)`,this.selectionRight.style.transform=`translateX(${o}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,p.Z)(this.selectionCountEl,(0,m.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>Yn(this,void 0,void 0,(function*(){}))}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}var ia=i(7401);function sa(e){const t=(0,At.Z)(e.description||"",150,180);return(0,Qt.Z)(t)}function na(e){let t=e.title||e.author||e.site_name||"";return t=(0,At.Z)(t,80,100),(0,Qt.Z)(t,{noLinks:!0,noLinebreaks:!0})}var aa=i(2342),oa=i(6566);function ra({pageX:e,pageY:t},i,s,n){const a=Array.from(i.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||i;let{scrollWidth:o}=a,{scrollHeight:r}=i;const c=document.body.getBoundingClientRect(),d=c.width,h=c.height;let u=8,p=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(p+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),s=l.Z.isMobile?"right":"left";let v="top";const f=h-r-m,y=d-o-p,b=g,w={x:{left:e,right:Math.min(y,e-o)},intermediateX:"right"===s?b:y,y:{top:t,bottom:t-r},intermediateY:f},S={left:w.x.left+o+p<=d,right:w.x.right>=g},C={top:w.y.top+r+m<=h,bottom:w.y.bottom-m>=m};{let e;e=S[s]?w.x[s]:(s="center",w.intermediateX),i.style.left=e+"px"}{let e;e=C[v]?w.y[v]:(v="center",w.intermediateY),i.style.top=e+"px"}return i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===v?v:"bottom")+"-"+("center"===s?s:"left"===s?"right":"left")),{width:o,height:r}}var la=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ca{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{dp.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,n.tH)(this.searchSuper.selection.selectionForwardBtn):new Gn({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,n.tH)(this.searchSuper.selection.selectionDeleteBtn):new jn(this.peerId,[this.mid],"chat")},this.managers=t.managers;hi.Z||Nn(e,(e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,mt.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{la(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>la(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),ra(e,this.element),ks.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}}))}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>la(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>la(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=Vn(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class da{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new ve,this.middleware=(0,kn.k)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,ce.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,k.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new ca(this.container,this),this.selection=new ea(this,this.managers);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new u.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,m.ag)(e.name)),i.append(s),t.append(i),(0,ye.Z)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let o;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),hi.Z&&Hn({element:this.tabsContainer,onSwipe:(e,t,i)=>{const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let r;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){r=e;break}void 0!==r&&(o=function(e){const t=e=>{(0,a.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(r))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new g(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,de.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),o&&(o(),o=void 0),this.onTransitionEnd()}),void 0,i),(0,n.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,a.Z)(e),this.selection.toggleByElement((0,mt.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1});const r=(e,t,i,s)=>la(this,void 0,void 0,(function*(){const n=(0,mt.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.dataset.peerId.toPeerId(),r=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,mt.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),l=r.findIndex((e=>e.mid===a&&e.peerId===o)),c=yield this.managers.appMessagesManager.getMessageByPeer(o,a);(new gp).setSearchContext(this.copySearchContext(i)).openMedia(c,r[l].element,0,!1,r.slice(0,l),r.slice(l+1))}));(0,n.fc)(this.tabs.inputMessagesFilterPhotoVideo,r.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),(0,n.fc)(this.tabs.inputMessagesFilterDocument,r.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],(0,Ne.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}))}filterMessagesByType(e,t){return(0,oa.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],{dom:s}=$p.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:54,loadPromises:i}),n=$p.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dom:s,highlightWord:this.searchContext.query});return i.push(n),Promise.all(i)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return la(this,void 0,void 0,(function*(){const s=(0,be.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=Se(s,200,200);return a="photo"!==s._?yield(yield Vt({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:o})).thumb:yield ot({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return la(this,void 0,void 0,(function*(){const i=(0,be.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield qt({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return la(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,aa.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}let a=document.createElement("div");a.classList.add("preview","row-media"),n.photo?ot({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:Se(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,r.Z)(a,Cs(n.title||n.display_url||n.description||n.url,!0)));let o=na(n);const l=sa(n),c=an((0,Qt.Z)(n.url||"")).firstElementChild;if(c instanceof HTMLAnchorElement)try{c.innerText=decodeURIComponent(c.href)}catch(e){}l.firstChild&&l.append("\n"),l.append(c),this.showSender&&l.append("\n",yield _t(e)),o.textContent||o.append((0,Kt.Z)(n.display_url.split("/",1)[0]));const d=new mi({title:o,titleRight:Bt(e),subtitle:l,havePadding:!0,clickable:!0,noRipple:!0});if(d.container.append(a),d.container.innerText.trim().length)return{message:e,element:d.container}}))}performSearchResult(e,t,i=!0){return la(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield(0,Ne.e9)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const c={elemsToAppend:s,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let d;switch(l){case"inputMessagesFilterEmpty":d=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":d=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":d=this.processDocumentFilter;break;case"inputMessagesFilterUrl":d=this.processUrlFilter}if(d){d=d.bind(this);const t=e.map((e=>la(this,void 0,void 0,(function*(){try{return c.message=e,yield d(c)}catch(t){this.log.error("error rendering filter",l,c,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i.filter(Boolean))}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{const{element:i,message:s}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?s.date:0,l);i.classList.add("search-super-item"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,n.items[e](i),this.selection.isSelecting&&this.selection.toggleElementCheckbox(i,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===l?1:e.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const a=(t,n,a=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=$p.addDialogNew({peerId:t,container:n.list,avatarSize:48,autonomous:n.autonomous});return{dom:i,peerId:t}})).forEach((({dom:e,peerId:t})=>la(this,void 0,void 0,(function*(){const n=yield this.managers.appPeersManager.getPeer(t);if(a&&(n.participants_count||n.participants)){const s=new RegExp(`(${cn(i)}|${cn((0,Wt.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield ji(t.toChatId()))}else if(t===s.Z.myId)e.lastMessageSpan.append((0,m.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,ls.u)(e.phone).formatted)}e.lastMessageSpan.innerHTML=""+i+""}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0).then(o).then((e=>{e&&a(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(a(e.my_results,this.searchGroups.contacts,!0),a(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new m.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,n.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.appMessagesManager.getConversations(i,0,20,0).then(o).then((e=>{e&&a(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>bi.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.innerHTML="",i.recentSearch.slice(0,20).forEach((e=>la(this,void 0,void 0,(function*(){let{dom:t}=$p.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:48,autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?re(yield this.managers.appUsersManager.getUser(e.toUserId())):ji(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===s.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.length&&e.forEach((e=>{$p.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:54,autonomous:!1})})),this.searchGroups.people.setActive()})),e()])}}loadMembers(e){return la(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let s;const a=t=>la(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new Fn({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,n.fc)(this.membersList.list,(e=>{const t=(0,Ai.Z)(e.target,Vp);if(!t)return;const i=t.dataset.peerId.toPeerId();let s=Promise.resolve();l.Z.isMobile&&(s=Gs.toggleSidebar(!1)),s.then((()=>{dp.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,Gi.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const n=this.membersList?200:50;s=this.managers.appProfileManager.getChannelParticipants(t,void 0,n,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;let s=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(s?s.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=s.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n;const a=e.inputFilter;if(this.loadPromises[a])return this.loadPromises[a];if("members"===e.type)return this.loadMembers(e);const o=null!==(n=this.historyStorage[a])&&void 0!==n?n:this.historyStorage[a]=[];if(!("inputMessagesFilterEmpty"!==a||o.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[a]=!0,Promise.resolve();const r=this.loadPromises[a]=Promise.resolve().then((()=>la(this,void 0,void 0,(function*(){var n,l;if(o.length&&this.usedFromHistory[a]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(r,a))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}let c=o.length?o[o.length-1].mid:0;const d=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:a},maxId:c,limit:i,nextRate:null!==(n=(l=this.nextRates)[a])&&void 0!==n?n:l[a]=0}));if(o.push(...d.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((d.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(d.history,a),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[a]=null}));return r}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),s=i.map((e=>({_:e.inputFilter}))),[n,a]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,s),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let o,r=0;i.forEach((e=>{const t=n.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===o&&(o=e),++r)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!a),a&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),this.navScrollableContainer.classList.toggle("hide",r<=1))}))}load(e=!1,t=!1){var i;return la(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,pe.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(Oi.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new m.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(i,l);const c=(0,ia.Z)(a,"desc");let d=0;for(;dc[d]);++d);a[n]={container:e,items:l},xn(e,this.tabs[t],d)}return a[n]}canViewMembers(){return Promise.all([this.searchContext.peerId.isAnyChat(),this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(),"view_participants")]).then((([e,t,i])=>e&&!t&&i))}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach((e=>{URL.revokeObjectURL(e)})),this.urlsToRevoke.length=0),this.mediaTabs.forEach((e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,fe.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,Di.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}}const ha=(e,t,i,s)=>{((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(n.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const n=e.querySelector(".btn-menu");if((0,a.Z)(i),e.classList.contains("menu-open"))ks.closeBtnMenu();else{const e=t&&t(i),a=()=>{ks.openBtnMenu(n,s)};e instanceof Promise?e.then(a):a()}}))},ua=(e={},t,i,s,n)=>{var a;e.asDiv=!0;const o=null!==(a=e.container)&&void 0!==a?a:I("more",e);o.classList.add("btn-menu-toggle");const r=Vn(i,e.listenerSetter);return r.classList.add(t),ha(o,s,e,n),o.append(r),o};function pa(e){const t=[];let i={users:[],chats:[]},s={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}var ma;!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(ma||(ma={}));const ga=ma;class va{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,p.Z)(i,t):(0,m.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===ga.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===ga.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new Uo({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:ga.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:ga.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:ga.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,fi.a)();i.forEach((({type:e,langKey:t})=>{const i=new mi({radioField:new wi({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=gi([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=Oo(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((i=>{i.row=new mi(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(us).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=pa(i);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case ga.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case ga.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case ga.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))return;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,m.v_)([e.users.length?(0,m.ag)("Users",[e.users.length]):null,e.chats.length?(0,m.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,m.ag)("PrivacySettingsController.AddUsers")]}}class fa extends E{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,m.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,m.ag)("PrivacyPhoneInfo4"),document.createElement("br"),function(e={}){const t=document.createElement("a");if(t.classList.add("anchor-copy"),e.mePath){const i="https://t.me/"+e.mePath;t.href=t.innerText=i}return(0,n.fc)(t,(e=>{(0,a.Z)(e),vi(t.href),Li({langPackKey:"LinkCopied"})})),t}({mePath:e}));const i=new va({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{o.setRadio(ga.Everybody),o.radioSection.container.classList.toggle("hide",e!==ga.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",o=new va({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[ga.Nobody],managers:this.managers});this.scrollable.container.insertBefore(o.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}function ya({emoji:e,div:t,width:i,height:n,managers:a=s.Z.managers}){return o=this,r=void 0,c=function*(){const s=yield a.appStickersManager.getAnimatedEmojiSticker(e);if(!s)throw t.classList.add("media-sticker-wrapper"),new Error("no sticker");return di({doc:s,div:t,emoji:e,width:i,height:n,loop:!1,play:!0})},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(o,r||[])).next())}));var o,r,l,c}class ba extends M{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new Uo({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");ya({emoji:"🥳",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const a=(0,L.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,n.fc)(a,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Eo,this),s.append(a),i.append(s),this.scrollable.container.append(e.container)}}var wa=i(4489);function Sa(e){return!qe.IS_MOBILE_SAFARI||!e}class Ca extends M{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new Uo({caption:!0,noDelimiter:!0});(0,m.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");ya({div:t,width:160,height:160,emoji:"📬"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const a=this.codeInputField=new wa.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{c(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{l()})).catch((e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),(0,p.Z)(a.label,(0,m.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),(0,p.Z)(a.label,(0,m.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}c(!1)}))}}),o=(0,L.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=(0,L.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),l=()=>{this.slider.createTab(ba).open()},c=e=>{(0,Ti.Z)([a.input,o,r],e)};(0,n.fc)(o,(e=>{c(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab(Ia,this),this.close()}),(()=>{c(!1)}))})),(0,n.fc)(r,(e=>{c(!0);const t=(0,fe.y)(r);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),c(!1)}))})),s.append(a.container,o,r),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Sa(this.isFirst)&&this.codeInputField.input.focus()}}var La=i(2423);class Ia extends M{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new Uo({caption:!0,noDelimiter:!0}),t=document.createElement("div");ya({div:t,width:160,height:160,emoji:"💌"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const o=this.inputField=new f.Z({name:"recovery-email",label:"RecoveryEmail",plainText:!0});o.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,a.Z)(e),d()})),o.input.addEventListener("input",(e=>{o.input.classList.remove("error")}));const r=(0,L.Z)("btn-primary btn-color-primary",{text:"Continue"}),l=(0,L.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=()=>{this.slider.createTab(ba).open()},d=()=>{const e=o.value.trim(),t=(i=e)?i.match(La.E):null;var i;if(!t||t[0].length!==e.length)return void o.input.classList.add("error");h(!0);const s=(0,fe.y)(r);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{c()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(Ca);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);h(!1),s.remove()}))};(0,n.fc)(r,d);const h=e=>{e?(r.setAttribute("disabled","true"),l.setAttribute("disabled","true")):(r.removeAttribute("disabled"),l.removeAttribute("disabled"))};(0,n.fc)(l,(e=>{new ki("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{h(!0),(0,fe.y)(l),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{c()}),(e=>{h(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(o.container,r,l),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Sa(this.isFirst)&&this.inputField.input.focus()}}var Ma=i(4425),Ea=i(6830),Pa=i(3083);class ka extends M{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new Uo({noDelimiter:!0}),t=document.createElement("div");ya({div:t,width:160,height:160,emoji:"💡"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new f.Z({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,a.Z)(e),s.value?c():d()}));const o=(e,t)=>{e&&(0,a.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void Ci(m.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab(Ia);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},r=(0,L.Z)("btn-primary btn-color-primary",{text:"Continue"}),l=(0,L.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=e=>o(e,!0),d=e=>o(e,!1);(0,n.fc)(r,c),(0,n.fc)(l,d),i.append(s.container,r,l),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class Ta extends M{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new Uo({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new Ea.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new Pa.Z(i,157),o=(0,L.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,o),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(f.I.Neutral),"Enter"===e.key)return l()}));const r=()=>this.newPassword===i.value||(i.setError(),!1),l=e=>{if(e&&(0,a.Z)(e),!r())return;const t=this.slider.createTab(ka);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,n.fc)(o,l),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class xa extends M{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new Uo({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new Ea.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Tt.Z)(this.state.hint):void 0}),o=new Ma.Z(s,157),l=(0,L.Z)("btn-primary btn-color-primary"),c=new m.ZP.IntlElement({key:"Continue"});l.append(c.element),i.append(s.container,l),t.content.append(o.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),c.key="Continue",c.update()),"Enter"===e.key)return h()}));const d=()=>!!s.value.length||(s.input.classList.add("error"),!1);let h;if(e)h=e=>{if(e&&(0,a.Z)(e),!d())return;const t=this.slider.createTab(Ta);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,r.Z)(s.label,(0,Tt.Z)(this.state.hint)):(0,p.Z)(s.label,(0,m.ag)("LoginPassword"))})));h=i=>{if(!d())return void(0,a.Z)(i);l.setAttribute("disabled","true"),c.key="PleaseWait",c.update();const n=(0,fe.y)(l),r=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),o&&o.remove();const t=this.slider.createTab(Aa);t.state=this.state,t.plainPassword=r,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{l.removeAttribute("disabled"),s.input.classList.add("error"),e.type,c.key="TwoStepAuth.InvalidPassword",c.update(),n.remove(),s.select(),t()}))},t()}return(0,n.fc)(l,h),o.load()}onOpenAfterTimeout(){Sa(this.isFirst)&&this.passwordInputField.input.focus()}}class Aa extends M{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new Uo({caption:!0,noDelimiter:!0}),t=document.createElement("div");ya({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,m.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,L.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,L.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),a=(0,L.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,n.fc)(t,(()=>{const e=this.slider.createTab(xa);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,n.fc)(s,(()=>{new ki("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Eo,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,n.fc)(a,(()=>{const e=this.slider.createTab(Ia);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()})),i.append(t,s,a)}else{(0,m.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,L.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,n.fc)(s,(e=>{const t=this.slider.createTab(xa);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class Za extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new va({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class Da extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new va({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[ga.Nobody],managers:this.managers})}}class Fa extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new va({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class _a extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new va({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[ga.Nobody],managers:this.managers})}}class Ba extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new va({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new va({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}class Ra extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new mi({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:U(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const i=document.createElement("div");return i.classList.add("row-midtitle"),i.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(i,t.subtitle),t},t=this.authorizations.slice();{const a=new Uo({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),o=(0,pe.Z)(t,(e=>e.pFlags.current)),r=e(o);if(a.content.append(r.container),t.length){const e=(0,L.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,n.fc)(e,(t=>{new ki("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,Ti.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()})),a.content.append(e)}this.scrollable.append(a.container)}if(!t.length)return;const i=new Uo({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&Ci(m.ZP.format("RecentSessions.Error.FreshReset",!0))};let a;const o=()=>{const e=a.dataset.hash;new ki("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&a.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},r=this.menuElement=Vn([{icon:"stop",text:"Terminate",onClick:o}]);r.id="active-sessions-contextmenu",r.classList.add("contextmenu"),document.getElementById("page-chats").append(r),Nn(this.scrollable.container,(e=>{a=(0,mt.Z)(e.target,"row"),a&&"0"!==a.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),ra(e,r),ks.openBtnMenu(r))})),(0,n.fc)(this.scrollable.container,(e=>{a=(0,mt.Z)(e.target,"row"),a&&"0"!==a.dataset.hash&&o()}))}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Na extends M{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new Uo({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=D({icon:"add",className:"is-visible"});this.content.append(t),(0,n.fc)(t,(e=>{new Yi({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=$p.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const a=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=$p.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:48,append:t}),n=yield this.managers.appUsersManager.getUser(e);n.pFlags.bot?s.lastMessageSpan.append("@"+n.username):n.phone?s.lastMessageSpan.innerHTML=cs(n.phone):s.lastMessageSpan.append(n.username?"@"+n.username:re(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)a(e,!0);let o;const r=this.menuElement=Vn([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=o.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);r.id="blocked-users-contextmenu",r.classList.add("contextmenu"),document.getElementById("page-chats").append(r),Nn(this.scrollable.container,(e=>{o=(0,Ai.Z)(e.target,Vp),o&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),ra(e,r),ks.openBtnMenu(r))}),this.listenerSetter),this.listenerSetter.add(s.Z)("peer_block",(e=>{const{peerId:t,blocked:s}=e,n=i.querySelector(`[data-peer-id="${t}"]`);s?n||a(t,!1):n&&n.remove()}));let l=!1;this.scrollable.onScrolledBottom=()=>{l||(l=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)a(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{l=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}function Ua(e){return"input"+(e[0].toUpperCase()+e.slice(1))}class Oa extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const e="Loading";{const t=new Uo({noDelimiter:!0,caption:"SessionsInfo"});let i;const n=new mi({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:e,clickable:()=>{const e=this.slider.createTab(Na);e.peerIds=i,e.open()}});let a;n.freezed=!0;const o=new mi({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:e,clickable:e=>{let t;a.pFlags.has_password?t=this.slider.createTab(xa):a.email_unconfirmed_pattern?(t=this.slider.createTab(Ca),t.email=a.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(Aa),t.state=a,t.open()}});o.freezed=!0;const r=this.activeSessionsRow=new mi({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:e,clickable:()=>{const e=this.slider.createTab(Ra);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()}});r.freezed=!0,t.content.append(n.container,o.container,r.container),this.scrollable.append(t.container);const l=e=>{e?(0,p.Z)(n.subtitle,(0,m.ag)("PrivacySettingsController.UserCount",[e])):(0,p.Z)(n.subtitle,(0,m.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(s.Z)("peer_block",(()=>{c()}));const c=()=>{this.managers.appUsersManager.getBlocked().then((e=>{n.freezed=!1,l(e.count),i=e.peerIds}))};c(),this.managers.passwordManager.getState().then((e=>{a=e,(0,p.Z)(o.subtitle,(0,m.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),o.freezed=!1})),this.updateActiveSessions()}{const t=new Uo({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});t.content.classList.add("privacy-navigation-container");const i={},n=i.inputPrivacyKeyPhoneNumber=new mi({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(fa).open()}}),a=i.inputPrivacyKeyStatusTimestamp=new mi({titleLangKey:"LastSeenTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Za).open()}}),o=i.inputPrivacyKeyProfilePhoto=new mi({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Da).open()}}),r=i.inputPrivacyKeyPhoneCall=new mi({titleLangKey:"WhoCanCallMe",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Ba).open()}}),l=i.inputPrivacyKeyForwards=new mi({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Fa).open()}}),c=i.inputPrivacyKeyChatInvite=new mi({titleLangKey:"WhoCanAddMe",subtitleLangKey:e,clickable:()=>{this.slider.createTab(_a).open()}}),d=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=pa(e),s=i.type===ga.Everybody?"PrivacySettingsController.Everbody":i.type===ga.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,m.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};t.content.append(n.container,a.container,o.container,r.container,l.container,c.container),this.scrollable.append(t.container);for(const e in i)d(e);s.Z.addEventListener("privacy_update",(e=>{d(Ua(e.key._))}))}const t=[];{const e=new Uo({name:"Privacy.SensitiveContent"});e.container.classList.add("hide"),t.push(this.managers.apiManager.invokeApi("account.getContentSettings").then((t=>{if(!t.pFlags.sensitive_can_change)return;const i=t.pFlags.sensitive_enabled,s=new mi({checkboxField:new Pi.Z({text:"PrivacyAndSecurity.SensitiveText",checked:i}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});e.content.append(s.container),e.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",(()=>{const e=s.checkboxField.checked;e!==i&&this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e})}),{once:!0})}))),this.scrollable.append(e.container)}{const e=new Uo({name:"FilterChats"}),t=()=>{new ki("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,Ti.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,L.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(t)}updateActiveSessions(){this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,m.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}}function Ha(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}class Va{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{let e=this._scrollDelta/this._scrollTails;if(this._scrollDelta%=this._scrollTails,e=e>0?Math.floor(e):Math.ceil(e),e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}this._onWheelRAF=void 0},this.drawNextPositionAnimated=()=>{const e=this._frames,t=e.shift();t&&this.drawImageData(t);const i=e.length;return i||(this._animatingToNextPosition=void 0),!!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,sn.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();for(;e>0;)t.push(t.shift()),--e;const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d")),this._canvas=e,this._ctx=this._canvas.getContext("2d"),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(){var e;if(this._colors.length<2)return;const t=this._tail,i=this._tails;let s;const n=[];for(let a=0,o=this._incrementalCurve.length;ai&&void 0===s&&(s=a,r%=i),n.push(r)}[n.slice(0,s),void 0!==s?n.slice(s):[]].forEach(((e,t,s)=>{const n=e[e.length-1];if(void 0!==n&&n>i&&(e[e.length-1]=+n.toFixed(2)),this._tail=null!=n?n:0,!e.length)return;const a=this.getNextPositions(this._phase,i,e);t!==s.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=a.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,rt.jt)(this.drawNextPositionAnimated)}scrollAnimate(e){this._colors.length<2&&e||(e&&!this._addedScrollListener?(document.addEventListener("wheel",this.onWheel),this._addedScrollListener=!0):!e&&this._addedScrollListener&&(document.removeEventListener("wheel",this.onWheel),this._addedScrollListener=!1))}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new Va;return i.init(t),{gradientRenderer:i,canvas:t}}}var Ga=i(6714);class Wa{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(Wa.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new f.Z({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new f.Z({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=Wa.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?f.I.Neutral:f.I.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(i);this.rgbInputField.setState(e?f.I.Neutral:f.I.Error),e&&this.setColor((0,sn.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){Et(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){Et(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,sn.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,sn.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+s,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,i)}getCurrentColor(){const e=(0,sn.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,sn.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(f.I.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(f.I.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,Le.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,Le.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,Le.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=(0,Le.Z)(a,0,100),c=100-l/2,d=100-(0,Le.Z)(o,0,100),h=(0,Le.Z)(d/100*c,0,100);this.saturation=l,this.lightness=h,i&&this.updatePicker()}}Wa.BASE_CLASS="color-picker";class ja extends M{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,sn.Pi)(e),i=this.theme.background,n=za(t);i.id="2",i.intensity=0,i.slug="",i.color=e.toLowerCase(),i.highlightningColor=n,this.managers.appStateManager.pushToState("settings",s.Z.settings),dp.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=Ga.Z.getTheme();const e=new Uo({});this.colorPicker=new Wa,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new Uo({}),i=this.grid=document.createElement("div");i.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,n.fc)(i,(e=>{const t=(0,mt.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,ii.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,i=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],i=!!t&&!e.slug;i&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),i||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var Ka=i(236);function $a(e){return new Promise((t=>{var i,s,n;const a=document.createElement("canvas"),o=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize);a.width=o.width*window.devicePixelRatio,a.height=o.height*window.devicePixelRatio,a.getContext("2d").drawImage(e.media,0,0,a.width,a.height),a.toBlob((e=>{t({blob:e,size:o})}),null!==(s=e.mimeType)&&void 0!==s?s:"image/jpeg",null!==(n=e.quality)&&void 0!==n?n:1)}))}var qa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Qa extends M{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",t.accept=e,document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>qa(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield Ae(t,i,!1);const s="image/jpeg",{blob:n}=yield $a({media:t,size:new st.c(t.naturalWidth,t.naturalHeight),mimeType:s});e=new File([n],e.name.replace(/\.png$/,".jpg"),{type:s})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),s=d.Z.getNewDeferredForUpload(e.name,i),n=(0,Re.Z)();n.addNotifyListener=s.addNotifyListener,n.cancel=s.cancel,s.then((e=>{this.clicked.delete(a),this.elementsByKey.delete(a),this.wallPapersByElement.set(r,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,r),this.setBackgroundDocument(e).then(n.resolve,n.reject)}),n.reject);const a=this.getWallPaperKey(t);n.catch((()=>{r.remove()}));const o=new Be({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),r=this.addWallPaper(t,!1);this.clicked.add(a),o.attach(r,!1,n)}))))},this.onResetClick=()=>{const e=Ka.h.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,Di.Z)(e.background),this.managers.appStateManager.pushToState("settings",s.Z.settings),dp.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,mt.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void this.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const a=i.document,o=new Be({cancelable:!0,tryAgainOnFail:!1}),r=()=>qa(this,void 0,void 0,(function*(){const e=this.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(a)).url&&!this.theme.background.blur||o.attach(t,!0,e)}));o.construct(),(0,n.fc)(t,(e=>{o.preloader.parentElement?(o.onClick(e),o.detach()):r()}),{listenerSetter:this.listenerSetter}),r()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{dp.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{let t=++this.tempId;const i=()=>t===this.tempId,n=e.document,a=(0,Re.Z)();let o;return n?(o=d.Z.downloadMediaURL({media:n,queueId:dp.chat.bubbles?dp.chat.bubbles.lazyLoadQueue.queueId:0}),a.addNotifyListener=o.addNotifyListener,a.cancel=o.cancel):o=Promise.resolve(),o.then((()=>qa(this,void 0,void 0,(function*(){if(!i())return void a.resolve();const t=this.theme.background,o=n=>{let o;if(n&&!this.theme.background.color)o=function(e){const t=document.createElement("img");return new Promise((i=>{xe(t,e,(()=>{const e=document.createElement("canvas"),s=t.naturalWidth/t.naturalHeight;1===s?(e.width=50,e.height=e.width/s):s>1?(e.height=50,e.width=e.height/s):e.width=e.height=50,e.getContext("2d").drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height),i(Ha(e))}))}))}(n);else{const{canvas:t}=Va.create(this.getColorsFromWallPaper(e));o=Promise.resolve(Ha(t))}o.then((o=>{var r,l,c;if(!i())return void a.resolve();const d=za(Array.from(o)),h=null!==(r=e.slug)&&void 0!==r?r:"";t.id=e.id,t.intensity=null!==(c=null===(l=e.settings)||void 0===l?void 0:l.intensity)&&void 0!==c?c:0,t.color=this.getColorsFromWallPaper(e),t.slug=h,t.highlightningColor=d,this.managers.appStateManager.pushToState("settings",s.Z.settings),h&&this.saveToCache(h,n),dp.applyCurrentTheme(h,n,!0).then(a.resolve)}))};if(!n)return void o();const r=yield this.managers.thumbsStorage.getCacheContext(n);t.blur?setTimeout((()=>{const{canvas:e,promise:t}=$e(r.url,12,4);t.then((()=>{i()?o(e.toDataURL()):a.resolve()}))}),200):o(r.url)})))),a},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}get theme(){return Ga.Z.getTheme()}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=Oo(this.scrollable),i=(0,L.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),a=(0,L.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),o=(0,L.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,n.fc)(i,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,n.fc)(a,(()=>{this.slider.createTab(ja).open()}),{listenerSetter:this.listenerSetter}),(0,n.fc)(o,this.onResetClick,{listenerSetter:this.listenerSetter});const r=this.blurCheckboxField=new Pi.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(r.input)("change",(()=>qa(this,void 0,void 0,(function*(){this.theme.background.blur=r.input.checked,yield this.managers.appStateManager.pushToState("settings",s.Z.settings),setTimeout((()=>{const e=t.querySelector(".active");if(!e)return;const i=this.wallPapersByElement.get(e);i.pFlags.pattern||"wallPaperNoFile"===i._||this.setBackgroundDocument(i)}),100)})))),e.append(i,a,o,r.label)}s.Z.addEventListener("background_change",this.setActive),this.managers.appDocsManager.getWallPapers().then((e=>{e.forEach((e=>{this.addWallPaper(e)}))}));const e=Oo(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),(0,n.fc)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallPaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map((e=>"#"+e.toString(16))).join(","):""}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){const i=this.getColorsFromWallPaper(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0,o=document.createElement("div");o.classList.add("grid-item"),o.dataset.id=""+e.id;const r=this.getWallPaperKey(e);this.wallPapersByElement.set(o,e),this.elementsByKey.set(r,o);const l=document.createElement("div");let c,d;if(l.classList.add("grid-item-media"),s?(d=Se(a,200,200),c=ot({photo:a,message:null,container:l,withoutPreloader:!0,size:d,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&l.classList.add("is-pattern"),c.then((({loadPromises:e,images:t})=>qa(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((t=>{var i;e.pFlags.pattern&&(n?(t.full.style.display="none",t.thumb&&(t.thumb.style.display="none")):(null===(i=e.settings)||void 0===i?void 0:i.intensity)&&(t.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),Pe.Z.mutate((()=>{o.append(l)}))}))):o.append(l),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Va.create(i);t.classList.add("background-colors-canvas"),n&&s?c.then((({loadPromises:i})=>{i.full.then((()=>qa(this,void 0,void 0,(function*(){const i=yield this.managers.thumbsStorage.getCacheContext(a,d.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+Math.abs(e.settings.intensity)/100,l.append(t)}))))})):l.append(t)}return this.getWallPaperKeyFromTheme(this.theme)===r&&o.classList.add("active"),this.grid[t?"append":"prepend"](o),o}}const Ya="STICKERS-POPUP";class Xa extends x.Z{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=(0,mt.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;dp.chat.input.sendMessageWithDocument(i)?this.hide():console.warn("got no doc by id:",i)},this.h6=document.createElement("h6"),this.h6.append((0,m.ag)("Loading")),this.header.append(this.h6),this.addEventListener("close",(()=>{h.Z.setOnlyOnePlayableGroup("")}));const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),(0,n.fc)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),(0,fe.y)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const i=(0,L.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(t),new u.ZP(this.body),this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return this.managers.appStickersManager.getStickerSet(this.stickerSetInput).then((e=>{if(!e)return Li({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,h.Z.setOnlyOnePlayableGroup(Ya),(0,r.Z)(this.h6,(0,Tt.Z)(e.set.title)),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=(0,L.Z)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append((0,m.ag)("RemoveStickersCount",[(0,m.ag)("Stickers",[e.set.count])]))):(t=(0,L.Z)("btn-primary btn-color-primary",{noRipple:!0}),t.append((0,m.ag)("AddStickersCount",[(0,m.ag)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),(0,n.fc)(t,(()=>{const e=(0,Ti.Z)([t],!0);this.managers.appStickersManager.toggleStickerSet(this.set).then((()=>{this.hide()})).catch((()=>{e()}))}));const i=new ve;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const s=l.Z.active.esgSticker.width;di({doc:t,div:e,lazyLoadQueue:i,group:Ya,play:!0,loop:!0,width:s,height:s}),this.stickersDiv.append(e)}}))}}var Ja=i(6761);var eo=i(3731);class to extends M{init(){return this.header.classList.add("with-border"),this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new Uo,s=t.map((t=>{const i=new wi({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new mi({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),Pn({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=gi(s,(e=>{this.managers.appReactionsManager.setDefaultReaction(e)}));i.content.append(n),this.scrollable.append(i.container)}))}}class io{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const l=document.createElement("div");l.classList.add(o+"-name"),(0,m.$d)(l,e);const c=this.valueContainer=document.createElement("div");c.classList.add(o+"-value"),a&&(c.innerHTML=""+i),r.append(l,c),this.range=new Pt({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(c.innerText=""+e)}}),this.container.append(r,this.range.container)}}class so extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=Oo.bind(null,this.scrollable);{const t=e("Settings"),i=new io("TextSize",1,s.Z.settings.messagesTextSize,12,20);i.onChange=e=>{s.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const a=(0,L.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});(0,n.fc)(a,(()=>{this.slider.createTab(Qa).open()}));const o=new Pi.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(i.container,a,o.label)}{const t=e("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new mi({radioField:new wi({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new mi({radioField:new wi({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,m.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[qe.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),t.append(i)}if(eo.Z){const t=e("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new mi({radioField:new wi({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new mi({radioField:new wi({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),t.append(i)}{const t=e("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new mi({radioField:new wi({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=pt.Z),function i(){e(),n=Ja.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),t.append(i)}{const t=e("Emoji"),i=new Pi.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),s=new Pi.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(i.label,s.label)}{const e=new Uo({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new mi({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(to).open()}}),i=()=>{Promise.resolve(this.managers.appReactionsManager.getQuickReaction()).then((e=>{Pn({row:t,doc:e.static_icon,size:"small"})}))};i(),this.listenerSetter.add(s.Z)("quick_reaction",i);const n=new Pi.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),a=new Pi.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),o={},r=e.generateContentElement(),l=new ve,c=(e,t="append")=>{const i=new mi({title:(0,Tt.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new Xa({id:e.id,access_hash:e.access_hash}).show()}});o[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),En({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),i.container.append(s),r[t](i.container)};this.managers.appStickersManager.getAllStickers().then((e=>{(0,Jt.Z)(e);for(const t of e.sets)c(t)})),this.listenerSetter.add(s.Z)("stickers_installed",(e=>{const t=e;o[t.id]||c(t,"prepend")})),this.listenerSetter.add(s.Z)("stickers_deleted",(e=>{const t=e;o[t.id]&&(o[t.id].container.remove(),delete o[t.id])})),e.content.append(t.container,n.label,a.label),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}class no extends M{init(){return e=this,t=void 0,a=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=Oo(this.scrollable,void 0,"Bio.Description"),i=document.createElement("div");i.classList.add("input-wrapper");const n=yield this.managers.apiManager.getAppConfig();this.firstNameInputField=new f.Z({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new f.Z({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new f.Z({label:"EditProfile.BioLabel",name:"bio",maxLength:s.Z.premium?n.about_length_limit_premium:n.about_length_limit_default}),i.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const a=document.createElement("div");a.classList.add("caption"),(0,m.XZ)({element:a,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new ui({peerId:s.Z.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,i)}{const t=new Uo({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new Ei({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=t.caption;s.append((0,m.ag)("UsernameSettings.ChangeDescription")),s.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append((0,m.ag)("UsernameHelpLink",[a])),s.append(n),e.push(this.usernameInputField),t.content.append(i),this.scrollable.append(t.container)}(0,n.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter});const t=yield this.managers.appUsersManager.getSelf(),i=yield this.managers.appProfileManager.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(i.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var ao=i(7625),oo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ro extends M{constructor(){super(...arguments),this.renderResults=e=>oo(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=$p.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:46}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const s=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,r.Z)(e,(0,Tt.Z)(i.title)),s.push(e)}})),(0,m.v_)(s,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=I("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",(()=>oo(this,void 0,void 0,(function*(){const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,ao.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,ao.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()})))),this.dialogsByFilters=new Map,this.managers.filtersStorage.getDialogFilters().then((e=>oo(this,void 0,void 0,(function*(){yield Promise.all(e.map((e=>oo(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))}))))}checkbox(e){const t=new Pi.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new Uo({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const s=document.createDocumentFragment();for(const e in i){const t=(0,L.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new Qi({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const o=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=100&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);return t&&setTimeout((()=>{t.checked=!1}),0),void Ci(m.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=o(e,i[e]?(0,m.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&t.content.querySelector(`[data-peer-id="${s}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,i){return this.originalFilter=e,this.filter=(0,Di.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,super.open()}}var lo=i(1544),co=i(3066),ho=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class uo extends M{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,m.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=I("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new ki("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{e.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=ua({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new Uo({}),i=document.createElement("div");i.classList.add("input-wrapper"),this.nameInputField=new f.Z({label:"FilterNameHint",maxLength:12}),i.append(this.nameInputField.container),t.content.append(i);const s=(e,t,i,s)=>{const n=new Uo({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,L.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=s("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=s("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const n=this.includePeerIds.container.querySelector(".folder-categories"),a=this.excludePeerIds.container.querySelector(".folder-categories");n.querySelector(".btn").addEventListener("click",(()=>{this.slider.createTab(ro).open(this.filter,"included",this)})),a.querySelector(".btn").addEventListener("click",(()=>{this.slider.createTab(ro).open(this.filter,"excluded",this)})),this.confirmBtn.addEventListener("click",(()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(n.children).slice(1).reduce(((e,t)=>e+ +!t.style.display),0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?Ci("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):Ci("Please choose at least one chat for this folder.")})),this.nameInputField.input.addEventListener("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const o="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=ni.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then((e=>(this.animation=e,ni.Z.waitForFirstFrame(e)))),...o])}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=(0,lo.Z)((0,co.Z)(e.title));for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>ho(this,void 0,void 0,(function*(){const i=this[t],s=$p.createChatList({ignoreClick:!0});let n=e[t];const a=e=>ho(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),o=yield Vi(n,(e=>a(e)));n.length=0,n.push(...o),n=n.slice();const r=e=>ho(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(n.length,e);tr(20))),l.append((0,m.ag)("FilterShowMoreChats",[n.length])),e.append(l)}r(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,Xi.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,Di.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()}))}}var po=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class mo extends M{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,i){return po(this,void 0,void 0,(function*(){let s,a,o="",r=[];if("dialogFilterSuggested"===e._)s=e.filter,o=e.description;else{if(s=e,1===Object.keys(s.pFlags).length){const e=s.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&r.push((0,m.ag)(t))}if(!r.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(s.id);let t=0,i=0,n=0;yield Promise.all(e.map((e=>po(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?n++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&r.push((0,m.ag)("Chats",[t])),i&&r.push((0,m.ag)("Channels",[i])),n&&r.push((0,m.ag)("Groups",[n]))}}if(i)i.subtitle.textContent="",(0,m.v_)(r).forEach((e=>{i.subtitle.append(e)}));else if(i=new mi({title:(0,Tt.Z)(s.title),subtitle:o,clickable:!0}),r.length&&(0,m.v_)(r).forEach((e=>{i.subtitle.append(e)})),"dialogFilter"===e._){const e=s.id;this.filtersRendered.hasOwnProperty(s.id)||(0,n.fc)(i.container,(()=>po(this,void 0,void 0,(function*(){this.slider.createTab(uo).open(yield this.managers.filtersStorage.getFilter(e))}))),{listenerSetter:this.listenerSetter}),this.filtersRendered[s.id]=i}return a=i.container,s.hasOwnProperty("orderIndex")?xn(a,a.parentElement||t,s.orderIndex):t&&t.append(a),a}))}init(){return po(this,void 0,void 0,(function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),(0,m.XZ)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,L.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new Uo({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new Uo({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,n.fc)(this.createFolderBtn,(()=>po(this,void 0,void 0,(function*(){const e=yield this.managers.apiManager.getAppConfig();Object.keys(this.filtersRendered).length>=(s.Z.premium?e.dialog_filters_limit_premium:e.dialog_filters_limit_default)?Ci("Sorry, you can't create more folders."):this.slider.createTab(uo).open()}))),{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return this.managers.filtersStorage.getDialogFilters().then((e=>po(this,void 0,void 0,(function*(){for(const t of e)yield this.renderFolder(t,this.foldersSection.content);t()})))),this.listenerSetter.add(s.Z)("filter_update",(e=>po(this,void 0,void 0,(function*(){this.filtersRendered.hasOwnProperty(e.id)?yield this.renderFolder(e,null,this.filtersRendered[e.id]):yield this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()})))),this.listenerSetter.add(s.Z)("filter_delete",(e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()})),this.listenerSetter.add(s.Z)("filter_order",(e=>{e.forEach(((e,t)=>{const i=this.filtersRendered[e].container;xn(i,i.parentElement,t+1)}))})),this.loadAnimationPromise=ni.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then((e=>(this.animation=e,ni.Z.waitForFirstFrame(e)))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}getSuggestedFilters(){return this.managers.filtersStorage.getSuggestedDialogsFilters().then((e=>po(this,void 0,void 0,(function*(){this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t),i=(0,L.Z)("btn-primary btn-color-primary",{text:"Add"});e.append(i),this.suggestedSection.content.append(e),(0,n.fc)(i,(s=>{if((0,a.Z)(s),Object.keys(this.filtersRendered).length>=10)return void Ci("Sorry, you can't create more folders.");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((t=>{t&&e.remove()})).finally((()=>{i.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter})}}))))}}var go=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class vo extends E{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new Uo({name:e.name}),i=new mi({checkboxField:new Pi.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),n=new mi({checkboxField:new Pi.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(i.container,n.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>go(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,n.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>go(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,s=n.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&s===t.show_previews)return;const o=(0,Di.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?oe.rU:0,o.show_previews=s,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(s.Z)("notify_settings",(i=>{const s=Ua(i.peer._);e.inputKey===s&&(t=i.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new Uo({name:"NotificationsOther"}),t=new mi({checkboxField:new Pi.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),i=new mi({checkboxField:new Pi.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});bi.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class fo extends M{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new Uo({}),t=new Map,i=this.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then((i=>{const s=(0,fi.a)();i.forEach((e=>{const i=new mi({radioField:new wi({text:e.name,name:s,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,i)}));const n=gi([...t.values()],(e=>{m.ZP.getLangPack(e)}));m.ZP.getCacheLangPack().then((e=>{const i=t.get(e.lang_code);i?i.radioField.setValueSilently(!0):console.error("no row",i,e)})),e.content.append(n)}));return this.scrollable.append(e.container),i},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}function yo(e){return new Promise(((t,i)=>{const{button:s,checkbox:n}=e;s.callback=e=>{t(e?!!e.size:void 0)};const a=(0,x.x)([s]),o=a.find((e=>e.isCancel));o.callback=()=>{i()},e.buttons=a,e.checkboxes=n&&[n],new ki("popup-confirmation",e).show()}))}function bo(e,t){const i=new Uo({name:t}),s="settings.autoDownload."+e+".",n=new Pi.Z({text:"AutodownloadContacts",name:"contacts",stateKey:s+"contacts",withRipple:!0}),a=new Pi.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:s+"private",withRipple:!0}),o=new Pi.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:s+"groups",withRipple:!0}),r=new Pi.Z({text:"AutodownloadChannels",name:"channels",stateKey:s+"channels",withRipple:!0});return i.content.append(n.label,a.label,o.label,r.label),i}class wo extends E{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=bo("photo","AutoDownloadPhotosTitle");this.scrollable.append(e.container)}}class So extends E{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=(0,Ii.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=bo("file","AutoDownloadFilesTitle"),i=524288,n=20447232,a=s.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/n)),r=new m.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[Mt(a)]}),l=new io("AutoDownloadMaxFileSize",.01,o,0,1,!1);l.onChange=t=>{const s=Math.pow(t,4)*n+i|0;r.compareAndUpdate({args:[Mt(s)]}),e(s)},l.valueContainer.append(r.element),t.content.append(l.container),this.scrollable.append(t.container)}}class Co extends E{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=bo("video","AutoDownloadVideosTitle");this.scrollable.append(e.container)}}const Lo={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class Io extends E{init(){return e=this,t=void 0,a=function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new Uo({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield bi.Z.getState(),i=new Pi.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),a=()=>{(0,Ti.Z)([h],(0,Xi.Z)(t.settings.autoDownload,Ka.h.settings.autoDownload)&&(0,Xi.Z)(t.settings.autoDownloadNew,Ka.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(l,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(d,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=new e(this.slider,!0);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},l=new mi({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(wo)}}),c=new mi({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(Co)}}),d=new mi({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(So)}}),h=(0,L.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,n.fc)(h,(()=>{yo({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=s.Z.settings;e.autoDownloadNew=(0,Di.Z)(Ka.h.settings.autoDownloadNew),e.autoDownload=(0,Di.Z)(Ka.h.settings.autoDownload),this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=s.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[l,c,d].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(i.label,l.container,c.container,d.container,h),this.scrollable.append(e.container)}{const e=new Uo({name:"AutoplayMedia"}),t=new Pi.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),i=new Pi.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});e.content.append(t.label,i.label),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}setAutoDownloadSubtitle(e,t,i){let s,n=[];const a=Object.keys(t),o=a.map((e=>t[e]?Lo[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push(Mt(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,m.v_)(o.map((e=>(0,m.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,p.Z)(e.subtitle,(0,m.ag)(s,n))}}var Mo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Eo extends M{constructor(){super(...arguments),this.buttons={}}init(){return Mo(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=ua({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new ki("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=I("edit"),this.header.append(this.buttons.edit,e),this.profile=new Ns(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(s.Z.myId);const t=this.profile.fillProfileElements(),i=(0,L.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});i.addEventListener("click",(()=>{const e=document.createElement("canvas");x.Z.createPopup(A.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))})),this.profile.element.lastElementChild.firstElementChild.append(i);const n=()=>Mo(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));n(),this.listenerSetter.add(s.Z)("avatar_update",(e=>{s.Z.myId===e&&n()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=[["unmute","AccountSettings.Notifications",vo],["data","DataSettings",Io],["lock","AccountSettings.PrivacyAndSecurity",Oa],["settings","Telegram.GeneralSettingsViewController",so],["folder","AccountSettings.Filters",mo]].map((([e,t,i])=>new mi({titleLangKey:t,icon:e,clickable:()=>{this.slider.createTab(i).open()}})));o.push(this.devicesRow=new mi({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>Mo(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(Ra);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()}))}),this.languageRow=new mi({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,m.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(fo).open()}})),a.append(...o.map((e=>e.container)));const r=new Uo;r.content.append(a),this.scrollable.append(this.profile.element,r.container),this.buttons.edit.addEventListener("click",(()=>{this.slider.createTab(no).open()})),ni.Z.loadLottieWorkers(),this.updateActiveSessions(),yield t}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}}class Po extends M{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new Z((e=>{this.uploadAvatar=e}));const e=new Uo({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new f.Z({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new f.Z({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=D({icon:"arrow_next"}),this.nextBtn.addEventListener("click",(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),dp.setInnerPeer({peerId:e.toPeerId(!0)}),Vo.removeTabFromHistory(this),this.slider.createTab(us).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))})),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var ko=i(709);class To extends x.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,m.$d)(this.title,"AddContactTitle"),(0,n.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,a.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&(Li({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)})),c.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new f.Z({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new f.Z({label:"LastName",name:"create-contact-lastname",maxLength:70}),a=new ko.Z({required:!0});e.push(i,s,a);const o=()=>{const e=i.value+" "+s.value;c.avatarElem.peerTitle=e,c.avatarElem.update()};this.listenerSetter.add(i.input)("input",o),this.listenerSetter.add(s.input)("input",o),a.validate=()=>!!a.value.match(/\d/);const r=yield this.managers.appUsersManager.getSelf(),l=(0,ls.u)(r.phone);l.code&&(a.value="+"+l.code.country_code);const c=new ui({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,c.avatarElem),this.container.append(t,a.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}class xo extends M{init(){this.container.id="contacts-container";const e=D({icon:"add",className:"is-visible"});this.content.append(e),(0,n.fc)(e,(()=>{x.Z.createPopup(To)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new y("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(s.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,kn.k)()}createList(){const e=new Fn({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),$p.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!qe.IS_MOBILE&&Sa(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=Oi.height/72*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,p.Z)(this.scrollable.container,i.list)}))}open(){return this.openContacts(),super.open()}}class Ao extends M{init(){if(this.wasFilterId=$p.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!$p.sortedLists[Ao.filterId]){const e=$p.createChatList();$p.generateScrollable(e,{id:Ao.filterId,orderIndex:1}).container.append(e),$p.setListClickListener(e,null,!0)}const e=$p.scrollables[Ao.filterId];return this.scrollable.container.replaceWith(e.container),this.scrollable=e,$p.setFilterIdAndChangeTab(Ao.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){$p.sortedLists[this.wasFilterId].clear()}onClose(){$p.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return $p.sortedLists[Ao.filterId].clear(),super.onCloseAfterTimeout()}}Ao.filterId=1;class Zo extends M{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===s.Z.settings.distanceUnit?e>1609.34?(0,m.ag)("MilesAway",[Math.round(e/1609)]):(0,m.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,m.ag)("KMetersAway2",[e/1e3]):(0,m.ag)("MetersAway2",[e])}open(){const e=super.open();return e.then((()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition((e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then((e=>{const t=e.updates[0].peers,i=t.sort(((e,t)=>e.distance-t.distance)),s=t.filter((e=>"peerChannel"==e.peer._)).length,n=t.filter((e=>"peerChannel"!=e.peer._)).length;null==i||i.forEach((e=>{const t=(0,_i.Z)(e.peer),i=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),i.sortedList.add(t)})),this.errorCategory.classList.toggle("hide",!(!n&&!s)),this.errorCategory.innerHTML="No groups or channels found around you."}))}),(e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."}))})),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,Ci("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,Ci("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var Do=i(4159),Fo=i(7487);function _o(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}var Bo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Ro="is-left-column-shown",No="sidebar-left-section";class Uo{constructor(e={}){const t=this.container=document.createElement("div");t.classList.add(No+"-container");const i=this.innerContainer=document.createElement("div");if(i.classList.add(No),e.noShadow&&i.classList.add("no-shadow"),e.fakeGradientDelimiter)i.append(Ho()),i.classList.add("with-fake-delimiter");else if(e.noDelimiter)i.classList.add("no-delimiter");else{const e=document.createElement("hr");i.append(e)}const s=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",No+"-name"),(0,m.XZ)({element:t,key:e.name,args:e.nameArgs}),s.append(t)}if(t.append(i),e.caption){const i=this.caption=this.generateContentElement();i.classList.add(No+"-caption"),t.append(i),!0!==e.caption&&(0,m.XZ)({element:i,key:e.caption})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(No+"-content"),this.innerContainer.append(e),e}}const Oo=(e,t,i)=>{const s=new Uo({name:t,caption:i});return e.append(s.container),s.content},Ho=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e},zo=new class extends T{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new y("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(xo).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(Ao).open()},verify:()=>Bo(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(1,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(1))}))},o=new Pi.Z({toggle:!0,checked:"night"===Ga.Z.getTheme().name});o.input.addEventListener("change",(()=>Bo(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),s.Z.dispatchEvent("theme_change")})))),s.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===Ga.Z.getTheme().name)}));const r=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout((()=>{dp.setPeer({peerId:dp.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},eo.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(Zo).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Eo).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Pi.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=m.ZP.format("TelegramFeaturesUrl",!0);dp.openUrl(e)}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout((()=>{e.remove()}),0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([Fo.Z.set({kz_version:"Z"}),Fo.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Do.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Fo.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Do.Z.isMainDomain}].filter(Boolean);this.toolsBtn=ua({},"bottom-right",r,(e=>Bo(this,void 0,void 0,(function*(){yield Promise.all(r.map((e=>Bo(this,void 0,void 0,(function*(){e.verify&&e.element.classList.toggle("hide",!(yield e.verify()))})))))})))),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const l=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(n.pf,(e=>{e.stopPropagation(),ks.closeBtnMenu()}));const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+Do.Z.suffix+" "+Do.Z.versionFull,c.append(d),l.classList.add("has-footer"),l.append(c),this.newBtnMenu=ua({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(Po).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(us).open({type:"chat",skippable:!1,takeOut:e=>{this.createTab(le).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,ye.Z)(this.updateBtn),this.updateBtn.append((0,m.ag)("Update")),(0,n.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",a.element.append(this.archivedCount),s.Z.addEventListener("folder_unread",(e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+_o(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const h={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};w.Z.pushItem(h),bi.Z.getState().then((e=>{const t=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((e=>{e!==Do.Z.versionFull&&(this.hasUpdate=!0,clearInterval(t),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(pt.Z)}),18e5)}))}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new u.ZP(e),i=()=>{this.backBtn.click()};this.searchGroups={contacts:new g("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new g("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new g("SearchMessages","messages"),people:new g(!1,"contacts",!0,"search-group-people",!0,!1,i),recent:new g("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new da({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);let n=[],a="".toPeerId(),o=0,r=0;const l=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},c=document.createElement("div");c.classList.add("search-helper"),c.addEventListener("click",(e=>{const t=(0,mt.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");o=+t,r=+s}else a=i.toPeerId();t.addEventListener("click",(()=>{h(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),l()})),s.nav.parentElement.append(c);const d=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new Mp;return s.classList.add("selector-user-avatar","tgico","avatar-30"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Ft({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,p.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},h=e=>{0===e.dataset.key.indexOf("date_")?o=r=0:a="".toPeerId(),e.remove(),(0,P.Z)(n,e),setTimeout((()=>{l(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{h(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:a,folderId:a?void 0:0,query:e,minDate:o,maxDate:r}),s.load(!0),c.innerHTML="",s.nav.classList.remove("hide"),!a&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.appMessagesManager.getConversations(e).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{c.append(d(e))})),s.nav.classList.toggle("hide",!!c.innerHTML))}))}if(!o&&e.trim()){const t=[];Y(e,t),t.forEach((e=>{c.append(d("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!c.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,Ai.Z)(e.target,Vp);if(!t)return;const i=(0,mt.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});let m=document.createElement("div");m.classList.add("search-group-scrollable"),m.append(this.searchGroups.people.list),this.searchGroups.people.container.append(m),new u.v7(m);let v,f=!0;const y=(0,b.v)(e.parentElement,"zoom-fade",150,(e=>{v&&clearTimeout(v),0!==e||f||(s.selectTab(0,!1),this.inputSearch.onClearClick(),v=window.setTimeout((()=>{v=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),f=!1}));y(0);const S="is-visible",C=()=>{this.toolsBtn.classList.remove(S),this.backBtn.classList.add(S),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";qe.IS_MOBILE_SAFARI||w.Z.findItemByType(e)||w.Z.pushItem({onPop:()=>{i()},type:e}),y(1)};this.inputSearch.input.addEventListener("focus",C),C(),this.backBtn.addEventListener("click",(e=>{this.toolsBtn.classList.add(S),this.backBtn.classList.remove(S),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),w.Z.removeByType("global-search"),y(0)}));const L=I("close");this.searchGroups.recent.nameEl.append(L),L.addEventListener("click",(()=>{yo({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}};F.GO.appSidebarLeft=zo;const Vo=zo;class Go{constructor(e,t,i){this.container=document.createElement("div"),this.container.classList.add("bubbles-group"),this.chat=e,this.groups=t,this.items=[],this.dateTimestamp=i,this.offset=0}createAvatar(e){if(this.avatarLoadPromise)return this.avatarLoadPromise;if("messageService"===e._)return;this.avatarContainer=document.createElement("div"),this.avatarContainer.classList.add("bubbles-group-avatar-container"),++this.offset;const t=e.fwd_from,i=e.fwdFromId,n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===i,a=this.chat.peerId;return this.avatar=new Mp,this.avatar.classList.add("bubbles-group-avatar","user-avatar","avatar-40"),this.avatarLoadPromise=this.avatar.updateWithOptions({lazyLoadQueue:this.chat.bubbles.lazyLoadQueue,peerId:(t&&(a===s.Z.myId||a===oe.hj)||n?i:e.fromId)||oe.NM,peerTitle:!i&&t&&t.from_name?t.from_name:void 0}),this.avatarContainer.append(this.avatar),this.container.append(this.avatarContainer),this.avatarLoadPromise}get firstTimestamp(){return this.firstItem.timestamp}get firstMid(){return this.firstItem.mid}get firstItem(){return this.items[this.items.length-1]}get lastMid(){return this.lastItem.mid}get lastItem(){return this.items[0]}updateClassNames(){const e=this.items,t=e.length;if(!t)return;const i=e[t-1].bubble;if(1===e.length)return void i.classList.add("is-group-first","is-group-last");i.classList.remove("is-group-last"),i.classList.add("is-group-first");for(let i=1,s=t-1;i{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||(xn(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.firstTimestamp),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);xn(this.container,e.container,qr+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class Wo{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121}removeItem(e){e.group.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t),a.unmountItem(t);const o=new Set;o.add(a);const[r,l]=n;if(r&&l&&this.canItemsBeGrouped(r,l)&&r.group!==l.group){const e=l.group;this.f(l.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}this.mountUnmountGroups(Array.from(o))}mountUnmountGroups(e){const[t,i]=function(e,t){const i=[],s=[];for(let t=0,a=e.length;t{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}class jo extends x.Z{constructor(e,t,i={}){if(super("popup-date-picker",i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},i)),this.onPick=t,this.options=i,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new f.Z({plainText:!0}),this.minutesInputField=new f.Z({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,n.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new m.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new m.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,m.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new m.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&l.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new m.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new m.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}var $o=i(6654);class qo extends HTMLElement{constructor(){super(),this.classList.add("reaction"),this.managers=s.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e){this.type=e,this.classList.add("reaction-"+e)}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("reaction-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=this.managers.appReactionsManager.getReaction(i.reaction);(0,$o.Z)(e,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive");const i="inline"===this.type?14:22,s=this.wrapStickerPromise=di({div:this.stickerContainer,doc:null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon,width:i,height:i,static:!0,managers:this.managers}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===s&&(this.wrapStickerPromise=void 0)}))}))}}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add("reaction-counter"));const e=_o(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new Ks({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,_i.Z)(e.peer_id))))))}setIsChosen(e=!!this.reactionCount.pFlags.chosen){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,De.Z)(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){(0,$o.Z)(this.managers.appReactionsManager.getReaction(this.reactionCount.reaction),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add("reaction-sticker-activate"),Promise.all([di({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers}).then((({render:e})=>e)),li({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers}).stickerPromise]).then((([e,t])=>{const s=()=>{(0,Fe.T2)((()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")}))};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(s,1e3)})):s())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define("reaction-element",qo);const Qo=new Map;class Yo extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[],this.managers=s.Z.managers}connectedCallback(){let e=Qo.get(this.key);e||Qo.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=Qo.get(this.key);e.delete(this),e.size||Qo.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i){void 0!==this.key&&this.disconnectedCallback(),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.isPlaceholder=i,this.type!==t&&(this.type=t,this.classList.add("reactions-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.isPlaceholder)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;const s=this.managers.appReactionsManager.getAvailableReactions(),n=i?s instanceof Promise?t.results:t.results.filter((e=>this.managers.appReactionsManager.isReactionActive(e.reaction))):[];(0,ao.Z)(this.sorted,((e,t,i)=>{const s=e.reactionCount.reaction;n.some((e=>e.reaction===s))||(i.splice(t,1),e.remove())}));const a=n.reduce(((e,t)=>e+t.count),0),o=t&&!!t.pFlags.can_see_list&&a<4;if(this.sorted=n.map(((e,i)=>{const s=this.sorted.findIndex((t=>t.reactionCount.reaction===e.reaction));let n=-1!==s&&this.sorted[s];n||(n=new qo,n.init(this.type)),xn(n,this,i);const a=t.recent_reactions?t.recent_reactions.filter((t=>t.reaction===e.reaction)):[];return n.reactionCount=Object.assign({},e),n.setCanRenderAvatars(o),n.render(this.isPlaceholder),n.renderCounter(),n.renderAvatars(a),n.setIsChosen(),n})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===dp.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>t.reactionCount.reaction===e.reaction));t&&t.fireAroundAnimation()}))}}customElements.define("reactions-element",Yo);s.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class Xo extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=s.Z.managers}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new Ks({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,_i.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new m.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?_o(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",Xo);const Jo=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,m.$d)(e,"EditedMessage"),e},er=()=>(0,m.ag)("SponsoredMessage");var tr;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,l,c,d;const h=!!s.pFlags.sponsored,u=!("action"in s)&&!h;let p,m=h?void 0:z(n);if(u){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=_o(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,r.Z)(t,(0,Tt.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=Jo()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}"peerUser"===s.peer_id._&&(p=!0,d=e.reactionsMessage,c=new Yo,c.init(d,"inline",!0),c.render(),a.unshift(c))}else h&&a.push(l=er());m&&a.push(m);let g=h?void 0:V(n);u&&(g+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${V(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${V(new Date(1e3*s.fwd_from.date))}`:""));const v=document.createElement("span");v.classList.add("time","tgico"),v.append(...a);const f=document.createElement("div");f.classList.add("inner","tgico"),g&&(f.title=g);let y=a;if(o&&(y[y.indexOf(o)]=Jo()),l&&(y[y.indexOf(l)]=er()),c){const e=y[y.indexOf(c)]=new Yo;e.init(d,"inline"),e.render()}return y=y.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),m&&(y[y.length-1]=z(n)),f.append(...y),v.append(f),v},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new Xo;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:n})=>{return a=this,o=void 0,l=function*(){const a=!i;a&&(i=t.querySelector(".bubble-content"));const o=a?i.querySelector(".reply"):null;if(!n.reply_to_mid)return o&&o.remove(),void t.classList.remove("is-reply");const r=n.reply_to.reply_to_peer_id?(0,_i.Z)(n.reply_to.reply_to_peer_id):e.peerId;let l,c,d=yield s.Z.managers.appMessagesManager.getMessageByPeer(r,n.reply_to_mid);if(d){const e=d.fwdFromId;c=n.fwdFromId&&n.fwdFromId===e?n.fwdFromId:d.fromId||e,l=new Ft({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else s.Z.managers.appMessagesManager.fetchMessageReplyTo(n),e.bubbles.needUpdate.push({replyToPeerId:r,replyMid:n.reply_to_mid,mid:n.mid}),l=(0,m.ag)("Loading");const{container:h,fillPromise:u}=In(l,void 0,d,e.isAnyGroup?c:void 0);yield u,o?o.replaceWith(h):i.append(h),t.classList.add("is-reply")},new((r=void 0)||(r=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}));var a,o,r,l}}(tr||(tr={}));var ir=i(252);function sr(e,t,i){const s=e.getBoundingClientRect(),n="center"===i?Math.ceil(s.left+(s.right-s.left)/2+1):Math.ceil(s.left+1),a="bottom"===t?Math.floor(s.top+s.height-1):Math.ceil(s.top+1);return document.elementFromPoint(n,a)}function nr(e){e.style.display="none",e.offsetLeft,e.style.display=""}F.GO.getElementByPoint=sr;const ar=2147483646;var or=i(993);function rr(e,t,i,s=e.getBoundingClientRect(),n=t.getBoundingClientRect()){let{top:a,right:o,bottom:r,left:l}=n;if(i){const e=t.querySelector(".sticky");e&&(a=e.getBoundingClientRect().bottom)}if(s.top>=r||s.bottom<=a||s.right<=l||s.left>=o)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},d="visualViewport"in window?window.visualViewport:window,h=d.width||d.innerWidth,u=d.height||d.innerHeight;return{rect:{top:s.topo&&o!==h?(c.right=!0,++c.horizontal,o):s.right,bottom:s.bottom>r&&r!==u?(c.bottom=!0,++c.vertical,r):s.bottom,left:s.left{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);dp.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&Li({langPackKey:"RequestToJoinSent"})}))}}]),{closable:!0,overlayClosable:!0,body:!0}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new Mp;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),ot({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):Es(s,oe.NM,!1,e.title);const n=document.createElement("div");n.classList.add("chat-title"),(0,r.Z)(n,(0,Tt.Z)(e.title));const a=e.pFlags.broadcast,o=(0,m.ag)(a?"Subscribers":"Members",[Wi(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,m.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER"}(lr||(lr={}));var dr=i(5418);class hr{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findAnchor(){const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query));let s,n;for(const a of i){const i=a.getBoundingClientRect();if(rr(a,e,void 0,i,t))s=i,n=a;else if(n)break}if(!s){const e=i[0];e&&(s=e.getBoundingClientRect(),n=e)}return{rect:s,anchor:n}}findAndSetAnchor(){const{rect:e,anchor:t}=this.findAnchor();this.rect=e,this.anchor=t}save(){this.findAndSetAnchor(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){qe.IS_SAFARI&&e&&nr(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!(null===(t=this.anchor)||void 0===t?void 0:t.parentElement)&&(this.findAndSetAnchor(),!this.anchor))return void this._restore(e);const n=this.rect,a=this.anchor.getBoundingClientRect().bottom-n.bottom;this.setScrollTop(i+a,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}F.GO&&(F.GO.ScrollSaver=hr);class ur{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;i{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}var yr=i(9976),br=i(3447),wr=i(7746);function Sr(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,oi.w1)(e).join("-").replace(/-?fe0f/g,"")}}const Cr=new Set;function Lr(e,t,i=!1,n=!1){var a;const o=document.createElement("span");let r;if(o.classList.add("super-emoji"),n&&!yr.Z?r=function(e){return(0,Qt.Z)(e,{entities:[Sr(e)]})}(e):(e=(0,wr.Z)(e),r=(0,Tt.Z)(e)),o.append(r),o.children.length>1){const e=o.firstElementChild;o.innerHTML="",o.append(e)}if("IMG"===(null===(a=o.firstElementChild)||void 0===a?void 0:a.tagName)){const e=o.firstElementChild,t=e.src;if(!Cr.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),s.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,Fe.T2)((()=>{s.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),o.classList.remove("empty"),Cr.add(t)}))}),{once:!0}),o.append(i)}}i?t.prepend(o):t.appendChild(o)}function Ir(e){return(0,mt.Z)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class Mr{constructor(e){this.managers=e,this.closeScrollTop=0,this.onContentClick=e=>{(0,a.Z)(e);const t=Ir(e.target);t&&(dp.chat.input.onEmojiSelected(t,!1),hi.Z&&(0,$n.Z)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},i=new Map([["Emoji.Recent",[]]]);for(const t in br.Z){const s=""+br.Z[t],n=e[+s[0]-1];if(!n)continue;let a=i.get(n);a||(a=[],i.set(n,a)),a[+s.slice(1)||0]=t}i.delete(e.pop()),i.forEach(((e,i)=>{const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append((0,m.ag)(i));const a=document.createElement("div");a.classList.add("super-emojis"),s.append(n,a),e.forEach((e=>{Lr((0,oi.zu)(e),a,!1)})),t[i]=s}));const n=this.menu=this.content.previousElementSibling,a=this.scroll=new u.ZP(this.content,"EMOJI"),o=(0,fe.y)(this.content,!0);Promise.all([(0,dr.Z)(200),this.managers.appEmojiManager.getRecentEmojis().then((e=>{const t=!!e.length,i=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[i].classList.add("active");const s=Or.menuOnClick(n,a,void 0,i);return this.stickyIntersector=s.stickyIntersector,this.setMenuActive=s.setActive,e}))]).then((([i,s])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of s)Lr(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map((e=>{const i=t[e];return i||console.error("no div by category:",e),a.container.append(i),this.stickyIntersector.observeStickyHeaderChanges(i),i}))})),this.content.addEventListener("click",this.onContentClick),this.init=null,s.Z.addEventListener("emoji_recent",(e=>{const t=Array.from(this.recentItemsDiv.children);for(let i=0,s=t.length;i{this.closeScrollTop=this.scroll.scrollTop}))}onClose(){}}class Er extends ge{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new he(((e,t)=>{const i=ue(this.queue,(t=>t.div===e));t&&i.length&&i.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()}))}observe(e){this.intersector.observe(e)}}var Pr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const kr=100;class Tr{constructor(e,t,i,n=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,Re.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>Pr(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img");i&&(i&&i.classList.remove("hide"),yield(0,Fe.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),h.Z.getAnimations(t).forEach((e=>{h.Z.checkAnimation(e,!0,!0)})))})))),this.managers=s.Z.managers,this.lazyLoadQueue=new Er(void 0,((e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),n&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>Pr(this,void 0,void 0,(function*(){const i=(yield Vt({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video");e.style.opacity="";const i=e.querySelector("img");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),h.Z.getAnimations(t).forEach((e=>{h.Z.checkAnimation(e,!0,!0)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){let i=e.w,s=e.h;s{e.forEach((e=>{i.add(e)})),s.remove()})),zr.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}class Ar extends ge{constructor(e,t){super(e),this.onVisibilityChange=t,this._queue=new Map,this.intersector=new he(((e,t)=>{const i=ue(this.queue,(t=>t.div===e));t&&(i.length?i:[this._queue.get(e)]).forEach((t=>{this.queue.unshift(t||this._queue.get(e))})),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()}))}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}var Zr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Dr{constructor(e,t,i){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{h.Z.getAnimations(e).forEach((e=>{t?h.Z.checkAnimation(e,!1):h.Z.checkAnimation(e,!0,!0)}))},this.processVisibleDiv=e=>Zr(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=l.Z.active.esgSticker.width,n=di({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisibleDiv=e=>Zr(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(i,e)})),this.lazyLoadQueue=new Ar(void 0,((e,t)=>{t||this.processInvisibleDiv(e)}))}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),e.animated&&this.observeAnimatedDiv(t)),di({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class Fr{constructor(e){this.managers=e,this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",i,s){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&("string"==typeof t?a.innerHTML=t:a.append(t)),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:s}),i.then((e=>{e.forEach((e=>{n.append(this.superStickerRenderer.renderSticker(e))})),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach((({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)})),this.queueCategoryPush.length=0)})),{titleDiv:a}}renderStickerSet(e,t=!1){return Zr(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-category"),i.dataset.id=""+e.id,i.dataset.access_hash=""+e.access_hash;const s=document.createElement("button");s.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:i,tab:s},t?this.menu.insertBefore(s,this.menu.firstElementChild.nextSibling):this.menu.append(s);const n=this.managers.appStickersManager.getStickerSet(e);this.categoryPush(i,(0,Tt.Z)(e.title),n.then((e=>e.documents)),t),yield n,En({set:e,container:s,group:Ur,lazyLoadQueue:Or.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new u.v7(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),s.Z.addEventListener("stickers_installed",(e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)})),s.Z.addEventListener("stickers_deleted",(e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}})),this.stickersDiv.addEventListener("click",(e=>{const t=e.target;if((0,mt.Z)(t,"category-title")){const e=(0,Ri.Z)(t,"data-id");new Xa({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else Or.onMediaClick(e)}));const i=(e=!1)=>{s.Z.dispatchEvent("choosing_sticker",!e)};this.scroll=new u.ZP(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{i()},zr.addEventListener("closed",(()=>{i(!0)})),zr.addEventListener("opened",(()=>{i()})),this.stickyIntersector=Or.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const n=(0,fe.y)(this.content,!0);Promise.all([this.managers.appStickersManager.getRecentStickers().then((e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},n.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append((0,m.ag)("Stickers.Recent"))})),this.managers.appStickersManager.getAllStickers().then((e=>{n.remove();for(let t of e.sets)this.renderStickerSet(t)}))]).finally((()=>{this.mounted=!0,i()})),this.superStickerRenderer=new Dr(Or.lazyLoadQueue,Ur,this.managers),zr.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(this.managers.appStickersManager.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let i=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);i||(i=this.superStickerRenderer.renderSticker(e));const s=this.recentDiv.querySelector(".category-items");s.prepend(i),s.childElementCount>20&&Array.from(s.children).slice(20).forEach((e=>e.remove()))}onClose(){}}const _r="GIFS-SEARCH";class Br extends M{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=(0,mt.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;dp.chat.input.sendMessageWithDocument(i)?l.Z.isMobile&&Gs.onCloseBtnClick():console.warn("got no doc by id:",i)}}init(){this.container.id="search-gifs-container",this.inputSearch=new y("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,n.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Tr(this.gifsDiv,_r,this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",h.Z.checkAnimations(void 0,_r),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return Gs.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}})),e}search(e,t=!0){return i=this,s=void 0,a=function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(oe.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class Rr extends M{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new ve,this.inputSearch=new y("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,n.fc)(this.setsDiv,(e=>{const t=(0,mt.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void dp.chat.input.sendMessageWithDocument(e)}const i=(0,mt.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,n=i.dataset.access_hash,a=(0,mt.Z)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:n}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(a.textContent="",a.append((0,m.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{a.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:n}).then((e=>{new Xa(e.set).show()}))}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",h.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,r.Z)(s.firstElementChild,(0,Tt.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,m.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,m.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const l=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()})),e}renderFeatured(){return this.managers.appStickersManager.getFeaturedStickers().then((e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,ao.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),h.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}class Nr extends S.Z{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&(0,Qn.Z)(t,this.element)||(this.displayTimeout=window.setTimeout((()=>{this.toggle(!1)}),200))},this.toggle=e=>{return t=this,i=void 0,n=function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.forceClose=!1,this.dispatchEvent("opened")}),hi.Z?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),hi.Z?0:200)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},(0,k.Z)(this,e)}attachButtonListener(e,t){let i=!0;hi.Z?(0,n.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",this.onMouseOut),i=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.toggle(!0)}),200)}))}init(){hi.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}const Ur="emoticons-dropdown";class Or extends Nr{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(h.Z.checkAnimations(!0,Ur),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=dp.chat,i=this.tabsEl.children,s=Array.from(i),n=this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers");s[2].toggleAttribute("disabled",!n);const a=this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs");s[3].toggleAttribute("disabled",!a);const o=this.tabsEl.querySelector(".active");!o||1===(0,Tn.Z)(o)||n&&a||this.selectTab(0,!1)},this.addEventListener("open",(()=>{return e=this,t=void 0,s=function*(){hi.Z&&(0,$n.Z)()&&(yield(0,dr.Z)(100)),this.element.parentElement!==dp.chat.input.chatInput&&dp.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),Or.lazyLoadQueue.lock(),h.Z.lockIntersectionGroup(Ur)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s})),this.addEventListener("opened",(()=>{h.Z.unlockIntersectionGroup(Ur),Or.lazyLoadQueue.unlock(),Or.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")})),this.addEventListener("close",(()=>{Or.lazyLoadQueue.lock(),h.Z.lockIntersectionGroup(Ur),h.Z.checkAnimations(!0,Ur)})),this.addEventListener("closed",(()=>{h.Z.unlockIntersectionGroup(Ur),Or.lazyLoadQueue.unlock(),Or.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0}))}init(){this.managers=s.Z.managers,this.emojiTab=new Mr(this.managers),this.stickersTab=new Fr(this.managers),this.gifsTab=new xr(this.managers),this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,de.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),h.Z.checkAnimations(!1,Ur)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{1===this.tabId?Gs.isTabExists(Rr)||Gs.createTab(Rr).open():Gs.isTabExists(Br)||Gs.createTab(Br).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",(e=>{var t;const i=dp.chat.input.messageInput;(null===(t=i.lastChild)||void 0===t?void 0:t.tagName)?i.lastElementChild.remove():i.lastChild&&(i.lastChild.textContent.length?i.lastChild.textContent=i.lastChild.textContent.slice(0,-1):i.lastChild.remove());const s=new Event("input",{bubbles:!0,cancelable:!0});dp.chat.input.messageInput.dispatchEvent(s),(0,a.Z)(e)}));const e=qe.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),dp.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===dp.chat.input.messageInput)return e.getRangeAt(0)}}Or.lazyLoadQueue=new ve,Or.menuOnClick=(e,t,i,s=0)=>{let n=-1;const a=t=>t!==s&&(e.children[s].classList.remove("active"),e.children[t].classList.add("active"),s=t,!0),o=new Ko(t.container,((s,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=(0,Tn.Z)(o);!s&&r||(a(r),i&&(r{let i=e.target;if(i=(0,mt.Z)(i,"menu-horizontal-div-item"),!i)return;const s=(0,Tn.Z)(i);if(!a(s))return;const o=(t.splitUp||t.container).children[s].offsetTop+1;t.container.scrollTop=n=o})),{stickyIntersector:o,setActive:a}},Or.onMediaClick=(e,t=!1)=>{let i=e.target;if(i=(0,Ai.Z)(i,"DIV"),!i)return!1;const s=i.dataset.docId;return!!s&&(dp.chat.input.sendMessageWithDocument(s,void 0,t)?(Hr.container&&(Hr.forceClose=!0,Hr.container.classList.add("disable-hover"),Hr.toggle(!1)),!0):(console.warn("got no doc by id:",s),!1))};const Hr=new Or;F.GO.emoticonsDropdown=Hr;const zr=Hr;var Vr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Gr=new Set(["messageActionHistoryClear","messageActionChatCreate"]),Wr=new Set;or.Z&&Wr.add("messageActionPhoneCall");const jr=void 0;let Kr=jr,$r=0;const qr=3,Qr=new Error("peer changed");function Yr(e){return Math.max(...e)}class Xr{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=(0,kn.k)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Set,this.setPeerTempId=0,this.renderNewPromises=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this;e&&e.random_id&&(delete e.random_id,this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),e.random_id))}}},this.onBubblesMouseMove=e=>Vr(this,void 0,void 0,(function*(){const t=(0,mt.Z)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=(0,mt.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let o=yield this.chat.getMessage(+e.dataset.mid);o=yield this.managers.appMessagesManager.getGroupsFirstMessage(o);const r=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(o),(0,dr.Z)(400)]).then((([e])=>{const t=e[0];t?di({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:r,group:rp,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Jt.Z)(e),r()&&(e.addEventListener("firstFrame",(()=>{r()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,n.fc)(s,(e=>{(0,a.Z)(e),this.managers.appReactionsManager.sendReaction(o,t.reaction),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter}))})):s.remove()}))}}else this.unhoverPrevious()})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>Vr(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,mt.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,mt.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==oe.NM?this.chat.appImManager.setInnerPeer({peerId:t}):Ci(m.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,mt.Z)(i,"bubble-content")){if(s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){x.Z.createPopup(jo,new Date(+e),this.onDatePick).show();break}return}if(!hi.Z&&(0,mt.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,a.Z)(e),hi.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,mt.Z)(i,"grouped-item")||s)}const o=(0,mt.Z)(i,"contact");if(o)return void this.chat.appImManager.setInnerPeer({peerId:o.dataset.peerId.toPeerId()});const r=(0,mt.Z)(i,"bubble-call");if(r)return void this.chat.appImManager.callUser(this.peerId.toUserId(),r.dataset.type);const l=(0,mt.Z)(i,"spoiler");if(l){const t=(0,mt.Z)(l,"message"),i="is-spoiler-visible",s=t.classList.contains(i);s||(0,a.Z)(e);const n=200,o=5e3,r=s?0:2;r&&t.classList.add("will-change");const c=t.dataset.spoilerTimeout;return null!==c&&(clearTimeout(+c),delete t.dataset.spoilerTimeout),void(0,De.Z)(t,i,!0,n,(()=>{t.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,De.Z)(t,i,!1,n,(()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout}))}),o)}),r)}const c=(0,Ai.Z)(i,"REACTION-ELEMENT");if(c){if((0,a.Z)(e),c.classList.contains("is-inactive"))return;const t=c.parentElement,i=t.getReactionCount(c),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}if((0,mt.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===oe.hj){const t=yield this.chat.getMessage(e),i=(0,_i.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(i,n,s)}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const d=(0,mt.Z)(i,"is-via");if(d){const t=d.querySelector(".peer-title");if(i===t||(0,Qn.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,a.Z)(e)}}const h=(0,mt.Z)(i,"peer-title")||(0,Ai.Z)(i,"AVATAR-ELEMENT")||(0,Ri.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,i]=t.split("_");this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+i})}else{const t=e.toPeerId();t!==oe.NM?this.chat.appImManager.setInnerPeer({peerId:t}):Ci(m.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new Xa(i.stickerSetInput).show())}const u=(0,mt.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,mt.Z)(i,"album-item")||(0,mt.Z)(i,"document-container"),o=+(t||s).dataset.mid,r=yield this.chat.getMessage(o);if(!r)return void this.log.warn("no message by messageId:",o);const l=(t||s).querySelector(".preloader-container");if(l)return(0,n.tH)(l),void(0,a.Z)(e);const c="webpage",d=s.classList.contains(c),h=u?e=>gp.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),p=[],m=d?[o]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>Vr(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,be.Z)(t);return i&&h(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));m.forEach((e=>{let t;u?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{p.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,mt.Z)(i,"media-container-aspecter"))return;let n=(0,mt.Z)(i,"album-item");const a=n||i.parentElement;s.has(a)||(s.add(a),p.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),p.sort(((e,t)=>e.mid-t.mid));let g=p.findIndex((e=>e.mid===o));return F.ZP&&this.log("open mediaViewer single with ids:",m,g,p),p[g]?((new gp).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(r,p[g].element,0,!0,p.slice(0,g),p.slice(g+1)),void(0,a.Z)(e)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,Ai.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Gn({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,mt.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.replyFollowHistory.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,_i.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t)=>{var i,s;if(this.isHeavyAnimationInProgress){if(this.sliceViewportDebounced&&this.sliceViewportDebounced.clearTimeout(),this.scrolledDown&&!e)return}else this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),this.sliceViewportDebounced&&this.sliceViewportDebounced(),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const n=null!==(i=null==t?void 0:t.distanceToEnd)&&void 0!==i?i:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&n>0||t)&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout((()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0}),1350+(null!==(s=null==t?void 0:t.duration)&&void 0!==s?s:0))),n<300&&(this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new C.Z,this.constructBubbles(),this.bubbleGroups=new Wo(this.chat),this.preloader=new Be({cancelable:!1}),this.lazyLoadQueue=new ve,this.lazyLoadQueue.queueId=++$r,this.listenerSetter.add(s.Z)("history_update",(({storageKey:e,mid:t,message:i})=>Vr(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e)return;const s=this.bubbles[t];if(!s)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[t]!==s)return;const n=this.bubbleGroups.getItemByBubble(s);if(!n)return;if(n.mid===t)return;const a=n.group,o=this.bubbleGroups.createItem(s,i),r=this.bubbleGroups.itemsArr.slice();(0,P.Z)(r,n);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(a===(null==l?void 0:l.group))return void this.bubbleGroups.changeBubbleMid(s,t);this.bubbleGroups.removeAndUnmountBubble(s);const{groups:c}=this.groupBubbles([{bubble:s,message:i}]);this.bubbleGroups.mountUnmountGroups(c),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(s.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(s.Z)("message_sent",(e=>Vr(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:n,mid:a,message:o}=e;if(this.chat.messagesStorageKey!==t)return;const r=this.bubbles,l=r[i];if(l){const e=r[i];r[a]=e,e.dataset.mid=""+a,delete r[i],(0,Fe.T2)((()=>{const t=+e.dataset.mid;r[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===s.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(a)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=n.date-10&&this.deleteMessagesByIds([a]),!l)return;let c,d;const h=o.grouped_id;if(h){const e=yield this.managers.appMessagesManager.getMidsByMessage(o);if(!e.length||Yr(e)!==a||r[a]!==l)return;if(c=yield Promise.all(e.map((e=>this.chat.getMessage(e)))),r[a]!==l)return;d=Array.from(l.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else c=[o],d=[i];const u=Array.from(l.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(o)})),c.forEach(((e,t)=>{var i,s,a,o,r;if(!e)return;const c=d[t],u=e.mid,p=l.querySelector(`.document-container[data-mid="${u}"]`)||l;if("message"!==e._)return;if(e.replies){const t=l.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,f=m.webpage;if(g){const t=p.querySelector(`.document-container[data-mid="${c}"] .document`);if(t){const i=(0,mt.Z)(t,"document-container");!(null===(o=null===(a=null===(s=n.media)||void 0===s?void 0:s.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(r=g.thumbs)||void 0===r?void 0:r.length)&&(0,Ne.e9)().then((()=>Vr(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield qt({message:e});t.replaceWith(s),i&&s.querySelector(".document-size").append(i)})))),i&&(i.dataset.mid=""+u)}const i=p.querySelector(`audio-element[data-mid="${c}"], .document[data-doc-id="${c}"], .media-round[data-mid="${c}"]`);i&&(i instanceof Ot||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):i.dataset.docId=""+g.id)}else if(v){const t=p.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+u))}else f&&!p.querySelector(".web")&&(0,Ne.e9)().then((()=>{this.safeRenderMessage(e,!0,p),this.scrollToBubbleIfLast(p)}));if(h){const e=p.querySelector(`.grouped-item[data-mid="${c}"]`)||p;e&&(e.dataset.mid=""+u)}}))})))),this.listenerSetter.add(s.Z)("message_edit",(({storageKey:e,message:t})=>{if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&this.safeRenderMessage(t,!0,i)})),this.listenerSetter.add(s.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=Yr(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=Yr(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),"scheduled"!==this.chat.type&&this.listenerSetter.add(s.Z)("messages_reactions",(e=>Vr(this,void 0,void 0,(function*(){let t;const i=e.map((({message:e,changedResults:t})=>Vr(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=Qo.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(s.Z)("messages_downloaded",(({peerId:e,mids:t})=>Vr(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,Ne.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,ao.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>Vr(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);tr.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,n.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,Ai.Z)(e.target,"CODE");return t?((0,a.Z)(e),vi(t.textContent),void Li({langPackKey:"TextCopied"})):void 0})),this.stickyIntersector=new Ko(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),qe.IS_SAFARI||(this.sliceViewportDebounced=(0,Ii.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,Ne.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,i&&i()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new C.Z),F.ZP&&this.listenerSetter.add(e)("dblclick",(e=>Vr(this,void 0,void 0,(function*(){const t=(0,mt.Z)(e.target,"grouped-item")||(0,mt.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),qe.IS_MOBILE||"pinned"===this.chat.type||this.listenerSetter.add(e)("dblclick",(e=>Vr(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}})))),hi.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o=!1;On({element:e,verifyTouchTarget:e=>Vr(this,void 0,void 0,(function*(){return!(this.chat.selection.isSelecting||!(yield this.chat.canSend())||(n=(0,mt.Z)(e.target,"bubble"),n&&((0,De.Z)(n,t,!0,250),n.offsetLeft,a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)),!n))})),onSwipe:(e,t)=>{o=e>=s,o&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(i,e));n.style.transform=`translateX(${r}px)`,Rn()},onReset:()=>{const e=n;(0,De.Z)(e,t,!1,250,(()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())})),(0,Fe.T2)((()=>{if(e.style.transform="",o){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),o=!1}}))},listenerOptions:{capture:!0}})}}constructPeerHelpers(){this.listenerSetter.add(s.Z)("history_append",(({storageKey:e,mid:t})=>Vr(this,void 0,void 0,(function*(){if(e===this.chat.messagesStorageKey&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId(),s.Z.settings.animationsEnabled)){const e=this.chat.gradientRenderer;e&&e.toNextPosition()}})))),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort(((e,t)=>t-e));this.renderNewMessagesByIds(t)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(s.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,Ne.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(s.Z)("dialogs_multiupdate",(e=>{e[this.peerId]&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(s.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(s.Z)("chat_update",(e=>Vr(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e()))})))),this.listenerSetter.add(s.Z)("settings_updated",(({key:e})=>Vr(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,ia.Z)(this.bubbles,"desc").map((e=>Vr(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(s.Z)("messages_views",(e=>{(0,Fe.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=_o(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}t&&t.restore()}))})),this.observer=new ur({root:this.scrollable.container}),this.listenerSetter.add(this.chat.appImManager)("chat_changing",(({to:e})=>{const t=e!==this.chat,i=()=>{this.observer.toggleObservingNew(t)};t?i():setTimeout((()=>{i()}),400)})),this.sendViewCountersDebounced=(0,Ii.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0)}get peerId(){return this.chat.peerId}createScrollSaver(e=!0){return new hr(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,l=this.scrollable.isScrolledDown;r===t||s&&l||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},l=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})},c=this.resizeObserver=new ResizeObserver((e=>{if(s)return void l(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let c=r+a;const d=c%1;if(c-=d,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void l(!1);if(n+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.setScrollTopSilently(e)}l(!1),a=d,t=o}));c.observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(ks)("toggle",this.unhoverPrevious),this.listenerSetter.add(vr.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){(0,De.Z)(e,"is-visible",t,200,t?void 0:()=>{e.remove()},2)}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=gr.Z.getFocusPromise().then((()=>Vr(this,void 0,void 0,(function*(){if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)pr(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),F.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}constructPinnedHelpers(){this.listenerSetter.add(s.Z)("peer_pinned_messages",(e=>{const{peerId:t,mids:i,pinned:s}=e;t===this.peerId&&i&&(s||this.deleteMessagesByIds(i))}))}constructScheduledHelpers(){const e=()=>Vr(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(s.Z)("scheduled_new",(({peerId:t,mid:i})=>{t===this.peerId&&(this.renderNewMessagesByIds([i]),e())})),this.listenerSetter.add(s.Z)("scheduled_delete",(({peerId:t,mids:i})=>{t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}onGoDownClick(){return Vr(this,void 0,void 0,(function*(){if(!this.replyFollowHistory.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.replyFollowHistory.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=Oi.height/2>e.top}else s&&(a=!1);a&&this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(e),1)})),this.replyFollowHistory.sort(((e,t)=>t-e));const s=this.replyFollowHistory.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=sr(this.scrollable.container,e,"center");return t&&(t=(0,mt.Z)(t,"bubble")),t}getGroupedBubble(e){return Vr(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return Vr(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,ia.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length&&(e?(F.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(F.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t)))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new u.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),hi.Z}updateUnreadByDialog(){return Vr(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===s.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}deleteMessagesByIds(e,t=!0,i){let s=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(s=!0,delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(t),this.observer&&(this.observer.unobserve(t,this.unreadedObserverCallback),this.unreaded.delete(t),this.observer.unobserve(t,this.viewsObserverCallback),this.viewsMids.delete(e)),this.emptyPlaceholderBubble===t&&(this.emptyPlaceholderBubble=void 0))})),s&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),h.Z.checkAnimations(!1,rp),this.deleteEmptyDateGroups(),i||this.onScroll())}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessagesByIds(e,t){const i=this._renderNewMessagesByIds(e,t);return this.renderNewPromises.add(i),i.catch(pt.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessagesByIds(e,t){return Vr(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>{i()&&this.renderNewMessagesByIds(e)}))}return}this.chat.threadId&&(e=yield Vi(e,(e=>Vr(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=null==t?void 0:t.reply_to;return i&&(i.reply_to_top_id||i.reply_to_msg_id)===this.chat.threadId}))))),e=e.filter((e=>!this.bubbles[e])),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:e},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,mt.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e.group.firstItem===e&&(0,Tn.Z)(e.group.container)===(this.stickyIntersector?qr:1)&&(a=e.group.container.parentElement)}const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),r=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:o?({rect:e})=>{let t=Oi.height;return t-=this.container.offsetTop,t-=l.Z.isMobile||Oi.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{this.onScroll(!0,e)}});return i===Bi.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),r}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return Vr(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}scrollToBubbleIfLast(e){return Vr(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,m.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===ar)i=(0,m.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new m.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,m.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){const{date:t,dateTimestamp:i}=this.getDateForDateContainer(e);if(!this.dateMessages[i]){const s=this.createDateBubble(e,t),n=this.createDateBubble(e,t);n.classList.add("is-fake");const a=document.createElement("section");a.className="bubbles-date-group",a.append(s,n),this.dateMessages[i]={div:s,container:a,firstTimestamp:t.getTime()};const o=(0,ia.Z)(this.dateMessages,"asc");let r,l=0,c=o.length;for(;lthis.setPeerTempId===a,c=fr(l,Qr);e||(yield c(this.chat.onChangePeer(c)));const d=this.chat.type;("scheduled"===d||this.chat.isRestricted)&&(i=0);const u=yield c(this.chat.getHistoryStorage());let m="pinned"===d?yield c(this.managers.appMessagesManager.getPinnedMessagesMaxId(t)):null!==(n=u.maxId)&&void 0!==n?n:0;const g=void 0!==i;let v,f,y,b=0;if(!g)if(e||(f=this.chat.appImManager.getChatSavedPosition(this.chat)),f);else if(m){b=yield c(this.managers.appMessagesManager.getReadMaxIdIfUnread(t,this.chat.threadId));const s=yield c(this.managers.appMessagesManager.getDialogOnly(t));if(!b||e||s&&1===s.unread_count)i=m;else{const e=u.history.findSliceOffset(b);e&&e.slice.isEnd(ir.D.Bottom)&&(y=e.slice[e.offset-25]||e.slice[0]||b),v=!g,i=b}}const w=i!==m;if(void 0===s&&(yield c(this.chat.isStartButtonNeeded()))&&(s=oe.gZ),e){const e=yield c(this.getMountedBubble(i));if(e)return g?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",i,!1)):m&&!w&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",i,!0)),void 0!==s&&this.chat.input.setStartParam(s),null}else this.peerId&&(this.lazyLoadQueue.queueId=++$r,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.replyFollowHistory.length=0,this.passEntities={messageEntityBotCommand:(yield c(this.managers.appPeersManager.isAnyGroup(t)))||(yield c(this.managers.appUsersManager.isBot(t)))};F.ZP&&r("setPeer peerId:",t,u,i,m);const S=null!=y?y:w||"scheduled"===d||this.chat.isRestricted?0:m;let C=0;if(e){let e=this.getBubbleByPoint("bottom");e&&(C=+e.dataset.mid),C<=0&&(C=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const L=this.chatInner,I=this.emptyPlaceholderBubble;this.cleanup();const M=this.chatInner=document.createElement("div");e?(M.className=L.className,M.classList.remove("disable-hover","is-scrolling")):M.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const E=e||m&&w||g,P=C>0&&(!i||Cthis.performHistoryResult({history:f.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield c(this.getHistory1(i,!0,w,S)),this.setPeerCached=x.cached,r.warn("got history");const{promise:A,cached:Z}=x;Z||e||(yield c(this.chat.finishPeerChange(g,w,i,s)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),h.Z.lockGroup(rp);const D=c(A).then((()=>Vr(this,void 0,void 0,(function*(){r.warn("promise fulfilled");let n=E?yield c(i?this.getMountedBubble(i):{bubble:this.getLastBubble()}):void 0;Z&&!e&&(r.warn("finishing peer change"),yield c(this.chat.finishPeerChange(g,w,i,s)),r.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,p.Z)(a.container,M),I&&this.cleanupPlaceholders(I),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),g||"chat"!==this.chat.type||this.chat.topbar.pinnedMessage.setCorrectIndex(0),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),r.warn("mounted chat",this.chatInner===M,this.chatInner.parentElement,performance.now()-o),h.Z.unlockGroup(rp),h.Z.checkAnimations(!1,rp),this.lazyLoadQueue.unlock(),f)a.setScrollTopSilently(f.top);else if(E){let t;if(k)a.setScrollTopSilently(99999);else if(T){const e=this.setTopPadding();e.isPaddingNeeded&&(t=e.unsetPadding),a.setScrollTopSilently(0)}let s,o=v&&this.firstUnreadBubble||(null==n?void 0:n.bubble);if((null==o?void 0:o.parentElement)||(o=this.findNextMountedBubbleByMsgId(i,!1)||this.findNextMountedBubbleByMsgId(i,!0)),o){const t=this.getLastBubble(),i=v?"start":w||g||t!==o?"center":"end";s="end"===i&&t===o&&e?this.scrollToEnd():this.scrollToBubble(o,i,e?void 0:Bi.f.Static),!v&&g&&this.highlightBubble(o)}t&&(s||Promise.resolve()).then((()=>{t()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const l=Promise.all([D,(0,Ne.e9)()]);if(l.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",i,!w),this.setFetchReactionsInterval(l),this.setFetchHistoryInterval({afterSetPromise:l,lastMsgId:i,samePeer:e,savedPosition:f,topMessage:m}),r("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&m&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===d){const e=yield c(this.managers.appMessagesManager.getDialogOnly(t));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(t,!0)}})))).catch((e=>{throw r.error("getHistory promise error:",e),l()||this.preloader.detach(),e}));return{cached:Z,promise:D}}))}setFetchReactionsInterval(e){return Vr(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(yield this.managers.appPeersManager.isChannel(this.peerId)){const i=()=>Vr(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,Ne.e9)(),(0,dr.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return Vr(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,a=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!a)return;if(yield i,!e())return;if(this.setLoaded("bottom",!1),this.scrollable.checkForTriggers(),!a)return;const o=()=>{this.fetchNewPromise=new Promise((i=>Vr(this,void 0,void 0,(function*(){e()&&(yield this.managers.appMessagesManager.isFetchIntervalNeeded(t))?this.managers.appMessagesManager.getNewHistory(t,this.chat.threadId).then((t=>{if(!e()||!t)return void i();const{isBottomEnd:s}=t;this.scrollable.loadedAll.bottom&&this.scrollable.loadedAll.bottom!==s&&(this.setLoaded("bottom",s),this.onScroll()),setTimeout(o,3e4),i()})):i()})))).finally((()=>{this.fetchNewPromise=void 0}))};n?setTimeout(o,3e4):o()}))}onScrolledAllDown(){return Vr(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return Vr(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.managers.appPeersManager.isChannel(this.peerId),this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.messagesQueue.push(e),this.setMessagesQueuePromise()}setMessagesQueuePromise(){if(!this.messagesQueue.length)return Promise.resolve();if(this.messagesQueuePromise)return this.messagesQueuePromise;const e=this.getMiddleware(),t=this.log.bindPrefix("queue"),i=fr(e,Qr),s=()=>Vr(this,void 0,void 0,(function*(){var e;t("start");const n=this.messagesQueue.slice();this.messagesQueue.length=0;const a=n.map((e=>{const i=performance.now();return e.then((e=>{t("render message time",performance.now()-i,e)})),e}));let o=yield i(Promise.all(a));const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));o=r(o),t("messages rendered");const l=null===(e=o[0])||void 0===e?void 0:e.reverse,{groups:c,avatarPromises:d}=this.groupBubbles(o.filter((e=>e.updatePosition))),h=o.reduce(((e,i)=>{const s=performance.now(),n=i.promises.slice(),a=n.map((e=>Vr(this,void 0,void 0,(function*(){return yield e,performance.now()-s}))));return Promise.all(a).then((e=>{t.groupCollapsed("media message time",performance.now()-s,i,e),e.forEach(((e,i)=>{t("media message time",e,i,n[i])})),t.groupEnd()})),e.push(...i.promises),e}),[]);h.push(...d),t("media promises to call",h,o,this.isHeavyAnimationInProgress),yield i(Promise.all([...h,this.setUnreadDelimiter()])),yield i((0,Fe.AD)()),t("media promises end"),o=r(o);const u=this.prepareToSaveScroll(l);this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),this.ejectBubbles();for(const e of this.bubblesToReplace){if(!o.find((t=>t.bubble===e)))continue;const t=this.bubbleGroups.getItemByBubble(e);t.mounted=!1,c.includes(t.group)||c.push(t.group),this.bubblesToReplace.delete(e)}if(this.chat.selection.isSelecting&&o.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),o.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(c),this.updatePlaceholderPosition&&this.updatePlaceholderPosition(),u&&u(),this.messagesQueue.length)return t("have new messages to render"),s();t("end")}));t("setting pause");const n=this.messagesQueuePromise=i((0,dr.Z)(0)).then(s).finally((()=>{this.messagesQueuePromise===n&&(this.messagesQueuePromise=null)}));return n}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const t=this.bubbleGroups.groupUngrouped(),i=Array.from(t).map((e=>{if(e.avatar)return;const t=e.firstItem;return this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);return{groups:[...t],avatarPromises:i}}getMiddleware(e){return this.middleware.get(e)}safeRenderMessage(e,t,i,s=!0,n){return Vr(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware();let o;try{this.renderingMessages.add(e.mid);const r=document.createElement("div");r.dataset.mid=""+e.mid,r.dataset.peerId=""+e.peerId,r.dataset.timestamp=""+e.date,i&&(this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.add(r),this.bubbleGroups.changeBubbleByBubble(i,r)),i=this.bubbles[e.mid]=r;let l=this.renderMessage(e,t,i);n&&(l=n(l,i));const c=l.then((e=>e&&a()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),o=yield c,!a())return;o||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return a()?(this.renderingMessages.delete(e.mid),o):void 0}))}renderMessage(e,t=!1,i){var o,c;return Vr(this,void 0,void 0,(function*(){const d="message"===e._,h=d&&e.grouped_id;let u,p;const g="pinned"!==this.chat.type;if(h&&g){u=yield this.managers.appMessagesManager.getMidsByAlbum(h);const t=Yr(u);if(e.mid!==t)return}d&&(p=h?yield this.managers.appMessagesManager.getGroupsFirstMessage(e):e);const v=this.chat.isOurMessage(e),f=document.createElement("div");let y,b;f.classList.add("message"),b=document.createElement("div"),b.classList.add("bubble-content-wrapper"),y=document.createElement("div"),y.classList.add("bubble-content"),i.classList.add("bubble"),b.append(y),i.append(b),v||e.pFlags.out||!this.observer||(e.pFlags.unread||pr(e))&&(this.observer.observe(i,this.unreadedObserverCallback),this.unreaded.set(i,e.mid));const w=[],S={bubble:i,promises:w,message:e,reverse:t};if(!("messageService"!==e._||e.action&&Wr.has(e.action._))){const t=e.action;if(t){const e=t._;if(Gr.has(e)||m.Hz.hasOwnProperty(e)&&!m.Hz[e])return}i.className="bubble service",y.innerHTML="";const s=document.createElement("div");if(s.classList.add("service-msg"),t){let i;if("messageActionChannelMigrateFrom"===t._){const e=new Ft;i=e.update({peerId:t.chat_id.toPeerId(!0)}),s.append((0,m.ag)("ChatMigration.From",[e.element]))}else if("messageActionChatMigrateTo"===t._){const e=new Ft;i=e.update({peerId:t.channel_id.toPeerId(!0)}),s.append((0,m.ag)("ChatMigration.To",[e.element]))}else s.append(yield yn(e))}return y.append(s),e.pFlags.is_single&&i.classList.add("is-group-last"),S}let C,L,I=d&&e.media;if(d)if((null==I?void 0:I.document)&&!["video","gif"].includes(I.document.type));else if(h&&g){const e=yield this.managers.appMessagesManager.getAlbumText(h);C=e.message,L=e.totalEntities}else"sticker"!==(null===(o=null==I?void 0:I.document)||void 0===o?void 0:o.type)&&(C=e.message,L=e.totalEntities);else"messageActionPhoneCall"===e.action._&&(I={_:"messageMediaCall",action:e.action});let M=(0,Qt.Z)(C,{entities:L,passEntities:this.passEntities}),E=!0,P=!1,k=!0;if(L&&!I){let e=L.filter((e=>"messageEntityEmoji"===e._)),t=C.length;if(e.reduce(((e,t)=>e+t.length),0)===t&&e.length<=3&&L.length===e.length){if(s.Z.settings.emoji.big){let t=yield this.managers.appStickersManager.getAnimatedEmojiSticker(C);if(1===e.length&&!I&&t)I={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),(0,r.Z)(t,M),i.classList.add("emoji-"+e.length+"x"),y.append(t)}i.classList.add("is-message-empty","emoji-big"),P=!0,E=!1,k=!1}i.classList.add("can-have-big-emoji")}}k&&(0,r.Z)(f,M);const T=tr.setTime({chatType:this.chat.type,message:e,reactionsMessage:p});if(f.append(T),y.prepend(f),d&&e.views){if(i.classList.add("channel-post"),!(null===(c=e.fwd_from)||void 0===c?void 0:c.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),y.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const x=d&&e.reply_markup;if(x&&"replyInlineMarkup"===x._&&x.rows&&x.rows.length){const t=x.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach((t=>{const i=t.buttons;if(!i||!i.length)return;const o=document.createElement("div");o.classList.add("reply-markup-row"),i.forEach((t=>{const i=(0,Qt.Z)(t.text,{noLinks:!0,noLinebreaks:!0});let s;switch(t._){case"keyboardButtonUrl":s=an((0,Qt.Z)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]})).firstElementChild,s.classList.add("is-link","tgico");break;case"keyboardButtonSwitchInline":s=document.createElement("button"),s.classList.add("is-switch-inline","tgico"),(0,n.fc)(s,(i=>{(0,a.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new Gn({[this.peerId]:[]},(t=>{e(t)}),!0);i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;default:s=document.createElement("button")}s.classList.add("reply-markup-button","rp"),"string"==typeof i?s.insertAdjacentHTML("beforeend",i):s.append(i),(0,ye.Z)(s),o.append(s)})),s.append(o)})),(0,n.fc)(s,(i=>{let s=i.target;if(s.classList.contains("reply-markup-button")||(s=(0,mt.Z)(s,"reply-markup-button")),!s||s.classList.contains("is-link")||s.classList.contains("is-switch-inline"))return;(0,a.Z)(i);const n=(0,Tn.Z)(s),o=t[(0,Tn.Z)(s.parentElement)];if(!o.buttons||!o.buttons[n])return void this.log.warn("no such button",o,n,e);const r=o.buttons[n];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,r).then((e=>{"string"==typeof e.message&&e.message.length&&Ci((0,Qt.Z)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),E=!1,i.classList.add("with-reply-markup"),b.append(s)}const A=e.pFlags.is_outgoing;if(v){(e.pFlags.unread||A)&&this.unreadOut.add(e.mid);let t="";t=A?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}A&&i.classList.add("is-outgoing");const Z=d&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),D=!!Z&&e.mid>0;D&&i.classList.add("with-replies");const F=d&&e.fwd_from,_=d&&e.fwdFromId,B=this.chat.isOutMessage(e);let R=y;const N=!(e.viaBotId||e.fromId!==s.Z.myId&&e.pFlags.out);if(I){let t=document.createElement("div");t.classList.add("attachment"),C||i.classList.add("is-message-empty");let n=!1;switch(I._){case"messageMediaPhoto":{const s=I.photo;if(C||(E=!1),N&&i.classList.add("hide-name"),i.classList.add("photo"),g&&h&&1!==u.length){i.classList.add("is-album","is-grouped");const e=Gt({groupId:h,attachmentDiv:t,middleware:this.getMiddleware(),isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:w,autoDownload:this.chat.autoDownload});w.push(e);break}const n=!qe.IS_ANDROID&&E&&!D&&!1;n&&i.classList.add("with-media-tail"),ot({photo:s,message:e,container:t,withTail:n,isOut:B,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:w,autoDownloadSize:this.chat.autoDownload.photo});break}case"messageMediaWebPage":{n=!0;let t=I.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let s=document.createElement("div");s.classList.add("web");let a,o,c=document.createElement("div");c.classList.add("quote");const d=t.photo;(d||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));let h=document.createElement("div");h.classList.add("quote-text");const u=t.document;if(u)if("gif"===u.type||"video"===u.type||"round"===u.type){const t="round"===u.type?l.Z.active.round:l.Z.active.webpage;"round"===u.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),Vt({doc:u,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:B,group:rp,loadPromises:w,autoDownload:this.chat.autoDownload})}else{const t=yield qt({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:w,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}}});o.append(t),o.classList.add("preview-with-document"),h.classList.add("has-document")}let p;if(a&&h.append(a),t.site_name){const e=an((0,Qt.Z)(t.url)).firstElementChild;e.classList.add("webpage-name");const i=document.createElement("strong");(0,r.Z)(i,(0,Tt.Z)(t.site_name)),e.textContent="",e.append(i),h.append(e),p=e}const m=na(t);if(m.textContent){let e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,r.Z)(t,m),e.append(t),h.append(e),p=e}const g=sa(t);if(g.textContent){let e=document.createElement("div");e.classList.add("text"),(0,r.Z)(e,g),h.append(e),p=e}if(c.append(h),d&&!u){i.classList.add("photo");const t=d.sizes[d.sizes.length-1];let s=!1;t.w===t.h&&p?(i.classList.add("is-square-photo"),s=!0,nt(d,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),ot({photo:d,message:e,container:o,boxWidth:s?0:l.Z.active.webpage.width,boxHeight:s?0:l.Z.active.webpage.height,isOut:B,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:w,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}s.append(c),f.insertBefore(s,T);break}case"messageMediaDocument":{const s=I.document;if(s.sticker){i.classList.add("sticker"),E=!1,P=!0,s.animated&&i.classList.add("sticker-animated");const e=l.Z.active,n=i.classList.contains("emoji-big")?e.emojiSticker:s.animated?e.animatedSticker:e.staticSticker;nt(s,t,n.width,n.height),y.style.minWidth=t.style.width,y.style.minHeight=t.style.height,di({doc:s,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:rp,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?C:void 0,withThumb:!0,loadPromises:w})}else if("video"===s.type||"gif"===s.type||"round"===s.type){const n="round"===s.type;if(n&&(P=!0),!n&&C||(E=!1),N&&i.classList.add("hide-name"),i.classList.add(n?"round":"video"),g&&h&&1!==u.length)i.classList.add("is-album","is-grouped"),yield Gt({groupId:h,attachmentDiv:t,middleware:this.getMiddleware(),isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:w,autoDownload:this.chat.autoDownload});else{const a=!qe.IS_ANDROID&&!qe.IS_APPLE&&!n&&E&&!D&&!1;a&&i.classList.add("with-media-tail"),Vt({doc:s,container:t,message:e,boxWidth:l.Z.active.regular.width,boxHeight:l.Z.active.regular.height,withTail:a,isOut:B,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:rp,loadPromises:w,autoDownload:this.chat.autoDownload,searchContext:n?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:l,searchContext:c,useSearch:d,sizeType:h,managers:u}){return Yt(this,void 0,void 0,(function*(){let d;const p=e?yield n.getMidsByMid(t.mid):[t.mid],m=p.map(((e,t)=>Yt(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield qt({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:l,searchContext:c,sizeType:h,managers:u}),m=document.createElement("div");m.classList.add("document-container"),m.dataset.mid=""+e,m.dataset.peerId=""+i.peerId;const g=document.createElement("div");if(g.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message");const t=(0,Qt.Z)(i.message,{entities:i.totalEntities});(0,r.Z)(e,t),g.append(e)}if(p.length>1){const e=document.createElement("div");e.classList.add("document-selection"),m.append(e),m.classList.add("grouped-item"),0===t&&(d=g)}return g.append(s),m.append(g),m})))),g=yield Promise.all(m);return s.append(...g),p.length>1&&i.classList.add("is-multiple-documents","is-grouped"),d}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:f,chat:this.chat,loadPromises:w,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===s.type||"audio"===s.type?{peerId:this.peerId,inputFilter:{_:"voice"===s.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName"});t&&(R=t);const a=f.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(T),i.classList.remove("is-message-empty"),f.classList.add((["photo","pdf"].includes(s.type)?"document":s.type||"document")+"-message"),n=!0}break}case"messageMediaCall":{const e=I.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const s=e.pFlags.video?"video":"voice";t.dataset.type=s;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,m.$d)(a,B?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append(mn(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,m.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),n=!0,i.classList.remove("is-message-empty"),f.classList.add("call-message"),f.append(t);break}case"messageMediaContact":{const e=I,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,n=!0;const s=document.createElement("div");s.className="contact-details";const a=document.createElement("div");a.className="contact-name",a.append((0,Tt.Z)([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+(0,ls.u)(e.phone_number).formatted:"Unknown phone number",t.append(s),s.append(a,o);const r=new Mp;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),t.prepend(r),i.classList.remove("is-message-empty"),f.classList.add("contact-message"),f.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=s.Z.managers){const i=new tn;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);f.prepend(t),f.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),f.append((0,m.ag)(m.nK),T),this.log.warn("unrecognized media type:",I._,e)}n||y.append(t)}P&&i.classList.add("just-media");let U="";const O=e.fromId!==s.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(O||F||e.reply_to_mid){let t,n;const a=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===_;let o,l=F&&!F.from_id;if(e.viaBotId&&(n=document.createElement("span"),n.innerText="@"+(yield this.managers.appUsersManager.getUser(e.viaBotId)).username,n.classList.add("peer-title"),i.classList.add("must-have-name")),l?(t=document.createElement("span"),(0,r.Z)(t,(0,Tt.Z)(F.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Ft({peerId:_||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&d&&(yield tr.setReply({chat:this.chat,bubble:i,bubbleContainer:y,message:e})),_||F)if(this.peerId===s.Z.myId||a||i.classList.add("forwarded"),e.savedFrom&&(U=e.savedFrom,t.dataset.savedFrom=U),o=document.createElement("div"),t.dataset.peerId=""+_,this.peerId!==s.Z.myId&&this.peerId!==oe.hj&&!a||P){const e=[t];P&&e.unshift(document.createElement("br")),o.append((0,m.ag)("ForwardedFrom",[e]))}else o.style.color=Ss(_,!1),o.append(t);else if(!e.viaBotId)if(!P&&O){o=document.createElement("div"),o.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&o.append(ms(s.scam)),v||(o.style.color=Ss(e.fromId,!1)),o.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append((0,m.ag)("ViaBot")," ",n),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),R.append(o))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(U=`${this.chat.peerId}_${e.mid}`),Z&&Z.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),U&&("pinned"===this.chat.type||F.saved_from_msg_id)&&this.peerId!==oe.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),y.append(e),i.dataset.savedFrom=U,i.classList.add("with-beside-button")}return i.classList.add(B?"is-out":"is-in"),D&&tr.renderReplies({bubble:i,bubbleContainer:y,message:Z,messageDiv:f,loadPromises:w,lazyLoadQueue:this.lazyLoadQueue})&&(E=!0),d&&this.appendReactionsElementToBubble(i,e,p),E&&(i.classList.add("can-have-tail"),y.append(Jr())),S}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser())return;if(!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new Yo;if(n.init(i,"block"),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=tr.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return;const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())}}performHistoryResult(e,t){return Vr(this,void 0,void 0,(function*(){let i=e.history;i=i.slice(),this.needReflowScroll&&(nr(this.scrollable.container),this.needReflowScroll=!1);const s=yield Promise.all(i.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),n=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),s=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!s.isEnd(ir.D.Bottom)||s.length&&!i.includes(s[0])||(t.bottom=!0),!n.isEnd(ir.D.Top)||n.length&&!i.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i}=this.setPeerOptions;this.setPeerOptions=void 0,e&&!this.bubbles[i]&&e!==i||(t.bottom=!0)}t.top&&n.push(this.setLoaded("top",!0)),t.bottom&&n.push(this.setLoaded("bottom",!0))}yield Promise.all(n);const a=s.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(a),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional())}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return Vr(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,ia.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const l=r.slice(r.findIndex((e=>o>e))),c=i?[]:[o],d=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();F.ZP&&a("targeting mid:",o,n,e,l.map((e=>(0,si.Z)(e))),d.map((e=>(0,si.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,m=(e,t=0)=>{const i=(0,Re.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const l=r.lastElementChild,c=[l],d=this.bubbleGroups.getItemByBubble(r);if(d&&d.group.avatar&&d.group.lastItem===d&&c.push(d.group.avatar),c.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===l&&(i.resolve(),l.removeEventListener("transitionend",e))};l.addEventListener("transitionend",e)}h.push(...c)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},g=m(l,p),v=m(c),f=m(d,p),y=[g.animationPromise,v.animationPromise,f.animationPromise],b=[g.lastMsDelay,v.lastMsDelay,f.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,Fe.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(l.length||c.length||d.length)&&(w=Promise.all(y),(0,Ne.YW)(w,Math.max(...b)+200).then((()=>{(0,Fe.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return Vr(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let o,r;if(t.classList.add(i,i+"-"+e),"group"===e?o=(0,m.ag)("GroupEmptyTitle1"):"saved"===e?o=(0,m.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?o=(0,m.ag)("NoMessages"):"noScheduledMessages"===e?o=(0,m.ag)("NoScheduledMessages"):"restricted"===e&&(o=document.createElement("span"),o.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),o.classList.add("center",i+"-title"),s.push(o),"group"===e)s.push((0,m.ag)("GroupEmptyTitle2")),r=[(0,m.ag)("GroupDescription1"),(0,m.ag)("GroupDescription2"),(0,m.ag)("GroupDescription3"),(0,m.ag)("GroupDescription4")];else if("saved"===e)r=[(0,m.ag)("ChatYourSelfDescription1"),(0,m.ag)("ChatYourSelfDescription2"),(0,m.ag)("ChatYourSelfDescription3"),(0,m.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,m.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const o=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>Vr(this,void 0,void 0,(function*(){if(!o())return;const i=[];return yield di({doc:e,div:t,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:rp,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,n.fc)(t,(e=>{(0,a.Z)(e),Or.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}r&&(s.push(...r.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?r.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&r.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="•",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t){return Vr(this,void 0,void 0,(function*(){const i=!!e.pFlags.sponsored,a=fr(this.getMiddleware());return this.safeRenderMessage(e,!i,void 0,!1,(o=>Vr(this,void 0,void 0,(function*(){const{bubble:r}=yield a(o);if(!r)return o;r.classList.add("is-group-last","is-group-first");const l=()=>{this.updatePlaceholderPosition===l&&(this.updatePlaceholderPosition=void 0),u[p](r)};i||(r.classList.add("bubble-first"),r.classList.remove("can-have-tail","is-in"));const c=[],d=yield a(this.managers.appPeersManager.isBot(this.peerId));let h,u=this.container,p="append";if(this.chat.isRestricted)h=this.renderEmptyPlaceholder("restricted",r,e,c);else{if(i){let t,i,s,a;r.classList.add("avoid-selection");const l=this.sponsoredMessage=e.sponsoredMessage,c=(0,_i.Z)(l.from_id);l.channel_post?(t="OpenChannelPost",i=(0,mr.Z)(l.channel_post)):l.start_param||d?(t="Chat.Message.ViewBot",s=l.start_param):t=(yield this.managers.appPeersManager.isAnyGroup(c))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",a=l.chat_invite?()=>{new cr(l.chat_invite_hash,l.chat_invite)}:l.chat_invite_hash?()=>{const e={_:lr.JOIN_CHAT,invite:l.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:c,lastMsgId:i,startParam:s})};const h=(0,L.Z)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.observer.observe(h,this.viewsObserverCallback),a&&(0,n.fc)(h,a),r.querySelector(".bubble-content").prepend(h),o}if(d&&"message"===e._){const e=document.createElement("b");e.append((0,m.ag)("BotInfoTitle")),c.push(e,"\n\n"),u=this.chatInner,p="prepend"}else h=(yield a(this.managers.appPeersManager.isAnyGroup(this.peerId)))&&(yield a(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",r,e,c):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",r,e,c):s.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",r,e,c):this.peerId.isUser()&&!d&&(yield a(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",r,e,c):this.renderEmptyPlaceholder("noMessages",r,e,c)}h&&(yield h),c.length&&r.querySelector(".message, .service-msg").prepend(...c);const g=!!this.messagesQueueOnRenderAdditional,v=this.setPeerCached&&!g;if(v){const e=r.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(pt.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||v||(t=!0),g||t?(this.updatePlaceholderPosition=l,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,Fe.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,l()}:this.updatePlaceholderPosition=l,!g&&t){yield a((0,Ne.e9)());const t=(0,ia.Z)(this.bubbles);(0,P.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return this.emptyPlaceholderBubble=r,o}))))}))}generateLocalMessageId(e=0){let t=("scheduled"===this.chat.type?-1:0)+e;const i=-Math.abs(t);return{id:i,mid:-Math.abs((0,mr.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return Vr(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Jt.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return function({overflowElement:e,selector:t,extraSize:i}){const s=e.getBoundingClientRect(),n=Array.from(e.querySelectorAll(t)),a=[],o=[],r=[];let l=!1;for(const t of n){const i=t.getBoundingClientRect(),n=rr(t,e,!1,i,s);let c;n?(l=!0,c=o):c=l?r:a,c.push({element:t,rect:i,visibleRect:n})}if(i&&o.length){const e=o[0].rect.top-i,t=o[o.length-1].rect.bottom+i;for(let t=a.length-1;t>=0;--t){const i=a[t];i.rect.top>=e&&(a.splice(t,1),o.unshift(i))}for(let e=0,i=r.length;e+e.dataset.mid));let o;!!i.length==!!s.length||t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(qe.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return Vr(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,i?!this.chat.isRestricted&&("bottom"===e&&(yield this.managers.appPeersManager.isBroadcast(this.peerId))&&this.toggleSponsoredMessage(t),"top"===e&&t&&(yield this.managers.appPeersManager.isBot(this.peerId)))?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return Vr(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&!this.bubbles[i]&&this.getSponsoredMessagePromise===s)),s=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>Vr(this,void 0,void 0,(function*(){const s=i.messages[0];if(!s)return void t("no message");const n=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{e()&&(t("rendering",i),this.performHistoryResult({history:[i]},!1))}))})))).finally((()=>{this.getSponsoredMessagePromise=void 0}))}else t("clearing rendered",i),this.deleteMessagesByIds([i]),this.getSponsoredMessagePromise=void 0}))}renderBotPlaceholder(){return Vr(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>Vr(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{e.message=s.bot_info.description}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return Vr(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).count||!Object.keys(this.bubbles).length||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,n=0,a=!1,o){return Vr(this,void 0,void 0,(function*(){const r=this.peerId,l=yield this.managers.appPeersManager.isBroadcast(r),c=Math.min(30,Oi.height/40|0);let d=l?20:Object.keys(this.bubbles).length>0?Math.max(35,c):c;if(void 0!==Kr){if(!Kr)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--Kr}let h,u=0;if(i&&(u=d,t||(d=0)),n&&!i)if("pinned"===this.chat.type)h=[n];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let p,m=yield this.requestHistory(e,d,u);const g=(null==h?void 0:h.length)&&!m.cached,v=this.isFirstLoad&&u&&!m.cached||g;g&&(p=m.result,m={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const f=e=>Vr(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(r)}})),y=e=>(0,Ne.e9)().then((()=>f(e))).then((()=>(!g&&n&&e.history.unshift(n),this.performHistoryResult(e,t)))),b=e=>{const t=Promise.resolve(e).then((e=>{if(o&&!o())throw Qr;if(!a)return y(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(m.cached){if(a)return this.scrollable.onScroll(),null;S=!0,w=y(yield m.result)}else S=!1,w=b(m.result);const C=g?b(p):w;if(v&&s.Z.settings.animationsEnabled){let i=g?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(n,h,g,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return a?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return Vr(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){let i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?qr:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Jr(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class el{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,n=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:n}=this;let a,o,r,l=[],c=[];const d=x.Z.MANAGERS,h=yield d.appPeersManager.canPinMessage(e),u=(s,a,o)=>{setTimeout((()=>{let s;s=i&&!t?h?d.appMessagesManager.unpinAllMessages(e):d.appMessagesManager.hidePinnedMessages(e):d.appMessagesManager.updatePinnedMessage(e,t,i,o,a),n&&s.then(n)}),300)};if(i){let i="UnpinMessage";t?(a="UnpinMessageAlertTitle",o="Chat.Confirm.Unpin"):h?(a="Popup.Unpin.AllTitle",o="Chat.UnpinAllMessagesConfirmation",r=[""+((yield d.appMessagesManager.getPinnedMessagesCount(e))||1)]):(a="Popup.Unpin.HideTitle",o="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),l.push({langKey:i,isDanger:!0,callback:u})}else{a="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(l.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield d.appChatsManager.isBroadcast(e.toChatId()))?o="PinMessageAlertChannel":(o="PinMessageAlert",c.push({text:"PinNotify",checked:!0}))):(o="PinMessageAlertChat",e===s.Z.myId?l.push({langKey:t,callback:u}):(l.push({langKey:t,callback:e=>u(0,!e.size)}),c.push({text:"PinAlsoFor",textArgs:[new Ft({peerId:e}).element],checked:!0})))}(0,x.x)(l),new ki("popup-delete-chat",{peerId:e,titleLangKey:a,descriptionLangKey:o,descriptionLangArgs:r,buttons:l,checkboxes:c}).show()},new((i=void 0)||(i=Promise))((function(s,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((n=n.apply(e,t||[])).next())}));var e,t,i,n}}function tl(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}function il(e,t,i){return s.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return d.Z.downloadMedia({media:s}).then((n=>{return a=this,o=void 0,c=function*(){const a=l.Z.active.emojiSticker,o=(0,oi.tB)(e),r=yield ni.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:o},"none");r.addEventListener("firstFrame",(()=>{ti(s,r.canvas,o),r.remove()}),{once:!0})},new((r=void 0)||(r=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(i,s)}n((c=c.apply(a,o||[])).next())}));var a,o,r,c}))}))}class sl extends ki{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&Li({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");ya({div:n,emoji:sl.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.append(n);const a=new f.Z({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}sl.STICKER_EMOJI="👮‍♀️";class nl extends ki{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,L.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const a=il(sl.STICKER_EMOJI);(0,n.fc)(this.body,(n=>{const o=(0,mt.Z)(n.target,"btn-primary"),r=s[(0,Tn.Z)(o)][1];a.then((()=>{this.hide(),new sl(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class al extends ki{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,m.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(m.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}]});const e=new u.ZP(void 0);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},this.description.replaceWith(e.container),e.container.append(this.description),e.container.classList.add("scrolled-top"),this.show()}}var ol=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class rl extends x.Z{constructor(e){super("popup-reacted-list",null,{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return ol(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message),t=yield this.managers.appMessagesManager.canViewMessageReadParticipants(e),i=new Yo,s=Object.assign(Object.assign({},e),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},e.reactions),{pFlags:{},recent_reactions:[]})});s.reactions.results=s.reactions.results.map((e=>Object.assign(Object.assign({},e),{pFlags:{}}))),i.init(s,"block"),i.render(),i.classList.add("no-stripe"),i.classList.remove("has-no-reactions"),i.append(this.btnClose),this.header.append(i);const n=document.createElement("div");n.classList.add("tabs-container"),n.dataset.animation="tabs";const a=new Map;let o=!1;if(s.reactions.results.length){const e=this.createFakeReaction("reactions",s.reactions.results.reduce(((e,t)=>e+t.count),0));i.prepend(e),s.reactions.results.unshift(e.reactionCount),o=!0}let r=!1;if(t)try{const t=yield this.managers.appMessagesManager.getMessageReadParticipants(e.peerId,e.mid);if(!t.length)throw"";const n=this.createFakeReaction("checks",t.length);i.prepend(n),s.reactions.results.unshift(n.reactionCount),r=!0}catch(e){}s.reactions.results.forEach((t=>{const i=new u.ZP(void 0);i.container.classList.add("tabs-tab");const s=new Uo({noShadow:!0,noDelimiter:!0}),o=$p.createChatList({dialogSize:72});$p.setListClickListener(o,(()=>{this.hide()}),void 0,!1,!0),s.content.append(o),i.container.append(s.container);const r="checks"!==t.reaction,l="checks"===t.reaction;let c;["checks","reactions"].includes(t.reaction)&&(t.reaction=void 0);const d=new Zi({scrollable:i,getPromise:()=>ol(this,void 0,void 0,(function*(){const i=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(e,void 0,t.reaction,c,r,l);return c=i.nextOffset,yield Promise.all(i.combined.map((({peerId:e,reaction:t})=>ol(this,void 0,void 0,(function*(){const{dom:i}=$p.addDialogNew({peerId:e,autonomous:!0,container:o,avatarSize:54,rippleEnabled:!1,meAsSaved:!1});if(t){const e=document.createElement("div");e.classList.add("reacted-list-reaction-icon"),di({doc:(yield this.managers.appReactionsManager.getReactionCached(t)).static_icon,div:e,width:24,height:24}),i.listEl.append(e)}(0,p.Z)(i.lastMessageSpan,re(yield this.managers.appUsersManager.getUser(e.toUserId())))}))))),!c}))});a.set(i.container,d),n.append(i.container)})),this.body.append(n);const l=(0,de.X)(i,n,((e,t)=>{if(e===i.childElementCount-1)return!1;const s=i.children[e],n=l.prevId();-1!==n&&i.children[n].setIsChosen(!1),s.setIsChosen(!0),a.get(t).load()}));l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new qo;i.init("block"),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const ll="btn-menu-reactions-reaction",cl=!qe.IS_SAFARI;class dl{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,mt.Z)(e.target,ll);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const s=this.widthContainer=document.createElement("div");s.classList.add("btn-menu-reactions-container"),s.classList.add("btn-menu-reactions-container-"+t);const a=this.container=document.createElement("div");a.classList.add("btn-menu-reactions");const o=this.scrollable="vertical"===t?new u.ZP(void 0):new u.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup="CHAT-MENU-REACTIONS-"+Date.now(),h.Z.setOverrideIdleGroup(this.animationGroup,!0),hi.Z||a.addEventListener("mousemove",this.onMouseMove),(0,n.fc)(a,(e=>{const t=(0,mt.Z)(e.target,ll);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),s.append(a),this.middleware=null!=i?i:(0,kn.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,$o.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,Fe.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),h.Z.setOverrideIdleGroup(this.animationGroup,!1),h.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return s.Z.settings.animationsEnabled&&!qe.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(ll);const i=document.createElement("div");i.classList.add(ll+"-scale");const s=document.createElement("div");let n;s.classList.add(ll+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(ll+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:e.reaction};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(hi.Z?1:1.25),l={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;di(Object.assign({doc:e.appear_animation,div:s,play:!0},l)).then((({render:e})=>e)).then((e=>{(0,Jt.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Jt.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),pt.Z)}))}),pt.Z);const i=di(Object.assign({doc:e.select_animation,div:n},l)).then((({render:e})=>e)).then((e=>((0,Jt.Z)(e),ni.Z.waitForFirstFrame(e)))).catch(pt.Z)}else delete l.needFadeIn,delete l.withThumb,di(Object.assign({doc:e.static_icon,div:s},l));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=rr(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}cl&&(i.style.transform=n)}}var hl=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ul{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,mt.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,mt.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{hl(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!tl(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention"),this.chat.selection.isSelecting&&!i){if(a)return;const e=yield this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));t&&(n=t)}}this.isOverBubble=!!i;const o=(0,mt.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=yield this.chat.getMessage(this.mid),this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0;const r=yield this.init();if(!r)return;s=r.element;const{cleanup:l,destroy:c,menuPadding:d,reactionsMenu:h,reactionsMenuPosition:u}=r;let p=!1;if(h){const e="is-visible";if(p=h.container.classList.contains(e),p&&h.container.classList.remove(e),"horizontal"===u){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{h&&h.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),p&&h.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>hl(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,n.tH)(this.chat.selection.selectionSendNowBtn):new Kn(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>hl(this,void 0,void 0,(function*(){if(tl()){const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];vi((yield Promise.all(e.map((e=>hl(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join(""))}else document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{vi(this.target.href)},this.onCopyLinkClick=()=>hl(this,void 0,void 0,(function*(){let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,si.Z)(i);let o,r="https://t.me/";n?(r+=n+"/"+(e?(0,si.Z)(e.fwd_from.channel_post):a),e&&(r+="?comment="+a),o="LinkCopied"):(r+="c/"+t.toChatId()+"/"+a,e&&(r+="?thread="+(0,si.Z)(e.mid)),o="LinkCopiedPrivateInfo"),Ci(m.ZP.format(o,!0)),vi(r)})),this.onPinClick=()=>{new el(this.peerId,this.mid)},this.onUnpinClick=()=>{new el(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>hl(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,n.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new Gn({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,mt.Z)(this.target,"grouped-item")||(0,mt.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>hl(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,n.tH)(this.chat.selection.selectionDeleteBtn):new jn(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new C.Z,this.attachListenerSetter=new C.Z,this.middleware=(0,kn.k)()}attachTo(e){this.attachListenerSetter.removeAll(),hi.Z?(0,n.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element","attachment"].join(", "))&&((0,a.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):Nn(e,this.onContextMenu,this.attachListenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return hl(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):Vi(e,(e=>hl(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||hi.Z,t=yield e.verify()),!!t}))))}))}setButtons(){this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,Jt.Z)(this.message),this.managers.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>hl(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>hl(this,void 0,void 0,(function*(){return(yield this.managers.appMessagesManager.canEditMessage(this.message,"text"))&&!!this.chat.input.messageInput}))},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>hl(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const i of t)if((yield this.managers.appMessagesManager.getMessageByPeer(e,i)).message)return!0;return!1})),notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{vi(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{vi(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>hl(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>hl(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>hl(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{d.Z.downloadToDisc({media:this.message.media.document})},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let i=!!hi.Z;const s=!t.type||!["gif","video","sticker"].includes(t.type);return s&&(i=i||!!(0,mt.Z)(this.target,"document")||!!(0,mt.Z)(this.target,"audio")),s&&i}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>hl(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.appMessagesManager.canEditMessage(this.message,"poll"))&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}))},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.fromId!==oe.yF||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new nl(this.peerId,[this.mid])},verify:()=>hl(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.appPeersManager.isChannel(this.peerId))})),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new rl(this.message)}},verify:()=>hl(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>hl(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(this.message)}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new al},verify:()=>!1,isSponsored:!0}]}init(){return hl(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=Vn(e,this.listenerSetter);t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>!e.icon));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new m.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,m.ag)("Chat.Context.ReactedFast",[a]):(0,m.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,m.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const l=22,c=3,d=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?d*Math.min(c,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new Ft({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;p=(0,m.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,m.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=d*Math.min(c,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new Ks({avatarSize:l});e.render(t?t.map((e=>(0,_i.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if("message"===this.message._&&!this.chat.selection.isSelecting&&!this.message.pFlags.is_outgoing&&!this.message.pFlags.is_scheduled){a=qe.IS_APPLE||hi.Z?"horizontal":"vertical",n=this.reactionsMenu=new dl(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0,i=0;s="vertical"===a?{top:t,left:e}:{top:e,right:i,left:t}}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}}var pl=i(4329),ml=i.n(pl),gl=i(9043);class vl{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=Vn(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Nn(e.onContextElement,(t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,a.Z)(t),ks.openBtnMenu(this.sendMenu))}),e.listenerSetter)}setPeerId(e){this.type=e===s.Z.myId?"reminder":"schedule"}}var fl=i(3735),yl=i(1293),bl=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class wl extends x.Z{constructor(e){super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,Ai.Z)(t,"LABEL"),s=(0,yl.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,Ai.Z)(t,"LABEL"),s=(0,Tn.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),m.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return bl(this,void 0,void 0,(function*(){if((0,m.$d)(this.title,"NewPoll"),this.questionInputField=new f.Z({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()})),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new vl({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,m.$d)(t,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const s=document.createElement("div");s.classList.add("caption"),(0,m.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new Pi.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new Pi.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new Pi.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),(0,m.$d)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),l=document.createElement("div");l.classList.add("poll-create-questions"),this.quizSolutionField=new f.Z({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const c=document.createElement("div");c.classList.add("subtitle"),(0,m.$d)(c,"AddAnExplanationInfo"),l.append(this.quizSolutionField.container,c),a.push(r,o,l),a.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...a),(0,n.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new u.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,fl.Z)(i,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,fl.Z)(this.quizSolutionField.input,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return bl(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,fl.Z)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}))}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,i=new f.Z({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new wi({text:"",name:"question"});s.main.append(i.container),(0,n.fc)(i.input,a.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Tn.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const o=document.createElement("span");o.classList.add("btn-icon","tgico-close"),i.container.append(o),(0,n.fc)(o,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}function Sl(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),$a({media:e,mediaSize:(0,st.C)(t,i),boxSize:(0,st.C)(320,240),quality:.9})}var Cl=i(2398);function Ll(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),(0,Cl.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s={};s.file=e;const n=document.createElement("div");n.classList.add("popup-item"),s.itemDiv=n;const a=i?this.attachMedia(s,n):this.attachDocument(s,n);return t.sendFileDetails.push(s),a},this.construct(i)}construct(e){return Il(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!1};const t=yield this.managers.apiManager.getConfig();if(this.captionLengthMax=t.caption_length_max,(0,n.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new vl({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new u.ZP(null);i.container.append(this.mediaContainer),this.inputField=new f.Z({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:this.captionLengthMax}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",(()=>{this.files=[],Ml=void 0})),Ml=this}))}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new Pi.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>o.Z.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new Pi.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.inputField.value;if(t.length>this.captionLengthMax)return void Ci(m.ZP.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat;s.forEach((e=>{e.itemDiv=void 0}));const{length:r}=s,l=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},l),{clearDraft:!0})),t=void 0);const s=Object.assign(Object.assign({},i),{sendFileDetails:e});this.managers.appMessagesManager.sendAlbum(a,s.sendFileDetails.map((e=>e.file)),Object.assign(Object.assign(Object.assign({},l),{caption:t,isMedia:n,clearDraft:!0}),s)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent()}attachMedia(e,t){return Il(this,void 0,void 0,(function*(){t.classList.add("popup-item-media");const i=e.file;let s;if(i.type.startsWith("video/")){const n=lt(),a=document.createElement("source");a.src=e.objectURL=yield bi.Z.invoke("createObjectURL",i),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),s=(0,ct.Z)(n).then((()=>Il(this,void 0,void 0,(function*(){e.width=n.videoWidth,e.height=n.videoHeight,e.duration=Math.floor(n.duration);const i=n.webkitAudioDecodedByteCount;void 0!==i&&(e.noSound=!i),t.append(n);const s=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{Sl(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(n);e.thumb=Object.assign({url:yield bi.Z.invoke("createObjectURL",s.blob)},s)})))),n.append(a)}else{const n=new Image;s=new Promise((s=>{n.onload=()=>{e.width=n.naturalWidth,e.height=n.naturalHeight,t.append(n),"image/gif"===i.type?(e.noSound=!0,Promise.all([Ll(n).then((t=>{e.duration=Math.ceil(t)})),Sl(n).then((t=>Il(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield bi.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{s()}))):s()}})),n.src=e.objectURL=yield bi.Z.invoke("createObjectURL",i)}return s}))}attachDocument(e,t){return Il(this,void 0,void 0,(function*(){t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");(s||n||i.size<2e7)&&(e.objectURL=yield bi.Z.invoke("createObjectURL",i));const a={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let o;e.objectURL&&(o={url:e.objectURL,downloaded:i.size,type:"full"});const r=yield qt({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}},cacheContext:o});return new Promise((i=>{const n=()=>{t.append(r),i()};if(s){const t=new Image;t.src=e.objectURL,t.onload=()=>{e.width=t.naturalWidth,e.height=t.naturalHeight,n()},t.onerror=n}else n()}))}))}shouldCompress(e){return"media"===this.willAttach.type&&o.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,p.Z)(t,(0,m.ag)(s,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const i=(0,we.Z)(t.width,t.height,380,320);e.style.width=i.width+"px",e.style.height=i.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{i.innerHTML="",e.length&&(this.setTitle(),this.iterate((e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Ee({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e.itemDiv,e)}))})))})).then((()=>{this.onRender()}))}}const kl="keydown",Tl="active",xl=["ArrowUp","ArrowDown"],Al=["ArrowLeft","ArrowRight"];class Zl extends S.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=function({list:e,type:t,onSelect:i,once:s,waitForKey:o}){let r=(null==o?void 0:o.length)?new Set(o):void 0;const l=new Set("xy"===t?xl.concat(Al):"x"===t?Al:xl);let c;const d=()=>c||e.querySelector(".active")||e.firstElementChild,h=(e,i)=>{if(c===e)return;let s=!1;c&&(s=!0,c.classList.remove(Tl)),c=e,c&&(c.classList.add(Tl),s&&g&&i&&(0,Bi.Z)({container:g,element:c,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},u=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let p;p="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):u(t,"ArrowRight"===i):(e,t)=>u(e,"ArrowRight"===t||"ArrowDown"===t);let m=i=>{const s=i.key;if(l.has(s)){if((0,a.Z)(i),e.childElementCount>1){let e=d();e=p(e,s),h(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,a.Z)(i),y(d()))};const g=(0,mt.Z)(e,"scrollable");e.classList.add("navigable-list");const v=t=>{const i=(0,Qn.Z)(t.target,e);i&&h(i,!1)},f=t=>{(0,a.Z)(t);const i=(0,Qn.Z)(t.target,e);i&&(h(i,!1),y(d()))},y=e=>{const t=i(e);(void 0!==t?!t:s)&&S()};let b=!1;const w=()=>{b||(b=!0,document.addEventListener(kl,m,{capture:!0,passive:!1}),e.addEventListener("mousemove",v,{passive:!0}),(0,n.fc)(e,f))},S=()=>{b&&(b=!1,document.removeEventListener(kl,m,{capture:!0}),e.removeEventListener("mousemove",v),(0,n.EN)(e,f))},C=()=>{r||h(e.firstElementChild,!1)};if(r){const e=m;m=t=>{r.has(t.key)&&((0,a.Z)(t),document.removeEventListener(kl,m,{capture:!0}),m=e,document.addEventListener(kl,m,{capture:!0,passive:!1}),r=void 0,C())}}else C();return w(),{attach:w,detach:S,resetTarget:C}}({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,qe.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},w.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(w.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,k.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(w.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const n=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,De.Z)(this.container,"is-visible",!e,s.Z.settings.animationsEnabled&&!i?300:0,(()=>{this.hidden&&this.dispatchEvent("hidden")}),n)}}class Dl extends Zl{constructor(e,t,i){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!Or.onMediaClick({target:e},!0),waitForKey:["ArrowUp","ArrowDown"]}),this.managers=i,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),s.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(l.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),s.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),il(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*l.Z.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},l.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0}))}))}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new u.ZP(this.container),this.lazyLoadQueue=new ve,this.superStickerRenderer=new Dr(this.lazyLoadQueue,rp,this.managers)}}const Fl=()=>{const e=new Date;return e.setHours(0,0,0,0),e},_l=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Bl extends jo{constructor(e,t,i){var s;if(super((s=e).getTime()>_l().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Fl(),maxDate:_l(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,L.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,n.fc)(e,(()=>{t(ar),this.hide()}))}}}var Rl=i(7298),Nl=i(6299),Ul=i(9041),Ol=i(6875);function Hl(e,t=!0){const i=[],s=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),i=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&i==t.endOffset){const s=i-1,n=e.childNodes;if(t.startContainer===e&&n[s]){a=n[s],o=0;for(let e=0;e{i.onEmojiSelected(Ir(e),!0)}}),this.managers=s,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new u.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{Lr(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class Vl extends Zl{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(Vl.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(Vl.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new u.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=Vl.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=Vl.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new Mp;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,r.Z)(n,(0,Tt.Z)(e.name)):n.append(new Ft({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,r.Z)(s,(0,Tt.Z)(e.description)),i.append(s)}return i}}Vl.BASE_CLASS="autocomplete-peer-helper",Vl.BASE_CLASS_LIST_ELEMENT=Vl.BASE_CLASS+"-list-element";var Gl=i(5082);function Wl(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new Gl.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class jl extends Vl{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${Vl.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=Wl(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class Kl{constructor(){this.helpers=new Set,this.middleware=(0,kn.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}var $l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ql extends Vl{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";e.username?s="@"+e.username:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>$l(this,void 0,void 0,(function*(){if(!n())return;const t=s.slice(1).toLowerCase(),i=e.map((e=>$l(this,void 0,void 0,(function*(){const i=yield this.managers.appUsersManager.getUser(e);if(!i.username||i.username.toLowerCase()!==t)return{peerId:e,description:i.username?"@"+i.username:void 0}}))));this.render((yield Promise.all(i)).filter(Boolean))})))),!0}}var Ql=i(5494),Yl=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Xl extends Nr{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Qn.Z)(t,this.element)||t===this.btnHover||((0,a.Z)(e),this.toggle(!1))},(0,k.Z)(this,e),this.element.classList.add(Xl.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(s.Z)("history_reply_markup",(({peerId:e})=>Yl(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,Ne.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>Yl(this,void 0,void 0,(function*(){yield this.render(),hi.Z&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})))),this.listenerSetter.add(this.element)("click",(e=>{const t=(0,mt.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:n}=this;"keyboardButtonRequestPhone"===i?yo({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(n,s.Z.myId)})):this.managers.appMessagesManager.sendText(n,t.dataset.text),this.toggle(!1)})),super.init()}checkForceReply(){return Yl(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return Yl(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}))}render(e){return Yl(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.element.textContent="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(Xl.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(Xl.BASE_CLASS+"-button","btn"),(0,r.Z)(t,(0,Tt.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.element.append(e)}}))}checkAvailability(e){var t;return Yl(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}Xl.BASE_CLASS="reply-keyboard";var Jl=i(7084),ec=i(515);const tc="INLINE-HELPER";class ic extends Zl{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ec.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,a=void 0,c=function*(){const s=this.controller.getMiddleware(),a=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==a._)throw"NOT_A_BOT";const o=this.managers.appInlineBotsManager.getInlineResults(e,a.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+a.id,i.dataset.queryId=""+t.query_id;const o=new Tr(null,tc,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const c=[],h=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=h?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),h)t.classList.add("grid-item");else{n.classList.add("empty"),(0,r.Z)(n,(0,Tt.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,r.Z)(s,(0,Tt.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,r.Z)(a,(0,Qt.Z)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),h&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>d.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,Jl.Z)(e).then((e=>{Ze(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&h)(0,Jt.Z)(i),"gif"===i.type?o.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,c),2===i.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(i){const e=h?48:void 0;h&&t.classList.add("no-border-radius"),ot({photo:i,container:h?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:c})}}}return Promise.all(c).then((()=>{if(!s())return void o.clear();i.classList.toggle("is-gallery",h),i.classList.toggle("super-stickers",h),this.container.classList.toggle("is-gallery",h);const c=this.list.parentElement;if(c.textContent="",t.switch_pm){const i=(0,L.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,r.Z)(i,(0,Tt.Z)(t.switch_pm.text)),(0,n.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,a.id,t.switch_pm.start_param)})),c.append(i)}c.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*l.Z.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},l.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:a,renderPromise:o}},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{r(c.next(e))}catch(e){t(e)}}function n(e){try{r(c.throw(e))}catch(e){t(e)}}function r(t){var s;t.done?e(t.value):(s=t.value,s instanceof o?s:new o((function(e){e(s)}))).then(i,n)}r((c=c.apply(s,a||[])).next())}));var s,a,o,c},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ii.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(l.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new u.ZP(this.container),this.lazyLoadQueue=new ve,this.superStickerRenderer=new Dr(this.lazyLoadQueue,tc,this.managers)}}var sc=i(8090);class nc extends Vl{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${Vl.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,$o.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=Wl(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var ac=i(6241),oc=i(6535),rc=i(2821);function lc(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}function cc(e){return e.then(lc)}var dc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class hc{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,kn.k)(),this.listenerSetter=new C.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,De.Z)(this.closeBtn,"is-visible",e,300,void 0,s),i||(0,De.Z)(t,"is-visible",!e,300,void 0,s)};ua({noRipple:!0,listenerSetter:this.listenerSetter,container:this.container},"top-right",e,(()=>{i(!0)}),(()=>{i(!1)})),e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=this.container.firstElementChild,this.btnMenu.classList.add("scrollable","scrollable-y"),this.container.append(this.closeBtn)}updateButtons(e){return dc(this,void 0,void 0,(function*(){const t=e.map(((e,t)=>dc(this,void 0,void 0,(function*(){const i=document.createElement("div"),n=document.createElement("div");return n.classList.add("btn-menu-item-subtitle"),e.isUser()?n.append((0,m.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?n.append((0,m.ag)("VoiceChat.DiscussionGroup")):n.append(yield ji(e.toChatId())),i.append(new Ft({peerId:e}).element,n),{onClick:t?()=>dc(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),n=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,P.Z)(t,e),t.unshift(e),this.updateButtons(t)};s.Z.settings.animationsEnabled?setTimeout(n,250):n(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),i=yield Promise.all(t),n=Vn(i);i.forEach(((t,i)=>{const s=e[i],n=new Mp;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),Array.from(this.btnMenu.children).slice(1).forEach((e=>e.remove())),this.btnMenu.append(...Array.from(n.children))}))}updateAvatar(e,t){return dc(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);let s=t?0:2;const n=t?0:300,a=this.avatar=new Mp;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,De.Z)(a,"is-visible",!0,n,void 0,s),i&&(0,De.Z)(i,"is-visible",!1,n,(()=>{i.remove()}),s),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,_i.Z)(e.default_send_as):void 0))})))}updateManual(e){return dc(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===c)),{container:n}=this,a=t.toChatId(),o=(yield cc(this.getDefaultSendAs())).result,r=e;o instanceof Promise&&(e=void 0);const l=r&&!e,c=this.updatingPromise=(0,$o.Z)(o,(t=>dc(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(a).then((e=>{if(!i())return;const s=e.map((e=>(0,_i.Z)(e)));this.sendAsPeerIds=s.slice(),(0,P.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const o=()=>{this.onReady(n,e),this.addedListener||(this.listenerSetter.add(s.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!l)return o;o()}))));return c.finally((()=>{this.updatingPromise===c&&(this.updatingPromise=void 0)})),l?void 0:c}))}update(e){return this.updateManual(e).then((e=>e&&e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var uc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const pc="Posting media content isn't allowed in this group.";class mc{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,a.Z)(e),this.recordCanceled=!0,this.recorder.stop(),gl.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=hi.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=hi.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>uc(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,n=this.chat.bubbles.getMiddleware(),a=s.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new Bl(t,(t=>{n()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{n()&&this.appImManager.openScheduled(i)}),0))}),a).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,a.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const i=e.code,s=t[i];if(document.getSelection().toString().trim().length&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,a.Z)(e)),"KeyZ"===i){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:i,entities:s,caretPos:n}=Hl(this.messageInputField.input),a=(0,rc.Z)(i,s,!0),o=(0,ac.Z)(s,(0,oc.Z)(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=i.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"})),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,Sr(e),t)},this.onBtnSendClick=e=>uc(this,void 0,void 0,(function*(){if((0,a.Z)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend("send_media")))return void Ci(pc);this.chatInput.classList.add("is-locked"),(0,$n.Z)(),this.recorder.start().then((()=>{this.releaseMediaPlayback=ut.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),gl.Z.setKeepAlive(!0);const e=()=>{new ki("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,n.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,mt.Z)(t.target,"chat-input")||(0,mt.Z)(t.target,"popup-cancel-record")||((0,a.Z)(t),e())}),{capture:!0,passive:!1}),w.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),o=255*s.length;let r=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));let t=Math.min(1,e/o+.36);this.recordRippleEl.style.transform=`scale(${t})`;let n=Date.now()-this.recordStartTime,a=n%1e3,l=ht(n/1e3)+","+("00"+Math.round(a/10)).slice(-2);this.recordTimeEl.innerText=l,(0,Fe.T2)(r)};r()})).catch((e=>{switch(e.name){case"NotAllowedError":Ci("Please allow access to your microphone");break;case"NotReadableError":Ci(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),Ci(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>{if(e&&(0,a.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=(0,rc.Z)(this.messageInputField.value,[]);if(e.message!==t)return void new ki("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if((0,a.Z)(e),(0,mt.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&hi.Z&&!e.container.classList.contains("active")&&ks.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new C.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Jr();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=D({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,n.fc)(this.goDownBtn,(e=>{(0,a.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=I(""),this.replyElements.cancelBtn=I("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(r=!0,this.canToggleHideAuthor()),t=()=>{r=!1},i=this.forwardElements={};let r=!1;const l=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new Pi.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new Pi.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new Pi.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new Pi.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],c=i.container=Vn(l,this.listenerSetter),d=Array.from(c.children);if([{elements:d.slice(0,2),onChange:(e,t)=>{const s=!!+e;r&&(this.forwardWasDroppingAuthor=!s);const n=this.replyElements.container.querySelector(".reply-title");if(n){const e=n.firstElementChild,t=m.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:d.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=pi(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),c.append(t)})),c.append(i.changePeer.element),hi.Z||(this.forwardHover=new Nr({element:c})),i.modifyArgs=l.slice(0,-1),this.replyElements.container.append(c),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.btnToggleEmoticons=I("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type){this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=D({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,n.fc)(this.goMentionBtn,(e=>{(0,a.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=I("scheduled btn-scheduled float hide",{noRipple:!0}),(0,n.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(s.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=I("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new Xl({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new nc(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const e=document.createElement("div");e.classList.add("new-message-bot-commands-icon-scale");const t=this.botCommandsIcon=document.createElement("div");t.classList.add("animated-menu-icon","animated-menu-close-icon"),e.append(t),this.botCommandsToggle.append(e),(0,n.fc)(this.botCommandsToggle,(e=>{(0,a.Z)(e),t.classList.contains("state-back")?(this.botCommands.toggle(!0),t.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),t.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{t.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{t.classList.remove("state-back")}))}this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...o.Z].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{x.Z.createPopup(wl,this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=ua({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new Kl,this.stickersHelper=new Dl(this.rowsWrapper,this.autocompleteHelperController,this.managers),this.emojiHelper=new zl(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new jl(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new ql(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new ic(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=I("delete btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=I("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new vl({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),zr.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(zr)("open",this.onEmoticonsOpen),this.listenerSetter.add(zr)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(s.Z)("settings_updated",(()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()})),this.listenerSetter.add(s.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat===e&&this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),"scheduled"===this.chat.type?this.listenerSetter.add(s.Z)("scheduled_delete",(({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})):(this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(s.Z)("dialogs_multiupdate",(e=>{e[this.chat.peerId]&&(this.startParam===oe.gZ?this.setStartParam():this.center(!0))})));try{this.recorder=new(ml())({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",(e=>{let t=e.target.files;t.length&&(x.Z.createPopup(Pl,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,n.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,n.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(w.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});gl.Z.decode(e,!0).then((e=>{gl.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,n.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,n.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ii.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,L.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,m.ag)("BotStart")),(0,n.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ti.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn)}constructPinnedHelpers(){this.pinnedControlBtn=(0,L.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new el(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))})),this.chatInput.classList.add("type-pinned")}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const l=i.getBoundingClientRect(),c=this.fakeRowsWrapper.getBoundingClientRect(),d=c.width,h=l.width;if(d!==h){const e=h/d,t=(d-h)/2;if(a=l.left-c.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,De.Z)(this.inputContainer,"is-centering",s,u),(0,De.Z)(this.rowsWrapperWrapper,"is-centering-to-control",!!(s&&e&&e.classList.contains("chat-input-control")),u),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:d,widthTo:h}}center(e=!1){return uc(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(){return uc(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==this.startParam||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return uc(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}))}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=(0,fl.Z)(this.messageInputField.input);let i;(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,Rl.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,i)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),qn(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,i=!1){return uc(this,void 0,void 0,(function*(){if(!i&&!(0,yl.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,Fe.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e){const t=(0,oc.Z)(e.message),i=e.entities||[],s=(0,ac.Z)(i.slice(),t);return(0,lo.Z)((0,co.Z)(e.message,{entities:s}))}(e);return(this.messageInputField.value!==s||this.replyToMsgId!==e.reply_to_msg_id)&&(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(s,t,t),!0)}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new hc(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return uc(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:l}=this,c=this.sendAs,d=this.createSendAs(),[h,u,p,g,v,f,y,b,w]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(),cc(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?cc(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,d?(d.setPeerId(this.chat.peerId),d.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),S=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&y){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,$o.Z)(y.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),l&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),l.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=f.result;(0,$o.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}c&&c.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput(g,S,w):this.pinnedControlBtn&&this.pinnedControlBtn.append((0,m.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this._center(v,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,De.Z)(this.newMessageWrapper,"has-offset",t,i?0:300,void 0,s)}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return uc(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=this.chat;let i;return i=t?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==s.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",i}))}updateMessageInputPlaceholder(e){const t=m.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(!this.attachMenuButtons)return;const{peerId:e,threadId:t}=this.chat;return Vi(this.attachMenuButtons,(i=>i.verify(e,t)))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),this.attachMenuButtons&&this.attachMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!i.includes(e))})),e?(a.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.removeAttribute("contenteditable"),n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new f.Z({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),sc.T&&(0,sc.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,Nl.Z)(e))(0,a.Z)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,Cl.Z)(this.messageInput)})),hi.Z&&(0,n.fc)(this.messageInput,(e=>{this.appImManager.selectTab(1),zr.toggle(!1)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",(()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"var(--font-monospace)"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!i[e])return!1;const s=i[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e||"spoiler"===e){let t=!1;const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=Ul.o[e],a=s.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(this.resetCurrentFormatting()):a.push("function"==typeof s?s():document.execCommand(s,!1,null))}else a.push("function"==typeof s?s():document.execCommand(s,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}resetCurrentFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){const{value:s,caretPos:n,entities:a}=Hl(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),l=s.substr(o),c=i?r.match(mc.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,u=(0,oc.Z)(s);(0,ac.Z)(a,u);const p=t?Math.max(t.length,e.length):e.length,m=[];t&&(m.push(t),t.offset=d);const g=c?p-c[2].length:p;a.forEach((e=>{e.offset>=d&&(e.offset+=g)})),(0,ac.Z)(a,m);{const e={_:"messageEntityCaret",offset:d+p,length:0};let t=0;for(let i=a.length;te.offset);++t);a.splice(t,0,e)}const v=(0,lo.Z)((0,co.Z)(h,{entities:a}));this.messageInputField.setValueSilently(v,!0);const f=this.messageInput.querySelector(".composer-sel");f&&(function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const i=document.createTextNode("");e.parentNode.insertBefore(i,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=i}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}(f),f.remove()),this.onMessageInput()}checkAutocomplete(e,t,i){return uc(this,void 0,void 0,(function*(){if(void 0===e){const s=Hl(this.messageInputField.input,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,rc.Z)(e,i,!0);i=(0,ac.Z)(i,(0,oc.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const n=e.match(mc.AUTO_COMPLETE_REG_EXP);let a;if(n){const t=i[0];let o=n[2];const r=o[0];if(this.stickersHelper&&s.Z.settings.stickers.suggest&&(yield this.chat.canSend("send_stickers"))&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)a=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?(0,si.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?oe.NM:this.chat.peerId,e))&&(a=this.mentionsHelper)}else n[1]||"/"!==r?s.Z.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(a=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):(yield this.commandsHelper.checkQuery(o,this.chat.peerId))&&(a=this.commandsHelper)}a=this.checkInlineAutocomplete(e,a),this.autocompleteHelperController.hideOtherHelpers(a)}))}checkInlineAutocomplete(e,t){let i=!1;if(!t){const s=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(s){const n=s[1],a=e.slice(s[0].length);i=s[0].length===e.length,t=this.inlineHelper,this.btnPreloader?(0,De.Z)(this.btnPreloader,"show",!0,400):(this.btnPreloader=I("none btn-preloader float show disable-hover",{noRipple:!0}),(0,fe.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{(0,De.Z)(this.btnPreloader,"show",!1,400)}))})).catch(pt.Z)}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&(0,De.Z)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&((0,De.Z)(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,Di.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new Gn(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return uc(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&qe.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,Ql.Z)(e),this.messageInputField.setValueSilently(i),(0,Ql.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);hi.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,yl.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const i=this.messageInputField.value;(0,oc.Z)(i).filter((e=>"messageEntityEmoji"===e._)).forEach((e=>{const t=(0,oi.zu)(e.unicode);this.managers.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,fl.Z)(this.messageInputField.input);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new jn(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,Di.Z)(this.forwarding);setTimeout((()=>{for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()}));o||this.onMessageSent()}),0)}}sendMessageWithDocument(e,t=!1,i=!1){var s;return uc(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?(Ci(pc),!1):"scheduled"!==this.chat.type||t?!!e&&(this.managers.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:i||void 0})),this.onMessageSent(i,!0),"sticker"===e.type&&(null===(s=zr.stickersTab)||void 0===s||s.pushRecentSticker(e)),!0):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,Ai.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return uc(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,lo.Z)((0,co.Z)(t.message,{entities:t.totalEntities}));const s=()=>uc(this,void 0,void 0,(function*(){const n=yield bn(t,void 0,[t.mid]);this.setTopInfo("edit",s,(0,m.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>uc(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),n=new Set;let a=0,o=0;const r=i.map((t=>uc(this,void 0,void 0,(function*(){const i=e[t],s=i.map((e=>uc(this,void 0,void 0,(function*(){var i;const s=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=s.fwd_from)||void 0===i?void 0:i.from_name)||s.fromId||s.fwdFromId?n.add("P"+s.fromId):n.add("N"+s.fwd_from.from_name),s.media&&s.message&&++o}))));yield Promise.all(s),a+=i.length}))));yield Promise.all(r);const l=n.size>2,c=[...n].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===s.Z.myId?(0,m.ag)("Chat.Accessory.Forward.You"):new Ft({peerId:t,dialog:!1,onlyFirstName:l}).element}return l?e.split(" ")[0]:e})),{forwardElements:d}=this;(0,Ai.Z)(d.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const h=d.hideCaption.checkboxField.checked;o&&h?d.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?d.hideSender:d.showSender).checkboxField.setValueSilently(!0);const u=d.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,m.ag)(u,[a]),g=document.createDocumentFragment();let v,f;if(c.length<3?g.append(...(0,m.v_)(c,!1)):g.append(c[0],(0,m.ag)("AndOther",[c.length-1])),1===i.length){const t=i[0],s=e[t];if(v=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),f=!!v.grouped_id,f){const e=yield this.managers.appMessagesManager.getMidsByMessage(v);(e.length!==a||e.find((e=>!s.includes(e))))&&(f=!1)}}const y=document.createDocumentFragment();if(f||1===a){const t=e[i[0]],s=yield bn(v,void 0,t);y.append(g,": ",s)}else y.append((0,m.ag)("Chat.Accessory.Forward.From"),": ",g);let b=this.setTopInfo("forward",t,p,y);d.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=m.ZP.weakMap.get(s);n.args=[t<2?i.length:o],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return uc(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new Ft({peerId:t.fromId,dialog:!1}).element:(s=(0,m.ag)("Loading"),this.managers.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.replyToMsgId=e};i()}))}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(w.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,De.Z)(this.chat.container,e,!0,150,(()=>{this.chat.container.classList.remove(e)}))}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,Fe.T2)((()=>{i&&(0,Cl.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=I(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:c}=In(i,s,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),"webpage"===e&&(c.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),qe.IS_MOBILE||w.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),c}}mc.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;const gc="pinned-container";class vc{constructor(e){this.floating=!1,(0,k.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(gc,"hide"),t.title.classList.add(gc+"-title"),t.subtitle.classList.add(gc+"-subtitle"),t.content.classList.add(gc+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(gc+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(gc+"-wrapper"),(0,ye.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(gc+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,n.fc)(e,(e=>{(0,a.Z)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const i=(this.floating||l.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}class fc extends Pt{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,a.Z)(e),ut.Z.muted=!ut.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=ut.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,fc.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+fc.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);ut.Z.muted=!1,ut.Z.volume=t}});const i="player-volume",s=this.btn=document.createElement("div");s.classList.add("btn-icon",i);const o=this.icon=document.createElement("span");o.classList.add(i+"__icon"),s.append(o,this.container),(0,n.fc)(o,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(ut.Z)("playbackParams",this.setVolume),this.setVolume()}}fc.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class yc extends vc{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new nn("pinned-audio",((e,t)=>{(0,p.Z)(this.divAndCaption.title,e),(0,p.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{ut.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const l="voice"!==e.type&&"round"!==e.type;if(l){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,Tt.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,Tt.Z)(t.performer):(0,m.ag)("AudioUnknownArtist")}else o=new Ft({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=H(t.date);this.fasterEl.classList.toggle("hide",l),this.repeatEl.classList.toggle("hide",!l),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=I("fast_rewind active",{noRipple:!0}),o=I("fast_forward active",{noRipple:!0}),r=(e,t)=>{(0,n.fc)(e,(e=>{(0,a.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};r(s,(()=>{ut.Z.previous()})),r(o,(()=>{ut.Z.next()})),this.toggleEl=I("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),r(this.toggleEl,(()=>{ut.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,o),this.volumeSelector=new fc(this.listenerSetter,!0);const l=document.createElement("div");l.classList.add("progress-line-container"),l.append(this.volumeSelector.container);const c=document.createElement("div");c.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(c),this.volumeSelector.btn.append(l),this.repeatEl=I("audio_repeat",{noRipple:!0}),r(this.repeatEl,(()=>{const e=ut.Z.getPlaybackParams();e.round?e.loop?(ut.Z.round=!1,ut.Z.loop=!1):ut.Z.loop=!ut.Z.loop:ut.Z.round=!0}));const d=this.fasterEl=I("playback_2x",{noRipple:!0});r(d,(()=>{ut.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const h=document.createElement("div");h.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new kt(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),h.append(this.progressLine.container),this.wrapper.insertBefore(h,this.wrapperUtils),this.topbar.listenerSetter.add(ut.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(ut.Z)("pause",this.onPause),this.topbar.listenerSetter.add(ut.Z)("stop",this.onStop),this.topbar.listenerSetter.add(ut.Z)("playbackParams",this.onPlaybackParams);const u=ut.Z.getPlayingDetails();u&&(this.onMediaPlay(u),this.onPlaybackParams(u.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}var bc;!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(bc||(bc={}));const wc="pinned-message-border";class Sc{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=bc.ONE:2===e?i=bc.TWO:3===e?i=bc.THREE:4===e?i=bc.FOUR:e>3&&(i=bc.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=bc.ONE:2===e?i=bc.TWO:3===e?i=bc.THREE:4===e?i=bc.FOUR:e>3&&(i=bc.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-bc.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?bc.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(wc),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=wc+"-wrapper-1",this.border.classList.remove(wc+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),l=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle(wc+"-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className=wc+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add(wc+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Cc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Lc{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Lc.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Lc.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),Lc.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}Lc.DURATION=200,Lc.BASE_CLASS="animated-super";class Ic{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Ic.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Ic.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Ic.BASE_CLASS+"-decimal-placeholder";const s=new Lc;return s.container.className=Ic.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),Lc.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Ic.EMPTY_INDEX,!0),t.animatedSuper.animate(Ic.EMPTY_INDEX,i,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Ic.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Ic.EMPTY_INDEX=-1,Ic.BASE_CLASS="animated-counter";class Mc{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.listenerSetter=new C.Z,this.log=(0,ce.kg)("PM"),this.debug=!0,this.isStatic=!1;const o=new Ln("pinned-message");this.pinnedMessageContainer=new vc({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:o,onClose:()=>Cc(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new el(this.chat.peerId,this.pinnedMid,!0):new el(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new Sc,o.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Lc,o.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Lc,this.animatedMedia.container.classList.add("pinned-message-media-container"),o.content.prepend(this.animatedMedia.container),this.animatedCounter=new Ic(!0),o.title.append((0,m.ag)("PinnedMessage")," ",this.animatedCounter.container);const r=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(r),o.container.prepend(r),this.btnOpen=I("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,n.fc)(this.btnOpen,(e=>{(0,a.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(s.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ii.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,ii.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>Mc.LOAD_COUNT&&(!this.loadedBottom&&e<=Mc.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=Mc.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Cc(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:Mc.LOAD_COUNT,backLimit:Mc.LOAD_COUNT}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new C.Z,function(e,t,i,s){if(hi.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Cc(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,Ne.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Cc(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Cc(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=yield Cn({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}Mc.LOAD_COUNT=50,Mc.LOAD_OFFSET=5;var Ec=i(6818);class Pc extends ki{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer(e,-1===i?oe.rU:(0,Rl.Z)(!0)+i)}}],body:!0});const t=[{time:3600,langKey:"ChatList.Mute.1Hour"},{time:14400,langKey:"ChatList.Mute.4Hours"},{time:28800,langKey:"ChatList.Mute.8Hours"},{time:86400,langKey:"ChatList.Mute.1Day"},{time:259200,langKey:"ChatList.Mute.3Days"},{time:-1,langKey:"ChatList.Mute.Forever"}].map((e=>new mi({radioField:new wi({langKey:e.langKey,name:"mute-time",value:""+e.time})})));let i;const s=gi(t,(e=>{i=+e}));t[t.length-1].radioField.checked=!0;const n=new Uo({noShadow:!0,noDelimiter:!0});n.content.append(s),this.body.append(n.container),this.show()}}class kc{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}let Tc;function xc(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach((t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)})),e}function Ac(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}function Zc(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}function Dc(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=Dc;function Fc(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?Zc:Dc)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=Fc;var _c=i(6669);function Bc(e){e.stop(),(0,_c.Z)(e,"ended")}class Rc{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}function Nc(e){return e<<0}function Uc(e){return e>>>0}function Oc(e){return"screencast"===e?"video":e}function Hc(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function zc(e,t="9",i){const s=Hc(e);return`m=${Oc(e)} ${t} ${s} ${i.join(" ")}`}class Vc extends Rc{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const i=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${i}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:i,sourceGroups:s}=e;const n=Uc(e.source);t+=n,i+=n;const a=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(Uc);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(a)}})):a(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:r}=e,l=t.transport,c="application"===n,d=c?void 0:t[n],h="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${Oc(n)} 0 ${Hc(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const u=c?[{id:5e3}]:d["payload-types"],p=u.map((e=>e.id));s(zc(n,r,p),"c=IN IP4 0.0.0.0",`a=rtcp:${r} IN IP4 0.0.0.0`),l["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let m=o;if("sendrecv"===o||!i||h||c||(m="sendonly"===o?"recvonly":"sendonly"),s(`a=${m}`),this.addTransport(l),c)s(`a=sctpmap:${u[0].id} webrtc-datachannel 256`);else{const e=d["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),u.forEach((e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==m&&"sendrecv"!==m||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:s,isAnswer:n}=e;this.addHeader(t.sessionId,s),qe.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((n?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,n);return this}static fromConference(e){return(new Vc).addConference(e).finalize()}}class Gc{constructor(e,t){const i=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain(),s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,i.connect(s)}}class Wc{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);o.getByteFrequencyData(r);const l=function(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;t{const e=this.counter%3==0,t=(e?this.items:this.items.filter((e=>"input"===e.type))).filter((e=>"audio"===e.kind)).slice(0,50).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),Wc.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,ce.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,l=Wc.getSource(e,i);switch(i){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+Nc(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:r}=a;r||(r=a.createTransceiver(e.connection,n)),a.direction!==r.direction&&(r.direction=a.direction);const l=Oc(t),c=o.findIndex((e=>e.kind===l)),d=-1!==c?o.splice(c,1)[0]:void 0,h=r.sender;h.track!==d&&h.replaceTrack(d).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{Bc(e)}))}catch(e){this.log.error(e)}}}Wc.ANALYSER_LISTENER=new S.Z;class jc extends S.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=Fc()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(pt.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&xc(),video:t&&{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:Ac(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=Wc.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const n="output"===i,{player:a,elements:o,streamManager:r}=this,l=t.kind,c="video"===l,d=c?s:l;let h=o.get(d);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),o.delete(d)}),{once:!0}),n&&r.addTrack(e,t,i);const u=c?e:r.outputStream;if(h)h.paused&&h.play().catch(pt.Z),h.srcObject=u;else{if(h=document.createElement(l),h.autoplay=!0,h.srcObject=u,h.volume=1,"undefined"!==h.sinkId){const{outputDeviceId:e}=this;e&&h.setSinkId(e)}c?(h.setAttribute("playsinline","true"),h.muted=!0):a.appendChild(h),o.set(d,h)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{Bc(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}class Kc{constructor(e,t){this.mid=e,this.type=t,this.port="9"}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver(Oc(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function $c(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class qc{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,k.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new Kc(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,P.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return Vc.fromConference(Object.assign({conference:this},e))}}class Qc{constructor(e){var t;(0,k.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,ce.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,ce.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,ce.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new qc(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}var Yc,Xc,Jc=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ed=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class td{constructor(e,t){Yc.set(this,void 0),Xc.set(this,void 0),Jc(this,Yc,e,"f"),Jc(this,Xc,t,"f")}get session(){return ed(this,Yc,"f")}get media(){return ed(this,Xc,"f")}get bundle(){return this.session.lines.find((e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)})).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map((e=>e.lines))).map((e=>e.toString())).join("\r\n")+"\r\n"}}function id(e,t,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}Yc=new WeakMap,Xc=new WeakMap;var sd,nd,ad,od=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},rd=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ld{constructor(e,t){sd.set(this,void 0),nd.set(this,void 0),ad.set(this,void 0),od(this,sd,new Set,"f"),od(this,nd,e,"f"),od(this,ad,t,"f")}generate(){const e=rd(this,nd,"f"),t=rd(this,ad,"f"),i=rd(this,sd,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){rd(this,sd,"f").add(e)}}sd=new WeakMap,nd=new WeakMap,ad=new WeakMap;var cd,dd,hd=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ud=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class pd{constructor(e,t){cd.set(this,void 0),dd.set(this,void 0),hd(this,cd,e,"f"),hd(this,dd,t,"f")}get key(){return ud(this,cd,"f")}get value(){return ud(this,dd,"f")}}cd=new WeakMap,dd=new WeakMap;var md,gd,vd,fd,yd=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},bd=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class wd{constructor(e,t,i,s){md.set(this,void 0),gd.set(this,void 0),vd.set(this,void 0),fd.set(this,void 0),yd(this,md,e,"f"),yd(this,gd,t,"f"),yd(this,vd,i,"f"),yd(this,fd,s,"f")}get type(){return bd(this,md,"f")}get port(){return bd(this,gd,"f")}get protocol(){return bd(this,vd,"f")}get ids(){return bd(this,fd,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}md=new WeakMap,gd=new WeakMap,vd=new WeakMap,fd=new WeakMap;var Sd,Cd,Ld,Id,Md=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},Ed=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class Pd{constructor(e,t){if(Sd.set(this,void 0),Cd.set(this,void 0),Ld.set(this,void 0),Id.set(this,void 0),Md(this,Sd,e,"f"),"string"==typeof t){if(Md(this,Cd,t,"f"),"m"===e){const e=t.split(" ");Md(this,Ld,new wd(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=id(t,":",1);t=e[0],Md(this,Id,1===e.length?new pd(t,null):new pd(t,e[1]),"f")}}else t instanceof wd?(Md(this,Ld,t,"f"),Md(this,Cd,t.toString(),"f")):t instanceof pd&&(Md(this,Id,t,"f"),Md(this,Cd,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return Ed(this,Sd,"f")}get value(){return Ed(this,Cd,"f")}get parsed(){return Ed(this,Id,"f")}get mediaLineParts(){return Ed(this,Ld,"f")}toString(){return`${this.key}=${this.value}`}}Sd=new WeakMap,Cd=new WeakMap,Ld=new WeakMap,Id=new WeakMap;var kd,Td,xd,Ad,Zd,Dd,Fd=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},_d=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class Bd{constructor(e,t,i=":",s=!1){kd.set(this,void 0),Td.set(this,void 0),xd.set(this,void 0),Ad.set(this,void 0),Zd.set(this,void 0),Dd.set(this,void 0),Fd(this,kd,e,"f"),Fd(this,Td,t,"f"),Fd(this,xd,i,"f"),Fd(this,Zd,s,"f"),Fd(this,Ad,s?new Map:null,"f"),Fd(this,Dd,s?[]:null,"f")}get lines(){return _d(this,Td,"f")}get value(){return _d(this,Zd,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!_d(this,Zd,"f")}get key(){return _d(this,kd,"f")}get keys(){return Bd.fill(this),_d(this,Dd,"f")}forEach(e){Bd.fill(this),_d(this,Ad,"f").forEach(e)}get(e){return Bd.fill(this),_d(this,Ad,"f").get(e)||new Bd(e,[],":",!0)}static fill(e){if(null!==_d(e,Ad,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=id(i,_d(e,xd,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=Fd(e,Ad,Bd.makeAttributes(t),"f");Fd(e,Dd,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new Bd(i,e))})),t}}kd=new WeakMap,Td=new WeakMap,xd=new WeakMap,Ad=new WeakMap,Zd=new WeakMap,Dd=new WeakMap;var Rd,Nd,Ud=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},Od=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class Hd{constructor(e){Rd.set(this,void 0),Nd.set(this,void 0),Ud(this,Rd,e,"f"),Ud(this,Nd,new Map,"f"),Hd.fillAttributes(this)}get(e){return Od(this,Nd,"f").get(e)||new Bd(e,[]," ",!0)}static fillAttributes(e){const t=new Map;Od(e,Rd,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{Od(e,Nd,"f").set(i,new Bd(i,t," ",!1))}))}}Rd=new WeakMap,Nd=new WeakMap;var zd,Vd,Gd,Wd,jd=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},Kd=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class $d{constructor(e){zd.set(this,void 0),Vd.set(this,void 0),Gd.set(this,void 0),Wd.set(this,void 0),jd(this,zd,e,"f"),jd(this,Vd,e[0],"f"),jd(this,Gd,jd(this,Wd,null,"f"),"f")}get lines(){return Kd(this,zd,"f")}get mediaLine(){return Kd(this,Vd,"f")}get mediaLineParts(){return Kd(this,Vd,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!Kd(this,Wd,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",jd(this,Wd,t,"f")}return Kd(this,Wd,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return Kd(this,Gd,"f")||jd(this,Gd,new Hd(this.lines),"f"),Kd(this,Gd,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}zd=new WeakMap,Vd=new WeakMap,Gd=new WeakMap,Wd=new WeakMap;var qd,Qd,Yd=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},Xd=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class Jd{constructor(e){qd.set(this,void 0),Qd.set(this,void 0),Yd(this,qd,e,"f"),Yd(this,Qd,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return Xd(this,qd,"f")}get sessionId(){return Xd(this,Qd,"f")}}function eh(e){function t(){i?s.push(new $d(n)):i=new Jd(n)}let i=null,s=[],n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=th(e);"m"===i.key&&(t(),n=[]),n.push(i)}})),t(),new td(i,s)}function th(e){const t=id(e,"=",1);return new Pd(t[0],t[1])}function ih(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const s=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>Nc(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[n,a]=i.fingerprint.split(" ",2),o=i.ssrc&&Nc(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:a,setup:i.setup,hash:n},source:o,sourceGroups:s,mid:i.mid}}qd=new WeakMap,Qd=new WeakMap;var sh,nh=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ah extends Qc{constructor(e){super(e),this.negotiateThrottled=(0,ii.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return nh(this,void 0,void 0,(function*(){const{groupCall:n,description:a}=this,o=n.id,r=t.map((t=>{const i=function(e,t){const i=ih(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),l=r.find((e=>"audio"===e.media.mediaType)),c=r.find((e=>"video"===e.media.mediaType));let{source:d,params:h}=l||{};const u=c||l,p={audio:l,video:c};if(a.entries.forEach((e=>{if("sendonly"===e.direction){const t=p[e.type];if(!t)return;a.setEntrySource(e,t.sourceGroups||t.source),a.setEntryPeerId(e,s.Z.myId)}})),h!==u.params){const e=JSON.parse(u.params.data);d?e.ssrc=d:delete e.ssrc,h={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(o,h,i),g=JSON.parse(m.params.data);return g.audio=g.audio||n.connections.main.description.audio,a.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,ao.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return nh(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=eh(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=function(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new ld(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(th("a=ssrc-group:SIM "+o.join(" ")));const l=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(th("a=ssrc-group:FID "+e+" "+i)),l.forEach((t=>{a.push(th("a=ssrc:"+e+" "+t))})),l.forEach((e=>{a.push(th("a=ssrc:"+i+" "+e))})))})),e.media[s]=new $d(a)}})),!!t}(s)||n),(0,ao.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,l=(r.ids,o.toString()),c=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(l!==zc(e.mediaType,void 0,c)){const o=ih(s,e);let l=Object.assign({},i);l.transport=(0,Di.Z)(l.transport),l.transport.ufrag=o.ufrag,l.transport.pwd=o.pwd,l.transport.fingerprints=[o.fingerprint],l.transport.candidates=[];const c=new Kc(o.mid,r.type);c.setPort(r.port),o.source&&c.setSource(o.sourceGroups||o.source),c.setDirection(e.direction);const d=eh((new Vc).addSsrcEntry(c,l).finalize()).media[0];a[t]=d,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const l=[],c=a.bundle;(0,ao.Z)(c,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),l.push(n))}));const d=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new Kc(i,e.mediaType),s.setDirection("inactive")),s})),h={type:"answer",sdp:t.generateSdp({bundle:c,entries:d,isAnswer:!0})};l.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,h.sdp),yield e.setRemoteDescription(h),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(sh||(sh={}));const oh=sh;var rh=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class lh extends jc{constructor(e){super(),(0,k.Z)(this,e),this.log||(this.log=(0,ce.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,ii.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===oh.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return oh.CLOSED;if("connected"===e||qe.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?oh.MUTED:oh.UNMUTED:oh.MUTED_BY_ADMIN}return oh.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==oh.UNMUTED}get isClosing(){const{state:e}=this;return e===oh.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,P.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,P.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return rh(this,void 0,void 0,(function*(){return oe.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(oe.NM)))}changeUserMuted(e,t){return rh(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return oe.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new ah(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return rh(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Zc(Ac()),i=new Wc,s=this.createConnectionInstance({streamManager:i,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",(()=>{s.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e:this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return rh(this,void 0,void 0,(function*(){const e={video:{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}};try{const t=yield Dc(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return rh(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(Bc(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return rh(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){let t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&s.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return rh(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const s=e.pFlags.self;if(s&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const n=t.muted;void 0!==n&&e.pFlags.self&&(n?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),s&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(i=this.connections.main.sources.video)&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:i.sourceGroups,audio_source:undefined}),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}var i;return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,_i.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=dh(0,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,i.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const l=o?[]:function(e){var t,i;return[dh(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&dh(0,"audio",e.video.audio_source),e.video&&dh(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&dh(0,"audio",e.presentation.audio_source),e.presentation&&dh(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,l);const c=new Set;r.forEach((e=>{const t=e.source;if(!l.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),c.add(e.type))}})),l.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),c.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),c.add(t.type))})),c.size&&(c.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}var ch=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function dh(e,t,i,s){return $c(t,i,s)}class hh extends S.Z{construct(e){this.managers=e,this.audioAsset=null!=Tc?Tc:Tc=new kc(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,ce.kg)("GCC"),s.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),s.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return ch(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:xc(),video:t&&{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}},s=new Wc(100);try{const t=yield Dc(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n)}))}joinGroupCallInternal(e,t,i,n,a=!1,o){return ch(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);const l="main";let{currentGroupCall:c}=this;if(!c||!a){c=new lh({chatId:e,id:t,managers:this.managers}),c.fixSafariAudio(),c.addEventListener("state",(e=>{this.currentGroupCall===c&&e===oh.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),s.Z.dispatchEvent("chat_update",c.chatId))})),c.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const d=c.createConnectionInstance({streamManager:i,type:l,options:{type:l,isMuted:n,joinVideo:o,rejoin:a}}),h=d.createPeerConnection();return h.addEventListener("negotiationneeded",(()=>{d.negotiate()})),h.addEventListener("track",(e=>{r("ontrack",e),c.onTrack(e)})),h.addEventListener("iceconnectionstatechange",(()=>{c.dispatchEvent("state",c.state);const{iceConnectionState:e}=h;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":c.hangUp();break;case"connected":c.joined||(c.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),d.createDescription(),d.createDataChannel(),d.appendStreamToConference(),this.setCurrentGroupCall(c),r("set currentGroupCall",t,c),this.startConnectingSound(),d.negotiate()}c.handleUpdateGroupCallParticipants=!1,c.updatingSdp=!1,r("update currentGroupCall",t,c)}))}}const uh=new hh;F.GO&&(F.GO.groupCallController=uh);const ph=uh;var mh=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class gh{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,a.Z)(e),(()=>{mh(this,void 0,void 0,(function*(){const e=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);t&&this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith((0,m.ag)(e));const i=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(i.map((e=>mh(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>mh(this,void 0,void 0,(function*(){var t;if(!Ec.Z||this.peerId.isUser())return!1;const i=ph.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChatTyped(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,Fi.Z)(n,"manage_call")})),this.verifyCallButton=e=>mh(this,void 0,void 0,(function*(){if(!or.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new Pc(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",l.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===l._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),qe.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{qe.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+e},this.setPeerStatusManual=(e=!1)=>mh(this,void 0,void 0,(function*(){if(!this.subtitle)return;const t=this.peerId;return this.chat.appImManager.setPeerStatus(t,this.subtitle,e,!1,(()=>t===this.peerId))})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{e&&e()})),this.listenerSetter=new C.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=I("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new yc(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=ua({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(l.Z)("changeScreen",this.onChangeScreen),(0,n.fc)(this.container,(e=>{const t=(0,mt.Z)(e.target,"pinned-container");if((0,$n.Z)(),t){if((0,a.Z)(e),(0,mt.Z)(e.target,"progress-line"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=ut.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else l.Z.activeScreen===l._.medium&&document.body.classList.contains(Ro)?o():(0,Ai.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(zs)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const o=e=>{if(e&&(0,a.Z)(e),l.Z.activeScreen===l._.medium&&document.body.classList.contains(Ro))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);w.Z.back(e?"im":"chat")}};(0,n.fc)(this.btnBack,o,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>l.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>mh(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&s.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute(this.peerId)},verify:()=>mh(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&s.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>mh(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}))},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),bi.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>mh(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),Ci((0,m.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(hs)){const e=this.appSidebarRight.createTab(hs);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>mh(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Yi({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new ki("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Ft({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>mh(this,void 0,void 0,(function*(){return s.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"lock",text:"BlockUser",onClick:()=>{new ki("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Ft({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&Li({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>mh(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==s.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&Li({langPackKey:"UserUnblocked"})}))},verify:()=>mh(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"delete danger",text:"Delete",onClick:()=>{new ss(this.peerId)},verify:()=>mh(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=I("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,n.fc)(e,(e=>{(0,a.Z)(e),!i&&(0,$n.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new Mp;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new Mc(this,this.chat,this.managers),this.btnJoin=(0,L.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=I("phone"),this.btnGroupCall=I("videochat"),this.btnPinned=I("pinlist"),this.btnMute=I("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,(()=>{this.openPinned(!0)})),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>mh(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,s.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(s.Z)("chat_update",(e=>mh(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(s.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(s.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(s.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(s.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.pinnedMessage&&this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();bi.Z.getState().then((s=>{i()&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(s.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()}))}constructDiscussionHelpers(){this.pinnedMessage=new Mc(this,this.chat,this.managers)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),this.chatAudio&&this.chatAudio.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){return mh(this,void 0,void 0,(function*(){const e=this.peerId;let t;this.avatarElement&&(t=this.constructAvatar());const[i,s,n,a,o,r,l]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,t?t.updateWithOptions({peerId:e}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),bi.Z.getState()]);return()=>{var a;if(this.btnMute&&this.btnMute.classList.toggle("hide",!i),this.btnJoin&&(s?((0,p.Z)(this.btnJoin,(0,m.ag)(i?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(a=null==n?void 0:n.pFlags)||void 0===a?void 0:a.left))):this.btnJoin.classList.add("hide")),t&&(this.avatarElement.replaceWith(t),this.avatarElement=t),this.setUtilsWidth(),this.verifyButtons(),this.pinnedMessage)if("chat"===this.chat.type){if(this.chat.wasAlreadyUsed){const e=new Mc(this,this.chat,this.managers);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}this.pinnedMessage.hidden=!!l.hiddenPinnedMessages[e]}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());o(),r&&r(),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return mh(this,void 0,void 0,(function*(){const t=this.peerId,i=()=>this.peerId===t;let n,a;if("pinned"===this.chat.type)n=void 0===e?(0,m.ag)("Loading"):(0,m.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!i())return;const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}));else if("scheduled"===this.chat.type)n=t===s.Z.myId?(0,m.ag)("Reminders"):(0,m.ag)("ScheduledMessages"),void 0===e&&this.managers.appMessagesManager.getScheduledMessages(t).then((e=>{i()&&this.setTitle(e.length)}));else if("discussion"===this.chat.type)n=void 0===e?(0,m.ag)("Loading"):(0,m.ag)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.managers.appMessagesManager.getHistory(t,0,1,0,this.chat.threadId),Promise.resolve()]).then((([e])=>{if(!i())return;const t=null==e?void 0:e.count;"number"!=typeof t?setTimeout((()=>{i()&&this.setTitle()}),30):this.setTitle(t)}));else if("chat"===this.chat.type&&([n,a]=yield Promise.all([_s({peerId:t,dialog:!0}),gs(t)]),!i()))return;return()=>{(0,p.Z)(this.title,n),a&&this.title.append(...a)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return mh(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId;let t=yield this.managers.appNotificationsManager.isPeerLocalMuted(e,!1);(yield this.managers.appPeersManager.isBroadcast(e))?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}))}}class vh extends M{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new y("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=I("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new v(e,this.inputSearch,{messages:new g("Chat.Search.PrivateSearch","messages")})}open(e,t,i,s){const a=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,n.fc)(this.btnPickDate,(()=>{x.Z.createPopup(jo,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),Gs.toggleSidebar(!0)),a}}class fh{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,a.Z)(e),x.Z.createPopup(jo,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,Ai.Z)(e.target,Vp);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,a.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,a.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,ye.Z)(this.backBtn);const s=this.listenerSetter=new C.Z,o=(e,t)=>{(0,n.fc)(e,t,{listenerSetter:s})};o(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new y("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new g(!1,"messages",void 0,"",!1),o(this.searchGroup.list,this.onResultsClick),this.appSearch=new v(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,p.Z)(this.foundCountEl,this.inputSearch.value?(0,m.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),o(this.footer,this.onFooterClick),(0,ye.Z)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),o(this.dateBtn,this.onDateClick),o(this.upBtn,this.onUpClick),o(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),i&&this.setQuery(i),qe.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},w.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.container.classList.remove("search-results-active"),this.chat.search=void 0,w.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Tn.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer(t,i);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,p.Z)(this.foundCountEl,(0,m.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}class yh{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,Xi.Z)(t.options,e)));return t||(t=new yh,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then((()=>this.fillCanvas(e)))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.img=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=Ae(t,e,!1).then((()=>t))}cleanup(e){this.canvases.delete(e),this.canvases.size||((0,P.Z)(yh.INSTANCES,this),this.objectUrl&&URL.revokeObjectURL(this.objectUrl))}fillCanvas(e){const t=e.getContext("2d");t.fillStyle instanceof CanvasPattern&&t.clearRect(0,0,e.width,e.height);const i=this.img;let s=i.width,n=i.height;s*=e.height/n,n=e.height,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,e.width,e.height),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";for(let a=0;ai.resize(e,t))))}}yh.INSTANCES=[];var bh=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class wh extends S.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,ce.kg)("CHAT",ce.v9.Log|ce.v9.Warn|ce.v9.Debug|ce.v9.Error),this.peerId=oe.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){const i=Ga.Z.getTheme();let n;if(i.background.color&&!i.background.slug&&!i.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=i.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const a=++this.backgroundTempId,o=this.gradientRenderer,r=this.patternRenderer,l=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const c=i.background.intensity&&i.background.intensity/100,d=!!c&&c<0;let h,u,p,m=null==n?void 0:n.firstElementChild;if(!n)if(n=document.createElement("div"),n.classList.add("chat-background-item"),e)if(c){n.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=yh.getInstance({url:e,width:t.width,height:t.height,mask:d}),m=this.patternCanvas=h.createCanvas(),m.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),d&&n.classList.add("is-dark")}else i.background.slug&&n.classList.add("is-image");else i.background.color&&n.classList.add("is-color");const g=i.background.color;if(g){const{canvas:e,gradientRenderer:t}=Va.create(g);p=this.gradientRenderer=t,u=this.gradientCanvas=e,u.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),s.Z.settings.animationsEnabled&&p.scrollAnimate(!0)}h&&(d?u:m).style.setProperty("--opacity-max",""+Math.abs(c));const v=new Promise((i=>{const s=()=>{if(this.backgroundTempId!==a)return h&&h.cleanup(m),void(p&&p.cleanup());const e=this.backgroundEl.lastElementChild;if(e===n)return void i();const s=[u,m].filter(Boolean);s.length&&n.append(...s),this.backgroundEl.append(n),(0,De.Z)(n,"is-visible",!0,t?0:200,e?()=>{r&&r.cleanup(l),o&&o.cleanup(),e.remove()}:null,2),i()};h?h.renderToCanvas(m).then((()=>{if(this.backgroundTempId!==a)return;let e;e=Promise.resolve(),e.then(s)})):e?xe(n,e,s):s()}));return this.setBackgroundPromise=Promise.race([(0,dr.Z)(500),v])}setType(e){this.type=e}init(){this.topbar=new gh(this,Gs,this.managers),this.bubbles=new Xr(this,this.managers),this.input=new mc(this,this.appImManager,this.managers),this.contextMenu=new ul(this,this.managers),this.selection=new ta(this,this.bubbles,this.input,this.managers),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),"scheduled"===this.type||hi.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)})),this.bubbles.listenerSetter.add(s.Z)("dialog_drop",(e=>{e.peerId===this.peerId&&this.appImManager.setPeer()}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.topbar.cleanup(),this.selection.cleanup()}onChangePeer(e){return bh(this,void 0,void 0,(function*(){const{peerId:t}=this,i=Gs.getTab(vh);i&&i.close();const[s,n,a,o,r]=yield e(Promise.all([this.managers.appPeersManager.noForwards(t),this.managers.appPeersManager.isRestricted(t),this._isAnyGroup(t),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(t)]));this.noForwards=s,this.isRestricted=n,this.isAnyGroup=a,this.isMegagroup=r,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=Gs.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(t,this.threadId),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e,t,i){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.peerId===e;if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=e||oe.NM,this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`;if(!e)return Gs.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer(!1,e),void this.appImManager.dispatchEvent("peer_changed",e);this.peerChanged=s;const n=this.bubbles.setPeer(s,e,t,i),a=this.setPeerPromise=n.then((e=>e.promise)).catch(pt.Z).finally((()=>{this.setPeerPromise===a&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){(0,P.Z)(this.sharedMediaTabs,e),e.destroy()}setAutoDownloadMedia(){return bh(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,a=function*(){let t,i=0,n=0,a=0;const o=s.Z.settings,r=s.Z.managers.appPeersManager;return!o.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield r.isContact(e))?"contacts":"private":(yield r.isBroadcast(e))?"channels":"groups",o.autoDownload.photo[t]&&(i=o.autoDownloadNew.photo_size_max),o.autoDownload.video[t]&&(n=o.autoDownloadNew.video_size_max),o.autoDownload.file[t]&&(a=o.autoDownloadNew.file_size_max)),{photo:i,video:n,file:a}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(t,i||[])).next())}));var t,i,n,a}(this.peerId)}))}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,i,s){return bh(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab;n.loadSidebarMedia(!0);const a=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s)]),[o]=yield Promise.all([a,n.fillProfileElements()]);i()&&(o.forEach((e=>{e()})),Gs.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",t))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return bh(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ir.Z.fromJSON(e.historySerialized)})))}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return bh(this,void 0,void 0,(function*(){return e===s.Z.myId||e===oe.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(l.Z.isMobile)this.search?this.search.setQuery(e):this.search=new fh(this.topbar,this,e);else{let t=Gs.getTab(vh);t||(t=Gs.createTab(vh)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,sendSilent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===s.Z.myId||e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return this.isOurMessage(e)&&(!t||this.peerId!==s.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}}var Sh=i(6637);class Ch{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,hi.Z){if(e&&(0,a.Z)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const i=I(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,a.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,n.fc)(i,(e=>{(0,a.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=I("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,m.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,aa.Z)(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,a.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=I("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),o=document.createElement("span"),r=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),o.classList.add("markup-tooltip-delimiter"),r.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(r,this.linkApplyButton),t.append(this.linkBackButton,o,this.linkInput,i),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,a.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Sh.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,aa.Z)(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,w.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let i=0;i!!e))}(),t=[...new Set(e.map((e=>e.parentNode)))],i=new Set;return t.forEach((e=>{for(const t in Ul.o){const s=Ul.o[t];e.closest(s.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&i.add(this.buttons[t])}})),[...i]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=rr(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=(0,Le.Z)(e.left,l,c)}else{const e=s.left+(s.width-o.width)/2;d=(0,Le.Z)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),tl())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),qe.IS_MOBILE||w.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){hi.Z&&!qe.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,a.Z)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(tl(i))this.hide();else if(hi.Z)if(qe.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()})))}}function Lh(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function Ih(e,t,i,s,n,a,o,r){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-a)),a>0&&l.push("A"+Lh(a,a,0,0,1,e+i,t+a)),l.push("V"+(t+s-o)),o>0&&l.push("A"+Lh(o,o,0,0,1,e+i-o,t+s)),l.push("H"+(e+r)),r>0&&l.push("A"+Lh(r,r,0,0,1,e+0,t+s-r)),l.push("V"+(t+n)),n>0&&l.push("A"+Lh(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}F.GO.generatePathData=Ih;class Mh{constructor(e,t){let i;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,m.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,m.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,i=Ih(5,5,e.width-t,e.height-t,t,t,t,t);this.path.setAttributeNS(null,"d",i)}}var Eh=i(7922);function Ph(e){e.forEach((e=>e.classList.add("no-transition"))),(0,Fe.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var kh=i(490),Th=i(5228);class xh{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const l=n.getContext("2d");l.beginPath(),l.moveTo(i,s),l.lineTo(e,s);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(c[n]*(1-i)+d[n]*i))*r+o*(1-r);l.lineTo(e,s)}else{const a=this.progress[n-1],u=c[n-1]*(1-a)+d[n-1]*a,p=this.progress[n],m=(i-e)/h*(n-1),g=(i-e)/h*n,v=m+(g-m)/2,f=(t-u)*r+o*(1-r),y=(t-(c[n]*(1-p)+d[n]*p))*r+o*(1-r);l.bezierCurveTo(v,f,v,y,g,y),n===h&&l.lineTo(i,s)}a(l),l.fill(),l.closePath()}}}class Ah{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=Ah.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===oh.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===oh.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===oh.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===oh.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Zh{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:l,currentState:c,previousState:d,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let m=Date.now()-this.lastUpdateTime;m>20&&(m=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*m,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:g,amplitude2:v,progressToState:f}=this,y=6*v*n,b=6*v*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*g)*n,i.minRadius=0,i.maxRadius=(3+9*g)*n,s.minRadius=0,s.maxRadius=(3+9*g)*n,t.update(g,.3),i.update(g,.7),s.update(g,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-f,h=d):(n=d?f:1,c.update(l-o,r-a,m,g),h=c);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},v=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};i.draw(a,o-y,r,l,p,u,o,1),s.draw(a,o-b,r,l,p,u,o,1),t.draw(a,o,r,l,p,v,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[oh.UNMUTED,new Ah(oh.UNMUTED)],[oh.MUTED,new Ah(oh.MUTED)],[oh.MUTED_BY_ADMIN,new Ah(oh.MUTED_BY_ADMIN)],[oh.CONNECTING,new Ah(oh.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(oh.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new xh(3),this.lbd1=new xh(7),this.lbd2=new xh(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}const Dh=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let t in e)this.getProperty(t)}))}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}},Fh=Dh;class _h{constructor(e,t){this.item=e,(0,k.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Bh{constructor(e,t){this.icon=e,this.autoplay=!1,(0,k.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=ni.Z.loadAnimationAsAsset({container:i,canvas:s,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>ni.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new _h(this,e)}getPart(e){return e instanceof _h?e:"string"==typeof e?this.parts.find((t=>t.name===e)):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class Rh{constructor(e){(0,k.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(pt.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Bh(this,e);return this.items.set(e.name,t),t}playPart(e,t,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const n=e.getPart(t);e.player.playPart({from:s.Z.settings.animationsEnabled&&!this.skipAnimation?n.startFrame:n.endFrame,to:n.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class Nh extends Rh{constructor(e){super({width:e.width,height:e.height}),(0,k.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(pt.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Uh extends Nh{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=uu;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var Oh=i(6733);class Hh extends Nh{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=hu;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=hu;let i,s;switch(e){case t.HAND:s="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:s=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:s="green"}const n=Fh.getProperty("gc-"+s+"-text-color");return i=(0,sn.oo)(n),i}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=Rh.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=hu;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const zh="group-call-participant-status";class Vh{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(zh+"-container")}setState(e,t){const i=hu,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(zh+"-icon",zh+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,m.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,m.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,m.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,r.Z)(this.container,(0,Tt.Z)(t.about));n=(0,m.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(zh,a),o.append(...s,n),(0,p.Z)(this.container,o)}}var Gh=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Wh extends Zn{constructor(e){super({getIndex:e=>Gh(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Gh(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=pu(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{xn(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=$p.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});t.listEl.classList.add("group-call-participant");const i=new Hh(!0),s=new Vh(["presentation","video"]);return(0,p.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:Fe.T2}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=$p.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}class jh extends S.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,k.Z)(this,e);const{listenerSetter:t,element:i}=this;hi.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,mt.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,mt.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}function Kh(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d");i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,rt.jt)((()=>(s(),t.isConnected))),s(),t}const $h="group-call-participant-video";class qh{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add($h+"-container"),this.info=document.createElement("div"),this.info.classList.add($h+"-info"),this.left=document.createElement("div"),this.left.classList.add($h+"-info-left"),this.right=document.createElement("div"),this.right.classList.add($h+"-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add($h+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,i){let s;e.pFlags.self?(s=(0,m.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new Ft({peerId:(0,_i.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Hh(!1),this.groupCallParticipantStatus=new Vh([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add($h,"call-video"),i.paused&&i.play();const n=Kh(i);n.classList.add($h+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=pu(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Qh extends jh{constructor(e){super(),(0,k.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:i}=this;i.add(s.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,n.fc)(this.container,(e=>{const t=(0,mt.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,_i.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new qh(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Yh=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Xh{constructor(e){this.onOpenProfileClick=()=>{const e=x.Z.getPopups(vu)[0];e&&e.hide(),dp.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Yh(this,void 0,void 0,(function*(){yo({peerId:this.targetPeerId,title:new Ft({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Ft({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),pt.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=Vn(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Nn(e.onContextElement,(e=>Yh(this,void 0,void 0,(function*(){const t=(0,mt.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,a.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield Vi(this.buttons,(e=>Yh(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),ra(e.touches?e.touches[0]:e,this.element,"right"),ks.openBtnMenu(this.element))}))),t),t.add(s.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,_i.Z)(t.peer);this.targetPeerId===e&&ks.closeBtnMenu()}}));let i=document.body;(0,Oh.Ms)(document.body,(()=>{const e=(0,Oh.rB)();i=e?x.Z.getPopups(vu)[0].getContainer():document.body,e||ks.closeBtnMenu()}),t)}}class Jh{constructor(e){(0,k.Z)(this,e);const t="group-call-participants",i=new u.ZP(void 0);i.container.classList.add(t+"-scrollable");const n=this.container=document.createElement("div");n.classList.add(t);const a=this.sortedList=new Wh(this.instance),{instance:o,listenerSetter:r}=this;this.contextMenu=new Xh(Object.assign(Object.assign({},e),{onContextElement:a.list,listenerSetter:r,instance:o})),this.groupCallParticipantsVideo=new Qh(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(a.list),n.append(i.container),e.appendTo.append(n),r.add(s.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Zi({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(o)}updateParticipant(e){const t=(0,_i.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Yh(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class eu{constructor(e){this.appendTo=e,this.descriptionIntl=new m.ZP.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let i,s;t===oh.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class tu{constructor(e){this.appendTo=e,this.peerTitle=new Ft({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,r.Z)(i,(0,Tt.Z)(s.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var iu=i(2820);function su(e,t,i){const s=e+"-button",a=document.createElement("div");a.classList.add(s,"call-button","rp-overflow"),i.icon&&a.classList.add("tgico-"+i.icon),i.noRipple||(0,ye.Z)(a),i.isDanger&&a.classList.add(s+"-red"),i.isConfirm&&a.classList.add(s+"-green"),i.callback&&(0,n.fc)(a,i.callback,{listenerSetter:t});let o=a;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,m.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(a,t),o=e}return o}const nu="movable-element",au="movable-element-resize-handler";class ou extends S.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,k.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(nu),this.addResizeHandlers(),this.setSwipeHandler(),l.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(nu),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){l.Z.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(au,au+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new Zs({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?Oi.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?Oi.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const i=(0,mt.Z)(t,au);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=Oi.height/2-this.height/2,this.left=Oi.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Le.Z)(this.width,this.minWidth,Oi.width),this.height=(0,Le.Z)(this.height,this.minHeight,Oi.height)}fixPosition(){this.top=(0,Le.Z)(this.top,0,Oi.height-this.height),this.left=(0,Le.Z)(this.left,0,Oi.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var ru,lu=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i};class cu{constructor(e){ru.set(this,void 0),(0,k.Z)(this,e),this.toggleMovable(!hi.Z),this.listenerSetter.add(l.Z)("changeScreen",((e,t)=>{t!==l._.mobile&&e!==l._.mobile||this.toggleMovable(!hi.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,ru,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=lu(this,ru,new ou(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),lu(this,ru,void 0,"f")}}}function du(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>du(e,t,!i)}ru=new WeakMap;var hu,uu;function pu(e){const t=hu;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(hu||(hu={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(uu||(uu={}));let mu={width:420,height:640};const gu="group-call";class vu extends x.Z{constructor(){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{(0,Oh.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=du.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new ki("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Oh.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,s=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==s&&(h.Z.checkAnimations(e),Ga.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Oh.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(gu,"night");const e=this.instance=ph.groupCall,{listenerSetter:t}=this;if(!qe.IS_APPLE_MOBILE){const e=this.btnFullScreen=I("fullscreen"),i=this.btnFullScreen2=I("fullscreen group-call-cfs"),s=this.btnExitFullScreen=I("smallscreen");(0,n.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,n.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,n.fc)(s,(()=>{(0,Oh.C8)()}),{listenerSetter:t}),(0,Oh.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=I("adduser");const i=this.btnShowColumn=I("rightpanel group-call-only-big");(0,n.fc)(i,this.toggleRightColumn,{listenerSetter:t});const a=document.createElement("div");a.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),a.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,a,this.btnFullScreen,i].filter(Boolean));const r=this.header.cloneNode(!1),l=a.cloneNode(!1),c=this.title.cloneNode(!1);l.append(c);const d=I("rightpanel");r.append(...[d,l,this.btnFullScreen2].filter(Boolean)),(0,n.fc)(d,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(r);const p=new u.ZP(void 0);p.container.classList.add("group-call-big-video-container"),this.container.append(p.container),this.groupCallTitle=new tu(this.title),this.groupCallDescription=new eu(o),this.groupCallBodyHeaderDescription=new eu(c),this.constructButtons(),this.groupCallParticipantsVideo=new Qh({appendTo:p.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new Jh({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new cu({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,mt.Z)(t,"chatlist")||(0,mt.Z)(t,"group-call-button")||(0,mt.Z)(t,"btn-icon")||(0,mt.Z)(t,"group-call-participants-video-container")||(0,Oh.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:mu}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(s.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;mu=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()})),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add("group-call-buttons");const t=su.bind(null,gu,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!iu.Z);const n=t({noRipple:!0,callback:(0,ii.Z)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Uh;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!iu.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===oh.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Oh.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=uu;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===uu.HAND?"hand":i===uu.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var fu;!function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(fu||(fu={}));const yu=fu;class bu{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let i;if(this.state=t,t===yu.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=ht(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case yu.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case yu.REQUESTING:s="Call.StatusRequesting";break;case yu.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case yu.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,m.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===yu.CONNECTED),(0,p.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class wu extends Nh{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const Su="call",Cu={width:400,height:580};let Lu=Object.assign({},Cu);class Iu extends x.Z{constructor(e){super("popup-call",void 0,{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,Oh.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Oh.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,s=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==s&&(h.Z.checkAnimations(e),Ga.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Su,"night");const s=document.createElement("div");s.classList.add("call-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new Mp;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),s.append(o);const r=new Ft({peerId:a}).element;r.classList.add("call-title");const l=document.createElement("div");l.classList.add("call-subtitle"),this.description=new bu(l);const c=this.emojisSubtitle=document.createElement("div");c.classList.add("call-emojis"),t.append(s,r,l),qe.IS_MOBILE?this.header.append(c):(this.btnFullScreen=I("fullscreen"),this.btnExitFullScreen=I("smallscreen hide"),(0,n.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,n.fc)(this.btnExitFullScreen,(()=>(0,Oh.C8)()),{listenerSetter:i}),(0,Oh.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(c)),this.partyStates=document.createElement("div"),this.partyStates.classList.add("call-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add("call-party-state");const d=(0,m.ag)("VoipUserMicrophoneIsOff",[new Ft({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);d.classList.add("call-party-state-text");const u=new wu(!1,!0);u.setState(!1,!1),this.partyMutedState.append(u.container,d),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=su.bind(null,Su,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new cu({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,mt.Z)(t,"call-button")||(0,mt.Z)(t,"btn-icon")||(0,Oh.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Lu:Object.assign({},Cu)});const p=this.movablePanel.movable;p&&this.listenerSetter.add(p)("resize",(()=>{this.resizeVideoContainers()}));const g=this.controlsHover=new jh;g.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),g.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Lu=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-first");const t=du.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});iu.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new m.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new wu(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-second"),this.declineI18nElement=new m.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),(0,n.fc)(t,(()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()}));const i=Kh(e);return i.classList.add("call-video-blur"),t.append(i,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===yu.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Oh.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===yu.PENDING;this.declineI18nElement.compareAndUpdate({key:t===yu.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const l=e.getMediaState("output");(0,De.Z)(this.partyMutedState,"is-visible",!!(null==l?void 0:l.muted),300);const c=this.videoContainers,d=Object.assign({},c);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,ct.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=c[t];a&&s&&!o&&(o=c[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete c[t])}));{const e=c.input,t=c.output;Object.keys(d).length!==Object.keys(c).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(c).length),!this.emojisSubtitle.textContent&&t{this.emojisSubtitle.append((0,Tt.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,Oh.rB)()?65535:a?i.height:i.width),l=a?t.videoWidth/t.videoHeight:1,c=a?1:t.videoHeight/t.videoWidth;e.style.width=r*l+"px",e.style.height=r*c+"px",e.style.maxWidth=o*l+"px",e.style.maxHeight=o*c+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}function Mu(e){const t=ih(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=ih(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const l=new Map,c=e=>{let t=l.get(e);return t||l.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=c(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;c(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=c(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(l.values())}return i}class Eu extends Qc{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=Mu(eh(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}let Pu;var ku=i(4484),Tu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const xu=45e3;class Au extends S.Z{construct(e){this.managers=e,this.log=(0,ce.kg)("CC"),or.Z&&(this.audioAsset=null!=Pu?Pu:Pu=new kc(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],s.Z.addEventListener("call_update",(e=>Tu(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(yu.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(xu,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield bi.Z.invokeCrypto("sha256",t);if(!(0,ku.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o);break}i.encryptionKey=a,i.joinCall();break}}})))),s.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new qu(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===yu.CLOSED?(this.instances.delete(t.id),(0,P.Z)(this.sortedInstances,t)):(0,An.Z)(this.sortedInstances,t,"sortIndex"),e===yu.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===yu.EXCHANGING_KEYS||e===yu.CONNECTING&&s?t.setHangUpTimeout(xu,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===yu.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===yu.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===yu.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===yu.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return Tu(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(yu.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:oe.NM,date:(0,Rl.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>Tu(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(yu.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(xu,"phoneCallDiscardReasonHangup")}))}))}}const Zu=new Au;F.GO&&(F.GO.callsController=Zu);const Du=Zu;var Fu=i(4903);const _u="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var Bu=i(3692),Ru=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Nu{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,Fu.Z)(...e),_u.digest("SHA-256",(0,Bu.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return Ru(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return Ru(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return Ru(this,void 0,void 0,(function*(){const t=yield _u.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield _u[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,l=yield this.prepareAesKeyIv(n,a,s),c=yield this.aesProcessCtr(o,r,l,!1),d=yield this.concatSHA256([n.subarray(88+s,88+s+32),c]);if(this.constTimeIsDifferent(d.subarray(8),a,16))return;const h=new DataView(c.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),c.slice(4))}))}}class Uu{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new Rc;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Gu(c)),s&&r.add(`a=msid:${l} audio${s}`),r.add("a=rtcp-mux",Wu(a),ju(i,s,n,l));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Gu(c)),s&&r.add(`a=msid:${l} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",Wu(a),ju(i,s,n,l))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new Rc;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Gu(c)),s&&r.add(`a=msid:${l} audio${s}`),r.add("a=rtcp-mux",Wu(a),ju(i,s,n,l));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",Gu(c)),s&&r.add(`a=msid:${l} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",Wu(a),ju(i,s,n,l))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Ou{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Gu(c),r+="\na=rtcp-mux",r+=Wu(a),r+=ju(i,s,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Gu(c),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Wu(a),r+=ju(i,s,n,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Gu(h),r+="\na=rtcp-mux",r+=Wu(c),r+=ju(i,n,a,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${c.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=Gu(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Wu(c),r+=ju(i,n,a,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class Hu{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Gu(c),s&&(r+=`\na=msid:${l} audio${s}`),r+="\na=rtcp-mux",r+=Wu(a),r+=ju(i,s,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Gu(c),s&&(r+=`\na=msid:${l} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Wu(a),r+=ju(i,s,n,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const l="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Gu(c),s&&(r+=`\na=msid:${l} audio${s}`),r+="\na=rtcp-mux",r+=Wu(a),r+=ju(i,s,n,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=Gu(c),s&&(r+=`\na=msid:${l} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=Wu(a),r+=ju(i,s,n,l)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function zu(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function Vu(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function Gu(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),c){const e=[];Object.getOwnPropertyNames(c).forEach((t=>{e.push(`${t}=${c[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function ju(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class Ku{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:l,type:c,relAddress:d,generation:h,tcpType:u,networkId:p,networkCost:m,username:g}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return zu()?Ou.generateOffer(e):Vu()?Hu.generateOffer(e):Uu.generateOffer(e)}static generateAnswer(e){return zu()?Ou.generateAnswer(e):Vu()?Hu.generateAnswer(e):Uu.generateAnswer(e)}}var $u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class qu extends jc{constructor(e){super(),this.log=(0,ce.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,k.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",yu[e]),e===yu.CLOSED&&this.cleanup()}));const t=this.streamManager=new Wc(100);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,Ii.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?yu.CLOSED:"connected"===e||qe.IS_SAFARI&&"completed"===e?yu.CONNECTED:yu.CONNECTING}return yu.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(yu.CLOSED-e+1);return t+=2147483647e3-(e===yu.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return $u(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return $u(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return $u(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return $u(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&(Bc(s),t.appendToConference(i))}))}toggleVideoSharing(){return $u(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===yu.CLOSING||e===yu.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=Ja.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return $u(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(yu.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>$u(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>$u(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new Eu({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===yu.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new Nu(e,t),this.decryptor=new Nu(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return $u(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...l]=e.split(" "),c={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,oi.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return $u(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description;let s=i.entries.map((e=>e.mid));const n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=Mu(eh(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return $u(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(yu.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return $u(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[$c("audio",+e.audio.ssrc),e.video?$c("video",s(e.video.ssrcGroups)):void 0,e.screencast?$c("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new Kc(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;let a=i.entries.map((e=>e.mid));const o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=Ku.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return $u(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return $u(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return $u(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),Du.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}class Qu{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new C.Z;t.add(Du)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(Du)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(ph)("instance",(e=>{this.updateInstance(e)})),t.add(s.Z)("group_call_update",(e=>{const t=ph.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(Wc.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new C.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof lh?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof lh)));const i=this.instance.isMuted;let s=e instanceof lh?e.state:function(e,t){switch(e){case yu.CLOSING:case yu.CLOSED:return oh.CLOSED;case yu.CONNECTED:return t?oh.MUTED:oh.UNMUTED;default:return oh.CONNECTING}}(e.connectionState,i);const{weave:n}=this;n.componentDidMount();const a=s===oh.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,De.Z)(document.body,"is-calling",!a,250,a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0)),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof lh)return this.groupCallTitle.update(e);(0,p.Z)(this.center,new Ft({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const i=document.createElement("div");i.classList.add("topbar-call-left");const s=this.groupCallMicrophoneIconMini=new wu,o=I();o.append(s.container),i.append(o);const r=(0,ii.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,n.fc)(o,(e=>{(0,a.Z)(e),r()}),{listenerSetter:e});const l=this.center=document.createElement("div");l.classList.add("topbar-call-center"),this.groupCallTitle=new tu(l),this.groupCallDescription=new eu(i),this.callDescription=new bu(i);const c=document.createElement("div");c.classList.add("topbar-call-right");const d=I("endcall_filled");c.append(d),(0,n.fc)(d,(e=>{(0,a.Z)(e);const{instance:t}=this;t&&(t instanceof lh?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,n.fc)(t,(()=>{if(this.instance instanceof lh){if(x.Z.getPopups(vu).length)return;(new vu).show()}else if(this.instance instanceof qu){if(x.Z.getPopups(Iu).find((e=>e.getCallInstance()===this.instance)))return;new Iu(this.instance).show()}}),{listenerSetter:e}),t.append(i,l,c);const h=this.weave=new Zh,u=h.render("topbar-call-weave");t.prepend(u),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var Yu=i(6009),Xu=i(6702),Ju=i(1722),ep=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const tp=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=ri.Z,this.faviconEl=document.head.querySelector('link[rel="icon"]'),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(e).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&Xu.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Xu.default.subscribe():Xu.default.unsubscribe())}Xu.default.setSettings(this.settings)})),bi.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,Re.Z)(),kh.Z.addEventListener("deactivated",(()=>{this.stop()})),kh.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),gr.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),s.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),s.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),Xu.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Xu.default.subscribe()})),Xu.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Xu.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),s.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Xu.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>ep(this,void 0,void 0,(function*(){e.custom.channel_id&&!(yield this.managers.appChatsManager.hasChat(e.custom.channel_id))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t))||dp.setInnerPeer({peerId:t,lastMsgId:(0,mr.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return ep(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},r=yield this.managers.appPeersManager.getPeerString(n);let l;if(s.show_previews){if("message"===e._&&e.fwd_from&&t>1)l=m.ZP.format("Notifications.Forwarded",!0,[t]);else if(l=yield bn(e,void 0,void 0,!0),i){const e="Notification.Contact.Reacted",t=[(0,wr.Z)(i.reaction),l];l=m.ZP.format(e,!0,t)}}else l=m.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const c=i?(0,_i.Z)(i.peer_id):e.fromId;o.title=yield(0,Zt.Z)(n,!0,void 0,void 0,this.managers),a&&c!==e.peerId&&(o.title=(yield(0,Zt.Z)(c,!0,void 0,void 0,this.managers))+" @ "+o.title),o.title=(0,Kt.Z)(o.title),o.onclick=()=>{dp.setInnerPeer({peerId:n,lastMsgId:e.mid})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const d=yield this.managers.appPeersManager.getPeerPhoto(n);d?this.managers.appAvatarsManager.loadAvatar(n,d,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=gr.Z.isIdle){if(qe.IS_MOBILE)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval((()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=m.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,i=e.key||"k"+t;this.notificationsShown[i]=!0;const s=(0,Rl.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void Xu.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),Ju.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[i],this.clear())},n.show&&n.show(),this.notificationsShown[i]=n,qe.IS_MOBILE||setTimeout((()=>{this.hide(i)}),8e3)}}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,Rl.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,Xu.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),s.Z.addEventListener("settings_updated",this.updateLocalSettings),Xu.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,Xi.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};F.GO&&(F.GO.uiNotificationsManager=tp);const ip=tp;var sp=i(8576),np=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function ap(e,t=!1){return np(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>np(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>np(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{const t=location.hash;e||w.Z.replaceState();const i=t.split("?"),s=this.parseUriParams(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr){const{onclick:e}=(0,gn.Z)(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else{"#/im"!==i[0]&&(s.p=i[0].slice(1));{const e=s.p;let t=void 0!==s.post?(0,mr.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",s.Z.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!s.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",s.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ii.Z)((()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),s.Z.settings.animationsEnabled?250:0,!1,!0),ni.Z.setLoop(s.Z.settings.stickers.loop),h.Z.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();m.ZP.setTimeFormat(s.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>op(this,void 0,void 0,(function*(){const i=El();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,a.Z)(e)}const s=yield ap(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(o.Z.has(s[0].type)?"media":"document"),x.Z.createPopup(Pl,this.chat,s,e.willAttachType)}}))}get myId(){return s.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(m.ZP.lastRequestedLangCode),ut.Z.construct(e),ip.construct(e),this.log=(0,ce.kg)("IM",ce.v9.Log|ce.v9.Warn|ce.v9.Debug|ce.v9.Error),this.backgroundPromises={},Ka.h.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(qe.IS_FIREFOX?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(0),gr.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(l.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),w.Z.onHashChange=this.onHashChange,this.setSettings(),s.Z.addEventListener("settings_updated",this.setSettings),(0,Ne.ZP)((()=>{h.Z.setOnlyOnePlayableGroup("lock"),h.Z.checkAnimations(!0)}),(()=>{h.Z.setOnlyOnePlayableGroup(""),h.Z.checkAnimations(!1)})),qe.IS_FIREFOX&&bi.Z.oldVersion&&-1===(0,Yu.Z)(bi.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),l.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(Ro)&&document.body.classList.contains(zs)&&Gs.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),l.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();yh.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),s.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),s.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),s.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||vr.Z.isOverlayActive||l.Z.activeScreen===l._.mobile&&1!==this.tabId)return;const a=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==a?void 0:a.action)||void 0===i?void 0:i._)){const t=a.action,i=s.bubbles.bubbles[(0,mr.Z)(a.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&i.classList.contains("sticker")&&rr(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,n.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const i=e=>{const t="version"===e,i=new x.Z("popup-instance-deactivated",void 0,{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,m.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,m.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Ju.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),kh.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};kh.Z.addEventListener("deactivated",i),kh.Z.deactivatedReason&&i(kh.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),s.Z.addEventListener("service_notification",(e=>{yo({button:{langKey:"OK",isCancel:!0},description:(0,Qt.Z)(e.message)})})),bi.Z.addEventListener("notificationBuild",(e=>{(this.chat.peerId!==e.message.peerId||gr.Z.isIdle)&&ip.buildNotification(e)})),this.addEventListener("peer_changed",(e=>op(this,void 0,void 0,(function*(){let t;if(document.body.classList.toggle("has-chat",!!e),e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}w.Z.overrideHash(t),bi.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),Eh.Z.setToCache("chatPositions",{}),(or.Z||Ec.Z)&&(this.topbarCall=new Qu(e)),or.Z&&(Du.addEventListener("instance",(({instance:e})=>{const t=new Iu(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(Du.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Du.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),Du.addEventListener("incompatible",(e=>{Li({langPackKey:"VoipPeerIncompatible",langPackArguments:[new Ft({peerId:e.toPeerId()}).element]})}))),kh.Z.activateInstance();const a=()=>{Th.default.setAuthorized(!0)};setInterval(a,R),a(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new ki("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:lr.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:lr.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),Ec.Z&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(lr.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>op(this,void 0,void 0,(function*(){let i;i=La.kO.test(e[0])?{_:lr.USER_PHONE_NUMBER,phone:e[0].slice(1)}:"c"===e[0]?{_:lr.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:lr.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(i)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;e.phone?t=this.makeLink(lr.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(t=this.makeLink(lr.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(lr.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(lr.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(lr.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener()}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(s.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===l._.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var i;const s=t.key;if(vr.Z.isOverlayActive||e.has(s))return;const n=t.target,o=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===n.tagName){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(o.input.editMsgId||!o.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(o.peerId,o.threadId).then((e=>{e&&(o.input.initMessageEditing(e.mid),(0,a.Z)(t))}))}else if("ArrowDown"===s)return}else(0,a.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,$p.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==o?void 0:o.input)||void 0===i?void 0:i.messageInput)&&t.target!==o.input.messageInput&&"INPUT"!==n.tagName&&!n.hasAttribute("contenteditable")&&!hi.Z&&(!l.Z.isMobile||1===this.tabId)&&!o.selection.isSelecting&&!o.input.recording){o.input.messageInput.focus(),(0,Cl.Z)(o.input.messageInput);const e=new KeyboardEvent(t.type,t);o.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return op(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case lr.MESSAGE:{const t=e.post?(0,mr.Z)(+e.post):void 0,i=e.comment?(0,mr.Z)(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start});break}case lr.PRIVATE_POST:{const t=e.channel.toChatId(),i=t.toPeerId(!0);if((yield this.managers.appChatsManager.getChat(t)).deleted)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw Li({langPackKey:"LinkNotFound"}),e}const s=(0,mr.Z)(+e.post),n=e.thread?(0,mr.Z)(+e.thread):void 0;n?this.openThread(i,s,n):this.setInnerPeer({peerId:i,lastMsgId:s,threadId:n});break}case lr.STICKER_SET:new Xa({id:e.set}).show();break;case lr.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new cr(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&Ci((0,m.ag)("InviteExpired"))}));break;case lr.VOICE_CHAT:Ec.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case lr.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&Li({langPackKey:"Alert.UserDoesntExists"})}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,gn.Z)(e),s=document.createElement("a");s.href=t,window[i](s)}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{(0,a.Z)(null);const i=t.href;let s,n;e.noPathnameParams||(s=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(i));const o=e.callback({pathnameParams:s,uriParams:n},t);return void 0===o&&o}}parseUriParams(e,t=e.split("?")){const i={};return t[1]?(t[1].split("&").forEach((e=>{i[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),i):i}openUsername(e){const{userName:t,lastMsgId:i,threadId:s,commentId:n,startParam:a}=e;return this.managers.appUsersManager.resolveUsername(t).then((e=>{const t="user"===e._,o=e.id.toPeerId(!t);return s?this.openThread(o,i,s):n?this.openComment(o,i,n):this.setInnerPeer({peerId:o,lastMsgId:i,startParam:a})}),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?Li({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&Li({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e,t,i){return this.managers.appMessagesManager.wrapSingleMessage(e,i).then((s=>(s?this.managers.appMessagesManager.generateThreadServiceStartMessage(s):t=void 0,this.setInnerPeer({peerId:e,lastMsgId:t,threadId:i,type:"discussion"}))))}openComment(e,t,i){return this.managers.appMessagesManager.getDiscussionMessage(e,t).then((e=>this.openThread(e.peerId,i,e.mid)))}callUser(e,t){return op(this,void 0,void 0,(function*(){Du.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?yo({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[new Ft({peerId:e.toPeerId()}).element],button:{langKey:"OK",isCancel:!0}}):(yield this.discardCurrentCall(e.toPeerId()),Du.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return ph.groupCall&&ph.groupCall!==t?this.discardGroupCallConfirmation(e):Du.currentCall&&Du.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return op(this,void 0,void 0,(function*(){const t=Du.currentCall;t&&(yield yo({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[new Ft({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new Ft({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return op(this,void 0,void 0,(function*(){const t=ph.groupCall;t&&(yield yo({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Ft({peerId:t.chatId.toPeerId(!0)}).element,new Ft({peerId:e}).element],button:{langKey:"OK"}}),ph.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return op(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void Li({langPackKey:"VoiceChat.Chat.Ended"});yield yo({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{op(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}ph.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=Ga.Z.getTheme();if(t.background.slug){const i=Ka.h.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,Di.Z)(i.background),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&s.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=Eh.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,ia.Z)(t.bubbles,"desc").filter((e=>!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}Eh.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=Eh.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),Ga.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Ph([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),s.Z.settings.animationsEnabled&&!1!==t&&(0,Ne.YW)((0,dr.Z)(400),400);const i=(0,Tn.Z)(this.prevTab);(0,Tn.Z)(e)>i&&w.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,$n.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),hi.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Ch(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(a,c)=>op(this,void 0,void 0,(function*(){if(c===i)return;const d=a.dataTransfer.types,h=d.contains?d.contains("Files"):d.indexOf("Files")>=0,u=El(),p=yield ap(a,!0);if(!h||!(yield this.canDrag())&&!u)return void(n=0);const m=u?l:r,g=u?t:e;if(c&&!g.length){const e=h&&!p.length,t=p.filter((e=>o.Z.has(e))).length;this.log("drag files",p),u?(u.appendDrops(m),(p.length||e)&&g.push(new Mh(m,{header:"Preview.Dragging.AddItems",headerArgs:[p.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((p.length||e)&&g.push(new Mh(m,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&g.push(new Mh(m,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(m))}(0,De.Z)(m,"is-visible",c,200,(()=>{c||(g.forEach((e=>{e.destroy()})),g.length=0)})),c?g.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",c),i=c}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,a.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const r=document.createElement("div");r.classList.add("drops-container");const l=r.cloneNode(!0)}canDrag(){return op(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||vr.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}selectTab(e,t){!1===t&&Ph([Vo.sidebarEl,this.columnEl,Gs.sidebarEl]),document.body.classList.toggle(Ro,0===e);const i=this.tabId;this.log("selectTab",e,i);let n=s.Z.settings.animationsEnabled?(0,Fe.d1)():Promise.resolve();if(-1!==i&&i!==e&&s.Z.settings.animationsEnabled&&!1!==t&&l.Z.activeScreen!==l._.large){const e=100+(l.Z.isMobile?250:200);n=(0,dr.Z)(e),(0,Ne.YW)(n,e)}this.tabId=e,(0,$n.Z)(),l.Z.isMobile&&2===i&&e<2&&document.body.classList.remove(zs),-1!==i&&e>i&&(e<2||!w.Z.findItemByType("im"))&&w.Z.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}});const a=window.onImTabChange;return a&&a(e),n}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new wh(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const a=this.chat;this.dispatchEvent("chat_changing",{from:n,to:a});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(a.container,i),t){this.dispatchEvent("peer_changed",a.peerId);const e=Gs.getTab(vh);e&&e.close(),Gs.replaceSharedMediaTab(a.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return op(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=oe.NM);const{peerId:s,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(s){if(o>0&&a.peerId&&a.peerId!==s){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(o>0)return void this.spliceChats(o,void 0,t);if(l.Z.activeScreen===l._.medium)return void this.selectTab(+!this.tabId,t)}if(s===a.peerId&&l.Z.activeScreen<=l._.medium&&document.body.classList.contains(Ro))return this.selectTab(1,t),!1;if(s||l.Z.activeScreen!==l._.mobile){const i=yield a.setPeer(s,n,e.startParam),o=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([o,a.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(1,t)}),0)}))}return s?void 0:(this.selectTab(0,t),!1)}))}setInnerPeer(e){var t;const{peerId:i}=e;if(i===oe.NM||!i)return;e.threadId&&(e.type="discussion");const s=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex((e=>e.peerId===i&&e.type===s));if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const a=this.chat;let o=a;return a.inited&&(o=this.createNewChat()),s&&(o.setType(s),e.threadId&&(o.threadId=e.threadId)),this.dispatchEvent("chat_changing",{from:a,to:o}),this.setPeer(e)}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t){return op(this,void 0,void 0,(function*(){const i=e.isUser();if(i&&(yield this.managers.appUsersManager.isBot(e)))return;const s=yield this.managers.appProfileManager.getPeerTypings(e);if(!(null==s?void 0:s.length))return;const n=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=i?a.private:s.length>1?a.multi:a.chat;let r=n.action;if(s.length>1){const e={};s.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;let c,d;if(e.isAnyChat()){const e=new Ft;c=e.update({peerId:n.userId.toPeerId(!1),onlyFirstName:!0}),d=[e.element,s.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let h=t.firstElementChild;if(h?h.dataset.action!==r._&&h.replaceWith(this.getTypingElement(r)):(h=this.getTypingElement(r),t.prepend(h)),"sendMessageEmojiInteractionSeen"===r._){d?d.pop():d=[];const e=(0,un.Z)((0,Tt.Z)(r.emoticon));d.push(e)}const u=(0,m.ag)(l,d);return u.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(u):t.append(u),t}))}getChatStatus(e){return op(this,void 0,void 0,(function*(){const t=yield this.getPeerTyping(e.toPeerId(!0));if(t)return{cached:!0,result:Promise.resolve(t)};const i=yield this.managers.acknowledged.appProfileManager.getChatFull(e),s=Promise.resolve(i.result).then((t=>op(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield ji(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,m.v_)([a,(0,m.ag)("OnlineCount",[Wi(o)])],!1)),a=e}return a}))));return{cached:i.cached,result:s}}))}getUserStatus(e,t){var i;return op(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=re(n);if(!n.pFlags.bot){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t){return op(this,void 0,void 0,(function*(){if(!e)return;let i;return i=e.isAnyChat()?this.getChatStatus(e.toChatId()):this.getUserStatus(e.toUserId(),t),i}))}setPeerStatus(e,t,i,s,n,a){return op(this,void 0,void 0,(function*(){if(!i){const i=t.querySelector(".peer-typing-container");if(i&&(yield this.getPeerTyping(e,i)))return}const o=yield this.getPeerStatus(e,a);if(!n())return;const r=()=>op(this,void 0,void 0,(function*(){const e=o&&(yield o.result);if(n())return()=>(0,p.Z)(t,e||l)})),l=s?"‎":"";return!o||o.cached?yield r():i?()=>(t.textContent=l,r().then((e=>e&&e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}}const cp=new lp;F.GO&&(F.GO.appImManager=cp);const dp=cp;class hp extends jh{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new C.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new kt(e,i),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=ht(0|i.duration);const l=new fc(n),c=t.querySelector(".left-controls");if(l.btn.classList.remove("btn-icon"),c.insertBefore(l.btn,o.parentElement),Array.from(e).forEach((e=>{n.add(e)("click",(()=>{this.togglePlay()}))})),this.pipButton){n.add(this.pipButton)("click",(()=>{this.video.requestPictureInPicture()}));const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,Ii.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}hi.Z||(n.add(i)("click",(()=>{this.togglePlay()})),n.add(document)("keydown",(e=>{if(vr.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let o=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)ut.Z.muted=!ut.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?o=!1:"ArrowLeft"===s?ut.Z.seekBackward({action:"seekbackward"}):ut.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=ut.Z.playbackRate,i=hp.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{hi.Z||this.toggleFullScreen()})),n.add(s)("click",(()=>{this.toggleFullScreen()})),(0,Oh.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.innerHTML=ht(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),hi.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(ut.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.innerHTML=ht(Math.round(i.duration||e)):(0,ct.Z)(i).then((()=>{r.innerHTML=ht(Math.round(i.duration))}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!qe.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=hp.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{ut.Z.playbackRate=e}}))),t=Vn(e);t.classList.add("top-left"),ha(this.playbackRateButton,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,void 0,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;hp.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=hp.PLAYBACK_RATES.indexOf(ut.Z.playbackRate);-1===t&&(t=hp.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+hp.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(qe.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,Oh.rB)()?(0,Oh.C8)():(0,Oh.Dj)(e)}onFullScreen(e){const t=(0,Oh.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}hp.PLAYBACK_RATES=[.5,1,1.5,2],hp.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var up=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class pp extends S.Z{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,a.Z)(e),hi.Z)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,mt.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(vr.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,a.Z)(e)},this.onKeyUp=e=>{vr.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(vr.Z.overlaysActive>1||(0,mt.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,a.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=s.Z.managers,this.log=(0,ce.kg)("AMV"),this.preloader=new Be,this.preloaderStreamable=new Be({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new me.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add("media-viewer");const o=this.topbar=document.createElement("div");o.classList.add("media-viewer-topbar","media-viewer-appear");const r=document.createElement("div");r.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=I("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const l=document.createElement("div");this.author.avatarEl=new Mp,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),l.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,l);const c=document.createElement("div");c.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=I(e,{noRipple:!0});this.buttons[e]=t,c.append(t)})),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=I("zoomout",{noRipple:!0}),(0,n.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=I("zoomin",{noRipple:!0}),(0,n.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new Pt({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),r.append(this.buttons["mobile-close"],this.author.container),o.append(r,c),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){(0,n.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,n.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,a.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,n.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},hi.Z&&new Zs({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,Oh.rB)())return Math.abs(e)/Oi.width>.2||e>125?(e<0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/Oi.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!(0,mt.Z)(e.target,"media-viewer-caption")})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=-1;this.zoomSwipeHandler=new Zs({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=ua({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&(0,a.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&w.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){vr.Z.isOverlayActive=e,h.Z.checkAnimations(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){this.zoomSwipeHandler&&this.zoomSwipeHandler.removeListeners(),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0})}setGlobalListeners(){this.isZooming()&&this.zoomSwipeHandler.setListeners(),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),hi.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return up(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=s.Z.settings.animationsEnabled?o?350:200:0;let l,c;e&&(e instanceof Mp||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=(0,mt.Z)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=(0,mt.Z)(e,"profile-avatars-container"),c=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==c.left&&(e=l=c=void 0))),e||(e=this.content.media),c||(l=e.parentElement,c=e.getBoundingClientRect());let d=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=rr(l,(0,mt.Z)(l,"scrollable"),!0);!t||i&&2!==i.overflow.vertical&&2!==i.overflow.horizontal?!i||1!==i.overflow.vertical&&1!==i.overflow.horizontal||(d=!0):(l=(e=this.content.media).parentElement,c=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,m,g="";if(o?(u=1===i?Oi.width:-h.width,p=h.top):(u=c.left,p=c.top),g+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){m=n.firstElementChild;const e=m.querySelector(".ckin__player");if(e){const t=e.firstElementChild;m.append(t),e.remove()}m.style.cssText||(n.classList.remove("active"),this.setFullAspect(m,h,c),n.offsetLeft,n.classList.add("active"))}else m=document.createElement("div"),m.classList.add("media-viewer-aspecter"),n.prepend(m);m.style.cssText=`width: ${c.width}px; height: ${c.height}px; transform: scale3d(${h.width/c.width}, ${h.height/c.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const v=c.width/h.width,f=c.height/h.height;o||(g+=`scale3d(${v},${f},1) `);let y=window.getComputedStyle(l).getPropertyValue("border-radius");const b=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(y);if(y=b.map((e=>parseInt(e)/v+"px")).join(" "),o||(n.style.borderRadius=y),t&&1!==a){const e=Oi.width/2-c.width/2,t=Oi.height/2-c.height/2,i=c.left-e,s=c.top-t;this.moversContainer.style.transform=`matrix(${v}, 0, 0, ${f}, ${i}, ${s})`}else n.style.transform=g;let w;d&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,Re.Z)(),L={onAnimationEnd:C},I=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(I)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,v,r,!1,S,y)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=y,n.firstElementChild&&(n.firstElementChild.style.borderRadius=y)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),L;{let t,i;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=lt(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/v:2/v}, ${a}) scale(${+n/v}, ${+o/f})`)),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=y.split(" ").map((e=>parseInt(e)));e=S?Ih(0,0,s-9/v,a,...i):Ih(9/v,0,s-9/v,a,...i),w.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+h.width),c.setAttributeNS(null,"height",""+h.height),n.prepend(o)}m&&(m.style.borderRadius=y,t&&m.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),m||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield Ae(t,i))),n.style.display="",(0,Fe.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,Fe.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,d&&(n.style.opacity=""),m&&this.setFullAspect(m,h,c),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),m&&(n.querySelector("video"),n.classList.remove("active"),m.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,v,r,!0,S,y),L}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:l,height:c}=t;s/=2;const d=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=d.map((e=>e*o));let p;p=a?Ih(0,0,l-9/i*o,c,...u):Ih(9/i*o,0,l,c,...u),e.setAttributeNS(null,"d",p),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,mt.Z)(e,"document")){if((0,mt.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}xe(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=_s({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,Tt.Z)(e)),t.classList.add("peer-title")}let n=this.author.avatarEl;const a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||oe.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,p.Z)(this.author.date,H(t)),(0,p.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,n,o=!1,r=[],c=[],h){return up(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const u=this.setAuthorInfo(i,t),p="document"===e._,m=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(r,c,o),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,v=!n||n===g;v&&(n=g),this.target={element:n};const f=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield u,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),qe.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},w.Z.pushItem(this.navigationItem)));const y=this.content.mover,b=Oi.width;let S=0;const C=Oi.height;C<1e6&&!l.Z.isMobile&&(S=120);const L=C-120-S;let I=Promise.resolve();const M=nt(e,g,b,L,!l.Z.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=it(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const E=!(!p||!e.supportsStreaming),P=E?this.preloaderStreamable:this.preloader,k=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let T;if(m){const t=h&&"gif"!==e.type,i=lt({pip:t}),o=()=>this.setMoverToTarget(n,!1,s).then((({onAnimationEnd:s})=>{const o=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==f&&i.pause()})),i.addEventListener("error",(()=>{4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),P&&P.detach()}),{once:!0}),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),qe.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),o.append(i);const l=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),c=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([l,s]).then((()=>{this.tempId===f&&((this.videoPlayer=new hp({video:i,play:!0,streamable:E,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?w.Z.removeItem(this.navigationItem):w.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,ut.Z.setPictureInPicture(i)):this.releaseSingleMedia=ut.Z.setSingleMedia(i,h))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(E){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{P.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,a.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>up(this,void 0,void 0,(function*(){const a=E?Promise.resolve():d.Z.downloadMediaURL({media:e});return E||s.then((()=>up(this,void 0,void 0,(function*(){(yield k()).url||P.attach(y,!0,a)})))),Promise.all([a,s]).then((()=>up(this,void 0,void 0,(function*(){if(this.tempId!==f)return void this.log.warn("media viewer changed video");const e=(yield k()).url;n instanceof SVGSVGElement?o.firstElementChild.lastElementChild.append(i):xe(i,e),t&&(this.releaseSingleMedia=ut.Z.setSingleMedia(i,h),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(n,e,"video"),c()})))),a}))})}));T=I.then(o)}else{const t=()=>this.setMoverToTarget(n,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>up(this,void 0,void 0,(function*(){const i=p?d.Z.downloadMediaURL({media:e}):d.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>up(this,void 0,void 0,(function*(){(yield k()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>up(this,void 0,void 0,(function*(){var e;if(this.tempId!==f)return void this.log.warn("media viewer changed photo");const t=(yield k()).url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(y,t,"img"),l.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){let e=new Image;e.classList.add("thumbnail"),xe(e,t,(()=>{this.updateMediaSource(n,t,"img"),s&&(0,Fe.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));T=I.then(t)}return this.setMoverPromise=T.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}var mp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class gp extends pp{constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,be.Z)(e);if(n&&(!t||gp.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>mp(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>mp(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new jn(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new Gn({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>mp(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>mp(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=Gs.getTab(Hs);e&&e.close()}dp.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>mp(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,be.Z)(i);s&&d.Z.downloadToDisc({media:s,queueId:dp.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new u.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,n.fc)(this.buttons.delete,this.onDeleteClick);const i=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(i),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),(0,n.fc)(this.buttons.forward,this.onForwardClick),(0,n.fc)(this.author.container,this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const i=t.target.getAttribute("onclick");if(!i||i.includes("showMaskedAlert"))return;return(0,a.Z)(t),this.close().then((()=>{(0,n.EN)(this.content.caption,e,{capture:!0}),t.target.click()})),!1}};(0,n.fc)(this.content.caption,e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,Qt.Z)(t,{entities:e.totalEntities})),(0,r.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return mp(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,l=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,c=(0,be.Z)(e),d="messageService"===e._||!this.managers.appMessagesManager.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach((e=>{e.classList.toggle("hide",d)})),this.wholeDiv.classList.toggle("no-forwards",d);const h=d;[this.buttons.download,this.btnMenuDownload.element].forEach((e=>{e.classList.toggle("hide",h)}));const u=this.managers.appMessagesManager.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach((e=>{e.classList.toggle("hide",!u)})),this.setCaption(e);const p=o._openMedia.call(this,c,e.date,l,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,p}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||o.Z.has(e.mime_type)}}class vp extends fs.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var fp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class yp extends pp{constructor(e){super(new vp({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>fp(this,void 0,void 0,(function*(){d.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:dp.chat.bubbles.lazyLoadQueue.queueId})})),this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return fp(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,r}))}}var bp=i(5880),wp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Sp=e=>{Array.from(document.querySelectorAll('avatar-element[data-peer-id="'+e+'"]')).forEach((e=>{e.update()}))};function Cp(e,t,i,n,a,o){return wp(this,void 0,void 0,(function*(){let r=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!r)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==r.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,r)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new gp).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,o?i(o):void 0)}}if(r){!(0,bp.Z)(n)&&n&&(r=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new yp(t).openMedia(r.id,l(),void 0,a?e(a):void 0,o?e(o):void 0)}}))}s.Z.addEventListener("avatar_update",Sp),s.Z.addEventListener("peer_title_edit",(e=>wp(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e))||Sp(e)}))));const Lp=new Map,Ip=new Set;class Mp extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}disconnectedCallback(){const e=Lp.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||Lp.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>wp(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield Cp(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(let t in e)this[t]=e[t]}updateWithOptions(e){const t=this.peerId;this.updateOptions(e);const i=this.peerId;if(t!==i){if(this.peerId=i,this.dataset.peerId=""+i,t){const e=Lp.get(t);e&&(e.delete(this),e.size||Lp.delete(t))}return this.update()}}r(e=!1){const t=Es(this,this.peerId,this.isDialog,this.peerTitle,e,this.isBig);return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!Ip.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=Lp.get(this.peerId);return e||(e=new Set,Lp.set(this.peerId,e)),e.add(this),this.lazyLoadQueue.push({div:this,load:()=>(Ip.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}Ip.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=Lp.get(this.peerId);if(t){t.delete(this);const e=Array.from(t);Lp.delete(this.peerId);for(let t=0,i=e.length;tEp(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.onPinClick=()=>{this.managers.appMessagesManager.toggleDialogPin(this.selectedId,this.filterId).catch((e=>Ep(this,void 0,void 0,(function*(){if("PINNED_DIALOGS_TOO_MUCH"===e.type)if(this.filterId>=1)Li({langPackKey:"PinFolderLimitReached"});else{const e=yield this.managers.apiManager.getConfig();new ki("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{Vo.createTab(mo)}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[(0,m.ag)("Chats",[e.pinned_dialogs_count_max])]}).show()}}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute(this.selectedId,!1)},this.onMuteClick=()=>{new Pc(this.selectedId)},this.onUnreadClick=()=>Ep(this,void 0,void 0,(function*(){const e=this.selectedId,t=yield this.managers.appMessagesManager.getDialogOnly(e);t&&(t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message),this.managers.appMessagesManager.markDialogUnread(e,!0)):this.managers.appMessagesManager.markDialogUnread(e))})),this.onDeleteClick=()=>{new ss(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,Ai.Z)(e.target,Vp)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{Ep(this,void 0,void 0,(function*(){this.filterId=$p.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId),yield Promise.all(this.buttons.map((e=>Ep(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)}))))),this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,m.ag)(yield this.managers.appPeersManager.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),ra(e,this.element),ks.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>Ep(this,void 0,void 0,(function*(){return!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>Ep(this,void 0,void 0,(function*(){var e;return!(this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>Ep(this,void 0,void 0,(function*(){var e;return this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>Ep(this,void 0,void 0,(function*(){return this.selectedId!==s.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>Ep(this,void 0,void 0,(function*(){return this.selectedId!==s.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==s.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==s.Z.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Vn(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var kp,Tp=i(9174);class xp{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{Promise.all([Fo.Z.get("dc"),s.Z.managers.rootScope.getConnectionStatus()]).then((([e,t])=>{e||(e=Do.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const i=t["NET-"+e],s=i&&i.status===Tp.Q.Connected;this.connecting&&s&&this.managers.apiUpdatesManager.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=i&&i.status===Tp.Q.TimedOut,this.connecting=!s,this.retryAt=i&&i.retryAt,F.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,p.Z)(this.statusEl,(0,m.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(kh.Z.deactivatedReason)return;const e=xp.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.round((t-i)/1e3),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");F.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,De.Z)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,F.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,ce.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,L.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new Be({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),s.Z.addEventListener("connection_status_change",(e=>{console.log(e),this.setConnectionStatus()})),s.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,F.ZP&&this.log("updating",this.updating),this.setState())})),s.Z.addEventListener("state_synchronized",(e=>{F.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,F.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,xp.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,m.ag)(e)),(0,n.fc)(i,(e=>{(0,a.Z)(e),t()})),i}}function Ap(e,t,i,s){return e>=s?t+i:-i/2*(Math.cos(Math.PI*e/s)-1)+t}function Zp(e,t,i,s,n,a,o,r){const l=e.canvas.dpr;if(l&&(t*=l,i*=l,s*=l,n*=l),"number"==typeof a)l&&(a*=l),a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]?l?a[t]*l:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}xp.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(kp||(kp={}));const Dp=window.devicePixelRatio,Fp=20*Dp,_p=2.5*Dp,Bp=2*Dp,Rp=1*Dp;var Np=i(3385),Up=i(2554);class Op{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,Le.Z)(this.lightSource,0,1),e=(0,Le.Z)(this.lightSource-this.lightSpread,0,1),t=(0,Le.Z)(this.lightSource+this.lightSpread,0,1);const a=Fh.getProperty("background-color-true"),o=Fh.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class Hp{constructor(){this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new Op,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=54,this.marginVertical=9,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom=i||e,(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),s.Z.settings.animationsEnabled||this.remove())}remove(){this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.onRemove&&(this.onRemove(),this.onRemove=void 0),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0))}updateCanvasSize(e=this.getRectFrom.getBoundingClientRect()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:n,availableLength:a}=this;if(!i)return;if(!s.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let l=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){l=!1;continue}const s=Ap(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${s})`,t.fill(),s<1&&(l=!1)}t.globalCompositeOperation="source-over",l&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,n=this.createPattern();t.settings({canvas:e,fillStyle:n});const a=()=>this.tempId===i;this.renderFrame(),(0,rt.jt)((()=>!!a()&&(s.Z.settings.animationsEnabled&&this.renderFrame(),a()))),s.Z.addEventListener("theme_change",this.onThemeChange),l.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,s.Z.removeEventListener("theme_change",this.onThemeChange),l.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=Fh.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=(this.avatarSize+2*this.marginVertical)*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=fr((()=>e[t]===s));return{deferred:s,middleware:n}}class Wp extends Zn{constructor(e,t,i,s){super({getIndex:t=>e.dialogsStorage.getDialogIndex(t.id,this.indexKey),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;xn(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const i=t?[]:void 0,{dom:s}=Kp.addListDialog({peerId:e.id,loadPromises:i,isBatch:t});return e.dom=s,(null==i?void 0:i.length)&&(e.loadPromises=i,Promise.all(i).finally((()=>{delete e.loadPromises}))),e},updateElementWith:Fe.TR}),this.managers=e,this.list=t,this.indexKey=i,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class jp{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=(0,ce.kg)("DIALOGS",ce.v9.Log|ce.v9.Error|ce.v9.Warn|ce.v9.Debug),this.placeholders={},this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>(this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()),this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new Uo({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new Fn({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=Oi.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach((e=>{s.add(e)})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)};const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>zp(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isContact(e))&&!(yield this.managers.appMessagesManager.getDialogOnly(e))})),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&(0,Fe.TR)((()=>{const e=performance.now(),t=this.scroll.scrollTop,i=this.chatList.firstElementChild,s=this.scroll.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)})),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-h,this.log("slice time",performance.now()-e)}))}),200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>(this.scroll.loadedAll[e]&&this.loadContacts&&this.loadContacts(),this.log("onChatsScroll",e),this.loadDialogs(e));const e=this.managers=(0,Up.Z)();this.contextMenu=new Pp(e),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Ii.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),hi.Z&&Hn({element:this.folders.container,onSwipe:e=>{const t=n.prevId();n(e>0?t+1:t-1)}}),this.allChatsIntlElement=new m.ZP.IntlElement({key:"FilterAllChatsShort"}),s.Z.addEventListener("state_cleared",(()=>{bi.Z.getState().then((e=>zp(this,void 0,void 0,(function*(){this.loadedDialogsAtLeastOnce=!1,this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)}))))})),this.setFilterId(0,0),this.addFilter({id:this.filterId,title:"",orderIndex:0});const i=new u.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const n=(0,de.X)(this.folders.menu,this.folders.container,((e,t)=>{if(e=+t.dataset.filterId||0,qe.IS_MOBILE_SAFARI||(e?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{n(0),this.filtersNavigationItem=void 0}},w.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(w.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),this.filterId!==e)return this.sortedLists[e].clear(),this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}))}),(()=>{for(const e in this.sortedLists)if(+e!==this.filterId){this.sortedLists[e].clear();const t=this.placeholders[e];t&&t.remove()}}),void 0,i);bi.Z.getState().then((e=>(ut.Z.setPlaybackParams(e.playbackParams),ut.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),l.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new xp(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{ni.Z.loadLottieWorkers()}),200),x.Z.MANAGERS=s.Z.managers=e,d.Z.construct(e),Vo.construct(e),Gs.construct(e),ph.construct(e),Du.construct(e),dp.construct(e),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],this.folders.menu.firstElementChild.click()}get chatList(){return this.sortedList.list}setFilterId(e,t){this.indexKey=(0,Np.Z)(t),this.filterId=e}setFilterIdAndChangeTab(e){return zp(this,void 0,void 0,(function*(){return this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.filterId=e,this.onTabChange()}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,De.Z)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove(i)},t&&!s?2:0)}initListeners(){s.Z.addEventListener("user_update",(e=>zp(this,void 0,void 0,(function*(){var t;const i=e.toPeerId(),n=this.getDialogDom(i);if(n&&i!==s.Z.myId&&!(yield this.managers.appUsersManager.isBot(e))){const i="userStatusOnline"===(null===(t=(yield this.managers.appUsersManager.getUser(e)).status)||void 0===t?void 0:t._);this.setOnlineStatus(n.avatarEl,i)}})))),s.Z.addEventListener("chat_update",(e=>zp(this,void 0,void 0,(function*(){const t=e.toPeerId(!0),i=yield this.managers.appMessagesManager.getDialogOnly(t);i&&this.processDialogForCallStatus(i)})))),s.Z.addEventListener("folder_unread",(e=>{this.setFilterUnreadCount(e.id)})),s.Z.addEventListener("contacts_update",(e=>{this.processContact&&this.processContact(e.toPeerId())})),s.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&(this.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e),this.setFiltersUnreadCount())})),s.Z.addEventListener("dialogs_multiupdate",(e=>{for(const t in e){const i=e[t];this.updateDialog(i),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(i)}})),s.Z.addEventListener("dialog_drop",(({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)})),s.Z.addEventListener("dialog_unread",(({dialog:e})=>{e&&(this.setUnreadMessagesN({dialog:e}),this.validateDialogForFilter(e))})),s.Z.addEventListener("dialog_notify_settings",(e=>{this.validateDialogForFilter(e),this.setUnreadMessagesN({dialog:e}),this.setFiltersUnreadCount()})),s.Z.addEventListener("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{t?this.sortedList.delete(i):this.updateDialog(e),this.processContact&&this.processContact(i)})),dp.addEventListener("peer_changed",(e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((e=>{this.setDialogActive(e,!0)}))})),s.Z.addEventListener("filter_update",(e=>zp(this,void 0,void 0,(function*(){if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange())})),s.Z.addEventListener("filter_order",(e=>zp(this,void 0,void 0,(function*(){const t=this.folders.menu,i=yield Promise.all(e.map((e=>zp(this,void 0,void 0,(function*(){return{indexKey:yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),filter:yield this.managers.filtersStorage.getFilter(e)}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.sortedLists[e].indexKey=n,xn(o.menu,t,a.orderIndex),xn(o.container,this.folders.container,a.orderIndex)})),this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId)})))),s.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>zp(this,void 0,void 0,(function*(){const i=yield this.managers.appMessagesManager.getDialogOnly(e);i&&(t.length?this.setTyping(i):this.unsetTyping(i))}))))}setDialogActive(e,t){const i=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==i?void 0:i.callIcon)&&i.callIcon.setActive(t)}onStateLoaded(e){return zp(this,void 0,void 0,(function*(){const t=this.onChatsScroll();this.initedListeners||(this.initListeners(),this.initedListeners=!0);const i=!(!e.filters||!Object.keys(e.filters).length),s=(i?Promise.resolve(Object.values(e.filters).sort(((e,t)=>e.orderIndex-t.orderIndex))):this.managers.filtersStorage.getDialogFilters()).then((e=>{for(const t of e)this.addFilter(t)}));if(i&&(yield s,this.showFiltersPromise&&(yield this.showFiltersPromise)),e.notifySettings){const t=[];for(const i in e.notifySettings){(0,Jt.Z)(i);const s=this.managers.appNotificationsManager.savePeerSettings({key:i,settings:e.notifySettings[i]});t.push(s)}yield Promise.all(t)}this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield t).renderPromise,this.managers.appMessagesManager.fillConversations()}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,$i.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessageN({dialog:e,dom:t,setUnread:!0}),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;return zp(this,void 0,void 0,(function*(){const i=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{foundUnmuted:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s),i.innerText=n?""+n:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}validateListForFilter(){return zp(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>zp(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(e.id)}))))}))}validateDialogForFilter(e){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e.peerId))}testDialogForFilter(e){return!(!e||(this.filterId>1?void 0===(0,$i.Z)(e,this.indexKey):this.filterId!==e.folder_id))}generateScrollable(e,t){const i=t.id,s=new u.ZP(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+i,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new Wp(this.managers,e,(0,Np.Z)(t.orderIndex),this.onListLengthChange);return this.scrollables[i]=s,this.sortedLists[i]=n,s}addFilter(e){if(1===e.id)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return xn(i.menu,t,e.orderIndex),void xn(i.container,this.folders.container,e.orderIndex);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),0===e.id?a.append(this.allChatsIntlElement.element):(0,r.Z)(a,(0,Tt.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const l=document.createElement("i");n.append(a,o,l),(0,ye.Z)(s),s.append(n),xn(s,t,e.orderIndex);const c=this.createChatList(),d=this.generateScrollable(c,e);d.container.classList.add("tabs-tab","chatlist-parts");const h=document.createElement("div");h.classList.add("chatlist-top");const u=document.createElement("div");u.classList.add("chatlist-bottom"),h.append(c),d.container.append(h,u);const p=d.container;xn(d.container,this.folders.container,e.orderIndex),this.setListClickListener(c,null,!0),this.filtersRendered[e.id]={menu:s,container:p,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise((e=>{window.setTimeout((()=>{const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0,e()}),0)}))),this.showFiltersPromise}loadDialogs(e){if(this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scroll.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});const t=(0,Re.Z)(),i=new Promise(((s,n)=>zp(this,void 0,void 0,(function*(){const{chatList:a,filterId:o,indexKey:r}=this;let l=Oi.height/72*1.25|0,c=0;const{index:d}=this.getOffsetIndex(e);if(d)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(o,!0),t=e.findIndex((e=>(0,$i.Z)(e,r)<=d)),i=Math.max(0,t-l);l=t-i,c=(0,$i.Z)(e[i],r)+1}else c=d;let h=this.placeholders[o];try{const s=this.managers.acknowledged.appMessagesManager.getConversations("",c,l,o,!0);if(!(a.childElementCount||h||this.loadedDialogsAtLeastOnce&&(yield s).cached)){h=this.placeholders[o]=new Hp;const e=1===o?this.chatsContainer:this.folders.container;h.attach({container:a.parentElement,getRectFrom:e,onRemove:()=>{delete this.placeholders[o]},blockScrollable:this.scroll}),t.resolve(!1)}const d=yield s,u=yield d.result;if(this.loadDialogsRenderPromise!==i)return n(),void t.reject();if(t.resolve(d.cached),"bottom"===e?u.isEnd&&(this.scroll.loadedAll[e]=!0):u.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,u.dialogs.length){const s="top"===e?u.dialogs.slice().reverse():u.dialogs,a=[],o=[],r=e=>{o.push(e)};if(s.forEach((e=>{const t=this.sortedList.add(e.peerId,!0,r,!1);t.loadPromises&&a.push(...t.loadPromises)})),a.push((0,Fe.AD)()),yield Promise.all(a).finally(),this.loadDialogsRenderPromise!==i)return n(),void t.reject();o.forEach((e=>e()))}else this.onListLengthChange();const p=u.dialogs["top"===e?0:u.dialogs.length-1];p&&(this.offsets[e]=(0,$i.Z)(p,r)),this.log.debug("getDialogs "+l+" dialogs by offset:",c,u,a.childElementCount),setTimeout((()=>{this.scroll.onScroll()}),0)}catch(e){this.log.error(e)}h&&h.detach(a.childElementCount),s()})))).finally((()=>{this.loadDialogsRenderPromise===i&&(this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0)}));return this.loadDialogsRenderPromise=i,this.loadDialogsPromise=t.then((e=>({cached:e,renderPromise:i})))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,m.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,m.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.scroll.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),i=a.container;const e=document.createElement("div"),t=128;ya({div:e,emoji:"📂",width:t,height:t}),i.prepend(e);const s=(0,L.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,n.fc)(s,(()=>zp(this,void 0,void 0,(function*(){Vo.createTab(uo).open(yield this.managers.filtersStorage.getFilter(this.filterId))})))),i.append(s)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),i=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new m.ZP.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),Ae(e,"assets/img/EmptyChats.svg"),(0,Fe.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,m.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){return zp(this,void 0,void 0,(function*(){const e=this.chatList,t=yield this.getDialogFromElement(e.firstElementChild),i=yield this.getDialogFromElement(e.lastElementChild),s=this.indexKey;this.offsets.top=(0,$i.Z)(t,s),this.offsets.bottom=(0,$i.Z)(i,s)}))}getDialogFromElement(e){return this.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,i=!1,s=!1,n=!1){let o;const r=(n?dp.setInnerPeer:dp.setPeer).bind(dp);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(e=>{if(0!==e.button)return;this.log("dialogs click list");const i=e.target,n=(0,Ai.Z)(i,Vp);if(n){if(e.ctrlKey||e.metaKey)return window.open(n.href,"_blank"),void(0,a.Z)(e);if(s){const e=o===n;o&&!e&&o.classList.remove("active"),n&&(n.classList.add("active"),o=n,this.lastActiveElements.add(n))}if(n){t&&t();const e=n.dataset.peerId.toPeerId(),i=+n.dataset.mid||void 0;r({peerId:e,lastMsgId:i})}else r()}}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,a.Z)(e)}),{capture:!0}),F.ZP&&e.addEventListener("dblclick",(e=>{const t=(0,Ai.Z)(e.target,Vp);if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",this.managers.appMessagesManager.getDialogByPeerId(e))}})),i&&Nn(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessageN(e){return this.setLastMessage(e.dialog,e.lastMessage,e.dom,e.highlightWord,e.isBatch,e.setUnread).catch(pt.Z)}setLastMessage(e,t,i,n,a=!1,o=!1){var r;return zp(this,void 0,void 0,(function*(){if(!i&&!(i=this.getDialogDom(e.peerId)))return;const{deferred:l,middleware:c}=Gp(i,"setLastMessagePromise");let d;if(!t&&("draftMessage"===(null===(r=e.draft)||void 0===r?void 0:r._)&&(d=e.draft),!(t=e.topMessage)||t.mid!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);t=yield c(i)}if(o&&this.setUnreadMessagesN({dialog:e,dom:i,isBatch:a,setLastMessagePromise:l}),!t)return i.lastMessageSpan.textContent="",i.lastTimeSpan.textContent="",delete i.listEl.dataset.mid,void l.resolve();const h=e.peerId,u=t&&dn(t);{let e;const a=[];if(t&&!d&&!u){const i=(0,be.Z)(t),s=new Set(["video","gif","round"]);if(i&&("photo"===i._||s.has(i.type))){const n=Se(i,20,20);if("photoSizeEmpty"!==n._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===i.type&&e.classList.add("is-round"),a.push(ot({photo:i,message:t,container:e,withoutPreloader:!0,size:n}).then((()=>e))),s.has(i.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(d){const e=document.createElement("b");e.classList.add("danger"),e.append((0,m.ag)("Draft"),": "),a.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("b");if(t.fromId===s.Z.myId)e.append((0,m.ag)("FromYou")),a.unshift(e);else{const i=c(_s({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),pt.Z);a.unshift(i)}e.append(": ")}const o=!!e&&!!(null==t?void 0:t.message);let r;if(r=n&&t.message?yield c(bn(t,void 0,void 0,!1,n,o)):d?yield c(bn(d)):t?yield c(bn(t,void 0,void 0,!1,void 0,o)):document.createDocumentFragment(),a.length){const e=yield c(Promise.all(a));r.prepend(...e)}(0,p.Z)(i.lastMessageSpan,r)}if(t||d){const e=d?Math.max(d.date,t.date||0):t.date;(0,p.Z)(i.lastTimeSpan,U(new Date(1e3*e)))}else i.lastTimeSpan.textContent="";null===o||o||(i.listEl.dataset.mid=""+t.mid),l.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e.dialog,e.dom,e.isBatch,e.setLastMessagePromise).catch((()=>{}))}setUnreadMessages(e,t=this.getDialogDom(e.peerId),i=!1,n){var a;return zp(this,void 0,void 0,(function*(){if(!t)return;const{deferred:o,middleware:r}=Gp(t,"setUnreadMessagePromise"),l=yield r(this.managers.appNotificationsManager.isPeerLocalMuted(e.peerId,!0)),c=t.listEl.classList.contains("is-muted");let d;if("draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)){const t=yield r(this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message));t&&t.pFlags.out&&t.peerId!==s.Z.myId&&(d=t)}const h=yield r(this.managers.filtersStorage.getFilter(this.filterId));let u;u=h?-1!==h.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const p=yield r(this.managers.appMessagesManager.isDialogUnread(e)),m=u||p;if(n)try{yield r(n)}catch(e){}const g=i?0:200;l!==c&&(0,De.Z)(t.listEl,"is-muted",l,g),function(e,t,i){let s;if((null==t?void 0:t.pFlags.out)&&(s=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,d);const v=(0,_e.Z)(t.unreadBadge);m&&!v&&t.subtitleEl.append(t.unreadBadge);const f=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),y=t.mentionsBadge&&(0,_e.Z)(t.mentionsBadge);if(f&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling))),(0,De.Z)(t.unreadBadge,"is-visible",m,g,m?void 0:()=>{t.unreadBadge.remove()},v?0:2),t.mentionsBadge&&(0,De.Z)(t.mentionsBadge,"is-visible",f,g,f?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},y?0:2),!m)return void o.resolve();u?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let b=!0,w=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",w=!0):p?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",b=!1),t.unreadBadge.classList.toggle("unread",b),t.unreadBadge.classList.toggle("mention",w),o.resolve()}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){return zp(this,void 0,void 0,(function*(){if("object"!=typeof e){const t=yield this.managers.appMessagesManager.getDialogOnly(e);if(!t){const t=e||oe.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return t}return e}))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=Fp;const i=t.getContext("2d"),s=(Fp-(3*Bp+2*_p))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Ap((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,Fp,Fp),i.fillStyle=e&&!l.Z.isMobile?Fh.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=Dp,Zp(i,s+e*Bp+e*_p,(Fp-n)/2,Bp,n,Rp,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,rt.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,De.Z)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){e.autonomous=!1;const t=this.addDialogNew(e);if(t){const i=this.getDialog(e.peerId).then((i=>{const{peerId:n}=i,a=[];return n.isUser()||a.push(this.processDialogForCallStatus(i,t.dom)),n!==s.Z.myId&&n.isUser()&&a.push(this.managers.appUsersManager.getUser(n).then((e=>{var i;"userStatusOnline"===(null===(i=e.status)||void 0===i?void 0:i._)&&this.setOnlineStatus(t.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:i,dom:t.dom,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));e.loadPromises&&e.loadPromises.push(i)}return t}processDialogForCallStatus(e,t){return zp(this,void 0,void 0,(function*(){if(!Ec.Z)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const i=yield this.managers.appChatsManager.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),xt(i)),{peerId:t}));return i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){return this.addDialog(e.peerId,e.container,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName)}addDialog(e,t,i=!0,s=!1,n=!0,a=!0,o=54,r=!!t,l,c,d){var h;const u=new Mp;u.classList.add("dialog-avatar","avatar-"+o),u.updateWithOptions({loadPromises:c,lazyLoadQueue:l,isDialog:!!n,peerId:e,peerTitle:d});const p=document.createElement("div");p.classList.add("user-caption");const m=document.createElement("span");m.classList.add("user-title");const g=new Ft,v=g.update({peerId:e,fromName:d,dialog:n,onlyFirstName:s,plainText:!1});c&&c.push(v),m.append(g.element),m.classList.add("tgico");const f=gs(e).then((e=>{m.append(...e)}));c&&c.push(f);const y=document.createElement("span");y.classList.add("user-last-message"),y.setAttribute("dir","auto");const b=document.createElement(Vp);b.classList.add("chatlist-chat"),b.href="#"+e,i&&(0,ye.Z)(b),b.append(u,p),b.dataset.peerId=""+e;const w=document.createElement("span");w.classList.add("message-status","sending-status");const S=document.createElement("span");S.classList.add("message-time");const C=document.createElement("div");C.className="dialog-subtitle-badge badge badge-24";const L=document.createElement("p");L.classList.add("dialog-title");const I=document.createElement("span");I.classList.add("dialog-title-details"),I.append(w,S),L.append(m,I);const M=document.createElement("p");M.classList.add("dialog-subtitle"),M.append(y),p.append(L,M);const E={avatarEl:u,captionDiv:p,titleSpan:g.element,titleSpanContainer:m,statusSpan:w,lastTimeSpan:S,unreadBadge:C,lastMessageSpan:y,containerEl:b,listEl:b,subtitleEl:M};return t&&t[a?"append":"prepend"](b),r||(b.dialogDom=E,(null===(h=dp.chat)||void 0===h?void 0:h.peerId)===e&&this.setDialogActive(b,!0)),{dom:E}}setTyping(e){return zp(this,void 0,void 0,(function*(){const t=this.getDialogDom(e.peerId);if(!t)return;const i=t.lastMessageSpan.querySelector(".peer-typing-container"),s=yield dp.getPeerTyping(e.peerId,i);!i&&s&&((0,p.Z)(t.lastMessageSpan,s),t.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessageN({dialog:e,lastMessage:null,dom:t,setUnread:null}))}}const Kp=new jp;F.GO.appDialogsManager=Kp;const $p=Kp},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},s.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},s.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])}}]); +//# sourceMappingURL=853.5062ae3867f3575462eb.chunk.js.map \ No newline at end of file diff --git a/public/853.5062ae3867f3575462eb.chunk.js.map b/public/853.5062ae3867f3575462eb.chunk.js.map new file mode 100644 index 000000000..db61a9813 --- /dev/null +++ b/public/853.5062ae3867f3575462eb.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"853.5062ae3867f3575462eb.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderImageWithFadeIn.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/helpers/dom/setCaretAt.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/helpers/dom/getSelectedNodes.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./public/recorder.min.js"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from \"../config/latinizeMap\";\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n й: 'q',\n ц: 'w',\n у: 'e',\n к: 'r',\n е: 't',\n н: 'y',\n г: 'u',\n ш: 'i',\n щ: 'o',\n з: 'p',\n х: '[',\n ъ: ']',\n ф: 'a',\n ы: 's',\n в: 'd',\n а: 'f',\n п: 'g',\n р: 'h',\n о: 'j',\n л: 'k',\n д: 'l',\n ж: ';',\n э: '\\'',\n я: 'z',\n ч: 'x',\n с: 'c',\n м: 'v',\n и: 'b',\n т: 'n',\n ь: 'm',\n б: ',',\n ю: '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(\r\n public name: LangPackKey | boolean, \r\n public type: string, \r\n private clearable = true, \r\n className?: string, \r\n clickable = true, \r\n public autonomous = true, \r\n public onFound?: () => void\r\n ) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then((res) => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch((err) => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): T;\r\n}\r\n\r\nexport interface SliderSuperTabEventableConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n public managers: AppManagers;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n if(this.slider) {\r\n this.slider.addTab(this);\r\n }\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type'];\r\n protected managers: AppManagers;\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n\r\n public createTab(ctor: SliderSuperTabConstructable, doNotAppend?: boolean) {\r\n const tab = new ctor(doNotAppend ? undefined : this, true);\r\n tab.managers = this.managers;\r\n return tab;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport type { InputFile } from \"../layer\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport PopupElement from \"./popups\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n attachClickEvent(this.container, () => {\r\n PopupElement.createPopup(PopupAvatar).open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatFullSentTimeRaw } from \"../../helpers/date\";\nimport { User } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../../lib/langPack\";\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n \n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport getUserStatusString from \"../../wrappers/getUserStatusString\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n let promise: Promise;\r\n if(this.isGeoChat) {\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n promise = this.managers.appChatsManager.createChannel({\r\n title, \r\n about: '', \r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords, \r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length) {\r\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n\r\n return chatId;\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n return chatId;\r\n });\r\n }\r\n\r\n if(!promise) {\r\n return;\r\n }\r\n\r\n promise.then((chatId) => {\r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n\r\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\r\n });\r\n });\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n return Promise.all(this.peerIds.map(async(userId) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: userId,\r\n container: this.list,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\r\n }));\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private startLocating() {\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = \"https://nominatim.openstreetmap.org/reverse\";\r\n uri += \"?lat=\"+location.coords.latitude;\r\n uri += \"&lon=\"+location.coords.longitude;\r\n uri += \"&format=json\";\r\n uri += \"&addressdetails=1\";\r\n uri += \"&accept-language=en\";\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach((entry) => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach((smth) => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\nimport LazyLoadQueueBase, { LazyLoadElementBase } from \"./lazyLoadQueueBase\";\nimport VisibilityIntersector from \"./visibilityIntersector\";\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n if(!this.intersectorTimeout) {\n this.intersectorTimeout = window.setTimeout(() => {\n this.intersectorTimeout = 0;\n this.processQueue();\n }, 0);\n }\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public unobserve(el: HTMLElement) {\n findAndSpliceAll(this.queue, (i) => i.div === el);\n\n this.intersector.unobserve(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport VisibilityIntersector from \"./visibilityIntersector\";\r\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\r\nimport findAndSplice from \"../helpers/array/findAndSplice\";\r\nimport LazyLoadQueueIntersector, { LazyLoadElement } from \"./lazyLoadQueueIntersector\";\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(parallelLimit?: number) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return findAndSplice(this.queue, item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from \"../../appDocsManager\";\nimport type { MyPhoto } from \"../../appPhotosManager\";\nimport calcImageInBox from \"../../../../helpers/calcImageInBox\";\nimport { PhotoSize } from \"../../../../layer\";\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument, \n boxWidth = 0, \n boxHeight = 0, \n useBytes = false, \n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n\n bestPhotoSize = photoSize;\n\n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport accumulate from \"../helpers/array/accumulate\";\r\nimport clamp from \"../helpers/number/clamp\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map((size) => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map((ratio) => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Layouter, RectPart } from \"./groupedLayout\";\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n \n div.append(mediaDiv);\n }\n\n // @ts-ignore\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n \n options.container.children[i].append(mediaDiv);\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: () => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', (err) => {\n console.error('Render image from url failed:', err, url, loader);\n callback();\n });\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from \"../sequentialDom\";\nimport renderImageFromUrl from \"./renderImageFromUrl\";\n\nexport default function renderImageWithFadeIn(\n container: HTMLElement, \n image: HTMLImageElement, \n url: string, \n needFadeIn: boolean, \n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n image.classList.add('fade-in');\n }\n\n const promise = new Promise((resolve) => {\n /* if(photo._ === 'document') {\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\n return resolve();\n } */\n\n renderImageFromUrl(image, url, () => {\n sequentialDom.mutateElement(container, () => {\n aspecter.append(image);\n\n resolve();\n /* fastRaf(() => {\n resolve();\n }); */\n\n if(needFadeIn) {\n image.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n image.classList.remove('fade-in');\n \n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }, {once: true});\n }\n });\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => any;\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n\r\n if(this.isUpload) {\r\n this.tryAgainOnFail = false;\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { ArgumentTypes } from \"../types\";\r\n\r\ntype HeavyQueue> = {\r\n items: ArgumentTypes[], \r\n process: (...args: any[]) => ReturnType,\r\n context: any,\r\n promise?: CancellablePromise[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]) as typeof promise;\r\n }\r\n \r\n const promise = queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk>(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([] as any);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: ReturnType[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: typeof results[0];\r\n // @ts-ignore\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!IS_CANVAS_FILTER_SUPPORTED) {\r\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(\r\n img: HTMLImageElement, \r\n radius: number, \r\n iterations: number, \r\n canvas: HTMLCanvasElement = document.createElement('canvas')\r\n) {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(IS_CANVAS_FILTER_SUPPORTED) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\r\nconst cache: Map = new Map();\r\nconst CACHE_SIZE = 150;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n throw 'no dataUri for blur: ' + dataUri;\r\n }\r\n\r\n if(cache.size > CACHE_SIZE) {\r\n cache.clear();\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.className = 'canvas-thumbnail';\r\n \r\n let cached = cache.get(dataUri);\r\n if(!cached) {\r\n const promise: CacheValue['promise'] = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n // if(IS_CANVAS_FILTER_SUPPORTED) {\r\n // resolve(processBlurNext(img, radius, iterations));\r\n // } else {\r\n const promise = addHeavyTask({\r\n items: [[img, radius, iterations, canvas]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift');\r\n \r\n promise.then(() => {\r\n resolve();\r\n });\r\n // }\r\n };\r\n img.src = dataUri;\r\n });\r\n });\r\n \r\n cache.set(dataUri, cached = {\r\n canvas,\r\n promise\r\n });\r\n } else {\r\n canvas.width = cached.canvas.width;\r\n canvas.height = cached.canvas.height;\r\n cached.promise.then(() => {\r\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\r\n });\r\n }\r\n\r\n return {\r\n ...cached,\r\n canvas\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport bytesFromHex from \"./bytesFromHex\";\nimport bytesToDataURL from \"./bytesToDataURL\";\n\nconst JPEG_HEADER = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n return bytesToDataURL(arr, mimeType);\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport type { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { PhotoSize } from \"../layer\";\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from \"./bytes/getPreviewURLFromBytes\";\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PhotoSize } from \"../layer\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { renderImageFromUrlPromise } from \"./dom/renderImageFromUrl\";\nimport getPreviewURLFromThumb from \"./getPreviewURLFromThumb\";\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n \n return {image: element, loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport type { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport type { ThumbCache } from \"../lib/storages/thumbs\";\nimport getImageFromStrippedThumb from \"./getImageFromStrippedThumb\";\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find((size) => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PhotoSize } from \"../layer\";\nimport { REPLIES_HIDDEN_CHANNEL_ID } from \"../lib/mtproto/mtproto_config\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport choosePhotoSize from \"../lib/appManagers/utils/photos/choosePhotoSize\";\nimport { MediaSize, makeMediaSize } from \"./mediaSize\";\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n if(!photoSize) {\n photoSize = choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n\n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n\n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport renderImageWithFadeIn from \"../../helpers/dom/renderImageWithFadeIn\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport { Message, PhotoSize } from \"../../layer\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport ProgressivePreloader from \"../preloader\";\nimport blur from '../../helpers/blur';\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getStrippedThumbIfNeeded from \"../../helpers/getStrippedThumbIfNeeded\";\nimport setAttachmentSize from \"../../helpers/setAttachmentSize\";\nimport choosePhotoSize from \"../../lib/appManagers/utils/photos/choosePhotoSize\";\nimport type { ThumbCache } from \"../../lib/storages/thumbs\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers}: {\n photo: MyPhoto | MyDocument, \n message?: Message.message | Message.messageService, \n container: HTMLElement, \n boxWidth?: number, \n boxHeight?: number, \n withTail?: boolean, \n isOut?: boolean, \n lazyLoadQueue?: LazyLoadQueue, \n middleware?: () => boolean, \n size?: PhotoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n}) {\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return {\n loadPromises: {\n thumb: Promise.resolve(),\n full: Promise.resolve()\n },\n images: {\n thumb: null,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n image = new Image();\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: 'full'\n } : undefined);\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n //noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n //container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n \n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n thumbImage = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n image.classList.add('media-photo');\n \n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n \n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ? \n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isGif && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 && \n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader && \n !cacheContext.downloaded && \n !withoutPreloader && \n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(() => {});\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n \n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return {\n loadPromises: {\n thumb: loadThumbPromise,\n full: loadPromise || Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: image\n },\n preloader,\n aspecter\n };\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\nimport { fastRaf } from \"../schedulers\";\nimport throttleWith from \"./throttleWith\";\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d');\n context.font = font;\n }\n\n //context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n //return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getTextWidth from \"../helpers/canvas/getTextWidth\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet pendingTest = false;\r\n\r\nfunction setTestQueue() {\r\n if(pendingTest) {\r\n return;\r\n }\r\n\r\n pendingTest = true;\r\n fastRaf(() => {\r\n pendingTest = false;\r\n testQueueElements();\r\n });\r\n}\r\n\r\nfunction testQueueElements() {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n}\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nfunction getElementWidth(element: HTMLElement) {\r\n const type = element.dataset.sizeType;\r\n if(type) {\r\n const mediaSize = mediaSizes.active;\r\n // @ts-ignore\r\n const size: MediaSize = mediaSize[type];\r\n return size.width;\r\n } \r\n \r\n return element.getBoundingClientRect().width;\r\n}\r\n\r\nfunction testElement(element: HTMLElement) {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = getElementWidth(element);\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = getElementWidth(element);\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = getElementWidth(element);\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n if(this.dataset.sizeType) {\r\n testElement(this);\r\n } else {\r\n testQueue.add(this);\r\n setTestQueue();\r\n }\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n testQueue.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { i18n, LangPackKey } from \"../lib/langPack\";\n\nexport default function formatBytes(bytes: number, decimals = 2) {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return i18n(sizes[i], [parseFloat((bytes / Math.pow(k, i)).toFixed(dm))]);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport RangeSelector from \"./rangeSelector\";\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n","import { Message } from \"../../../../layer\";\nimport type { MyMessage } from \"../../appMessagesManager\";\n\nexport default function getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport limitSymbols from \"../helpers/string/limitSymbols\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport getPeerTitle from \"./wrappers/getPeerTitle\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean,\r\n limitSymbols?: number,\r\n managers?: AppManagers\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n private fromName: string;\r\n private plainText = false;\r\n private onlyFirstName = false;\r\n private dialog = false;\r\n private limitSymbols: number;\r\n private managers: AppManagers;\r\n\r\n constructor(options?: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n\r\n if(options) {\r\n this.update(options);\r\n }\r\n \r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public setOptions(options?: PeerTitleOptions) {\r\n if(!options) {\r\n return;\r\n }\r\n\r\n for(const i in options) {\r\n // @ts-ignore\r\n const value = options[i];\r\n\r\n if(typeof(value) !== 'object') {\r\n // @ts-ignore\r\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\r\n }\r\n\r\n // @ts-ignore\r\n this[i] = value;\r\n }\r\n }\r\n\r\n public async update(options?: PeerTitleOptions) {\r\n this.setOptions(options);\r\n\r\n let fromName = this.fromName;\r\n if(fromName !== undefined) {\r\n if(this.limitSymbols !== undefined) {\r\n fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols);\r\n }\r\n\r\n setInnerHTML(this.element, wrapEmojiText(fromName));\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n const managers = this.managers ?? rootScope.managers;\r\n setInnerHTML(this.element, await getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols, managers));\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\nimport getMessageSenderPeerIdOrName from \"../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName\";\nimport { i18n } from \"../../lib/langPack\";\nimport rootScope from \"../../lib/rootScope\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default async function wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\n\nexport default function wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport rootScope from \"../lib/rootScope\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport formatBytes from \"../helpers/formatBytes\";\nimport { animateSingle } from \"../helpers/animation\";\nimport clamp from \"../helpers/number/clamp\";\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\nimport MediaProgressLine from \"./mediaProgressLine\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\nimport wrapSenderToPeer from \"./wrappers/senderToPeer\";\nimport wrapSentTime from \"./wrappers/sentTime\";\nimport getMediaFromMessage from \"../lib/appManagers/utils/messages/getMediaFromMessage\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach((mid) => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach((elem) => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; //mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; //mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n \n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n \n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(await wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map((s) => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map((element) => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (isVoice ? wrapVoiceMessage(this) : wrapAudio(this));\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID, \n inputFilter: {_: 'inputMessagesFilterEmpty'}, \n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = await wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach((img) => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDownloadManager.downloadMediaURL({media: doc});\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n \n //setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n //}, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { animateSingle } from \"../../helpers/animation\";\nimport { ChatAutoDownloadSettings } from \"../../helpers/autoDownload\";\nimport deferredPromise from \"../../helpers/cancellablePromise\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport createVideo from \"../../helpers/dom/createVideo\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport onMediaLoad from \"../../helpers/onMediaLoad\";\nimport throttleWithRaf from \"../../helpers/schedulers/throttleWithRaf\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport toHHMMSS from \"../../helpers/string/toHHMMSS\";\nimport { Message, PhotoSize } from \"../../layer\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport rootScope from \"../../lib/rootScope\";\nimport { ThumbCache } from \"../../lib/storages/thumbs\";\nimport animationIntersector from \"../animationIntersector\";\nimport appMediaPlaybackController, { MediaSearchContext } from \"../appMediaPlaybackController\";\nimport { findMediaTargets } from \"../audio\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport ProgressivePreloader from \"../preloader\";\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, size, searchContext, autoDownload, managers = rootScope.managers}: {\n doc: MyDocument, \n container?: HTMLElement, \n message?: Message.message, \n boxWidth?: number, \n boxHeight?: number, \n withTail?: boolean, \n isOut?: boolean,\n middleware?: () => boolean,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: true,\n noPlayButton?: boolean,\n group?: string,\n onlyPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n size?: PhotoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && \n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n \n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n let res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc, \n message, \n container, \n boxWidth, \n boxHeight, \n withTail, \n isOut, \n lazyLoadQueue, \n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n \n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n \n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n \n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n \n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n \n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n \n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n \n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n \n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n \n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n \n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n \n divRound.classList.add('is-paused');\n };\n \n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n \n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n \n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n \n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n \n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n \n // ! костыль\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n \n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n \n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID, \n inputFilter: {_: 'inputMessagesFilterEmpty'}, \n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n \n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n \n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else {\n video.autoplay = true; // для safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc, \n message, \n container, \n boxWidth, \n boxHeight, \n withTail, \n isOut, \n lazyLoadQueue, \n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else { // * gifs masonry\n // const gotThumb = managers.appDocsManager.getThumb(doc, false);\n // if(gotThumb) {\n // gotThumb.promise.then(() => {\n // video.poster = gotThumb.cacheContext.url;\n // });\n // }\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n \n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n });\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.videoWidth) {\n return;\n }\n \n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n //video.play();\n video.autoplay = true;\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = managers.apiFileManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId, onlyCache: noAutoDownload});\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject();\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n renderImageFromUrl(video, cacheContext.url);\n }, () => {});\n\n return {download: loadPromise, render: renderDeferred};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ? \n (await load()).render : \n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n return res;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ChatAutoDownloadSettings } from \"../../helpers/autoDownload\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport { PhotoSize } from \"../../layer\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getMediaFromMessage from \"../../lib/appManagers/utils/messages/getMediaFromMessage\";\nimport choosePhotoSize from \"../../lib/appManagers/utils/photos/choosePhotoSize\";\nimport rootScope from \"../../lib/rootScope\";\nimport Chat from \"../chat/chat\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport prepareAlbum from \"../prepareAlbum\";\nimport wrapPhoto from \"./photo\";\nimport wrapVideo from \"./video\";\n\nexport default async function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers}: {\n groupId: string, \n attachmentDiv: HTMLElement,\n middleware?: () => boolean,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers\n}) {\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\n\n // !lowest msgID will be the FIRST in album\n const storage = await managers.appMessagesManager.getMidsByAlbum(groupId);\n const messages = await Promise.all(storage.map((mid) => chat.getMessage(mid)));\n for(const message of messages) {\n const media = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n if(isPhoto) {\n wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n wrapVideo({\n doc: message.media.document,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers\n });\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../../environment/mediaMimeTypesSupport\";\nimport { clearBadCharsAndTrim } from \"../../helpers/cleanSearchText\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { simulateClickEvent, attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport formatBytes from \"../../helpers/formatBytes\";\nimport { MediaSizeType } from \"../../helpers/mediaSizes\";\nimport noop from \"../../helpers/noop\";\nimport { Message, MessageMedia, WebPage } from \"../../layer\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getDownloadMediaDetails from \"../../lib/appManagers/utils/download/getDownloadMediaDetails\";\nimport choosePhotoSize from \"../../lib/appManagers/utils/photos/choosePhotoSize\";\nimport { joinElementsWith } from \"../../lib/langPack\";\nimport wrapPlainText from \"../../lib/richTextProcessor/wrapPlainText\";\nimport rootScope from \"../../lib/rootScope\";\nimport type { ThumbCache } from \"../../lib/storages/thumbs\";\nimport { MediaSearchContext } from \"../appMediaPlaybackController\";\nimport AudioElement from \"../audio\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport { MiddleEllipsisElement } from \"../middleEllipsis\";\nimport ProgressivePreloader from \"../preloader\";\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from \"./senderToPeer\";\nimport wrapSentTime from \"./sentTime\";\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext}: {\n message: Message.message, \n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache\n}): Promise {\n if(!fontWeight) fontWeight = 500;\n if(!sizeType) sizeType = '' as any;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n \n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \n 'file';\n\n let docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n\n let imgs: (HTMLImageElement | HTMLCanvasElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type)) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc, \n message: null, \n container: icoDiv, \n boxWidth: 54, \n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoDiv.innerText = ext;\n }\n\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n let fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\n \n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n if(downloadDiv) {\n downloadDiv.classList.add('downloaded');\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const load = async(e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: Promise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadMediaVoid({media: doc, queueId});\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n if(downloadDiv) {\n download.then(onLoad, noop);\n preloader.attach(downloadDiv, true, download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download');\n const promise = appDownloadManager.downloadMediaVoid({media: doc});\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download');\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n uploadPromise.then(onLoad, noop);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport rootScope from \"../lib/rootScope\";\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n return !!savingLottiePreview[key];\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n let saving = savingLottiePreview[key];\n if(saving && saving.width >= width && saving.height >= height) {\n return;\n }\n\n saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n \n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n delete savingLottiePreview[key];\n\n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice((t) => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\nimport assumeType from \"../../helpers/assumeType\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport throttleWithRaf from \"../../helpers/schedulers/throttleWithRaf\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport wrapSticker from \"./sticker\";\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers\n}: {\n size: number,\n doc: MyDocument,\n middleware?: () => boolean,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: false,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers\n }).then(({render}) => render).then((animation) => {\n assumeType(animation);\n animation.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === animation.maxFrame) {\n animation.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = generateRandomSigned(16);\n const randomOffsetY = generateRandomSigned(4);\n const stableOffsetX = size / 8 * (side === 'right' ? 1 : -1);\n const setPosition = () => {\n if(!isInDOM(target)) {\n return;\n }\n \n const rect = target.getBoundingClientRect();\n /* const boxWidth = Math.max(rect.width, rect.height);\n const boxHeight = Math.max(rect.width, rect.height);\n const x = rect.left + ((boxWidth - size) / 2);\n const y = rect.top + ((boxHeight - size) / 2); */\n\n const rectX = side === 'right' ? rect.right : rect.left;\n\n const addOffsetX = side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0) + stableOffsetX + randomOffsetX;\n const x = rectX + addOffsetX;\n // const y = rect.bottom - size + size / 4;\n const y = rect.top + ((rect.height - size) / 2) + (side === 'center' ? 0 : randomOffsetY);\n // animationDiv.style.transform = `translate(${x}px, ${y}px)`;\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n };\n\n const onScroll = throttleWithRaf(setPosition);\n\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n appImManager.emojiAnimationContainer.append(animationDiv);\n\n return {animationDiv, stickerPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_WEBP_SUPPORTED from \"../../environment/webpSupport\";\nimport assumeType from \"../../helpers/assumeType\";\nimport getPathFromBytes from \"../../helpers/bytes/getPathFromBytes\";\nimport deferredPromise from \"../../helpers/cancellablePromise\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport createVideo from \"../../helpers/dom/createVideo\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport getImageFromStrippedThumb from \"../../helpers/getImageFromStrippedThumb\";\nimport getPreviewURLFromThumb from \"../../helpers/getPreviewURLFromThumb\";\nimport onMediaLoad from \"../../helpers/onMediaLoad\";\nimport { isSavingLottiePreview, saveLottiePreview } from \"../../helpers/saveLottiePreview\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { PhotoSize } from \"../../layer\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getServerMessageId from \"../../lib/appManagers/utils/messageId/getServerMessageId\";\nimport choosePhotoSize from \"../../lib/appManagers/utils/photos/choosePhotoSize\";\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport type { ThumbCache } from \"../../lib/storages/thumbs\";\nimport webpWorkerController from \"../../lib/webp/webpWorkerController\";\nimport { SendMessageEmojiInteractionData } from \"../../types\";\nimport { getEmojiToneIndex } from \"../../vendor/emoji\";\nimport animationIntersector from \"../animationIntersector\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport wrapStickerAnimation from \"./stickerAnimation\";\n\nexport default async function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers}: {\n doc: MyDocument, \n div: HTMLElement, \n middleware?: () => boolean, \n lazyLoadQueue?: LazyLoadQueue, \n group?: string, \n play?: boolean, \n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: boolean,\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers\n}) {\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width) {\n width = !emoji ? 200 : undefined;\n }\n\n if(!height) {\n height = !emoji ? 200 : undefined;\n }\n\n if(stickerType === 2) {\n //LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n \n if(!stickerType) {\n console.error('wrong doc for wrapSticker!', doc);\n throw new Error('wrong doc for wrapSticker!');\n }\n\n div.dataset.docId = '' + doc.id;\n div.classList.add('media-sticker-wrapper');\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n \n //console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n let getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext();\n }\n\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n \n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length || \n lottieCachedThumb\n ) && \n !div.firstElementChild && (\n !downloaded || \n isThumbNeededForType || \n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n \n //console.log('wrap sticker', thumb, div);\n\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n const afterRender = () => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n \n sequentialDom.mutateElement(div, () => {\n div.append(thumbImage);\n loadThumbPromise.resolve();\n });\n }\n };\n\n if('url' in thumb) {\n thumbImage = new Image();\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\n haveThumbCached = true;\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(thumb.bytes.length) {\n const d = getPathFromBytes(thumb.bytes);\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttributeNS(null, 'd', d);\n svg.append(path);\n div.append(svg);\n } else {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n } else if(toneIndex <= 0) {\n thumbImage = new Image();\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n renderImageFromUrl(thumbImage, getPreviewURLFromThumb(doc, thumb, true), afterRender);\n haveThumbCached = true;\n } else {\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n \n if(middleware && !middleware()) return;\n \n if(!div.childElementCount) {\n renderImageFromUrl(thumbImage, getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\n }\n }).catch(() => {});\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if(div.childElementCount || (middleware && !middleware())) return;\n\n const r = () => {\n if(div.childElementCount || (middleware && !middleware())) return;\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\n };\n \n await getCacheContext();\n if(cacheContext.url) {\n r();\n return;\n } else {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n thumbImage = res.image;\n res.loadPromise.then(r);\n \n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n }\n };\n \n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div, load});\n return;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb) { // for sticker panel\n return;\n }\n \n const load = async() => {\n if(middleware && !middleware()) return;\n\n if(stickerType === 2 && !asStatic) {\n /* if(doc.id === '1860749763008266301') {\n console.log('loaded sticker:', doc, div);\n } */\n\n //await new Promise((resolve) => setTimeout(resolve, 500));\n //return;\n\n //console.time('download sticker' + doc.id);\n\n //appDocsManager.downloadDocNew(doc.id).promise.then((res) => res.json()).then(async(json) => {\n //fetch(doc.url).then((res) => res.json()).then(async(json) => {\n return await appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId})\n .then(async(blob) => {\n //console.timeEnd('download sticker' + doc.id);\n //console.log('loaded sticker:', doc, div/* , blob */);\n if(middleware && !middleware()) {\n throw new Error('wrapSticker 2 middleware');\n }\n\n let animation = await lottieLoader.loadAnimationWorker({\n container: div,\n loop: loop && !emoji,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex\n }, group, middleware);\n\n //const deferred = deferredPromise();\n \n animation.addEventListener('firstFrame', () => {\n const element = div.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== animation.canvas) {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n animation.canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n \n animation.canvas.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n animation.canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n\n if(withThumb !== false) {\n saveLottiePreview(doc, animation.canvas, toneIndex);\n }\n\n //deferred.resolve();\n }, {once: true});\n \n if(emoji) {\n const data: SendMessageEmojiInteractionData = {\n a: [],\n v: 1\n };\n\n let sendInteractionThrottled: () => void;\n\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n\n attachClickEvent(div, async(e) => {\n cancelEvent(e);\n const animation = lottieLoader.getAnimation(div);\n \n if(animation.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n div.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n \n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n \n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n const peerId = appImManager.chat.peerId;\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n \n const bubble = findUpClassName(div, 'bubble');\n const isOut = bubble.classList.contains('is-out');\n\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 280,\n target: div,\n play: true\n });\n\n if(bubble) {\n if(isOut) {\n animationDiv.classList.add('is-out');\n } else {\n animationDiv.classList.add('is-in');\n }\n }\n\n if(!sendInteractionThrottled) {\n sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n \n const firstTime = data.a[0].t;\n \n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n \n const bubble = findUpClassName(div, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true);\n \n data.a.length = 0;\n }, 1000, false);\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(e.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n \n sendInteractionThrottled();\n }\n });\n }\n\n return animation;\n\n //return deferred;\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n\n //console.timeEnd('render sticker' + doc.id);\n } else if(asStatic || stickerType === 3) {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n media = createVideo();\n (media as HTMLVideoElement).muted = true;\n\n if(play) {\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).loop = true;\n }\n }\n\n const thumbImage = div.firstElementChild !== media && div.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage : (!thumbImage || thumbImage.tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n media.classList.add('media-sticker');\n\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n return new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) return resolve();\n \n const onLoad = () => {\n sequentialDom.mutateElement(div, () => {\n div.append(media);\n if(thumbImage) {\n thumbImage.classList.add('fade-out');\n }\n\n if(stickerType === 3 && !isSavingLottiePreview(doc, toneIndex)) {\n // const perf = performance.now();\n assumeType(media);\n const canvas = document.createElement('canvas');\n canvas.width = width * window.devicePixelRatio;\n canvas.height = height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n\n if(stickerType === 3 && group) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n\n resolve();\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n if(thumbImage) {\n thumbImage.remove();\n }\n }, {once: true});\n }\n });\n };\n\n await getCacheContext();\n if(asStatic) {\n renderImageFromUrl(media, cacheContext.url, onLoad);\n } else {\n (media as HTMLVideoElement).src = cacheContext.url;\n onMediaLoad(media as HTMLVideoElement).then(onLoad);\n }\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType === 2 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n \n promise.then(r, resolve);\n }\n });\n }\n };\n\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || isAnimated) ? \n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n return {render: loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.updateWithOptions({peerId: this.peerId});\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach((inputField) => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach((inputField) => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach((r) => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport ripple from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public titleRight: HTMLElement;\r\n public subtitle: HTMLElement;\r\n public media: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string | HTMLElement | DocumentFragment,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n titleRightSecondary: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n havePadding = true;\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n \r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n havePadding = true;\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n const titleRight = options.titleRight || options.titleRightSecondary;\r\n if(titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n if(typeof(options.title) === 'string') {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(options.title);\r\n }\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(titleRight) {\r\n const titleRightEl = this.titleRight = document.createElement('div');\r\n titleRightEl.classList.add('row-title', 'row-title-right');\r\n\r\n if(options.titleRightSecondary) {\r\n titleRightEl.classList.add('row-title-right-secondary');\r\n }\r\n\r\n if(typeof(titleRight) === 'string') {\r\n titleRightEl.innerHTML = titleRight;\r\n } else {\r\n titleRightEl.append(titleRight);\r\n }\r\n\r\n c.append(titleRightEl);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n public createMedia(size?: 'small') {\r\n this.container.classList.add('row-with-padding');\r\n \r\n const media = this.media = document.createElement('div');\r\n media.classList.add('row-media');\r\n\r\n if(size) {\r\n media.classList.add('row-media-' + size);\r\n }\r\n\r\n this.container.append(media);\r\n\r\n return media;\r\n }\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string,\r\n alignRight?: boolean\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n\r\n if(options.alignRight) {\r\n label.classList.add('radio-field-right');\r\n }\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n apiManagerProxy.getState().then((state) => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey,\r\n langPackArguments: FormatterArguments\r\n}>) {\r\n toast(i18n(options.langPackKey, options.langPackArguments));\r\n}\r\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\nimport isUsernameValid from \"../lib/richTextProcessor/isUsernameValid\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(\r\n options: UsernameInputField['options'], \r\n private managers: AppManagers\r\n ) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\r\n } else {\r\n this.checkUsernamePromise = this.managers.appUsersManager.checkUsername(username);\r\n }\r\n\r\n this.checkUsernamePromise.then((available) => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string | DocumentFragment,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach((o) => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach((button) => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach((o) => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../putPreloader\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n }, this.managers);\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\r\n return this.managers.appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Scrollable from \"../components/scrollable\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then((done) => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_WORKER } from \"./context\";\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n \n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join(\".\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\nimport { Chat, ChatParticipants } from \"../../layer\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport rootScope from \"../../lib/rootScope\";\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(chatId);\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n let key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport type { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport PeerTitle from \"./peerTitle\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport type { IsPeerType } from \"../lib/appManagers/appPeersManager\";\nimport { generateDelimiter, SettingSection } from \"./sidebarLeft\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterUnique from \"../helpers/array/filterUnique\";\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport findAndSplice from \"../helpers/array/findAndSplice\";\nimport AvatarElement from \"./avatar\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport filterAsync from \"../helpers/array/filterAsync\";\nimport getParticipantPeerId from \"../lib/appManagers/utils/chats/getParticipantPeerId\";\nimport getChatMembersString from \"./wrappers/getChatMembersString\";\nimport getUserStatusString from \"./wrappers/getUserStatusString\";\nimport { Chat, User } from \"../layer\";\nimport canSendToUser from \"../lib/appManagers/utils/users/canSendToUser\";\nimport hasRights from \"../lib/appManagers/utils/chats/hasRights\";\nimport getDialogIndex from \"../lib/appManagers/utils/dialogs/getDialogIndex\";\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n \n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n\n private managers: AppManagers;\n \n constructor(options: {\n appendTo: AppSelectPeers['appendTo'], \n onChange?: AppSelectPeers['onChange'], \n peerType?: AppSelectPeers['peerType'], \n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void, \n renderResultsFunc?: AppSelectPeers['renderResultsFunc'], \n chatRightsAction?: AppSelectPeers['chatRightsAction'], \n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey'],\n managers: AppSelectPeers['managers']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter((peerId) => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n //target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private async renderSaved() {\n if(\n !this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = this.managers.appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true);\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n }\n\n await this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map((dialog) => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n await this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter((peerId) => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map((participant) => {\n return getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center'\n });\n }\n \n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n //const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach((value) => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center', \n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence,\r\n managers: this.managers\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport getUserStatusString from \"../../wrappers/getUserStatusString\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(this.userId)));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n }, this.managers);\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n this.managers.appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n this.managers.appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager, { DIALOG_LIST_ELEMENT_TAG } from \"../../../lib/appManagers/appDialogsManager\";\nimport { AppManagers } from \"../../../lib/appManagers/managers\";\nimport combineParticipantBannedRights from \"../../../lib/appManagers/utils/chats/combineParticipantBannedRights\";\nimport hasRights from \"../../../lib/appManagers/utils/chats/hasRights\";\nimport getPeerId from \"../../../lib/appManagers/utils/peers/getPeerId\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const options = this.options;\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n \n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n if((\n options.participant && \n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n (chat as Chat.channel).username &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n \n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter((i) => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach((info) => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach((flag) => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.appChatsManager.getChat(this.chatId)) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach((info) => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map((t) => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n // this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n // const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n // const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n // if(needAdd) {\n // if(!li) {\n // add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n // } else {\n // setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n // }\n\n // if(update.prev_participant?._ !== 'channelParticipantBanned') {\n // ++exceptionsCount;\n // }\n // } else {\n // if(li) {\n // li.remove();\n // }\n\n // if(update.prev_participant?._ === 'channelParticipantBanned') {\n // --exceptionsCount;\n // }\n // }\n\n // setLength();\n // });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return this.managers.appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then((res) => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(await this.managers.appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from \"../../../../helpers/object/copy\";\nimport { ChatBannedRights, Chat } from \"../../../../layer\";\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from \".\";\nimport type { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId, \n // actionType: 'leave' | 'delete', \n private peerType?: PeerType, \n private onSelect?: (promise: Promise) => void\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect} = this;\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = managers.appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport debounce from \"../../../helpers/schedulers/debounce\";\nimport CheckboxField from \"../../checkboxField\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n let originalReactions = chatFull.available_reactions ?? [];\n const enabledReactions = new Set(originalReactions);\n\n const toggleSection = new SettingSection({\n caption: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'EnableReactionsChannelInfo' : 'EnableReactionsGroupInfo'\n });\n\n const toggleCheckboxField = new CheckboxField({toggle: true, checked: !!enabledReactions.size});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions'\n });\n\n toggleSection.content.append(toggleRow.container);\n\n const reactionsSection = new SettingSection({\n name: 'AvailableReactions'\n });\n\n const checkboxFields = availableReactions.map((availableReaction) => {\n const checkboxField = new CheckboxField({\n toggle: true, \n checked: enabledReactions.has(availableReaction.reaction)\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n enabledReactions.add(availableReaction.reaction);\n\n if(!toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(true);\n }\n } else {\n enabledReactions.delete(availableReaction.reaction);\n\n if(!enabledReactions.size && toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(false);\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n this.listenerSetter.add(toggleRow.checkboxField.input)('change', () => {\n if(!toggleCheckboxField.checked) {\n checkboxFields.forEach((checkboxField) => checkboxField.checked = false);\n saveReactionsDebounced();\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n checkboxFields.forEach((checkboxField) => checkboxField.checked = true);\n saveReactionsDebounced();\n }\n });\n\n const saveReactions = async() => {\n const newReactions = Array.from(enabledReactions);\n if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n return;\n }\n\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.chatId);\n if(chatFull) {\n chatFull.available_reactions = newReactions;\n }\n \n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, newReactions);\n originalReactions = newReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', saveReactions, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport AppChatReactionsTab from \"./chatReactions\";\r\nimport hasRights from \"../../../lib/appManagers/utils/chats/hasRights\";\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n private tempId: number;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n this.tempId ??= 0;\r\n const tempId = ++this.tempId;\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n let chatFull = await this.managers.appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(this.chatId);\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = await this.managers.appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach((callback) => callback());\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\r\n if(this.chatId === chatId) {\r\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n const canChangeType = await this.managers.appChatsManager.hasRights(this.chatId, 'change_type');\r\n const canChangePermissions = await this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n \r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n \r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n \r\n if(canChangeType) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatTypeTab);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(canChangeType || canChangePermissions) {\r\n const reactionsRow = new Row({\r\n titleLangKey: 'Reactions',\r\n icon: 'reactions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatReactionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open().then(() => {\r\n if(this.tempId !== tempId) {\r\n return;\r\n }\r\n \r\n this.listenerSetter.add(tab.eventListener)('destroy', setReactionsLength);\r\n });\r\n }\r\n });\r\n\r\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\r\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\r\n const setReactionsLength = () => {\r\n const reactions = chatFull.available_reactions ?? [];\r\n reactionsRow.subtitle.innerHTML = reactions.length + '/' + availableReactionsLength;\r\n };\r\n\r\n setReactionsLength();\r\n\r\n section.content.append(reactionsRow.container);\r\n }\r\n\r\n if(canChangePermissions && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppGroupPermissionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = async() => {\r\n const chat = await this.managers.appChatsManager.getChatTyped(this.chatId);\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && canChangeType) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport getPeerId from \"../../../lib/appManagers/utils/peers/getPeerId\";\r\nimport formatUserPhone from \"../../wrappers/formatUserPhone\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !(await this.managers.appUsersManager.isContact(this.peerId.toUserId()));\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false));\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, async() => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n this.managers.appUsersManager.addContact(\r\n this.peerId, \r\n this.nameInputField.value, \r\n this.lastNameInputField.value, \r\n (await this.managers.appUsersManager.getUser(this.peerId)).phone\r\n ).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n this.managers.appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { setButtonLoader } from \"../../putPreloader\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\r\n managers: this.managers\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { _i18n } from \"../lib/langPack\";\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Chat, User } from \"../layer\";\nimport rootScope from \"../lib/rootScope\";\nimport generateFakeIcon from \"./generateFakeIcon\";\n// import generatePremiumIcon from \"./generatePremiumIcon\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\n\nexport default async function generateTitleIcons(peerId: PeerId) {\n const elements: Element[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel)?.pFlags?.verified) {\n elements.push(generateVerifiedIcon());\n }\n\n if((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n // if((peer as User.user).pFlags.premium) {\n // elements.push(generatePremiumIcon());\n // }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport wrapEmojiText from \"./wrapEmojiText\";\n\nexport default function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPreviewURLFromBytes from \"../helpers/bytes/getPreviewURLFromBytes\";\nimport { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport { recordPromise } from \"../helpers/recordPromise\";\nimport sequentialDom from \"../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto } from \"../layer\";\nimport type { PeerPhotoSize } from \"../lib/appManagers/appAvatarsManager\";\nimport getPeerColorById from \"../lib/appManagers/utils/peers/getPeerColorById\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport getAbbreviation from \"../lib/richTextProcessor/getAbbreviation\";\nimport rootScope from \"../lib/rootScope\";\nimport getPeerInitials from \"./wrappers/getPeerInitials\";\n\nexport async function putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n) {\n const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n await (renderThumbPromise || renderPromise);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement, \n innerHTML: Parameters[1], \n color: string, \n icon: string\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n}\n\n// peerId === peerId || title\nexport default async function putPhoto(\n div: HTMLElement, \n peerId: PeerId, \n isDialog = false, \n title = '', \n onlyThumb = false, \n isBig?: boolean\n) {\n const myId = rootScope.myId;\n \n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = await managers.appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = await (title ? getAbbreviation(title) : getPeerInitials(peerId, managers));\n set(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Chat, User } from \"../../layer\";\nimport getAbbreviation from \"../../lib/richTextProcessor/getAbbreviation\";\nimport rootScope from \"../../lib/rootScope\";\n\nexport default async function getPeerInitials(peerId: PeerId, managers = rootScope.managers) {\n const peer: Chat | User = await managers.appPeersManager.getPeer(peerId);\n return getAbbreviation(\n (peer as Chat.chat).title ?? [(peer as User.user).first_name, (peer as User.user).last_name].filter(Boolean).join(' ')\n );\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appNavigationController from \"../components/appNavigationController\";\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\nimport cancelEvent from \"./dom/cancelEvent\";\nimport { CLICK_EVENT_NAME } from \"./dom/clickEvent\";\nimport EventListenerBase from \"./eventListenerBase\";\nimport mediaSizes from \"./mediaSizes\";\n\nclass ContextMenuController extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n private openedMenu: HTMLElement;\n private menuOverlay: HTMLElement;\n private openedMenuOnClose: () => void;\n\n constructor() {\n super();\n \n mediaSizes.addEventListener('resize', () => {\n if(this.openedMenu) {\n this.closeBtnMenu();\n }\n \n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n \n console.log(innerWidth, innerHeight, rect);\n } */\n })\n }\n\n public isOpened() {\n return !!this.openedMenu;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n let rect = this.openedMenu.getBoundingClientRect();\n let {clientX, clientY} = e;\n\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.closeBtnMenu();\n //openedMenu.parentElement.click();\n }\n //console.log('mousemove', diffX, diffY);\n };\n\n private onClick = (e: MouseEvent | TouchEvent) => {\n //cancelEvent(e);\n this.closeBtnMenu();\n };\n\n // ! no need in this due to the same handler in appNavigationController\n /* const onKeyDown = (e: KeyboardEvent) => {\n if(e.key === 'Escape') {\n closeBtnMenu();\n cancelEvent(e);\n }\n }; */\n\n public closeBtnMenu = () => {\n if(this.openedMenu) {\n this.openedMenu.classList.remove('active');\n this.openedMenu.parentElement.classList.remove('menu-open');\n //openedMenu.previousElementSibling.remove(); // remove overlay\n if(this.menuOverlay) this.menuOverlay.remove();\n this.openedMenu = undefined;\n \n this.dispatchEvent('toggle', false);\n }\n \n if(this.openedMenuOnClose) {\n this.openedMenuOnClose();\n this.openedMenuOnClose = undefined;\n }\n \n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick);\n }\n \n document.removeEventListener(CLICK_EVENT_NAME, this.onClick);\n \n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType('menu');\n }\n };\n\n public openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\n this.closeBtnMenu();\n \n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'menu',\n onPop: (canAnimate) => {\n this.closeBtnMenu();\n }\n });\n }\n \n this.openedMenu = menuElement;\n this.openedMenu.classList.add('active');\n this.openedMenu.parentElement.classList.add('menu-open');\n \n if(!this.menuOverlay) {\n this.menuOverlay = document.createElement('div');\n this.menuOverlay.classList.add('btn-menu-overlay');\n \n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n \n this.openedMenu.parentElement.insertBefore(this.menuOverlay, this.openedMenu);\n \n //document.body.classList.add('disable-hover');\n \n this.openedMenuOnClose = onClose;\n \n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n //window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {once: true});\n }\n \n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n \n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick);\n \n this.dispatchEvent('toggle', true);\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\nimport contextMenuController from \"../helpers/contextMenuController\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\ncontextMenuController.addEventListener('toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean | Promise;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = async(_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport findAndSplice from \"../helpers/array/findAndSplice\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport type { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport choosePhotoSize from \"../lib/appManagers/utils/photos/choosePhotoSize\";\nimport { openAvatarViewer } from \"./avatar\";\nimport { putAvatar } from \"./putPhoto\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) \n || (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n \n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, lastIndex = 0, minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars, \n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n //console.log(xDiff, yDiff);\n return false;\n }, \n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n }, \n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n \n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n \n //console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return this.managers.appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then((value) => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n \n promises.push(this.managers.appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then(async(result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || await this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n await this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n await this.managers.appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach((img) => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach((target) => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PeerTitle, { PeerTitleOptions } from \"../peerTitle\";\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Chat, ChatFull, User, UserFull } from \"../layer\";\nimport type { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport I18n from \"../lib/langPack\";\nimport wrapRichText from \"../lib/richTextProcessor/wrapRichText\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateTitleIcons from \"./generateTitleIcons\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\nimport formatUserPhone from \"./wrappers/formatUserPhone\";\nimport wrapPeerTitle from \"./wrappers/peerTitle\";\n\nlet setText = (text: Parameters[1], row: Row) => {\n //fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n \n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable, \n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.isDialog = this.isDialog;\n this.avatar.attachClickEvent();\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: async(e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n const full = await this.managers.appProfileManager.getProfileByPeerId(this.peerId);\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: async() => {\n const peer: Channel | User.user = await this.managers.appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: async() => {\n const peer: User = await this.managers.appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n copyTextToClipboard(this.link.title.textContent);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n toast(I18n.format('LinkCopied', true));\n // });\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n \n //let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('peer_title_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.fillUsername();\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n // const photo = appPeersManager.getPeerPhoto(peerId);\n // if(!photo && this.avatars) {\n this.setAvatar();\n // }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n private setPeerStatus = (needClear = false) => {\n const peerId = this.peerId;\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n if(!peerId || (rootScope.myId === peerId && this.isDialog)) return;\n\n return appImManager.setPeerStatus(\n peerId, \n this.subtitle, \n needClear, \n true, \n () => peerId === this.peerId, \n !this.isDialog\n ).then((callback) => {\n if(callback) {\n callback();\n }\n });\n };\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private async setAvatar() {\n if(this.canBeDetailed()) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n await this.avatar.updateWithOptions({peerId: this.peerId});\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n return setText(username, this.username);\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n return setText(user.phone ? formatUserPhone(user.phone) : undefined, this.phone);\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n notificationsRow.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n });\n }\n }\n\n private async fillRows() {\n const peerId = this.peerId;\n\n await Promise.all([\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(),\n (async() => {\n const [element, icons] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n }),\n\n generateTitleIcons(peerId)\n ]);\n replaceContent(this.name, element);\n this.name.append(...icons);\n })(),\n this.setPeerStatus(true)\n ]);\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n this.cleanupHTML();\n await Promise.all([\n this.setAvatar(),\n this.fillRows(),\n ]);\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull: ChatFull | UserFull) {\n // if(peerFull.about) {\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n // }\n\n if(!peerId.isUser()) {\n const chat: Chat.channel = await this.managers.appChatsManager.getChat(peerId.toChatId());\n if(chat.username) {\n setText('https://t.me/' + chat.username, this.link);\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n setText(exportedInvite.link, this.link);\n }\n }\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n setText(location.address, this.location);\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n }\n\n private async setMoreDetails(override?: true) {\n this.clearSetMoreDetailsTimeout();\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId || await this.managers.appPeersManager.isRestricted(peerId) || !this.canBeDetailed()) {\n return;\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override);\n const setPromise = result.result.then(async(peerFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId || await this.managers.appPeersManager.isRestricted(peerId)) {\n //this.log.warn('peer changed');\n return;\n }\n \n await this._setMoreDetails(peerId, peerFull);\n });\n\n if(result.cached) {\n await setPromise;\n }\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\nconst historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.managers, this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map((peerId) => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public async renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!historiesStorage[peerId]) return;\n\n const messages = await Promise.all(mids.map((mid) => this.managers.appMessagesManager.getMessageByPeer(peerId, mid)));\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historiesStorage[peerId][inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType(messages, inputFilter).filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n\n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n --this.searchSuper.usedFromHistory[inputFilter];\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public async cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', await this.searchSuper.canViewMembers() && await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: historiesStorage[peerId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n await this.cleanupHTML();\n await this.toggleEditBtn();\n await this.profile.fillProfileElements();\n }\n\n private async toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n this.profile.destroy();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n private isColumnProportionSet = false;\r\n private sharedMediaTab: AppSharedMediaTab;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n }\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n }\r\n\r\n public createSharedMediaTab() {\r\n const tab = this.createTab(AppSharedMediaTab, true);\r\n tab.slider = this;\r\n // this.tabsContainer.prepend(tab.container);\r\n return tab;\r\n }\r\n\r\n public replaceSharedMediaTab(tab: AppSharedMediaTab) {\r\n let previousTab = this.sharedMediaTab;\r\n if(previousTab) {\r\n const wasActive = previousTab.container.classList.contains('active');\r\n if(wasActive) {\r\n tab.container.classList.add('active');\r\n }\r\n \r\n previousTab.container.replaceWith(tab.container);\r\n } else {\r\n this.tabsContainer.prepend(tab.container);\r\n }\r\n\r\n this.sharedMediaTab = tab;\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport ripple from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public async open(message: any) {\r\n const ret = super.open();\r\n const poll = await this.managers.appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\r\n\r\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\r\n votesList.votes.forEach((vote) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: vote.user_id.toPeerId(false),\r\n container: list,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then((votes) => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"./avatar\";\nimport type LazyLoadQueue from \"./lazyLoadQueue\";\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n \n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport ripple from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Message, MessageMedia, Poll, PollResults } from \"../layer\";\r\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\r\nimport StackedAvatars from \"./stackedAvatars\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport wrapRichText from \"../lib/richTextProcessor/wrapRichText\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nlet isListenerSet = false;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\r\n appImManager.chat.bubbles.container.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n\r\n if(!isListenerSet) {\r\n isListenerSet = true;\r\n appImManager.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: Message.message;\r\n public managers: AppManagers;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public async render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\r\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n \r\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\r\n\r\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\r\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\r\n });\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n this.managers.appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach((el) => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find((r) => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach((target) => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach((target) => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\r\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\r\n stackedAvatars.render(peerIds);\r\n replaceContent(this.avatarsDiv, stackedAvatars.container);\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach((svg) => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map((p) => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach((svg) => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\r\n if(html instanceof DocumentFragment) return html;\r\n const template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","import { RestrictionReason } from \"../layer\";\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","import { isRestricted } from \"../../../../helpers/restrictions\";\nimport { Message } from \"../../../../layer\";\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message, MessageAction } from \"../../layer\";\nimport wrapUrl from \"../../lib/richTextProcessor/wrapUrl\";\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\nimport wrapMessageActionTextNewUnsafe from \"./messageActionTextNewUnsafe\";\n\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: true): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: false): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: boolean): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: boolean): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { formatTime } from \"../../helpers/date\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport { MessageAction } from \"../../layer\";\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\nimport I18n, { FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n } from \"../../lib/langPack\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport wrapPlainText from \"../../lib/richTextProcessor/wrapPlainText\";\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\nimport rootScope from \"../../lib/rootScope\";\nimport PeerTitle from \"../peerTitle\";\nimport getPeerTitle from \"./getPeerTitle\";\nimport wrapJoinVoiceChatAnchor from \"./joinVoiceChatAnchor\";\nimport wrapMessageForReply from \"./messageForReply\";\n\nexport default async function wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = async(peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = rootScope.myId;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map((peerId) => getNameDivHTML(peerId, plain));\n args.push(wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message).then(async(originalMessage) => {\n if(originalMessage && message) {\n rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(managers.appMessagesManager.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: await managers.appMessagesManager.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(await wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n await Promise.all(users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain))),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from \"../../helpers/assumeType\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport { getRestrictionReason } from \"../../helpers/restrictions\";\nimport escapeRegExp from \"../../helpers/string/escapeRegExp\";\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport { Message, DocumentAttribute } from \"../../layer\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport { MyDraftMessage } from \"../../lib/appManagers/appDraftsManager\";\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\nimport isMessageRestricted from \"../../lib/appManagers/utils/messages/isMessageRestricted\";\nimport I18n, { LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY } from \"../../lib/langPack\";\nimport sortEntities from \"../../lib/richTextProcessor/sortEntities\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport wrapPlainText from \"../../lib/richTextProcessor/wrapPlainText\";\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\nimport rootScope from \"../../lib/rootScope\";\nimport wrapMessageActionTextNew from \"./messageActionTextNew\";\n\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n \n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = await appMessagesManager.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n\n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n \n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] as string));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find((attribute) => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n\n default:\n //messageText += media._;\n ///////appMessagesManager.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = await wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n \n if(found) {\n sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport choosePhotoSize from \"../../lib/appManagers/utils/photos/choosePhotoSize\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\nimport wrapMessageForReply from \"../wrappers/messageForReply\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport async function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n await wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n await wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach((child) => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, async(title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { hexToRgb } from \"../../helpers/color\";\nimport { Message } from \"../../layer\";\nimport getPeerColorById from \"../../lib/appManagers/utils/peers/getPeerColorById\";\nimport ReplyContainer from \"../chat/replyContainer\";\n\nexport default function wrapReply(\n title: Parameters[0], \n subtitle: Parameters[1], \n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply');\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport createVideo from \"../../helpers/dom/createVideo\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport { StickerSet } from \"../../layer\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\nimport rootScope from \"../../lib/rootScope\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport wrapSticker from \"./sticker\";\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: string,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id\n }, group);\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n \n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n });\n });\n }\n }\n });\n\n return;\n }\n\n const promise = managers.appStickersManager.getStickerSet(set);\n const stickerSet = await promise;\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc: stickerSet.documents[0],\n div: container, \n group: group,\n lazyLoadQueue,\n managers\n }); // kostil\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport Row from \"../row\";\nimport wrapSticker from \"./sticker\";\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\n return result;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport insertInDescendSortedArray from \"./array/insertInDescendSortedArray\";\nimport { getMiddleware } from \"./middleware\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach((element) => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(\n id: SortedElementId, \n batch = false, \n updateElementWith?: SortedList['updateElementWith'], \n updateBatch = batch\n ) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public async update(\n id: SortedElementId, \n batch = false, \n element = this.get(id), \n updateElementWith?: SortedList['updateElementWith']\n ) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, { AppDialogsManager, DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport getUserStatusString from \"./wrappers/getUserStatusString\";\nimport type LazyLoadQueue from \"./lazyLoadQueue\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n protected managers: AppManagers;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> & {\n managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(element.id));\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport { IS_APPLE } from \"../../environment/userAgent\";\nimport contextMenuController from \"../contextMenuController\";\nimport ListenerSetter from \"../listenerSetter\";\nimport cancelEvent from \"./cancelEvent\";\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n \n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\n let timeout: number;\n\n const options: EventListenerOptions = {capture: true};\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n \n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e.touches[0]);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport cancelEvent from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelContextMenuOpening } from \"./attachContextMenuListener\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from \"../helpers/contextMenuController\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n textArgs?: FormatterArguments,\n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean | any, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n // ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) textElement.innerHTML = options.regularText;\n }\n \n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n \n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n contextMenuController.closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach((b) => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from \"../../lib/rootScope\";\nimport PopupElement, { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport hasRights from \"../../lib/appManagers/utils/chats/hasRights\";\nimport filterAsync from \"../../helpers/array/filterAsync\";\n\nexport default class PopupDeleteMessages {\n constructor(private peerId: PeerId, private mids: number[], private type: ChatType, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm} = this;\n\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\n \n this.show();\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager, MessagesStorageKey } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport { attachContextMenuListener } from \"../../helpers/dom/attachContextMenuListener\";\nimport filterUnique from \"../../helpers/array/filterUnique\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n//const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, listenerSetter);\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n\n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(seenSet.has(mid)) {\n return;\n }\n\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = this.getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach((element) => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n };\n\n private getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n SetTransition(element, 'is-selected', false, 200);\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n // const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n // if(diff < 0) {\n // toast(I18n.format('Chat.Selection.LimitToast', true));\n // return false;\n // /* const it = this.selectedMids.values();\n // do {\n // const mid = it.next().value;\n // const mounted = this.appImManager.getMountedBubble(mid);\n // if(mounted) {\n // this.toggleByBubble(mounted.bubble);\n // } else {\n // const mids = this.appMessagesManager.getMidsByMid(mid);\n // for(const mid of mids) {\n // this.selectedMids.delete(mid);\n // }\n // }\n // } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n // }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach((mid) => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, managers: AppManagers) {\n super({\n managers,\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n this.attachListeners(searchSuper.container, new ListenerSetter());\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach((element) => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', () => this.cancelSelection(), {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n appImManager.setInnerPeer({peerId, lastMsgId: mid});\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private bubbles: ChatBubbles, \n private input: ChatInput, \n managers: AppManagers\n ) {\n super({\n managers,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n \n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach((item) => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement): Promise => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(element));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && \n !bubble.classList.contains('is-outgoing') && \n !bubble.classList.contains('bubble-first') && \n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n this.selectionLeft = \n this.selectionRight = \n null;\n this.selectedText = undefined;\n }\n \n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n });\n\n //const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n \n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport { WebPage } from \"../../layer\";\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\n } */);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport { WebPage } from \"../../layer\";\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from \"./mediaSizes\";\n\nexport type MenuPositionPadding = {\n top?: number, \n right?: number, \n bottom?: number, \n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n //let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n let {scrollHeight: menuHeight} = elem;\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n //intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop,\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n \n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n let top: number;\n\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n \n elem.style.top = top + 'px';\n }\n \n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, { DIALOG_LIST_ELEMENT_TAG } from \"../lib/appManagers/appDialogsManager\";\nimport type { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { logger } from \"../lib/logger\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { putPreloader } from \"./putPreloader\";\nimport ripple from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants, Document, Message, MessageMedia, Photo, WebPage } from \"../layer\";\nimport SortedUserList from \"./sortedUserList\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appSidebarRight from \"./sidebarRight\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport cleanSearchText from \"../helpers/cleanSearchText\";\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport handleTabSwipe from \"../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../helpers/windowSize\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupForward from \"./popups/forward\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport Row from \"./row\";\nimport htmlToDocumentFragment from \"../helpers/dom/htmlToDocumentFragment\";\nimport { SearchSelection } from \"./chat/selection\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, simulateClickEvent } from \"../helpers/dom/clickEvent\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport AppMediaViewer from \"./appMediaViewer\";\nimport lockTouchScroll from \"../helpers/dom/lockTouchScroll\";\nimport copy from \"../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../helpers/object/getObjectKeysAndSort\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport escapeRegExp from \"../helpers/string/escapeRegExp\";\nimport findAndSplice from \"../helpers/array/findAndSplice\";\nimport { ScrollStartCallbackDimensions } from \"../helpers/fastSmoothScroll\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport choosePhotoSize from \"../lib/appManagers/utils/photos/choosePhotoSize\";\nimport wrapWebPageDescription from \"./wrappers/webPageDescription\";\nimport wrapWebPageTitle from \"./wrappers/webPageTitle\";\nimport getAbbreviation from \"../lib/richTextProcessor/getAbbreviation\";\nimport matchUrl from \"../lib/richTextProcessor/matchUrl\";\nimport wrapPlainText from \"../lib/richTextProcessor/wrapPlainText\";\nimport wrapRichText from \"../lib/richTextProcessor/wrapRichText\";\nimport wrapSenderToPeer from \"./wrappers/senderToPeer\";\nimport wrapSentTime from \"./wrappers/sentTime\";\nimport getMediaFromMessage from \"../lib/appManagers/utils/messages/getMediaFromMessage\";\nimport filterMessagesByInputFilter from \"../lib/appManagers/utils/messages/filterMessagesByInputFilter\";\nimport getChatMembersString from \"./wrappers/getChatMembersString\";\nimport getUserStatusString from \"./wrappers/getUserStatusString\";\nimport getParticipantPeerId from \"../lib/appManagers/utils/chats/getParticipantPeerId\";\nimport { Awaited } from \"../types\";\nimport { attachContextMenuListener } from \"../helpers/dom/attachContextMenuListener\";\nimport contextMenuController from \"../helpers/contextMenuController\";\nimport positionMenu from \"../helpers/positionMenu\";\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n \n await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n \n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await button.verify() : true;\n }\n \n button.element.classList.toggle('hide', !good);\n }));\n \n item.classList.add('menu-open');\n \n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message, \n middleware: () => boolean, \n promises: Promise[], \n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n \n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n public urlsToRevoke: string[] = [];\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n \n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, this.managers);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.canLoadMediaTab(this.mediaTab)/* && false */) {\n //this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n //this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n \n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n \n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = async(className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map((el) => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map((k) => +k).sort((a, b) => a - b);\n const idx = targets.findIndex((item) => item.mid === mid && item.peerId === peerId);\n \n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const {dom} = appDialogsManager.addDialogNew({\n peerId: message.peerId, \n container: searchGroup.list, \n avatarSize: 54,\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any, \n lastMessage: message, \n dom, \n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n })).thumb;\n } else {\n wrapped = await wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webpage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage;\n\n if(!webpage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n //display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webpage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webpage.description = message.message;\n }\n }\n\n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: choosePhotoSize(webpage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true));\n }\n \n let title = wrapWebPageTitle(webpage);\n\n const subtitleFragment = wrapWebPageDescription(webpage);\n const aFragment = htmlToDocumentFragment(wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', await wrapSenderToPeer(message));\n }\n \n if(!title.textContent) {\n //title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webpage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\n }\n }\n \n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n \n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited.filter(Boolean));\n }\n \n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach((details) => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach((child) => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId, \n container: group.list, \n avatarSize: 48,\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n this.managers.appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n this.managers.appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n \n this.managers.appMessagesManager.getConversations(query, 0, 20, 0)\n .then(onLoad)\n .then((value) => {\n if(value) {\n setResults(value.dialogs.map((d) => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n let {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(await (peerId.isUser() ? \n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) : \n getChatMembersString(peerId.toChatId())));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n this.managers.appUsersManager.getTopPeers('correspondents').then((peers) => {\n if(!middleware()) return;\n\n const idx = peers.findIndex((peer) => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n peerId: peer.id, \n container: this.searchGroups.people.list, \n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue, \n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n continue;\n }\n\n this.membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch((err) => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n\n return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const peerId = this.searchContext.peerId;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters),\n this.canViewMembers()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach((mediaTab) => {\n const counter = counters.find((c) => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n // firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n \n public async load(single = false, justLoad = false) {\n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter((t) => t !== this.mediaTab);\n toLoad = toLoad.filter((mediaTab) => {\n return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (mediaTab) => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map((mediaTab) => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware);\n });\n\n return Promise.all(promises).catch((err) => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return Promise.all([\n this.searchContext.peerId.isAnyChat(),\n this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),\n this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants')\n ]).then(([isAnyChat, isBroadcast, hasRights]) => {\n return isAnyChat && !isBroadcast && hasRights;\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach((mediaTab) => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.loadFirstTimePromise = undefined;\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach((mediaTab) => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport contextMenuController from \"../helpers/contextMenuController\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\n\r\nconst ButtonMenuToggle = (\r\n options: Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n listenerSetter: ListenerSetter, \r\n asDiv: boolean,\r\n container: HTMLElement\r\n }> = {}, \r\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', \r\n buttons: ButtonMenuItemOptions[], \r\n onOpen?: (e: Event) => void,\r\n onClose?: () => void\r\n) => {\r\n options.asDiv = true;\r\n const button = options.container ?? ButtonIcon('more', options);\r\n button.classList.add('btn-menu-toggle');\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options, onClose);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void | Promise, options?: AttachClickOptions, onClose?: () => void) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n contextMenuController.closeBtnMenu();\r\n } else {\r\n const result = onOpen && onOpen(e);\r\n const open = () => {\r\n contextMenuController.openBtnMenu(openedMenu, onClose);\r\n };\r\n\r\n if(result instanceof Promise) {\r\n result.then(open);\r\n } else {\r\n open();\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PrivacyRule } from \"../../../../layer\";\nimport PrivacyType from \"./privacyType\";\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts': \n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport getPrivacyRulesDetails from \"../lib/appManagers/utils/privacy/getPrivacyRulesDetails\";\r\nimport PrivacyType from \"../lib/appManagers/utils/privacy/privacyType\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey],\r\n managers: AppManagers\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n const managers = options.managers;\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter((r) => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n options.tab.slider.createTab(AppAddMembersTab).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach((k) => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map((id) => id.toPeerId()));\r\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', async() => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n const a = ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>);\r\n for(const [k, chatKey, usersKey] of a) {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({\r\n _: usersKey, \r\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\r\n });\r\n }\r\n }\r\n }\r\n }\r\n \r\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else if(caption instanceof HTMLElement) {\r\n replaceContent(captionElement, caption);\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach((peerId) => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { i18n, LangPackKey } from \"../../../../lib/langPack\";\r\nimport anchorCopy from \"../../../../helpers/dom/anchorCopy\";\r\nimport PrivacyType from \"../../../../lib/appManagers/utils/privacy/privacyType\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\r\n const captionEl = document.createElement('div');\r\n captionEl.append(\r\n i18n('PrivacyPhoneInfo'), \r\n document.createElement('br'), \r\n document.createElement('br'), \r\n i18n('PrivacyPhoneInfo4'),\r\n document.createElement('br'),\r\n anchorCopy({\r\n mePath: formatted\r\n })\r\n );\r\n\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [captionEl, captionEl, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n },\r\n managers: this.managers\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { toastNew } from \"../../components/toast\";\nimport { copyTextToClipboard } from \"../clipboard\";\nimport cancelEvent from \"./cancelEvent\";\nimport { attachClickEvent } from \"./clickEvent\";\n\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n if(options.mePath) {\n const href = 'https://t.me/' + options.mePath;\n anchor.href = anchor.innerText = href;\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(anchor.href);\n toastNew({langPackKey: 'LinkCopied'});\n });\n\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport rootScope from \"../../lib/rootScope\";\nimport wrapSticker from \"./sticker\"\n\nexport default async function wrapStickerEmoji({emoji, div, width, height, managers = rootScope.managers}: {\n emoji: string,\n div: HTMLElement,\n managers?: AppManagers,\n width: number,\n height: number\n}) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n doc,\n div,\n emoji,\n width,\n height,\n loop: false,\n play: true\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n emoji,\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../putPreloader\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n this.managers.passwordManager.confirmPasswordEmail('' + code)\r\n .then((value) => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch((err) => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../putPreloader\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport matchEmail from \"../../../../lib/richTextProcessor/matchEmail\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","import { EMAIL_REG_EXP } from \".\";\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const stickerContainer = document.createElement('div');\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../../../helpers/dom/setInnerHTML\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport wrapEmojiText from \"../../../../lib/richTextProcessor/wrapEmojiText\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../putPreloader\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return this.managers.passwordManager.getState().then((_state) => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport PrivacyType from \"../../../../lib/appManagers/utils/privacy/privacyType\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport PrivacyType from \"../../../../lib/appManagers/utils/privacy/privacyType\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport { toast } from \"../../toast\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport findAndSplice from \"../../../helpers/array/findAndSplice\";\r\nimport { attachContextMenuListener } from \"../../../helpers/dom/attachContextMenuListener\";\r\nimport positionMenu from \"../../../helpers/positionMenu\";\r\nimport contextMenuController from \"../../../helpers/contextMenuController\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n \r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach((auth) => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then((value) => {\r\n if(value) {\r\n target.remove();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager, { DIALOG_LIST_ELEMENT_TAG } from \"../../../lib/appManagers/appDialogsManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport formatUserPhone from \"../../wrappers/formatUserPhone\";\r\nimport getUserStatusString from \"../../wrappers/getUserStatusString\";\r\nimport { attachContextMenuListener } from \"../../../helpers/dom/attachContextMenuListener\";\r\nimport positionMenu from \"../../../helpers/positionMenu\";\r\nimport contextMenuController from \"../../../helpers/contextMenuController\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n section.caption.parentElement.prepend(section.caption);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n this.managers.appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n section.content.append(list);\r\n\r\n const add = async(peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: list,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = await this.managers.appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : getUserStatusString(user));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n this.managers.appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\nimport getPrivacyRulesDetails from \"../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails\";\r\nimport PrivacyType from \"../../../lib/appManagers/utils/privacy/privacyType\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppBlockedUsersTab);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n this.managers.passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.updateActiveSessions();\r\n }, {once: true});\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n this.managers.appUsersManager.getBlocked().then((res) => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n this.managers.passwordManager.getState().then((state) => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyLastSeenTab).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyCallsTab).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(\r\n numberVisibilityRow.container, \r\n lastSeenTimeRow.container, \r\n photoVisibilityRow.container, \r\n callRow.container, \r\n linkAccountRow.container, \r\n groupChatsAddRow.container\r\n );\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(this.managers.apiManager.invokeApi('account.getContentSettings').then((settings) => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n this.managers.apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\r\n const context = canvas.getContext('2d');\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n return outPixel;\r\n}\r\n\r\nexport function averageColor(imageUrl: string) {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n resolve(averageColorFromCanvas(canvas));\r\n });\r\n });\r\n};\r\n","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\nimport { hexToRgb } from \"../../helpers/color\";\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n /* private readonly _curve = [ \n 0, 25, 50, 75, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, \n 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1830, 1860, 1890, 1920, \n 1950, 1980, 2010, 2040, 2070, 2100, 2130, 2160, 2190, 2220, 2250, 2280, 2310, \n 2340, 2370, 2400, 2430, 2460, 2490, 2520, 2550, 2580, 2610, 2630, 2640, 2650, \n 2660, 2670, 2680, 2690, 2700\n ]; */\n private readonly _curve = [\n 0 , 0.25 , 0.50 , 0.75 , 1 , 1.5 , 2 , 2.5 , 3 , 3.5 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ,\n 13 , 14 , 15 , 16 , 17 , 18 , 18.3 , 18.6 , 18.9 , 19.2 , 19.5 , 19.8 , 20.1 , 20.4 , 20.7 ,\n 21.0 , 21.3 , 21.6 , 21.9 , 22.2 , 22.5 , 22.8 , 23.1 , 23.4 , 23.7 , 24.0 , 24.3 , 24.6 ,\n 24.9 , 25.2 , 25.5 , 25.8 , 26.1 , 26.3 , 26.4 , 26.5 , 26.6 , 26.7 , 26.8 , 26.9 , 27 ,\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n { x: 0.80, y: 0.10 },\n { x: 0.60, y: 0.20 },\n { x: 0.35, y: 0.25 },\n { x: 0.25, y: 0.60 },\n { x: 0.20, y: 0.90 },\n { x: 0.40, y: 0.80 },\n { x: 0.65, y: 0.75 },\n { x: 0.75, y: 0.40 }\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n while(shift > 0) {\n positions.push(positions.shift());\n --shift;\n }\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n \n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax,\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n \n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n \n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private drawOnWheel = () => {\n let diff = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n diff = diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n if(diff) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = () => {\n const frames = this._frames;\n const id = frames.shift();\n if(id) {\n this.drawImageData(id);\n }\n \n const leftLength = frames.length;\n if(!leftLength) {\n this._animatingToNextPosition = undefined;\n }\n\n return !!leftLength;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map((color) => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d');\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d');\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n \n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition() {\n if(this._colors.length < 2) {\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n \n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n \n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n \n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animate(this.drawNextPositionAnimated);\n }\n\n public scrollAnimate(start?: boolean) {\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","import { ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla } from \"../helpers/color\";\r\nimport attachGrabListeners from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { Theme } from \"../../../config/state\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport themeController from \"../../../helpers/themeController\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = themeController.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach((color) => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n \r\n background.id = '2';\r\n background.intensity = 0;\r\n background.slug = '';\r\n background.color = hex.toLowerCase();\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n const color = (background.color || '').split(',')[0];\r\n const isColored = !!color && !background.slug;\r\n \r\n // * set active if type is color\r\n if(isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(color || '#cccccc');\r\n \r\n if(!isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","import type { MediaSize } from \"../mediaSize\";\n\nexport default function scaleMediaElement(options: {\n media: CanvasImageSource, \n mediaSize?: MediaSize, \n boxSize?: MediaSize, \n quality?: number,\n mimeType?: 'image/jpeg' | 'image/png',\n size?: MediaSize\n}): Promise<{blob: Blob, size: MediaSize}> {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n canvas.width = size.width * window.devicePixelRatio;\n canvas.height = size.height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\n canvas.toBlob((blob) => {\n resolve({blob, size});\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection } from \"..\";\r\nimport { averageColor, averageColorFromCanvas } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport deferredPromise, { CancellablePromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport ChatBackgroundGradientRenderer from \"../../chat/gradientRenderer\";\r\nimport { Document, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager, { AppDownloadManager, DownloadBlob } from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\nimport choosePhotoSize from \"../../../lib/appManagers/utils/photos/choosePhotoSize\";\r\nimport { STATE_INIT, Theme } from \"../../../config/state\";\r\nimport themeController from \"../../../helpers/themeController\";\r\nimport requestFile from \"../../../helpers/files/requestFile\";\r\nimport { renderImageFromUrlPromise } from \"../../../helpers/dom/renderImageFromUrl\";\r\nimport scaleMediaElement from \"../../../helpers/canvas/scaleMediaElement\";\r\nimport { MediaSize } from \"../../../helpers/mediaSize\";\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n private wallPapersByElement: Map = new Map();\r\n private elementsByKey: Map = new Map();\r\n\r\n private get theme() {\r\n return themeController.getTheme();\r\n }\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n this.slider.createTab(AppBackgroundColorTab).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(active);\r\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\r\n return;\r\n }\r\n \r\n this.setBackgroundDocument(wallpaper);\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n this.managers.appDocsManager.getWallPapers().then((wallPapers) => {\r\n wallPapers.forEach((wallPaper) => {\r\n this.addWallPaper(wallPaper);\r\n });\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\r\n if(file.name.endsWith('.png')) {\r\n const img = document.createElement('img');\r\n const url = URL.createObjectURL(file);\r\n await renderImageFromUrlPromise(img, url, false);\r\n const mimeType = 'image/jpeg';\r\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\r\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\r\n }\r\n\r\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\r\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\r\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\r\n deferred.cancel = uploadDeferred.cancel;\r\n\r\n uploadDeferred.then((wallPaper) => {\r\n this.clicked.delete(key);\r\n this.elementsByKey.delete(key);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n const newKey = this.getWallPaperKey(wallPaper);\r\n this.elementsByKey.set(newKey, container);\r\n\r\n this.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n deferred.catch(() => {\r\n container.remove();\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallPaper, false);\r\n this.clicked.add(key);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private getColorsFromWallPaper(wallPaper: WallPaper) {\r\n return wallPaper.settings ? [\r\n wallPaper.settings.background_color,\r\n wallPaper.settings.second_background_color,\r\n wallPaper.settings.third_background_color,\r\n wallPaper.settings.fourth_background_color\r\n ].filter(Boolean).map((color) => '#' + color.toString(16)).join(',') : '';\r\n }\r\n\r\n private getWallPaperKey(wallPaper: WallPaper) {\r\n return '' + wallPaper.id;\r\n }\r\n\r\n private getWallPaperKeyFromTheme(theme: Theme) {\r\n return '' + theme.background.id;\r\n }\r\n\r\n private addWallPaper(wallPaper: WallPaper, append = true) {\r\n const colors = this.getColorsFromWallPaper(wallPaper);\r\n const hasFile = wallPaper._ === 'wallPaper';\r\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\r\n return;\r\n }\r\n\r\n const isDark = !!wallPaper.pFlags.dark;\r\n\r\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n container.dataset.id = '' + wallPaper.id;\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n this.elementsByKey.set(key, container);\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n let wrapped: ReturnType, size: PhotoSize;\r\n if(hasFile) {\r\n size = choosePhotoSize(doc, 200, 200);\r\n wrapped = wrapPhoto({\r\n photo: doc,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: size,\r\n noFadeIn: wallPaper.pFlags.pattern\r\n });\r\n\r\n if(wallPaper.pFlags.pattern) {\r\n media.classList.add('is-pattern');\r\n }\r\n\r\n wrapped.then(async({loadPromises, images}) => {\r\n await loadPromises.thumb || loadPromises.full;\r\n return images;\r\n }).then((images) => {\r\n if(wallPaper.pFlags.pattern) {\r\n if(isDark) {\r\n images.full.style.display = 'none';\r\n if(images.thumb) {\r\n images.thumb.style.display = 'none';\r\n }\r\n } else if(wallPaper.settings?.intensity) {\r\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\r\n }\r\n }\r\n\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n } else {\r\n container.append(media);\r\n }\r\n\r\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\r\n canvas.classList.add('background-colors-canvas');\r\n \r\n if(isDark && hasFile) {\r\n wrapped.then(({loadPromises}) => {\r\n loadPromises.full.then(async() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\r\n canvas.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\r\n media.append(canvas);\r\n });\r\n });\r\n } else {\r\n media.append(canvas);\r\n }\r\n }\r\n\r\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\r\n container.classList.add('active');\r\n }\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(target);\r\n if(wallpaper._ === 'wallPaperNoFile') {\r\n this.setBackgroundDocument(wallpaper);\r\n return;\r\n }\r\n \r\n const key = this.getWallPaperKey(wallpaper);\r\n if(this.clicked.has(key)) return;\r\n this.clicked.add(key);\r\n \r\n const doc = wallpaper.document as MyDocument;\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const load = async() => {\r\n const promise = this.setBackgroundDocument(wallpaper);\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then((response) => {\r\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (wallPaper: WallPaper) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\r\n const deferred = deferredPromise();\r\n let download: Promise | ReturnType;\r\n if(doc) {\r\n download = appDownloadManager.downloadMediaURL({media: doc, queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0});\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n } else {\r\n download = Promise.resolve();\r\n }\r\n\r\n download.then(async() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url?: string) => {\r\n //const perf = performance.now();\r\n let getPixelPromise: Promise;\r\n if(url && !this.theme.background.color) {\r\n getPixelPromise = averageColor(url);\r\n } else {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(this.getColorsFromWallPaper(wallPaper));\r\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\r\n }\r\n\r\n getPixelPromise.then((pixel) => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n \r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n // const hsla = 'rgba(0, 0, 0, 0.3)';\r\n //console.log(doc, hsla, performance.now() - perf);\r\n\r\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\r\n background.id = wallPaper.id;\r\n background.intensity = wallPaper.settings?.intensity ?? 0;\r\n background.color = this.getColorsFromWallPaper(wallPaper);\r\n background.slug = slug;\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n if(slug) {\r\n this.saveToCache(slug, url);\r\n }\r\n\r\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\r\n });\r\n };\r\n\r\n if(!doc) {\r\n onReady();\r\n return;\r\n }\r\n\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\r\n promise.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(canvas.toDataURL());\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n };\r\n}\r\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n \n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from \".\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../putPreloader\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { toastNew } from \"../toast\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return this.managers.appStickersManager.getStickerSet(this.stickerSetInput).then((set) => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n setInnerHTML(this.h6, wrapEmojiText(set.set.title));\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n this.managers.appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SettingSection } from \"..\";\nimport RadioField from \"../../radioField\";\nimport Row, { RadioFormFromRows } from \"../../row\";\nimport SliderSuperTab from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === quickReaction.reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction(value);\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection, SettingSection } from \"..\";\r\nimport RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport { wrapStickerSetThumb, wrapStickerToRow } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport IS_GEOLOCATION_SUPPORTED from \"../../../environment/geolocationSupport\";\r\nimport AppQuickReactionTab from \"./quickReaction\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\nimport { State } from \"../../../config/state\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n public valueContainer: HTMLElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(\r\n name: LangPackKey, \r\n step: number, \r\n initialValue: number, \r\n minValue: number, \r\n maxValue: number,\r\n writeValue = true\r\n ) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = this.valueContainer = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n\r\n if(writeValue) {\r\n valueDiv.innerHTML = '' + initialValue;\r\n }\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step, \r\n min: minValue, \r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n if(writeValue) {\r\n //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n this.slider.createTab(AppBackgroundTab).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers', \r\n name, \r\n value: 'kilometers', \r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles', \r\n stateKey\r\n })\r\n });\r\n \r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'], \r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey, \r\n name, \r\n value: format, \r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString(\"en-us-u-hc-\" + format, {\r\n hour: '2-digit', \r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map((row) => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\r\n\r\n const reactionsRow = new Row({\r\n titleLangKey: 'DoubleTapSetting',\r\n havePadding: true,\r\n clickable: () => {\r\n this.slider.createTab(AppQuickReactionTab).open();\r\n }\r\n });\r\n\r\n const renderQuickReaction = () => {\r\n Promise.resolve(this.managers.appReactionsManager.getQuickReaction()).then((reaction) => {\r\n wrapStickerToRow({\r\n row: reactionsRow,\r\n doc: reaction.static_icon,\r\n size: 'small'\r\n });\r\n });\r\n };\r\n\r\n renderQuickReaction();\r\n\r\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const stickersContent = section.generateContentElement();\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n stickersContent[method](row.container);\r\n };\r\n\r\n this.managers.appStickersManager.getAllStickers().then((allStickers) => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n section.content.append(reactionsRow.container, suggestCheckboxField.label, loopCheckboxField.label);\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from \"./eachTimeout\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from \"../environment/ctx\";\nimport noop from \"./noop\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { generateSection, SettingSection } from \"..\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n const appConfig = await this.managers.apiManager.getAppConfig();\r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: rootScope.premium ? appConfig.about_length_limit_premium : appConfig.about_length_limit_default\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n }, this.managers);\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(this.managers.appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = await this.managers.appUsersManager.getSelf();\r\n\r\n const userFull = await this.managers.appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', async() => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n await Promise.all(filters.map(async(filter) => {\r\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n const peerIds = dialogs.map((d) => d.peerId);\r\n this.dialogsByFilters.set(filter, new Set(peerIds));\r\n }));\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await this.managers.appUsersManager.getContacts();\r\n peerIds.forEach((peerId) => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: this.selector.scrollable,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n setInnerHTML(span, wrapEmojiText(filter.title));\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach((el) => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n /////////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container, \r\n onChange: this.onSelectChange, \r\n peerType: ['dialogs'], \r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats',\r\n managers: this.managers\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport InputField from \"../../inputField\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport deepEqual from \"../../../helpers/object/deepEqual\";\r\nimport documentFragmentToHTML from \"../../../helpers/dom/documentFragmentToHTML\";\r\nimport wrapDraftText from \"../../../lib/richTextProcessor/wrapDraftText\";\r\nimport filterAsync from \"../../../helpers/array/filterAsync\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach((o) => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch((err) => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then((player) => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = documentFragmentToHTML(wrapDraftText(filter.title));\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList({ignoreClick: true});\r\n\r\n let peers = filter[key];\r\n\r\n // filter peers where we're kicked\r\n const hasPeer = async(peerId: PeerId) => {\r\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\r\n };\r\n \r\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\r\n peers.length = 0;\r\n peers.push(...filtered);\r\n\r\n peers = peers.slice();\r\n\r\n const renderMore = async(_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\r\n continue;\r\n }\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: ul,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') {\r\n this.setFilter(this.originalFilter, true);\r\n this.onEditOpen();\r\n } else {\r\n this.onCreateOpen();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport cancelEvent from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private async renderFolder(dialogFilter: DialogFilterSuggested | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter as MyDialogFilter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n await Promise.all(folder.map(async(dialog) => {\r\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }));\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach((el) => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, async() => {\r\n this.slider.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach((el) => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, async() => {\r\n const appConfig = await this.managers.apiManager.getAppConfig();\r\n if(Object.keys(this.filtersRendered).length >= (rootScope.premium ? appConfig.dialog_filters_limit_premium : appConfig.dialog_filters_limit_default)) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n this.slider.createTab(AppEditFolderTab).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n for(const filter of filters) {\r\n await this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n await this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n await this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then((player) => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\r\n\r\n for(const filter of suggestedFilters) {\r\n const div = await this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n this.managers.filtersStorage.createDialogFilter(f, true).then((bool) => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\nimport { MUTE_UNTIL } from \"../../../lib/mtproto/mtproto_config\";\r\nimport apiManagerProxy from \"../../../lib/mtproto/mtprotoworker\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = async() => {\r\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', async() => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = this.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then((langPack) => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { addCancelButton } from \"./popups\";\nimport PopupPeer, { PopupPeerOptions } from \"./popups/peer\";\n\n// type PopupConfirmationOptions = Pick;\ntype PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\n };\n\n const buttons = addCancelButton([button]);\n const cancelButton = buttons.find((button) => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes = checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SettingSection } from \"../..\";\nimport { LangPackKey } from \"../../../../lib/langPack\";\nimport CheckboxField from \"../../../checkboxField\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts', \n name: 'contacts',\n stateKey: key + 'contacts',\n withRipple: true\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats', \n name: 'private',\n stateKey: key + 'private',\n withRipple: true\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats', \n name: 'groups',\n stateKey: key + 'groups',\n withRipple: true\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels', \n name: 'channels',\n stateKey: key + 'channels',\n withRipple: true\n });\n\n section.content.append(\n contactsCheckboxField.label, \n privateCheckboxField.label, \n groupsCheckboxField.label, \n channelsCheckboxField.label\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle');\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from \"../../../../helpers/formatBytes\";\nimport debounce from \"../../../../helpers/schedulers/debounce\";\nimport I18n from \"../../../../lib/langPack\";\nimport rootScope from \"../../../../lib/rootScope\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { RangeSettingSelector } from \"../generalSettings\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle');\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\nimport { autoDownloadPeerTypeSection } from \"./photo\";\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle');\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AutoDownloadPeerTypeSettings, STATE_INIT } from \"../../../config/state\";\nimport { SettingSection } from \"..\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport formatBytes from \"../../../helpers/formatBytes\";\nimport copy from \"../../../helpers/object/copy\";\nimport deepEqual from \"../../../helpers/object/deepEqual\";\nimport { FormatterArguments, i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport Button from \"../../button\";\nimport CheckboxField from \"../../checkboxField\";\nimport confirmationPopup from \"../../confirmationPopup\";\nimport Row from \"../../row\";\nimport { SliderSuperTabEventable, SliderSuperTabEventableConstructable } from \"../../sliderTab\";\nimport AppAutoDownloadFileTab from \"./autoDownload/file\";\nimport AppAutoDownloadPhotoTab from \"./autoDownload/photo\";\nimport AppAutoDownloadVideoTab from \"./autoDownload/video\";\nimport apiManagerProxy from \"../../../lib/mtproto/mtprotoworker\";\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n protected async init() {\n this.header.classList.add('with-border');\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia', \n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n withRipple: true\n });\n\n const onChange = () => {\n toggleDisability([resetButton], \n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) && \n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo, /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = new tabConstructor(this.slider, true);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n \n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n }\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n }\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n }\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n \n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoCheckboxField.label,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n \n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n const gifsCheckboxField = new CheckboxField({\n text: 'AutoplayGIF', \n name: 'gifs', \n stateKey: 'settings.autoPlay.gifs',\n withRipple: true\n });\n const videosCheckboxField = new CheckboxField({\n text: 'AutoplayVideo', \n name: 'videos', \n stateKey: 'settings.autoPlay.videos',\n withRipple: true\n });\n\n section.content.append(gifsCheckboxField.label, videosCheckboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey, args: FormatterArguments = [];\n \n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n \n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n \n replaceContent(row.subtitle, i18n(key, args));\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport Button from \"../../button\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport AppGeneralSettingsTab from \"./generalSettings\";\r\nimport AppEditProfileTab from \"./editProfile\";\r\nimport AppChatFoldersTab from \"./chatFolders\";\r\nimport AppNotificationsTab from \"./notifications\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport AppDataAndStorageTab from \"./dataAndStorage\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport PeerProfile from \"../../peerProfile\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SliderSuperTabConstructable } from \"../../sliderTab\";\r\nimport PopupAvatar from \"../../popups/avatar\";\r\nimport { AccountAuthorizations, Authorization } from \"../../../layer\";\r\nimport PopupElement from \"../../popups\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n storage: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n } = {} as any;\r\n private profile: PeerProfile;\r\n\r\n private languageRow: Row;\r\n private devicesRow: Row;\r\n\r\n private authorizations: Authorization.authorization[];\r\n private getAuthorizationsPromise: Promise;\r\n\r\n protected async init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n this.managers.apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.buttons.edit = ButtonIcon('edit');\r\n\r\n this.header.append(this.buttons.edit, btnMenu);\r\n\r\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\r\n this.profile.init();\r\n this.profile.setPeer(rootScope.myId);\r\n const fillPromise = this.profile.fillProfileElements();\r\n\r\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\r\n changeAvatarBtn.addEventListener('click', () => {\r\n const canvas = document.createElement('canvas');\r\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\r\n upload().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n });\r\n });\r\n });\r\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\r\n \r\n const updateChangeAvatarBtn = async() => {\r\n const user = await this.managers.appUsersManager.getSelf();\r\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\r\n };\r\n \r\n updateChangeAvatarBtn();\r\n this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\r\n if(rootScope.myId === peerId) {\r\n updateChangeAvatarBtn();\r\n }\r\n });\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n \r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n \r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const b: [string, LangPackKey, SliderSuperTabConstructable][] = [\r\n ['unmute', 'AccountSettings.Notifications', AppNotificationsTab],\r\n ['data', 'DataSettings', AppDataAndStorageTab],\r\n ['lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab],\r\n ['settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab],\r\n ['folder', 'AccountSettings.Filters', AppChatFoldersTab],\r\n ];\r\n\r\n const rows = b.map(([icon, langPackKey, tabConstructor]) => {\r\n return new Row({\r\n titleLangKey: langPackKey,\r\n icon,\r\n clickable: () => {\r\n this.slider.createTab(tabConstructor).open();\r\n // new tabConstructor(this.slider, true).open();\r\n }\r\n });\r\n });\r\n\r\n rows.push(\r\n this.devicesRow = new Row({\r\n titleLangKey: 'Devices',\r\n titleRightSecondary: ' ',\r\n icon: 'activesessions',\r\n clickable: async() => {\r\n if(!this.authorizations) {\r\n await this.updateActiveSessions();\r\n }\r\n\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.authorizations = undefined;\r\n this.updateActiveSessions(true);\r\n }, {once: true});\r\n tab.open();\r\n }\r\n }),\r\n\r\n this.languageRow = new Row({\r\n titleLangKey: 'AccountSettings.Language',\r\n titleRightSecondary: i18n('LanguageName'),\r\n icon: 'language',\r\n clickable: () => {\r\n this.slider.createTab(AppLanguageTab).open();\r\n }\r\n })\r\n );\r\n\r\n buttonsDiv.append(...rows.map((row) => row.container));\r\n\r\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\r\n // profileSection.content.append(this.profile.element);\r\n\r\n const buttonsSection = new SettingSection();\r\n buttonsSection.content.append(buttonsDiv);\r\n\r\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = this.slider.createTab(AppEditProfileTab);\r\n tab.open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.updateActiveSessions();\r\n\r\n await fillPromise;\r\n }\r\n\r\n private getAuthorizations(overwrite?: boolean) {\r\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\r\n\r\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\r\n .finally(() => {\r\n if(this.getAuthorizationsPromise === promise) {\r\n this.getAuthorizationsPromise = undefined;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public updateActiveSessions(overwrite?: boolean) {\r\n return this.getAuthorizations(overwrite).then((auths) => {\r\n this.authorizations = auths.authorizations;\r\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length && \r\n !this.channelNameInputField.input.classList.contains('error') && \r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n this.managers.appChatsManager.createChannel({\r\n title, \r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n\r\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n this.slider.createTab(AppAddMembersTab).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n this.construct();\n }\n\n private async construct() {\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = await this.managers.appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\nimport PopupElement from \"../../popups\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n PopupElement.createPopup(PopupCreateContact);\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n const isContact = await this.managers.appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach((el) => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.appUsersManager.getContactsPeerIds(query, undefined, 'online').then((contacts) => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport type { LOCAL_FOLDER_ID } from \"../../../lib/storages/dialogs\";\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: LOCAL_FOLDER_ID = 1;\n private wasFilterId: number;\n\n protected init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, {id: AppArchivedTab.filterId, orderIndex: 1} as any as MyDialogFilter).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport AppNewGroupTab from \"./newGroup\";\r\nimport { toast } from \"../../toast\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport { i18n, join, _i18n } from \"../../../lib/langPack\";\r\nimport rootScope from '../../../lib/rootScope';\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport SortedUserList from \"../../sortedUserList\";\r\nimport { PeerLocated, Update, Updates } from \"../../../layer\";\r\nimport { SettingChatListSection } from \"..\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\nimport getPeerId from \"../../../lib/appManagers/utils/peers/getPeerId\";\r\nimport type LazyLoadQueue from \"../../lazyLoadQueue\";\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueue;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n // protected async init() {\r\n // this.container.classList.add('people-nearby-container');\r\n // this.setTitle('PeopleNearby');\r\n\r\n // this.errorCategory = document.createElement('div');\r\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n // this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n // const emoji = '🧭';\r\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\r\n // const stickerContainer = document.createElement('div');\r\n // stickerContainer.classList.add('sticker-container');\r\n\r\n // if(doc) {\r\n // wrapSticker({\r\n // doc,\r\n // div: stickerContainer,\r\n // loop: false,\r\n // play: true,\r\n // width: 86,\r\n // height: 86,\r\n // emoji,\r\n // needUpscale: true\r\n // }).then(() => {\r\n // // this.animation = player;\r\n // });\r\n // } else {\r\n // stickerContainer.classList.add('media-sticker-wrapper');\r\n // }\r\n\r\n // const caption = document.createElement('div');\r\n // caption.classList.add('caption');\r\n // _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n // this.locatedPeers = new Map();\r\n\r\n // const m = () => {\r\n // const sortedUserList = new SortedUserList({\r\n // avatarSize: 42, \r\n // createChatListOptions: {\r\n // dialogSize: 48,\r\n // new: true\r\n // },\r\n // autonomous: false,\r\n // onUpdate: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // const elements: HTMLElement[] = [\r\n // this.parseDistance(peer.distance)\r\n // ];\r\n\r\n // if(!element.id.isUser()) {\r\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\r\n // }\r\n\r\n // element.dom.lastMessageSpan.textContent = '';\r\n // element.dom.lastMessageSpan.append(...join(elements, false));\r\n // },\r\n // getIndex: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // return 0x7FFFFFFF - peer.distance;\r\n // },\r\n // appUsersManager: this.managers.appUsersManager\r\n // });\r\n\r\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n \r\n // return sortedUserList;\r\n // };\r\n \r\n // const peopleSection = this.peopleSection = new SettingChatListSection({\r\n // name: 'PeopleNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const chatsSection = this.chatsSection = new SettingChatListSection({\r\n // name: 'ChatsNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const btnMakeVisible = peopleSection.makeButton({\r\n // text: 'MakeMyselfVisible',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnMakeInvisible = peopleSection.makeButton({\r\n // text: 'StopShowingMe',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnCreateGroup = chatsSection.makeButton({\r\n // text: 'NearbyCreateGroup',\r\n // icon: 'newgroup'\r\n // });\r\n\r\n // attachClickEvent(btnMakeVisible, () => {\r\n // confirmationPopup({\r\n // titleLangKey: 'MakeMyselfVisibleTitle',\r\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n // button: {\r\n // langKey: 'OK'\r\n // }\r\n // }).then(() => {\r\n // this.startWatching();\r\n // });\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnMakeInvisible, () => {\r\n // this.stopWatching();\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnCreateGroup, () => {\r\n // this.slider.createTab(AppNewGroupTab).open([], true);\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // btnMakeVisible.classList.add('primary');\r\n // btnMakeInvisible.classList.add('danger');\r\n // btnCreateGroup.classList.add('primary');\r\n\r\n // this.content.append(this.retryBtn);\r\n // this.scrollable.append(\r\n // stickerContainer,\r\n // caption,\r\n // peopleSection.container,\r\n // chatsSection.container,\r\n // this.errorCategory\r\n // );\r\n // }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n this.managers.appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach((peer) => {\r\n const peerId = getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = \"No groups or channels found around you.\";\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = \"Location permission denied. Click below to retry.\";\r\n } else {\r\n this.errorCategory.innerHTML = \"An error has occurred. Please retry later clicking the button below.\";\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n this.managers.appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n this.managers.appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n this.managers.appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p)\r\n * (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport I18n, { FormatterArguments, i18n, i18n_, LangPackKey } from \"../../lib/langPack\";\nimport AppPeopleNearbyTab from \"./tabs/peopleNearby\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { attachClickEvent, CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport ButtonIcon from \"../buttonIcon\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport IS_GEOLOCATION_SUPPORTED from \"../../environment/geolocationSupport\";\nimport type SortedUserList from \"../sortedUserList\";\nimport Button, { ButtonOptions } from \"../button\";\nimport noop from \"../../helpers/noop\";\nimport ripple from \"../ripple\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport AvatarElement from \"../avatar\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport themeController from \"../../helpers/themeController\";\nimport contextMenuController from \"../../helpers/contextMenuController\";\nimport { DIALOG_LIST_ELEMENT_TAG } from \"../../lib/appManagers/appDialogsManager\";\nimport apiManagerProxy from \"../../lib/mtproto/mtprotoworker\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n //private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n \n public archivedCount: HTMLSpanElement;\n\n private newBtnMenu: HTMLElement;\n\n //private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n this.createTab(AppNewGroupTab).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(1));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n await this.managers.appStateManager.setByKey('settings.theme', themeCheckboxField.input.checked ? 'night' : 'day');\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, async(e) => {\n await Promise.all(filteredButtons.map(async(button) => {\n if(button.verify) {\n button.element.classList.toggle('hide', !(await button.verify()));\n }\n }));\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n contextMenuController.closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n // this.updateBtn.classList.add('btn-update');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n \n location.reload();\n });\n \n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then((state) => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true,\n managers: this.managers\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-30');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach((el) => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then((dialogs) => dialogs.map((d) => d.peerId)),\n this.managers.appMessagesManager.getConversations(value).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.appUsersManager.getContactsPeerIds(value, true)\n ]).then((results) => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach((peerId) => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach((dateData) => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG) as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\n}\n\nexport type SettingSectionOptions = {\n name?: LangPackKey, \n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n if(options.caption) {\n const caption = this.caption = this.generateContentElement();\n caption.classList.add(className + '-caption');\n container.append(caption);\n\n if(options.caption !== true) {\n i18n_({element: caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { Message } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { SERVICE_AS_REGULAR, STICKY_OFFSET } from \"./bubbles\";\r\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\r\nimport partition from \"../../helpers/array/partition\";\r\n\r\ntype GroupItem = {\r\n bubble: HTMLElement, \r\n fromId: PeerId, \r\n mid: number, \r\n groupMid?: number, \r\n timestamp: number, \r\n dateTimestamp: number, \r\n mounted: boolean, \r\n single: boolean, \r\n group?: BubbleGroup,\r\n message: Message.message | Message.messageService // use it only to set avatar\r\n};\r\n\r\nclass BubbleGroup {\r\n container: HTMLElement;\r\n chat: Chat;\r\n groups: BubbleGroups;\r\n items: GroupItem[]; // descend sorted\r\n avatarContainer: HTMLElement;\r\n avatarLoadPromise: ReturnType;\r\n avatar: AvatarElement;\r\n mounted: boolean;\r\n dateTimestamp: number;\r\n offset: number;\r\n\r\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('bubbles-group');\r\n this.chat = chat;\r\n this.groups = groups;\r\n this.items = [];\r\n this.dateTimestamp = dateTimestamp;\r\n this.offset = 0;\r\n }\r\n\r\n createAvatar(message: Message.message | Message.messageService) {\r\n if(this.avatarLoadPromise) {\r\n return this.avatarLoadPromise;\r\n } else if(message._ === 'messageService') {\r\n return;\r\n }\r\n\r\n this.avatarContainer = document.createElement('div');\r\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\r\n ++this.offset;\r\n\r\n const fwdFrom = message.fwd_from;\r\n const fwdFromId = message.fwdFromId;\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n const currentPeerId = this.chat.peerId;\r\n this.avatar = new AvatarElement();\r\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\r\n this.avatarLoadPromise = this.avatar.updateWithOptions({\r\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\r\n peerId: ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID,\r\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined,\r\n });\r\n\r\n this.avatarContainer.append(this.avatar);\r\n this.container.append(this.avatarContainer);\r\n\r\n return this.avatarLoadPromise;\r\n }\r\n\r\n get firstTimestamp() {\r\n return this.firstItem.timestamp;\r\n }\r\n\r\n get firstMid() {\r\n return this.firstItem.mid;\r\n }\r\n\r\n get firstItem() {\r\n return this.items[this.items.length - 1];\r\n }\r\n\r\n get lastMid() {\r\n return this.lastItem.mid;\r\n }\r\n\r\n get lastItem() {\r\n return this.items[0];\r\n }\r\n\r\n updateClassNames() {\r\n const items = this.items;\r\n const length = items.length;\r\n if(!length) {\r\n return;\r\n }\r\n \r\n // const elements = Array.from(this.container.children);\r\n // if(this.offset) elements.splice(0, this.offset);\r\n\r\n // const length = elements.length;\r\n // if(!length) {\r\n // return;\r\n // }\r\n\r\n const first = items[length - 1].bubble;\r\n\r\n if(items.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n for(let i = 1, _length = length - 1; i < _length; ++i) {\r\n const bubble = items[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = items[0].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n }\r\n\r\n insertItem(item: GroupItem) {\r\n const {items} = this;\r\n const {timestamp, mid} = item;\r\n if(this.chat.type === 'scheduled') {\r\n let foundMidOnSameTimestamp = 0;\r\n let i = 0, length = items.length;\r\n for(; i < length; ++i) {\r\n const {timestamp: _timestamp, mid: _mid} = items[i];\r\n \r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n items.splice(i, 0, item);\r\n } else {\r\n // insertInDescendSortedArray(items, item, 'mid');\r\n insertInDescendSortedArray(items, item, 'groupMid');\r\n }\r\n\r\n item.group = this;\r\n if(items.length === 1) {\r\n insertInDescendSortedArray(this.groups.groups, this, 'lastMid');\r\n }\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n indexOfAndSplice(this.items, item);\r\n\r\n if(!this.items.length) {\r\n indexOfAndSplice(this.groups.groups, this);\r\n }\r\n\r\n item.group = undefined;\r\n }\r\n\r\n mount(updateClassNames?: boolean) {\r\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\r\n debugger;\r\n\r\n if(this.mounted) {\r\n this.onItemUnmount();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const {offset, items} = this;\r\n const {length} = items;\r\n forEachReverse(items, (item, idx) => {\r\n this.mountItem(item, length - 1 - idx, offset);\r\n });\r\n \r\n if(updateClassNames) {\r\n this.updateClassNames();\r\n }\r\n\r\n this.onItemMount();\r\n }\r\n\r\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\r\n if(item.mounted) {\r\n return;\r\n }\r\n\r\n positionElementByIndex(item.bubble, this.container, offset + idx);\r\n item.mounted = true;\r\n }\r\n\r\n unmountItem(item: GroupItem) {\r\n if(!item.mounted) {\r\n return;\r\n }\r\n\r\n item.bubble.remove();\r\n item.mounted = false;\r\n this.onItemUnmount();\r\n }\r\n\r\n onItemMount() {\r\n if(this.mounted) {\r\n return;\r\n }\r\n\r\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.firstTimestamp);\r\n // const idx = this.groups.indexOf(group);\r\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\r\n const dateGroupsLength = dateGroups.length;\r\n const idx = dateGroups.indexOf(this);\r\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\r\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\r\n this.mounted = true;\r\n }\r\n\r\n onItemUnmount() {\r\n if(!this.mounted) {\r\n return;\r\n }\r\n\r\n if(!this.items.length) {\r\n this.container.remove();\r\n this.chat.bubbles.deleteEmptyDateGroups();\r\n this.mounted = false;\r\n } else {\r\n this.updateClassNames();\r\n }\r\n }\r\n}\r\n\r\n// class BubbleGroupItem implements GroupItem {\r\n// bubble: HTMLElement;\r\n// fromId: PeerId;\r\n// mid: number;\r\n// timestamp: number;\r\n// dateTimestamp: number;\r\n// mounted: boolean;\r\n// single: boolean;\r\n// group: BubbleGroup;\r\n\r\n// constructor(details: GroupItem) {\r\n// Object.assign(this, details);\r\n// }\r\n// }\r\n\r\nexport default class BubbleGroups {\r\n public itemsArr: Array = []; // descend sorted\r\n private itemsMap: Map = new Map();\r\n public groups: Array = []; // descend sorted\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n item.group.removeItem(item);\r\n this.removeItemFromCache(item);\r\n }\r\n\r\n removeAndUnmountBubble(bubble: HTMLElement) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n const items = this.itemsArr;\r\n const index = items.indexOf(item);\r\n const siblings = this.getSiblingsAtIndex(index, items);\r\n \r\n const group = item.group;\r\n this.removeItem(item);\r\n group.unmountItem(item);\r\n\r\n const modifiedGroups: Set = new Set();\r\n modifiedGroups.add(group);\r\n\r\n const [previousSibling, nextSibling] = siblings;\r\n if(\r\n previousSibling \r\n && nextSibling \r\n && this.canItemsBeGrouped(previousSibling, nextSibling) \r\n && previousSibling.group !== nextSibling.group\r\n ) {\r\n const group = nextSibling.group;\r\n this.f(nextSibling.group.items);\r\n group.onItemUnmount();\r\n modifiedGroups.add(previousSibling.group);\r\n this.groupUngrouped();\r\n }\r\n\r\n this.mountUnmountGroups(Array.from(modifiedGroups));\r\n }\r\n\r\n mountUnmountGroups(groups: BubbleGroup[]) {\r\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\r\n\r\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\r\n toUnmount.forEach((group) => {\r\n group.onItemUnmount();\r\n })\r\n\r\n toMount.forEach((group) => {\r\n group.mount(true);\r\n });\r\n\r\n // toMount.forEach((group) => {\r\n // group.updateClassNames();\r\n // });\r\n }\r\n\r\n f(items: GroupItem[], index: number = 0, length = items.length) {\r\n for(; index < length; ++index) {\r\n const item = items[index];\r\n item.mounted = false;\r\n item.group.removeItem(item);\r\n --length;\r\n --index;\r\n }\r\n }\r\n\r\n getItemByBubble(bubble: HTMLElement) {\r\n return this.itemsMap.get(bubble);\r\n }\r\n\r\n getLastGroup() {\r\n return this.groups[0];\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.mid = mid;\r\n \r\n // indexOfAndSplice(item.group.items, item);\r\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\r\n // // if(canChangeGroupMid) item.groupMid = mid;\r\n // item.group.insertItem(item);\r\n \r\n indexOfAndSplice(this.itemsArr, item);\r\n insertInDescendSortedArray(this.itemsArr, item, 'mid');\r\n }\r\n\r\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\r\n this.itemsMap.delete(item.bubble);\r\n item.bubble = bubble;\r\n this.itemsMap.set(bubble, item);\r\n }\r\n \r\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\r\n const item = this.getItemByBubble(from);\r\n if(!item) {\r\n return;\r\n }\r\n \r\n this.changeItemBubble(item, to);\r\n }\r\n\r\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) { \r\n return item2.fromId === item1.fromId \r\n && Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff \r\n && item1.dateTimestamp === item2.dateTimestamp \r\n && !item1.single \r\n && !item2.single;\r\n }\r\n\r\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\r\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\r\n }\r\n\r\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\r\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\r\n // }\r\n\r\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\r\n items = items.slice();\r\n const idx = insertInDescendSortedArray(items, item, 'mid');\r\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\r\n return this.findGroupSiblingInItems(item, items, idx);\r\n }\r\n\r\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\r\n const previousItem = items[index - 1];\r\n let siblingGroupedItem: GroupItem;\r\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\r\n siblingGroupedItem = previousItem;\r\n } else {\r\n for(let k = index + 1; k < length; ++k) {\r\n const nextItem = items[k];\r\n if(this.canItemsBeGrouped(item, nextItem)) {\r\n if(nextItem.group) {\r\n siblingGroupedItem = nextItem;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return siblingGroupedItem;\r\n }\r\n\r\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\r\n group.insertItem(item);\r\n this.addItemToCache(item);\r\n }\r\n\r\n addItemToCache(item: GroupItem) {\r\n insertInDescendSortedArray(this.itemsArr, item, 'mid');\r\n this.itemsMap.set(item.bubble, item);\r\n }\r\n\r\n removeItemFromCache(item: GroupItem) {\r\n indexOfAndSplice(this.itemsArr, item);\r\n this.itemsMap.delete(item.bubble);\r\n }\r\n\r\n getMessageFromId(message: MyMessage) {\r\n let fromId = message.viaBotId || message.fromId;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n\r\n return fromId;\r\n }\r\n\r\n createItem(bubble: HTMLElement, message: MyMessage) {\r\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\r\n const {mid, date: timestamp} = message;\r\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\r\n const item: GroupItem = {\r\n mid, \r\n groupMid: mid, \r\n fromId: this.getMessageFromId(message), \r\n bubble, \r\n timestamp, \r\n dateTimestamp, \r\n mounted: false, \r\n single,\r\n message\r\n };\r\n\r\n return item;\r\n }\r\n\r\n splitSiblingsOnGrouping(siblings: ReturnType) {\r\n const [previousSibling, nextSibling] = siblings;\r\n const previousGroup = previousSibling?.group;\r\n const nextGroup = nextSibling?.group;\r\n\r\n if(!previousGroup) {\r\n return;\r\n }\r\n\r\n // will refresh group\r\n // if(previousGroup === nextGroup) {\r\n const items = previousGroup.items;\r\n const index = items.indexOf(previousSibling) + 1;\r\n const length = items.length;\r\n if(index === length) {\r\n return;\r\n }\r\n\r\n const modifiedGroups: BubbleGroup[] = [previousGroup];\r\n // if(previousGroup !== nextGroup && nextGroup) {\r\n // modifiedGroups.push(nextGroup);\r\n // }\r\n\r\n this.f(items, index, length);\r\n return modifiedGroups;\r\n // }\r\n }\r\n\r\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\r\n if(this.getItemByBubble(bubble)) {\r\n debugger;\r\n return;\r\n }\r\n\r\n const item = this.createItem(bubble, message);\r\n this.addItemToCache(item);\r\n }\r\n\r\n groupUngrouped() {\r\n const items = this.itemsArr;\r\n const length = items.length;\r\n const modifiedGroups: Set = new Set();\r\n // for(let i = length - 1; i >= 0; --i) {\r\n for(let i = 0; i < length; ++i) {\r\n const item = items[i];\r\n if(item.group) {\r\n continue;\r\n }\r\n\r\n let hadGroup = true;\r\n const siblings = this.getSiblingsAtIndex(i, items);\r\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\r\n\r\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\r\n const foundItem = siblingGroupedItem;\r\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\r\n\r\n modifiedGroups.add(group);\r\n group.insertItem(item);\r\n\r\n if(!hadGroup) {\r\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\r\n if(splittedGroups) {\r\n splittedGroups.forEach((group) => modifiedGroups.add(group));\r\n }\r\n }\r\n }\r\n\r\n return modifiedGroups;\r\n }\r\n\r\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\r\n // const oldItem = this.getItemByBubble(bubble);\r\n // if(unmountIfFound) { // updating position\r\n // this.removeAndUnmountBubble(bubble);\r\n // } else if(oldItem) { // editing\r\n // const group = oldItem.group;\r\n // this.changeItemBubble(oldItem, bubble);\r\n // oldItem.mounted = false;\r\n\r\n // return {item: oldItem, group};\r\n // }\r\n\r\n // const item = this.createItem(bubble, message);\r\n\r\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\r\n\r\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\r\n // this.addItemToGroup(item, group);\r\n \r\n // return {item, group};\r\n // }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach((object) => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n // updateGroupByMessageId(mid: number) {\r\n // const item = this.itemsArr.find((g) => g.mid === mid);\r\n // if(item) {\r\n // item.group.updateGroup();\r\n // }\r\n // }\r\n \r\n cleanup() {\r\n this.itemsArr = [];\r\n this.groups = [];\r\n this.itemsMap.clear();\r\n }\r\n\r\n // findIncorrentPositions() {\r\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\r\n // var items = this.itemsArr;\r\n // for(var i = 0, length = items.length; i < length; ++i) {\r\n // const item = items[i];\r\n // const foundBubble = bubbles[i];\r\n // if(item.bubble !== foundBubble) {\r\n // console.log('incorrect position', i, item, foundBubble);\r\n // // debugger;\r\n // // break;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n const entry = entries\r\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n\r\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\r\n }\r\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from \"../../helpers/callbackify\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { MessagePeerReaction, ReactionCount } from \"../../layer\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport SetTransition from \"../singleTransition\";\nimport StackedAvatars from \"../stackedAvatars\";\nimport { wrapSticker, wrapStickerAnimation } from \"../wrappers\";\nimport { Awaited } from \"../../types\";\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n \n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n \n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const availableReaction = this.managers.appReactionsManager.getReaction(reactionCount.reaction);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc: availableReaction.center_icon ?? availableReaction.static_icon,\n width: size,\n height: size,\n static: true,\n managers: this.managers\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n });\n }\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = !!this.reactionCount.pFlags.chosen) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition(this, 'is-chosen', isChosen, this.isConnected ? 300 : 0);\n }\n }\n\n public fireAroundAnimation() {\n callbackify(this.managers.appReactionsManager.getReaction(this.reactionCount.reaction), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers\n }).stickerPromise\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n fastRaf(() => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n });\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(remove, 1e3);\n });\n } else {\n remove();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport { Message, ReactionCount } from \"../../layer\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport rootScope from \"../../lib/rootScope\";\nimport ReactionElement, { ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT } from \"./reaction\";\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport { REACTIONS_ELEMENTS };\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.managers = rootScope.managers;\n }\n \n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(message: Message.message, type: ReactionLayoutType, isPlaceholder?: boolean) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.isPlaceholder);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n availableReactionsResult instanceof Promise ? \n reactions.results : \n reactions.results.filter((reactionCount) => {\n return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n })\n ) : [];\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionCount.reaction === reaction);\n if(!found) {\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && !!reactions.pFlags.can_see_list && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n const reactionElementIdx = this.sorted.findIndex((reactionElement) => reactionElement.reactionCount.reaction === reactionCount.reaction);\n let reactionElement = reactionElementIdx !== -1 && this.sorted[reactionElementIdx];\n if(!reactionElement) {\n reactionElement = new ReactionElement();\n reactionElement.init(this.type);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n \n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reaction.reaction === reactionCount.reaction) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionElement.reactionCount.reaction === reactionCount.reaction);\n if(reactionElement) {\n reactionElement.fireAroundAnimation();\n }\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Message } from \"../../layer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ripple from \"../ripple\";\r\nimport I18n from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport type LazyLoadQueue from \"../lazyLoadQueue\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (message) => {\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public stackedAvatars: StackedAvatars;\r\n public text: I18n.IntlElement;\r\n public managers: AppManagers;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n this.managers = rootScope.managers;\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!this.stackedAvatars) {\r\n this.stackedAvatars = new StackedAvatars({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n avatarSize: 30\r\n });\r\n\r\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\r\n }\r\n\r\n leftPart = this.stackedAvatars.container;\r\n\r\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.prepend(leftPart);\r\n }\r\n \r\n if(!this.text) {\r\n this.text = new I18n.IntlElement();\r\n }\r\n\r\n const text = this.text;\r\n if(replies) {\r\n if(replies.replies) {\r\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\r\n } else {\r\n text.compareAndUpdate({key: 'LeaveAComment'});\r\n }\r\n } else {\r\n text.compareAndUpdate({key: 'ViewInChat'});\r\n }\r\n\r\n if(replies) {\r\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n }/* else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n } */\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text.element);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatTime, getFullDate } from \"../../helpers/date\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { Message } from \"../../layer\";\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport rootScope from \"../../lib/rootScope\";\nimport type LazyLoadQueue from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat, { ChatType } from \"./chat\";\nimport ReactionsElement from \"./reactions\";\nimport RepliesElement from \"./replies\";\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType, \n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n \n let editedSpan: HTMLElement, sponsoredSpan: HTMLElement, reactionsElement: ReactionsElement, reactionsMessage: Message.message;\n \n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n let hasReactions: boolean;\n \n let time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n \n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n \n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n \n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n \n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n if(message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n hasReactions = true;\n\n reactionsMessage = options.reactionsMessage;\n reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'inline', true);\n reactionsElement.render();\n args.unshift(reactionsElement);\n }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n \n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n if(reactionsElement) {\n const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n _reactionsElement.init(reactionsMessage, 'inline');\n _reactionsElement.render();\n }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueue\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = async({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = await rootScope.managers.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(\r\n element: HTMLElement, \r\n overflowElement: HTMLElement, \r\n lookForSticky?: boolean, \r\n rect = element.getBoundingClientRect(),\r\n overflowRect = overflowElement.getBoundingClientRect()\r\n) {\r\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowLeft\r\n || rect.left >= overflowRight) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n\n export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat,\n [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { addCancelButton } from \".\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\r\nimport { ChatInvite } from \"../../layer\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { i18n, _i18n } from \"../../lib/langPack\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport AvatarElement from \"../avatar\";\r\nimport putPhoto from \"../putPhoto\";\r\nimport { toastNew } from \"../toast\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(\r\n private hash: string, \r\n private chatInvite: ChatInvite.chatInvite, \r\n ) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n this.managers.appChatsManager.importChatInvite(hash)\r\n .then((chatId) => {\r\n const peerId = chatId.toPeerId(true);\r\n appImManager.setInnerPeer({peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.construct();\r\n }\r\n\r\n private async construct() {\r\n this.header.remove();\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n\r\n const {chatInvite, managers, hash} = this;\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.classList.add('avatar-100');\r\n avatarElem.isDialog = false;\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n\r\n this.show();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from \"../components/scrollable\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport getVisibleRect from \"./dom/getVisibleRect\";\nimport reflowScrollableElement from \"./dom/reflowScrollableElement\";\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private anchor: HTMLElement;\n private rect: DOMRect;\n\n /**\n * \n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable, \n private query: string, \n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight, \n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findAnchor() {\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n let rect: DOMRect, anchor: HTMLElement;\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n rect = elementRect;\n anchor = bubble;\n // break; // find first\n } else if(anchor) { // find last\n break;\n }\n }\n\n if(!rect) {\n const bubble = bubbles[0];\n if(bubble) {\n rect = bubble.getBoundingClientRect();\n anchor = bubble;\n }\n }\n\n return {rect, anchor};\n }\n\n public findAndSetAnchor() {\n const {rect, anchor} = this.findAnchor();\n this.rect = rect;\n this.anchor = anchor;\n }\n\n public save() {\n this.findAndSetAnchor();\n // console.warn('scroll save', this.anchor, this.rect);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n //previousScrollHeight = scrollHeight;\n //previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n //this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n //isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n //container.scrollTop = scrollHeight;\n //isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.anchor?.parentElement) { // try to find new anchor\n this.findAndSetAnchor();\n\n if(!this.anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const rect = this.rect;\n const newRect = this.anchor.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n \n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n \n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop', \n previousScrollHeightMinusTop, scrollHeight, \n newScrollTop, container.container.clientHeight); */\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n \n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n debugger;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type { MyDocument } from \"../../appDocsManager\";\nimport type { MyMessage } from \"../../appMessagesManager\";\nimport { Message, MessageMedia } from \"../../../../layer\";\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = '') {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","import { MessageEntity } from \"../../layer\";\nimport { toCodePoints } from \"../../vendor/emoji\";\n\nexport default function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport cancelEvent from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport pause from \"../../../helpers/schedulers/pause\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../putPreloader\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport IS_TOUCH_SUPPORTED from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\nimport Emoji from \"../../../config/emoji\";\nimport { AppManagers } from \"../../../lib/appManagers/managers\";\nimport fixEmoji from \"../../../lib/richTextProcessor/fixEmoji\";\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\nimport wrapSingleEmoji from \"../../../lib/richTextProcessor/wrapSingleEmoji\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach((c) => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n this.managers.appEmojiManager.getRecentEmojis().then((recent) => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map((category) => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\n\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getEmojiEntityFromEmoji from \"./getEmojiEntityFromEmoji\";\nimport wrapRichText from \"./wrapRichText\";\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\nimport LazyLoadQueueIntersector from \"./lazyLoadQueueIntersector\";\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((target, visible) => {\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n \n this.onVisibilityChange && this.onVisibilityChange(target, visible);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: HTMLElement) {\n this.intersector.observe(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport LazyLoadQueueRepeat2 from \"./lazyLoadQueueRepeat2\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n private managers: AppManagers;\r\n\r\n constructor(\r\n private element: HTMLElement, \r\n private group: string, \r\n private scrollable: Scrollable, \r\n attach = true\r\n ) {\r\n this.managers = rootScope.managers;\r\n\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\r\n const res = await wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach((item) => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach((item) => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n // const gotThumb = this.managers.appDocsManager.getThumb(doc, false);\r\n\r\n // const willBeAPoster = !!gotThumb;\r\n // let img: HTMLImageElement;\r\n // if(willBeAPoster) {\r\n // img = new Image();\r\n // img.classList.add('media-poster');\r\n\r\n // if(!gotThumb.cacheContext.url) {\r\n // gotThumb.promise.then(() => {\r\n // img.src = gotThumb.cacheContext.url;\r\n // });\r\n // }\r\n // }\r\n\r\n // const afterRender = () => {\r\n // if(img) {\r\n // div.append(img);\r\n // div.style.opacity = '';\r\n // }\r\n // };\r\n\r\n // (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../putPreloader\";\r\nimport { AppManagers } from \"../../../lib/appManagers/managers\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n constructor(private managers: AppManagers) {\r\n\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n this.managers.appDocsManager.getGifs().then((docs) => {\r\n docs.forEach((doc) => {\r\n masonry.add(doc);\r\n });\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\nimport LazyLoadQueueIntersector, { LazyLoadElement } from \"./lazyLoadQueueIntersector\";\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private _queue: Map = new Map();\n\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((target, visible) => {\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible) {\n const items = spliced.length ? spliced : [this._queue.get(target)];\n items.forEach((item) => {\n this.queue.unshift(item || this._queue.get(target));\n });\n }\n \n this.onVisibilityChange && this.onVisibilityChange(target, visible);\n this.setProcessQueueTimeout();\n });\n }\n\n public clear() {\n super.clear();\n this._queue.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this._queue.set(el.div, el);\n this.intersector.observe(el.div);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport { AppManagers } from \"../../../lib/appManagers/managers\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport LazyLoadQueueRepeat from \"../../lazyLoadQueueRepeat\";\r\nimport { putPreloader } from \"../../putPreloader\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(\r\n private regularLazyLoadQueue: LazyLoadQueue, \r\n private group: string,\r\n private managers: AppManagers\r\n ) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.animated) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.animated,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach((player) => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = async(div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n }).then(({render}) => render);\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = async(div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n constructor(private managers: AppManagers) {\r\n\r\n }\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: DocumentFragment | string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n if(typeof(categoryTitle) === 'string') titleDiv.innerHTML = categoryTitle;\r\n else titleDiv.append(categoryTitle);\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then((documents) => {\r\n documents.forEach((doc) => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = this.managers.appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, wrapEmojiText(set.title), promise.then((stickerSet) => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n this.managers.appStickersManager.getRecentStickers().then((stickers) => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n this.managers.appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter((p) => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter((p) => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n this.managers.appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach((el) => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `
`;\r\n\r\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach((animation) => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport pause from \"../../helpers/schedulers/pause\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport type LazyLoadQueueIntersector from \"../lazyLoadQueueIntersector\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab(this.managers);\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager, ChatSavedPosition } from \"../../lib/appManagers/appImManager\";\r\nimport type { HistoryResult, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport ripple from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, User, WebPage } from \"../../layer\";\r\nimport { BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection, ScrollStartCallbackDimensions } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast, toastNew } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport debounce, { DebounceReturnType } from \"../../helpers/schedulers/debounce\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport Button from \"../button\";\r\nimport { CallType } from \"../../lib/calls/types\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport PopupJoinChatInvite from \"../popups/joinChatInvite\";\r\nimport { InternalLink, INTERNAL_LINK_TYPE } from \"../../lib/appManagers/internalLink\";\r\nimport ReactionsElement, { REACTIONS_ELEMENTS } from \"./reactions\";\r\nimport type ReactionElement from \"./reaction\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport pause from \"../../helpers/schedulers/pause\";\r\nimport ScrollSaver from \"../../helpers/scrollSaver\";\r\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\r\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\nimport getViewportSlice from \"../../helpers/dom/getViewportSlice\";\r\nimport SuperIntersectionObserver from \"../../helpers/dom/superIntersectionObserver\";\r\nimport generateFakeIcon from \"../generateFakeIcon\";\r\nimport copyFromElement from \"../../helpers/dom/copyFromElement\";\r\nimport PopupElement from \"../popups\";\r\nimport setAttachmentSize from \"../../helpers/setAttachmentSize\";\r\nimport wrapWebPageDescription from \"../wrappers/webPageDescription\";\r\nimport wrapWebPageTitle from \"../wrappers/webPageTitle\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\r\nimport wrapMessageActionTextNew from \"../wrappers/messageActionTextNew\";\r\nimport isMentionUnread from \"../../lib/appManagers/utils/messages/isMentionUnread\";\r\nimport getMediaFromMessage from \"../../lib/appManagers/utils/messages/getMediaFromMessage\";\r\nimport getPeerColorById from \"../../lib/appManagers/utils/peers/getPeerColorById\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport getServerMessageId from \"../../lib/appManagers/utils/messageId/getServerMessageId\";\r\nimport generateMessageId from \"../../lib/appManagers/utils/messageId/generateMessageId\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport filterAsync from \"../../helpers/array/filterAsync\";\r\nimport { Awaited } from \"../../types\";\r\nimport idleController from \"../../helpers/idleController\";\r\nimport overlayCounter from \"../../helpers/overlayCounter\";\r\nimport { cancelContextMenuOpening } from \"../../helpers/dom/attachContextMenuListener\";\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { AckedResult } from \"../../lib/mtproto/superMessagePort\";\r\nimport middlewarePromise from \"../../helpers/middlewarePromise\";\r\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport noop from \"../../helpers/noop\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nexport const SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\nexport const STICKY_OFFSET = 3;\r\nconst SCROLLED_DOWN_THRESHOLD = 300;\r\nconst PEER_CHANGED_ERROR = new Error('peer changed');\r\n\r\nconst DO_NOT_SLICE_VIEWPORT = false;\r\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\r\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\r\n\r\ntype Bubble = {\r\n bubble: HTMLElement, \r\n mids: Set, \r\n groupedId?: string\r\n};\r\n\r\ntype MyHistoryResult = HistoryResult | {history: number[]};\r\n\r\nfunction getMainMidForGrouped(mids: number[]) {\r\n return Math.max(...mids);\r\n}\r\n\r\nexport default class ChatBubbles {\r\n public container: HTMLDivElement;\r\n public chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\r\n public bubblesNew: {[mid: string]: Bubble} = {};\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLElement, \r\n firstTimestamp: number, \r\n container: HTMLElement,\r\n timeout?: number \r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: ReturnType[] = [];\r\n // private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderBubble: HTMLElement;\r\n\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n \r\n private hoverBubble: HTMLElement;\r\n private hoverReaction: HTMLElement;\r\n private sliceViewportDebounced: DebounceReturnType;\r\n private resizeObserver: ResizeObserver;\r\n private willScrollOnLoad: boolean;\r\n private observer: SuperIntersectionObserver;\r\n\r\n private renderingMessages: Set = new Set();\r\n private setPeerCached: boolean;\r\n private attachPlaceholderOnRender: () => void;\r\n\r\n private bubblesToEject: Set = new Set();\r\n private bubblesToReplace: Set = new Set();\r\n private updatePlaceholderPosition: () => void;\r\n private setPeerOptions: {lastMsgId: number; topMessage: number;};\r\n\r\n private setPeerTempId: number = 0;\r\n\r\n private renderNewPromises: Set> = new Set();\r\n\r\n // private reactions: Map;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private managers: AppManagers\r\n ) {\r\n this.log = this.chat.log;\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.constructBubbles();\r\n\r\n // * constructor end\r\n\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // this.reactions = new Map();\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, mid, message}) => {\r\n if(this.chat.messagesStorageKey !== storageKey) {\r\n return;\r\n }\r\n\r\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\r\n log && log('start');\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n if(this.renderNewPromises.size) {\r\n log && log.error('will await new messages render');\r\n await Promise.all(Array.from(this.renderNewPromises));\r\n }\r\n\r\n if(this.messagesQueuePromise) {\r\n log && log.error('messages render in process');\r\n await this.messagesQueuePromise;\r\n }\r\n\r\n if(this.bubbles[mid] !== bubble) return;\r\n\r\n // await getHeavyAnimationPromise();\r\n \r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(!item) { // probably a group item\r\n log && log.error('no item by bubble', bubble);\r\n return;\r\n } else if(item.mid === mid) {\r\n log && log.warn('wow what', item, mid);\r\n return;\r\n }\r\n\r\n const group = item.group;\r\n const newItem = this.bubbleGroups.createItem(bubble, message);\r\n // newItem.mid = item.mid;\r\n const _items = this.bubbleGroups.itemsArr.slice();\r\n indexOfAndSplice(_items, item);\r\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\r\n if(group === foundItem?.group/* && false */) {\r\n log && log('item has correct position', item);\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n // return;\r\n\r\n // await fastRafPromise();\r\n // if(this.bubbles[mid] !== bubble) return;\r\n\r\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\r\n // log && log('group has collapsed', item);\r\n\r\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\r\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\r\n // const siblingGroup = siblingGroups[i];\r\n // const siblingItems = siblingGroup.items;\r\n // const nextGroup = siblingGroups[i + 1];\r\n // const nextItems = nextGroup.items;\r\n\r\n // let _break = false, moved = false;\r\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\r\n // const siblingItem = siblingItems[j];\r\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\r\n // if(!foundItem) {\r\n // _break = true;\r\n // break;\r\n // }\r\n\r\n // log('will move item', siblingItem, nextGroup);\r\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\r\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\r\n // moved = true;\r\n // }\r\n\r\n // if(moved) {\r\n // nextGroup.mount();\r\n // }\r\n\r\n // if(_break) {\r\n // break;\r\n // }\r\n // }\r\n // }\r\n\r\n const {groups} = this.groupBubbles([{bubble, message}]);\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n log && log('end');\r\n\r\n // this.bubbleGroups.findIncorrentPositions();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\r\n const {storageKey, tempId, tempMessage, mid, message} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.messagesStorageKey !== storageKey) {\r\n return;\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n const _bubble = bubbles[tempId];\r\n if(_bubble) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n bubble.dataset.mid = '' + mid;\r\n delete bubbles[tempId];\r\n\r\n fastRaf(() => {\r\n const mid = +bubble.dataset.mid;\r\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\r\n bubble.classList.remove('is-sending', 'is-outgoing');\r\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n\r\n if(!_bubble) {\r\n return;\r\n }\r\n\r\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n const mids = await this.managers.appMessagesManager.getMidsByMessage(message);\r\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n \r\n messages = await Promise.all(mids.map((mid) => this.chat.getMessage(mid)));\r\n if(bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n\r\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\r\n } else {\r\n messages = [message];\r\n tempIds = [tempId];\r\n }\r\n\r\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\r\n if(reactionsElements.length) {\r\n reactionsElements.forEach((reactionsElement) => {\r\n reactionsElement.changeMessage(message as Message.message);\r\n });\r\n }\r\n\r\n (messages as Message.message[]).forEach((message, idx) => {\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const tempId = tempIds[idx];\r\n const mid = message.mid;\r\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\r\n\r\n if(message._ !== 'message') {\r\n return;\r\n }\r\n\r\n if(message.replies) {\r\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\r\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\r\n const poll = (media as MessageMedia.messageMediaPoll).poll;\r\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\r\n if(doc) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\r\n getHeavyAnimationPromise().then(async() => {\r\n const timeSpan = div.querySelector('.time');\r\n const newDiv = await wrapDocument({message});\r\n div.replaceWith(newDiv);\r\n \r\n if(timeSpan) {\r\n newDiv.querySelector('.document-size').append(timeSpan);\r\n }\r\n });\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = '' + doc.id;\r\n }\r\n }\r\n } else if(poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', '' + poll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n } else if(webPage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, bubble);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n }\r\n \r\n // set new mids to album items for mediaViewer\r\n if(groupedId) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storageKey, message}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n const bubble = this.bubbles[message.mid];\r\n if(!bubble) return;\r\n\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\r\n if(peerId !== this.peerId) return;\r\n \r\n const mids = messages.map(({mid}) => mid);\r\n const oldMids = mids.concat(Array.from(deletedMids));\r\n const wasMainMid = getMainMidForGrouped(oldMids);\r\n const bubble = this.bubbles[wasMainMid];\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n const mainMid = getMainMidForGrouped(mids);\r\n const message = messages.find((message) => message.mid === mainMid);\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n if(this.chat.type !== 'scheduled' && !DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\r\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\r\n let scrollSaver: ScrollSaver;\r\n\r\n const a = arr.map(async({message, changedResults}) => {\r\n if(this.peerId !== message.peerId) {\r\n return;\r\n }\r\n\r\n const result = await this.getMountedBubble(message.mid, message);\r\n if(!result) {\r\n return;\r\n }\r\n\r\n return {bubble: result.bubble, message, changedResults};\r\n });\r\n\r\n let top: number;\r\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(false);\r\n scrollSaver.save();\r\n }\r\n \r\n const key = message.peerId + '_' + message.mid;\r\n const set = REACTIONS_ELEMENTS.get(key);\r\n if(set) {\r\n for(const element of set) {\r\n element.update(message, changedResults);\r\n }\r\n } else if(!message.reactions || !message.reactions.results.length) {\r\n return;\r\n } else {\r\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\r\n }\r\n });\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n }\r\n\r\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n await getHeavyAnimationPromise();\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach((mid) => {\r\n const needUpdate = this.needUpdate;\r\n const filtered: typeof needUpdate[0][] = [];\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n this.needUpdate.splice(idx, 1)[0];\r\n filtered.push(obj);\r\n }\r\n });\r\n\r\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n });\r\n });\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\r\n if(e.button !== 0) return;\r\n \r\n const code: HTMLElement = findUpTag(e.target, 'CODE');\r\n if(code) {\r\n cancelEvent(e);\r\n copyFromElement(code);\r\n toastNew({langPackKey: 'TextCopied'});\r\n return;\r\n }\r\n });\r\n\r\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n const dateBubble = dateMessage.div;\r\n\r\n // dateMessage.container.classList.add('has-sticky-dates');\r\n\r\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\r\n // if(this.previousStickyDate) {\r\n // dateBubble.classList.add('kek');\r\n // }\r\n\r\n dateBubble.classList.toggle('is-sticky', stuck);\r\n if(stuck) {\r\n this.previousStickyDate = dateBubble;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(this.previousStickyDate) {\r\n // fastRaf(() => {\r\n // this.bubblesContainer.classList.add('has-sticky-dates');\r\n // });\r\n }\r\n });\r\n\r\n if(!IS_SAFARI) {\r\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\r\n }\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced.clearTimeout();\r\n // }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced();\r\n // }\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n private constructBubbles() {\r\n const container = this.container = document.createElement('div');\r\n container.classList.add('bubbles', 'scrolled-down');\r\n\r\n const chatInner = this.chatInner = document.createElement('div');\r\n chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n container.append(this.scrollable.container);\r\n }\r\n\r\n public attachContainerListeners() {\r\n const container = this.container;\r\n\r\n this.chat.contextMenu.attachTo(container);\r\n this.chat.selection.attachListeners(container, new ListenerSetter());\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', await this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE && this.chat.type !== 'pinned') {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n if(this.chat.selection.isSelecting || \r\n !(await this.chat.canSend())) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: container,\r\n verifyTouchTarget: async(e) => {\r\n if(this.chat.selection.isSelecting || !(await this.chat.canSend())) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, mid}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n const gradientRenderer = this.chat.gradientRenderer;\r\n if(gradientRenderer) {\r\n gradientRenderer.toNextPosition();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.updateUnreadByDialog();\r\n });\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = await this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n const callbacks = await Promise.all([\r\n this.finishPeerChange(),\r\n this.chat.input.finishPeerChange(),\r\n ]);\r\n\r\n callbacks.forEach((callback) => callback());\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\r\n if(key === 'settings.emoji.big') {\r\n const middleware = this.getMiddleware();\r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n const m = mids.map(async(mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n return {bubble, message: await this.chat.getMessage(mid)};\r\n }\r\n });\r\n\r\n const awaited = await Promise.all(m);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n awaited.forEach(({bubble, message}) => {\r\n if(this.bubbles[message.mid] !== bubble) {\r\n return;\r\n }\r\n \r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n }\r\n });\r\n\r\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\r\n fastRaf(() => {\r\n let scrollSaver: ScrollSaver;\r\n for(const {peerId, views, mid} of arr) {\r\n if(this.peerId !== peerId) continue;\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) continue;\r\n \r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(!postViewsElements.length) continue;\r\n\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach((postViews) => {\r\n if(different || postViews.textContent !== str) {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(true);\r\n scrollSaver.save();\r\n }\r\n\r\n different = true;\r\n postViews.textContent = str;\r\n }\r\n });\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n });\r\n\r\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\r\n\r\n this.listenerSetter.add(this.chat.appImManager)('chat_changing', ({to}) => {\r\n const freeze = to !== this.chat;\r\n\r\n const cb = () => {\r\n this.observer.toggleObservingNew(freeze);\r\n };\r\n\r\n if(!freeze) {\r\n setTimeout(() => {\r\n cb();\r\n }, 400);\r\n } else {\r\n cb();\r\n }\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n }\r\n\r\n private get peerId() {\r\n return this.chat.peerId;\r\n }\r\n\r\n private createScrollSaver(reverse = true) {\r\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\r\n return scrollSaver;\r\n }\r\n\r\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n };\r\n\r\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), sponsoredMessage.random_id);\r\n }\r\n }\r\n }\r\n };\r\n\r\n private createResizeObserver() {\r\n if(!('ResizeObserver' in window) || this.resizeObserver) {\r\n return;\r\n }\r\n\r\n const container = this.scrollable.container;\r\n let wasHeight = 0/* container.offsetHeight */;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n // let skipNext = true;\r\n\r\n const onResizeEnd = () => {\r\n const height = container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n //this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries: ResizeObserverCallback = (entries) => {\r\n /* if(skipNext) {\r\n skipNext = false;\r\n return;\r\n } */\r\n\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n \r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n\r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n //if(isSafari) { // * fix opening keyboard while ESG is active \r\n part = -realDiff;\r\n //}\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.setScrollTopSilently(needScrollTop);\r\n }\r\n \r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(container);\r\n }\r\n\r\n private destroyResizeObserver() {\r\n const resizeObserver = this.resizeObserver;\r\n if(!resizeObserver) {\r\n return;\r\n }\r\n\r\n resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n private onBubblesMouseMove = async(e: MouseEvent) => {\r\n const content = findUpClassName(e.target, 'bubble-content');\r\n if(content && !this.chat.selection.isSelecting) {\r\n const bubble = findUpClassName(content, 'bubble');\r\n if(!this.chat.selection.canSelectBubble(bubble)) {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n let {hoverBubble, hoverReaction} = this;\r\n if(bubble === hoverBubble) {\r\n return;\r\n }\r\n\r\n this.unhoverPrevious();\r\n\r\n hoverBubble = this.hoverBubble = bubble;\r\n hoverReaction = this.hoverReaction;\r\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\r\n if(!hoverReaction) {\r\n hoverReaction = this.hoverReaction = document.createElement('div');\r\n hoverReaction.classList.add('bubble-hover-reaction');\r\n\r\n const stickerWrapper = document.createElement('div');\r\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\r\n hoverReaction.append(stickerWrapper);\r\n\r\n content.append(hoverReaction);\r\n\r\n let message = (await this.chat.getMessage(+bubble.dataset.mid)) as Message.message;\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n\r\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\r\n Promise.all([\r\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\r\n pause(400)\r\n ]).then(([availableReactions]) => {\r\n const availableReaction = availableReactions[0];\r\n if(!availableReaction) {\r\n hoverReaction.remove();\r\n return;\r\n }\r\n\r\n wrapSticker({\r\n div: stickerWrapper,\r\n doc: availableReaction.select_animation,\r\n width: 18,\r\n height: 18,\r\n needUpscale: true,\r\n middleware,\r\n group: CHAT_ANIMATION_GROUP,\r\n withThumb: false,\r\n needFadeIn: false\r\n }).then(({render}) => render).then((player) => {\r\n assumeType(player);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n player.addEventListener('firstFrame', () => {\r\n if(!middleware()) {\r\n // debugger;\r\n return;\r\n }\r\n\r\n hoverReaction.dataset.loaded = '1';\r\n this.setHoverVisible(hoverReaction, true);\r\n }, {once: true});\r\n\r\n attachClickEvent(hoverReaction, (e) => {\r\n cancelEvent(e); // cancel triggering selection\r\n\r\n this.managers.appReactionsManager.sendReaction(message, availableReaction.reaction);\r\n this.unhoverPrevious();\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n } else if(hoverReaction.dataset.loaded) {\r\n this.setHoverVisible(hoverReaction, true);\r\n }\r\n } else {\r\n this.unhoverPrevious();\r\n }\r\n };\r\n\r\n public setReactionsHoverListeners() {\r\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\r\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\r\n }\r\n\r\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\r\n SetTransition(hoverReaction, 'is-visible', visible, 200, visible ? undefined : () => {\r\n hoverReaction.remove();\r\n }, 2);\r\n }\r\n\r\n private unhoverPrevious = () => {\r\n const {hoverBubble, hoverReaction} = this;\r\n if(hoverBubble) {\r\n this.setHoverVisible(hoverReaction, false);\r\n this.hoverBubble = undefined;\r\n this.hoverReaction = undefined;\r\n }\r\n };\r\n\r\n public setStickyDateManually() {\r\n return;\r\n\r\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.observer.unobserve(target, this.unreadedObserverCallback);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = idleController.getFocusPromise().then(async() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = await this.chat.getMessage(mid);\r\n if(isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = async() => {\r\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = async(e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble && !this.chat.selection.isSelecting) {\r\n const avatar = findUpClassName(target, 'user-avatar');\r\n if(!avatar) {\r\n return;\r\n }\r\n\r\n const peerId = avatar.dataset.peerId.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n return;\r\n }\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const spoiler: HTMLElement = findUpClassName(target, 'spoiler');\r\n if(spoiler) {\r\n const messageDiv = findUpClassName(spoiler, 'message');\r\n\r\n const className = 'is-spoiler-visible';\r\n const isVisible = messageDiv.classList.contains(className);\r\n if(!isVisible) {\r\n cancelEvent(e);\r\n }\r\n\r\n const duration = 400 / 2;\r\n const showDuration = 5000;\r\n const useRafs = !isVisible ? 2 : 0;\r\n if(useRafs) {\r\n messageDiv.classList.add('will-change');\r\n }\r\n\r\n const spoilerTimeout = messageDiv.dataset.spoilerTimeout;\r\n if(spoilerTimeout !== null) {\r\n clearTimeout(+spoilerTimeout);\r\n delete messageDiv.dataset.spoilerTimeout;\r\n }\r\n\r\n SetTransition(messageDiv, className, true, duration, () => {\r\n messageDiv.dataset.spoilerTimeout = '' + window.setTimeout(() => {\r\n SetTransition(messageDiv, className, false, duration, () => {\r\n messageDiv.classList.remove('will-change');\r\n delete messageDiv.dataset.spoilerTimeout;\r\n });\r\n }, showDuration);\r\n }, useRafs);\r\n\r\n return;\r\n }\r\n\r\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\r\n if(reactionElement) {\r\n cancelEvent(e);\r\n if(reactionElement.classList.contains('is-inactive')) {\r\n return;\r\n }\r\n\r\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\r\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\r\n\r\n const message = reactionsElement.getMessage();\r\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message1 = await this.chat.getMessage(bubbleMid);\r\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\r\n const replies = message.replies;\r\n if(replies) {\r\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion', \r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n\r\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))\r\n || target.classList.contains('canvas-thumbnail')) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\r\n if(preloader) {\r\n simulateClickEvent(preloader);\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\r\n\r\n const message = await this.chat.getMessage(mid);\r\n const media = getMediaFromMessage(message);\r\n \r\n return media && f(media) && mid;\r\n }))).filter(Boolean).sort((a, b) => a - b);\r\n\r\n ids.forEach((id) => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex((t) => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId, \r\n lastMsgId: replyToMid, \r\n type: this.chat.type, \r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public async onGoDownClick() {\r\n if(!this.replyFollowHistory.length) {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n\r\n return;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const slice = this.replyFollowHistory.slice();\r\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\r\n if(!middleware()) return;\r\n\r\n slice.forEach((mid, idx) => {\r\n const message = messages[idx];\r\n\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else if(message) {\r\n bad = false;\r\n }\r\n\r\n if(bad) {\r\n this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(mid), 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public async getGroupedBubble(groupId: string) {\r\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of mids) {\r\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\r\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: mid,\r\n // message: await this.chat.getMessage(maxId) as Message.message\r\n };\r\n }\r\n }\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\r\n if(message === undefined) {\r\n message = await this.chat.getMessage(mid);\r\n }\r\n\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n const a = await this.getGroupedBubble(groupedId);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\r\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\r\n\r\n let filterCallback: (_mid: number) => boolean;\r\n if(prev) filterCallback = (_mid) => _mid < mid;\r\n else filterCallback = (_mid) => mid < _mid;\r\n\r\n const foundMid = mids.find((_mid) => {\r\n if(!filterCallback(_mid)) return false;\r\n return !!this.bubbles[_mid]?.parentElement;\r\n });\r\n\r\n return this.bubbles[foundMid];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n // return;\r\n\r\n //this.log('loadMoreHistory', top);\r\n if(\r\n !this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n // some messages can have negative id (such as sponsored message)\r\n const history = Object.keys(this.bubbles)\r\n .map((id) => +id)\r\n .filter((id) => id > 0 && !this.skippedMids.has(id))\r\n .sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n // const historyMaxId = await this.chat.getHistoryMaxId();\r\n \r\n // // if scroll down after search\r\n // if(history.indexOf(historyMaxId) !== -1) {\r\n // this.setLoaded('bottom', true);\r\n // return;\r\n // }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions) => {\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced.clearTimeout();\r\n }\r\n\r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.scrolledDown && !ignoreHeavyAnimation) {\r\n return;\r\n }\r\n } else {\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\r\n }\r\n \r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced();\r\n }\r\n \r\n this.setStickyDateManually();\r\n }\r\n \r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\r\n return;\r\n }\r\n\r\n const distanceToEnd = scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\r\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions) {\r\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n \r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350 + (scrollDimensions?.duration ?? 0));\r\n }\r\n \r\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.container.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.container.classList.contains('scrolled-down')) {\r\n this.container.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n };\r\n\r\n public setScroll() {\r\n if(this.scrollable) {\r\n this.destroyScrollable();\r\n }\r\n\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED && false) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public async updateUnreadByDialog() {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n this.unreadOut.delete(msgId);\r\n\r\n if(bubble.classList.contains('is-outgoing')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\r\n bubble.classList.add('is-read');\r\n }\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\r\n let deleted = false;\r\n mids.forEach((mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n if(this.observer) {\r\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\r\n this.unreaded.delete(bubble);\r\n\r\n this.observer.unobserve(bubble, this.viewsObserverCallback);\r\n this.viewsMids.delete(mid);\r\n }\r\n\r\n if(this.emptyPlaceholderBubble === bubble) {\r\n this.emptyPlaceholderBubble = undefined;\r\n }\r\n\r\n // this.reactions.delete(mid);\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.scrollable.ignoreNextScrollEvent();\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n\r\n if(!ignoreOnScroll) {\r\n this.onScroll();\r\n }\r\n }\r\n\r\n private setTopPadding(middleware = this.getMiddleware()) {\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.setScrollTopSilently(scrollHeight);\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n return {\r\n isPaddingNeeded,\r\n unsetPadding: isPaddingNeeded ? () => {\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n } : undefined\r\n };\r\n }\r\n\r\n private renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n const promise = this._renderNewMessagesByIds(mids, scrolledDown);\r\n this.renderNewPromises.add(promise);\r\n promise.catch(noop).finally(() => {\r\n this.renderNewPromises.delete(promise);\r\n });\r\n return promise;\r\n }\r\n \r\n private async _renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(() => {\r\n if(!middleware()) return;\r\n this.renderNewMessagesByIds(mids);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = await filterAsync(mids, async(mid) => {\r\n const message = await this.chat.getMessage(mid);\r\n const replyTo = message?.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter((mid) => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble || \r\n this.scrollingToBubble === this.getLastBubble() || \r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\r\n\r\n const promise = this.performHistoryResult({history: mids}, false);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n // it will be called only once even if was set multiple times (that won't happen)\r\n promise.then(unsetPadding);\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public getLastBubble() {\r\n const group = this.bubbleGroups.getLastGroup();\r\n return group?.lastItem?.bubble;\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n if(!element.parentElement) {\r\n this.log.error('element is not connected', bubble);\r\n }\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end') {\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\r\n const dateGroup = item.group.container.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n let margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n const promise = this.scrollable.scrollIntoViewNew({\r\n element, \r\n position, \r\n margin, \r\n forceDirection, \r\n forceDuration, \r\n axis: 'y', \r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.container.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering,\r\n startCallback: (dimensions) => {\r\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\r\n this.onScroll(true, dimensions);\r\n }\r\n });\r\n\r\n // fix flickering date when opening unread chat and focusing message\r\n if(forceDirection === FocusDirection.Static) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n // private getLastDateGroup() {\r\n // let lastTime = 0, lastElem: HTMLElement;\r\n // for(const i in this.dateMessages) {\r\n // const dateMessage = this.dateMessages[i];\r\n // if(dateMessage.firstTimestamp > lastTime) {\r\n // lastElem = dateMessage.container;\r\n // lastTime = dateMessage.firstTimestamp;\r\n // }\r\n // }\r\n\r\n // return lastElem;\r\n // }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\r\n let dateElement: HTMLElement;\r\n \r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n \r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n \r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n\r\n return bubble;\r\n }\r\n\r\n public getDateForDateContainer(timestamp: number) {\r\n const date = new Date(timestamp * 1000);\r\n date.setHours(0, 0, 0);\r\n return {date, dateTimestamp: date.getTime()};\r\n }\r\n\r\n public getDateContainerByTimestamp(timestamp: number) {\r\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\r\n if(!this.dateMessages[dateTimestamp]) {\r\n const bubble = this.createDateBubble(timestamp, date);\r\n // bubble.classList.add('is-sticky');\r\n const fakeBubble = this.createDateBubble(timestamp, date);\r\n fakeBubble.classList.add('is-fake');\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble, fakeBubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n\r\n if(this.chatInner.parentElement) {\r\n this.container.classList.add('has-groups');\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n private destroyScrollable() {\r\n this.scrollable.removeListeners();\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.destroyScrollable();\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.observer && this.observer.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.observer && delete this.observer;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n this.renderNewPromises.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n this.cleanupPlaceholders();\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.observer) {\r\n this.observer.disconnect();\r\n\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n\r\n this.viewsMids.clear();\r\n }\r\n\r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.attachPlaceholderOnRender = undefined;\r\n this.emptyPlaceholderBubble = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n this.renderingMessages.clear();\r\n this.bubblesToEject.clear();\r\n this.bubblesToReplace.clear();\r\n\r\n // this.reactions.clear();\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n\r\n this.container.classList.remove('has-sticky-dates');\r\n this.scrollable.cancelMeasure();\r\n }\r\n\r\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\r\n if(bubble) {\r\n bubble.remove();\r\n\r\n if(this.emptyPlaceholderBubble === bubble) {\r\n this.emptyPlaceholderBubble = undefined;\r\n }\r\n }\r\n }\r\n\r\n public async setPeer(samePeer: boolean, peerId: PeerId, lastMsgId?: number, startParam?: string): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\r\n const tempId = ++this.setPeerTempId;\r\n\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.preloader.detach();\r\n return null;\r\n }\r\n\r\n const perf = performance.now();\r\n const log = this.log.bindPrefix('setPeer');\r\n log.warn('start');\r\n\r\n const middleware = () => {\r\n return this.setPeerTempId === tempId;\r\n };\r\n\r\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\r\n\r\n if(!samePeer) {\r\n await m(this.chat.onChangePeer(m));\r\n }\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled' || this.chat.isRestricted) {\r\n lastMsgId = 0;\r\n }\r\n\r\n const historyStorage = await m(this.chat.getHistoryStorage());\r\n let topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId)) : historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let followingUnread: boolean;\r\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\r\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\r\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\r\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\r\n }\r\n\r\n followingUnread = !isTarget;\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n //lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\r\n\r\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\r\n startParam = BOT_START_PARAM;\r\n }\r\n\r\n if(samePeer) {\r\n const mounted = await m(this.getMountedBubble(lastMsgId));\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\r\n this.scrollToEnd();\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || await m(this.managers.appUsersManager.isBot(peerId))\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n this.destroyResizeObserver();\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\r\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\r\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const scrollFromDown = !fromUp && samePeer;\r\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\r\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\r\n\r\n this.setPeerOptions = {\r\n lastMsgId,\r\n topMessage\r\n };\r\n\r\n let result: Awaited>;\r\n if(!savedPosition) {\r\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult({history: savedPosition.mids}, true);\r\n }) as any,\r\n cached: true,\r\n waitPromise: Promise.resolve()\r\n };\r\n }\r\n\r\n this.setPeerCached = result.cached;\r\n\r\n log.warn('got history');// warning\r\n\r\n const {promise, cached} = result;\r\n\r\n if(!cached && !samePeer) {\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\r\n this.scrollable.container.textContent = '';\r\n // oldContainer.textContent = '';\r\n //oldChatInner.remove();\r\n this.preloader.attach(this.container);\r\n }\r\n\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n\r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = m(promise).then(async() => {\r\n log.warn('promise fulfilled');\r\n\r\n let mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\r\n if(cached && !samePeer) {\r\n log.warn('finishing peer change');\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\r\n log.warn('finished peer change');\r\n }\r\n\r\n this.preloader.detach();\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n this.setPeerCached = undefined;\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n const scrollable = this.scrollable;\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollPosition = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\r\n\r\n if(oldPlaceholderBubble) {\r\n this.cleanupPlaceholders(oldPlaceholderBubble);\r\n }\r\n\r\n if(this.attachPlaceholderOnRender) {\r\n this.attachPlaceholderOnRender();\r\n }\r\n\r\n if(!isTarget && this.chat.type === 'chat') {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(0);\r\n }\r\n\r\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\r\n\r\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.setScrollTopSilently(savedPosition.top);\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if(haveToScrollToBubble) {\r\n let unsetPadding: () => void;\r\n if(scrollFromDown) {\r\n scrollable.setScrollTopSilently(99999);\r\n } else if(scrollFromUp) {\r\n const set = this.setTopPadding();\r\n if(set.isPaddingNeeded) {\r\n unsetPadding = set.unsetPadding;\r\n }\r\n\r\n scrollable.setScrollTopSilently(0);\r\n }\r\n\r\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\r\n }\r\n \r\n let promise: Promise;\r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n const lastBubble = this.getLastBubble();\r\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\r\n\r\n if(position === 'end' && lastBubble === bubble && samePeer) {\r\n promise = this.scrollToEnd();\r\n } else {\r\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\r\n }\r\n\r\n if(!followingUnread && isTarget) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n\r\n if(unsetPadding) {\r\n (promise || Promise.resolve()).then(() => {\r\n unsetPadding();\r\n });\r\n }\r\n } else {\r\n scrollable.setScrollTopSilently(99999);\r\n }\r\n\r\n // if(!cached) {\r\n this.onRenderScrollSet();\r\n // }\r\n\r\n this.onScroll();\r\n\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n\r\n // if(cached) {\r\n // this.onRenderScrollSet();\r\n // }\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n this.setFetchReactionsInterval(afterSetPromise);\r\n this.setFetchHistoryInterval({\r\n afterSetPromise,\r\n lastMsgId,\r\n samePeer,\r\n savedPosition,\r\n topMessage\r\n });\r\n \r\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(dialog?.pFlags.unread_mark) {\r\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n }).catch((err) => {\r\n log.error('getHistory promise error:', err);\r\n if(!middleware()) {\r\n this.preloader.detach();\r\n }\r\n\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\r\n const middleware = this.getMiddleware();\r\n const needReactionsInterval = await this.managers.appPeersManager.isChannel(this.peerId);\r\n if(needReactionsInterval) {\r\n const fetchReactions = async() => {\r\n if(!middleware()) return;\r\n\r\n const mids: number[] = [];\r\n for(const mid in this.bubbles) {\r\n let message = await this.chat.getMessage(+mid);\r\n if(message?._ !== 'message') {\r\n continue;\r\n }\r\n\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n mids.push(message.mid);\r\n }\r\n\r\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\r\n promise.then(() => {\r\n setTimeout(fetchReactions, 10e3);\r\n });\r\n };\r\n\r\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\r\n fetchReactions();\r\n });\r\n }\r\n }\r\n\r\n private async setFetchHistoryInterval({\r\n lastMsgId,\r\n topMessage,\r\n afterSetPromise,\r\n savedPosition,\r\n samePeer\r\n }: {\r\n lastMsgId: number,\r\n topMessage: number,\r\n afterSetPromise: Promise,\r\n savedPosition: ChatSavedPosition,\r\n samePeer: boolean\r\n }) {\r\n const middleware = this.getMiddleware();\r\n const peerId = this.peerId;\r\n\r\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n return;\r\n }\r\n\r\n await afterSetPromise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.setLoaded('bottom', false);\r\n this.scrollable.checkForTriggers();\r\n\r\n if(!needFetchInterval) {\r\n return;\r\n }\r\n\r\n const f = () => {\r\n this.fetchNewPromise = new Promise(async(resolve) => {\r\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\r\n resolve();\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\r\n if(!middleware() || !result) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const {isBottomEnd} = result;\r\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n\r\n public async onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public async finishPeerChange() {\r\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\r\n this.managers.appPeersManager.isChannel(this.peerId),\r\n this.chat.canSend(),\r\n this.chat.isAnyGroup\r\n ]);\r\n\r\n return () => {\r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\r\n \r\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n \r\n this.createResizeObserver();\r\n };\r\n }\r\n\r\n public renderMessagesQueue(options: ChatBubbles['messagesQueue'][0]) {\r\n this.messagesQueue.push(options);\r\n return this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(!this.messagesQueue.length) return Promise.resolve();\r\n\r\n if(this.messagesQueuePromise) {\r\n return this.messagesQueuePromise;\r\n }\r\n \r\n const middleware = this.getMiddleware();\r\n const log = this.log.bindPrefix('queue');\r\n const possibleError = PEER_CHANGED_ERROR;\r\n const m = middlewarePromise(middleware, possibleError);\r\n\r\n const processQueue = async(): Promise => {\r\n log('start');\r\n\r\n const renderQueue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const renderQueuePromises = renderQueue.map((promise) => {\r\n const perf = performance.now();\r\n promise.then((details) => {\r\n log('render message time', performance.now() - perf, details);\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n let loadQueue = await m(Promise.all(renderQueuePromises));\r\n const filterQueue = (queue: typeof loadQueue) => {\r\n return queue.filter((details) => {\r\n // message can be deleted during rendering\r\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\r\n });\r\n };\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n log('messages rendered');\r\n\r\n const reverse = loadQueue[0]?.reverse;\r\n\r\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\r\n\r\n // if(groups.length > 2 && loadQueue.length === 1) {\r\n // debugger;\r\n // }\r\n \r\n const promises = loadQueue.reduce((acc, details) => {\r\n const perf = performance.now();\r\n\r\n const promises = details.promises.slice();\r\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\r\n Promise.all(timePromises).then((times) => {\r\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\r\n times.forEach((time, idx) => {\r\n log('media message time', time, idx, promises[idx]);\r\n });\r\n log.groupEnd();\r\n });\r\n\r\n // if(details.updatePosition) {\r\n // if(res) {\r\n // groups.add(res.group);\r\n // if(details.needAvatar) {\r\n // details.promises.push(res.group.createAvatar(details.message));\r\n // }\r\n // }\r\n // }\r\n\r\n acc.push(...details.promises);\r\n return acc;\r\n }, [] as Promise[]);\r\n\r\n promises.push(...avatarPromises);\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\r\n await m(Promise.all([...promises, this.setUnreadDelimiter()])); // не нашёл места лучше\r\n await m(fastRafPromise()); // have to be the last\r\n log('media promises end');\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n const restoreScroll = this.prepareToSaveScroll(reverse);\r\n // if(this.messagesQueueOnRender) {\r\n // this.messagesQueueOnRender();\r\n // }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n this.ejectBubbles();\r\n for(const bubble of this.bubblesToReplace) {\r\n if(!loadQueue.find((details) => details.bubble === bubble)) {\r\n continue;\r\n }\r\n\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n item.mounted = false;\r\n if(!groups.includes(item.group)) {\r\n groups.push(item.group);\r\n }\r\n\r\n this.bubblesToReplace.delete(bubble);\r\n }\r\n \r\n if(this.chat.selection.isSelecting) {\r\n loadQueue.forEach(({bubble}) => {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n });\r\n }\r\n\r\n loadQueue.forEach(({message, bubble, updatePosition}) => {\r\n if(message.pFlags.local && updatePosition) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n });\r\n\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n // this.bubbleGroups.findIncorrentPositions();\r\n\r\n if(this.updatePlaceholderPosition) {\r\n this.updatePlaceholderPosition();\r\n }\r\n\r\n if(restoreScroll) {\r\n restoreScroll();\r\n }\r\n\r\n // this.setStickyDateManually();\r\n \r\n if(this.messagesQueue.length) {\r\n log('have new messages to render');\r\n return processQueue();\r\n } else {\r\n log('end');\r\n }\r\n };\r\n\r\n log('setting pause');\r\n const promise = this.messagesQueuePromise = m(pause(0)).then(processQueue).finally(() => {\r\n if(this.messagesQueuePromise === promise) {\r\n this.messagesQueuePromise = null;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n private ejectBubbles() {\r\n for(const bubble of this.bubblesToEject) {\r\n bubble.remove();\r\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n }\r\n\r\n this.bubblesToEject.clear();\r\n }\r\n\r\n public groupBubbles(items: Array<{\r\n // Awaited> & \r\n bubble: HTMLElement, \r\n message: Message.message | Message.messageService\r\n }/* & {\r\n unmountIfFound?: boolean\r\n } */>) {\r\n items.forEach(({bubble, message}) => {\r\n this.bubbleGroups.prepareForGrouping(bubble, message);\r\n });\r\n\r\n const groups = this.bubbleGroups.groupUngrouped();\r\n\r\n const avatarPromises = Array.from(groups).map((group) => {\r\n if(group.avatar) return;\r\n const firstItem = group.firstItem;\r\n if(this.chat.isAvatarNeeded(firstItem.message)) {\r\n return group.createAvatar(firstItem.message);\r\n }\r\n }).filter(Boolean);\r\n\r\n return {\r\n groups: [...groups], \r\n avatarPromises\r\n };\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n\r\n private async safeRenderMessage(\r\n message: Message.message | Message.messageService, \r\n reverse?: boolean, \r\n bubble?: HTMLElement, \r\n updatePosition = true,\r\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\r\n ) {\r\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\r\n return;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n\r\n let result: Awaited> & {updatePosition: typeof updatePosition};\r\n try {\r\n this.renderingMessages.add(message.mid);\r\n\r\n // const groupedId = (message as Message.message).grouped_id;\r\n const newBubble = document.createElement('div');\r\n newBubble.dataset.mid = '' + message.mid;\r\n newBubble.dataset.peerId = '' + message.peerId;\r\n newBubble.dataset.timestamp = '' + message.date;\r\n\r\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\r\n // bubble: newBubble, \r\n // mids: new Set(), \r\n // groupedId\r\n // };\r\n\r\n // bubbleNew.mids.add(message.mid);\r\n\r\n if(bubble) {\r\n this.skippedMids.delete(message.mid);\r\n\r\n this.bubblesToEject.add(bubble);\r\n this.bubblesToReplace.delete(bubble);\r\n this.bubblesToReplace.add(newBubble);\r\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\r\n }\r\n\r\n bubble = this.bubbles[message.mid] = newBubble;\r\n let originalPromise = this.renderMessage(message, reverse, bubble);\r\n if(processResult) {\r\n originalPromise = processResult(originalPromise, bubble);\r\n }\r\n \r\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\r\n\r\n this.renderMessagesQueue(promise.catch(() => undefined));\r\n\r\n result = await promise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!result) {\r\n this.skippedMids.add(+message.mid);\r\n }\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.renderingMessages.delete(message.mid);\r\n return result;\r\n }\r\n \r\n // reverse means top\r\n private async renderMessage(\r\n message: Message.message | Message.messageService, \r\n reverse = false, \r\n bubble: HTMLElement\r\n ) {\r\n // if(DEBUG) {\r\n // this.log('message to render:', message);\r\n // }\r\n\r\n // if(!bubble && this.bubbles[message.mid]) {\r\n // return;\r\n // }\r\n\r\n // await pause(1000);\r\n\r\n const isMessage = message._ === 'message';\r\n const groupedId = isMessage && message.grouped_id;\r\n let albumMids: number[], reactionsMessage: Message.message;\r\n\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\r\n albumMids = await this.managers.appMessagesManager.getMidsByAlbum(groupedId);\r\n const mainMid = getMainMidForGrouped(albumMids);\r\n if(message.mid !== mainMid) {\r\n return;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n reactionsMessage = groupedId ? await this.managers.appMessagesManager.getGroupsFirstMessage(message) : message;\r\n }\r\n \r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = this.chat.isOurMessage(message);\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble.classList.add('bubble');\r\n contentWrapper.append(bubbleContainer);\r\n bubble.append(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.observer) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n isMentionUnread(message)/* || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid) */;\r\n if(isUnread) {\r\n this.observer.observe(bubble, this.unreadedObserverCallback);\r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n\r\n const loadPromises: Promise[] = [];\r\n const ret = {\r\n bubble,\r\n promises: loadPromises,\r\n message,\r\n reverse\r\n };\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n return;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n let promise: Promise;\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true)});\r\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true)});\r\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\r\n } else {\r\n s.append(await wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document && \r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupedId && albumMustBeRenderedFull) {\r\n const t = await this.managers.appMessagesManager.getAlbumText(groupedId);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n \r\n /* let richText = wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n setInnerHTML(attachmentDiv, richText);\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n\r\n const timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type, \r\n message,\r\n reactionsMessage\r\n });\r\n messageDiv.append(timeSpan);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n bubble.classList.add('channel-post');\r\n\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n if(!message.pFlags.is_outgoing && this.observer) {\r\n this.observer.observe(bubble, this.viewsObserverCallback);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then((peerId) => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n if(typeof(text) === 'string') {\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n } else {\r\n buttonEl.append(text);\r\n }\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n if(isOutgoing) {\r\n bubble.classList.add('is-outgoing');\r\n }\r\n\r\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = this.chat.isOutMessage(message);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n \r\n let processingWebPage = false;\r\n \r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n ////////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n \r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n const promise = wrapAlbum({\r\n groupId: groupedId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n\r\n loadPromises.push(promise);\r\n \r\n break;\r\n }\r\n \r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo, \r\n message,\r\n container: attachmentDiv,\r\n withTail, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webPage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webPage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webPage.photo as any;\r\n if(photo || webPage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n\r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n \r\n const doc = webPage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message: message as Message.message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n //}\r\n } else {\r\n const docDiv = await wrapDocument({\r\n message: message as Message.message,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises,\r\n sizeType: 'documentName',\r\n searchContext: {\r\n useSearch: false,\r\n peerId: this.peerId,\r\n inputFilter: {\r\n _: 'inputMessagesFilterEmpty'\r\n }\r\n }\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n quoteTextDiv.classList.add('has-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webPage.site_name) {\r\n const html = wrapRichText(webPage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n const title = wrapWebPageTitle(webPage);\r\n if(title.textContent) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, title);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n const description = wrapWebPageDescription(webPage);\r\n if(description.textContent) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, description);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n }\r\n \r\n box.append(quote);\r\n \r\n //bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n \r\n //this.log('night running', bubble.scrollHeight);\r\n \r\n break;\r\n }\r\n \r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\r\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n await wrapAlbum({\r\n groupId: groupedId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc, \r\n container: attachmentDiv, \r\n message: message as Message.message, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n const newNameContainer = await wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n sizeType: 'documentName'\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n lastContainer && lastContainer.append(timeSpan);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ? \r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') : \r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const contactDetails = document.createElement('div');\r\n contactDetails.className = 'contact-details';\r\n const contactNameDiv = document.createElement('div');\r\n contactNameDiv.className = 'contact-name';\r\n contactNameDiv.append(\r\n wrapEmojiText([\r\n contact.first_name,\r\n contact.last_name\r\n ].filter(Boolean).join(' '))\r\n );\r\n\r\n const contactNumberDiv = document.createElement('div');\r\n contactNumberDiv.className = 'contact-number';\r\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\r\n\r\n contactDiv.append(contactDetails);\r\n contactDetails.append(contactNameDiv, contactNumberDiv);\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.updateWithOptions({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n peerId: contact.user_id.toPeerId()\r\n });\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n \r\n let isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + (await this.managers.appUsersManager.getUser(message.viaBotId)).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\r\n title.classList.add('peer-title');\r\n //title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n await MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n \r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n \r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\r\n const pFlags = (peer as User.user)?.pFlags;\r\n if(pFlags && (pFlags.scam || pFlags.fake)) {\r\n nameDiv.append(generateFakeIcon(pFlags.scam));\r\n }\r\n\r\n if(!our) {\r\n nameDiv.style.color = getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\r\n }\r\n\r\n /* if(isMessage) {\r\n const reactionHover = document.createElement('div');\r\n reactionHover.classList.add('bubble-reaction-hover');\r\n contentWrapper.append(reactionHover);\r\n } */\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n private appendReactionsElementToBubble(bubble: HTMLElement, message: Message.message, reactionsMessage: Message.message, changedResults?: ReactionCount[]) {\r\n if(this.peerId.isUser()/* || true */) {\r\n return;\r\n }\r\n\r\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\r\n return;\r\n }\r\n\r\n // message = this.appMessagesManager.getMessageWithReactions(message);\r\n\r\n const reactionsElement = new ReactionsElement();\r\n reactionsElement.init(reactionsMessage, 'block');\r\n reactionsElement.render(changedResults);\r\n\r\n if(bubble.classList.contains('is-message-empty')) {\r\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\r\n } else {\r\n const messageDiv = bubble.querySelector('.message');\r\n if(bubble.classList.contains('is-multiple-documents')) {\r\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\r\n let documentMessageDiv = documentContainer.querySelector('.document-message');\r\n\r\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\r\n if(!timeSpan) {\r\n timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message,\r\n reactionsMessage\r\n });\r\n }\r\n \r\n reactionsElement.append(timeSpan);\r\n\r\n if(!documentMessageDiv) {\r\n documentMessageDiv = document.createElement('div');\r\n documentMessageDiv.classList.add('document-message');\r\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\r\n }\r\n\r\n documentMessageDiv.append(reactionsElement);\r\n } else {\r\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\r\n reactionsElement.append(timeSpan);\r\n \r\n messageDiv.append(reactionsElement);\r\n }\r\n }\r\n }\r\n\r\n private prepareToSaveScroll(reverse?: boolean) {\r\n const isMounted = !!this.chatInner.parentElement;\r\n if(!isMounted) {\r\n return;\r\n }\r\n\r\n const log = this.log.bindPrefix('prepareToSaveScroll');\r\n log('save');\r\n const scrollSaver = this.createScrollSaver(reverse);\r\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\r\n \r\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\r\n const viewportSlice = this.getViewportSlice();\r\n this.deleteViewportSlice(viewportSlice, true);\r\n }\r\n \r\n // scrollSaver.save(); // ! slicing will corrupt scroll position\r\n // const saved = scrollSaver.getSaved();\r\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\r\n\r\n return () => {\r\n log('restore');\r\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\r\n scrollSaver.restore(reverse);\r\n this.onRenderScrollSet(scrollSaver.getSaved());\r\n };\r\n }\r\n\r\n public async performHistoryResult(historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]}, reverse: boolean) {\r\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\r\n log && log('start', this.chatInner.parentElement);\r\n\r\n let history = historyResult.history;\r\n history = history.slice(); // need\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (message: Message.message | Message.messageService) => {\r\n if(!message) {\r\n return;\r\n } else if(message.pFlags.local) {\r\n return this.processLocalMessageRender(message);\r\n } else {\r\n return this.safeRenderMessage(message, reverse);\r\n }\r\n };\r\n\r\n const messages = await Promise.all(history.map((mid) => {\r\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n }));\r\n\r\n const setLoadedPromises: Promise[] = [];\r\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\r\n let isEnd = (historyResult as HistoryResult).isEnd;\r\n if(!isEnd) {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n isEnd = {top: false, bottom: false, both: false};\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n isEnd.bottom = true;\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n isEnd.top = true;\r\n }\r\n }\r\n\r\n if(!isEnd.bottom && this.setPeerOptions) {\r\n const {lastMsgId, topMessage} = this.setPeerOptions;\r\n this.setPeerOptions = undefined;\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n isEnd.bottom = true;\r\n }\r\n }\r\n\r\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\r\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\r\n }\r\n\r\n await Promise.all(setLoadedPromises);\r\n\r\n // ! it is important to insert bubbles to group reversed way\r\n // const length = history.length, promises: Promise[] = [];\r\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\r\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\r\n const promises = messages.map(cb);\r\n\r\n // cannot combine them into one promise\r\n await Promise.all(promises);\r\n await this.messagesQueuePromise;\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n log && log('performHistoryResult end');\r\n }\r\n\r\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\r\n const className = 'has-sticky-dates';\r\n if(!this.container.classList.contains(className)) {\r\n const isLoading = !this.preloader.detached;\r\n\r\n if(isLoading || \r\n (\r\n state ??= {\r\n scrollHeight: this.scrollable.scrollHeight,\r\n clientHeight: this.scrollable.container.clientHeight\r\n }, \r\n state.scrollHeight !== state.clientHeight\r\n )\r\n ) {\r\n /* for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n dateMessage.div.classList.add('is-sticky');\r\n } */\r\n \r\n const middleware = this.getMiddleware();\r\n const callback = () => {\r\n if(!middleware()) return;\r\n this.container.classList.add(className);\r\n };\r\n\r\n if(this.willScrollOnLoad) {\r\n callback();\r\n } else {\r\n setTimeout(callback, 600);\r\n }\r\n\r\n return;\r\n }\r\n }\r\n \r\n this.willScrollOnLoad = undefined;\r\n }\r\n\r\n public onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n return this.managers.acknowledged.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n }).then((ackedResult) => {\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((value) => {\r\n return {history: value.history.map((m) => m.mid)};\r\n })\r\n };\r\n });\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\r\n };\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n const log = this.log.bindPrefix('ladder');\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n log.warn('will be delayed');\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n log.warn('no bubbles');\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n log('targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map((m) => getServerMessageId(m)), \r\n bottomIds.map((m) => getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble || this.skippedMids.has(mid)) {\r\n log.warn('no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n\r\n const contentWrapper = bubble.lastElementChild as HTMLElement;\r\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item && item.group.avatar && item.group.lastItem === item) {\r\n elementsToAnimate.push(item.group.avatar);\r\n }\r\n\r\n elementsToAnimate.forEach((element) => {\r\n element.classList.add('zoom-fade', 'can-zoom-fade');\r\n element.style.transitionDelay = lastMsDelay + 'ms';\r\n });\r\n \r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n\r\n setBubbles.push(...elementsToAnimate);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach((element) => {\r\n element.classList.remove('zoom-fade');\r\n });\r\n });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach((element) => {\r\n element.style.transitionDelay = '';\r\n element.classList.remove('can-zoom-fade');\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n // if(!IS_SAFARI) {\r\n // this.needReflowScroll = true;\r\n // }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private async renderEmptyPlaceholder(\r\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted', \r\n bubble: HTMLElement, \r\n message: any, \r\n elements: (Node | string)[]\r\n ) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n else if(type === 'restricted') {\r\n title = document.createElement('span');\r\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\r\n }\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n await wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n // this.renderMessagesQueue({\r\n // message, \r\n // bubble, \r\n // reverse: false, \r\n // promises: [loadPromise]\r\n // });\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map((elem) => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private async processLocalMessageRender(message: Message.message | Message.messageService, animate?: boolean) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const middleware = this.getMiddleware();\r\n const m = middlewarePromise(middleware);\r\n return this.safeRenderMessage(message, isSponsored ? false : true, undefined, false, async(result) => {\r\n const {bubble} = await m(result);\r\n if(!bubble) {\r\n return result;\r\n }\r\n\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n const updatePosition = () => {\r\n if(this.updatePlaceholderPosition === updatePosition) {\r\n this.updatePlaceholderPosition = undefined;\r\n }\r\n\r\n appendTo[method](bubble);\r\n };\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = await m(this.managers.appPeersManager.isBot(this.peerId));\r\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\r\n if(this.chat.isRestricted) {\r\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\r\n } else if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param || isBot) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n \r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId,\r\n lastMsgId: mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.observer.observe(button, this.viewsObserverCallback);\r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return result;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n appendTo = this.chatInner;\r\n method = 'prepend';\r\n } else if(await m(this.managers.appPeersManager.isAnyGroup(this.peerId)) && (await m(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator) {\r\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\r\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n if(renderPromise) {\r\n await renderPromise;\r\n }\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\r\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\r\n if(noTransition) {\r\n const setOn = bubble.firstElementChild;\r\n setOn.classList.add('no-transition');\r\n \r\n if(this.chat.setPeerPromise) {\r\n this.chat.setPeerPromise.catch(noop).finally(() => {\r\n setOn.classList.remove('no-transition');\r\n });\r\n }\r\n }\r\n\r\n if(animate === undefined && !noTransition) {\r\n animate = true;\r\n }\r\n\r\n if(isWaitingForAnimation || animate) {\r\n this.updatePlaceholderPosition = updatePosition;\r\n\r\n this.onAnimateLadder = () => {\r\n // appendTo[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else if(this.chat.setPeerPromise) {\r\n this.attachPlaceholderOnRender = () => {\r\n this.attachPlaceholderOnRender = undefined;\r\n updatePosition();\r\n // appendTo[method](bubble);\r\n };\r\n } else {\r\n this.updatePlaceholderPosition = updatePosition;\r\n // appendTo[method](bubble);\r\n }\r\n\r\n if(!isWaitingForAnimation && animate) {\r\n await m(getHeavyAnimationPromise());\r\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\r\n indexOfAndSplice(additionMsgIds, message.mid);\r\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderBubble = bubble;\r\n // }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n let offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n let message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\r\n message = savedMessages[0];\r\n message.mid = mid;\r\n return message as any;\r\n }\r\n\r\n public getViewportSlice() {\r\n // this.log.trace('viewport slice');\r\n return getViewportSlice({\r\n overflowElement: this.scrollable.container, \r\n selector: '.bubbles-date-group .bubble:not(.is-date)',\r\n extraSize: Math.max(700, windowSize.height) * 2\r\n });\r\n }\r\n\r\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\r\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\r\n return;\r\n }\r\n\r\n const {invisibleTop, invisibleBottom} = slice;\r\n const invisible = invisibleTop.concat(invisibleBottom);\r\n if(!invisible.length) {\r\n return;\r\n }\r\n\r\n if(invisibleTop.length) {\r\n this.setLoaded('top', false);\r\n this.getHistoryTopPromise = undefined;\r\n }\r\n\r\n if(invisibleBottom.length) {\r\n this.setLoaded('bottom', false);\r\n this.getHistoryBottomPromise = undefined;\r\n }\r\n\r\n const mids = invisible.map(({element}) => +element.dataset.mid);\r\n\r\n let scrollSaver: ScrollSaver;\r\n if(!!invisibleTop.length !== !!invisibleBottom.length && !ignoreScrollSaving) {\r\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\r\n scrollSaver.save();\r\n }\r\n \r\n this.deleteMessagesByIds(mids, false, true);\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n } else if(invisibleTop.length) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n }\r\n\r\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\r\n // Safari cannot reset the scroll.\r\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\r\n return;\r\n }\r\n\r\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\r\n // scrollSaver.save();\r\n const slice = this.getViewportSlice();\r\n // if(IS_SAFARI) slice.invisibleTop = [];\r\n this.deleteViewportSlice(slice);\r\n // scrollSaver.restore();\r\n }\r\n\r\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n const log = this.log.bindPrefix('setLoaded');\r\n log('change', side, value);\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n // return;\r\n\r\n if(!checkPlaceholders) {\r\n return;\r\n }\r\n\r\n if(!this.chat.isRestricted) {\r\n if(side === 'bottom' && await this.managers.appPeersManager.isBroadcast(this.peerId)/* && false */) {\r\n this.toggleSponsoredMessage(value);\r\n }\r\n \r\n if(side === 'top' && value && await this.managers.appPeersManager.isBot(this.peerId)) {\r\n return this.renderBotPlaceholder();\r\n }\r\n }\r\n\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n private async toggleSponsoredMessage(value: boolean) {\r\n const _log = this.log.bindPrefix('sponsored');\r\n _log('checking');\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n\r\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\r\n .then(async(sponsoredMessages) => {\r\n const sponsoredMessage = sponsoredMessages.messages[0];\r\n if(!sponsoredMessage) {\r\n _log('no message');\r\n return;\r\n }\r\n\r\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n \r\n return Promise.all([\r\n messagePromise,\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(([message]) => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n _log('rendering', message);\r\n const promise = this.performHistoryResult({history: [message]}, false);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n _log('clearing rendered', mid);\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n private async renderBotPlaceholder() {\r\n const _log = this.log.bindPrefix('bot placeholder');\r\n \r\n const middleware = this.getMiddleware();\r\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\r\n _log('getting profile, cached:', result.cached);\r\n const processPromise = result.result.then(async(userFull) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n _log.warn('no description');\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n const message = await this.generateLocalFirstMessage(false, (message) => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n _log('rendering');\r\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\r\n _log('done');\r\n });\r\n\r\n return {renderPromise};\r\n });\r\n\r\n if(!result.cached) {\r\n return;\r\n }\r\n\r\n return processPromise;\r\n }\r\n\r\n public async checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderBubble === undefined && \r\n (\r\n this.chat.isRestricted || \r\n !(await this.chat.getHistoryStorage()).count || \r\n (\r\n !Object.keys(this.bubbles).length || \r\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = await this.generateLocalFirstMessage(true);\r\n return {renderPromise: this.processLocalMessageRender(message)};\r\n }\r\n }\r\n\r\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\r\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\r\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\r\n });\r\n\r\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\r\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n\r\n if(!justLoad) {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public async getHistory(\r\n maxId = 0, \r\n reverse = false, \r\n isBackLimit = false, \r\n additionMsgId = 0, \r\n justLoad = false,\r\n middleware?: () => boolean\r\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\r\n const peerId = this.peerId;\r\n\r\n const isBroadcast = await this.managers.appPeersManager.isBroadcast(peerId);\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = await this.chat.getMessage(additionMsgIds[i]);\r\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: typeof result['result'];\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && !result.cached;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result.result;\r\n\r\n result = {\r\n cached: true,\r\n result: Promise.resolve({history: additionMsgIds})\r\n };\r\n\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: Awaited) => {\r\n if((historyResult as HistoryResult).isEnd?.top) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\r\n historyResult.history.push(...mids.reverse());\r\n }\r\n\r\n // synchronize bot placeholder appearance\r\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\r\n\r\n // await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (historyResult: Awaited) => {\r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(historyResult);\r\n }).then(() => {\r\n if(!isAdditionRender && additionMsgId) {\r\n historyResult.history.unshift(additionMsgId);\r\n }\r\n\r\n return this.performHistoryResult(historyResult, reverse);\r\n });\r\n };\r\n\r\n const processPromise = (_promise: typeof result['result']) => {\r\n const promise = Promise.resolve(_promise).then((result) => {\r\n if(middleware && !middleware()) {\r\n throw PEER_CHANGED_ERROR;\r\n }\r\n\r\n if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n // fastRaf(() => {\r\n // this.scrollable.checkForTriggers();\r\n // });\r\n return;\r\n }\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(!result.cached) {\r\n cached = false;\r\n promise = processPromise(result.result);\r\n } else if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n return null;\r\n } else {\r\n cached = true;\r\n promise = sup(await result.result);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('messagesQueueOnRenderAdditional');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n return {cached, promise, waitPromise};\r\n }\r\n\r\n public async setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\r\n .map((i) => +i)\r\n .sort((a, b) => a - b)\r\n .find((i) => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyMaxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(!Object.keys(this.dateMessages).length) {\r\n this.container.classList.remove('has-groups');\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copyTextToClipboard } from \"../clipboard\";\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { MediaSizeType } from \"../../helpers/mediaSizes\";\nimport { Message } from \"../../layer\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\nimport { MediaSearchContext } from \"../appMediaPlaybackController\";\nimport Chat from \"../chat/chat\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport wrapDocument from \"./document\";\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n \n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n const richText = wrapRichText(message.message, {\n entities: message.totalEntities\n });\n\n setInnerHTML(messageDiv, richText);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n \n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport rootScope from \"../../lib/rootScope\";\nimport PollElement from \"../poll\";\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from \"./getVisibleRect\";\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, selector, extraSize}: {\n overflowElement: HTMLElement,\n selector: string,\n extraSize?: number\n}) {\n // const perf = performance.now();\n const overflowRect = overflowElement.getBoundingClientRect();\n const elements = Array.from(overflowElement.querySelectorAll(selector));\n\n const invisibleTop: ViewportSlicePart = [], \n visible: typeof invisibleTop = [], \n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n \n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom; \n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n if(extraSize && visible.length) {\n const maxTop = visible[0].rect.top;\n const minTop = maxTop - extraSize;\n const minBottom = visible[visible.length - 1].rect.bottom;\n const maxBottom = minBottom + extraSize;\n \n for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n const element = invisibleTop[i];\n if(element.rect.top >= minTop) {\n invisibleTop.splice(i, 1);\n visible.unshift(element);\n }\n }\n\n for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n const element = invisibleBottom[i];\n if(element.rect.bottom <= maxBottom) {\n invisibleBottom.splice(i--, 1);\n --length;\n visible.push(element);\n }\n }\n }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n \n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(await managers.appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\nimport rootScope from \"../lib/rootScope\";\nimport { getEmojiToneIndex } from \"../vendor/emoji\";\nimport mediaSizes from \"./mediaSizes\";\nimport { saveLottiePreview } from \"./saveLottiePreview\";\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ReportReason } from \"../../layer\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport wrapStickerEmoji from \"../wrappers/stickerEmoji\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n this.managers.appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then((bool) => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport preloadAnimatedEmojiSticker from \"../../helpers/preloadAnimatedEmojiSticker\";\nimport { ReportReason } from \"../../layer\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach((b) => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport Scrollable from \"../scrollable\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }]\n });\n\n const scrollable = new Scrollable(undefined);\n scrollable.onAdditionalScroll = () => {\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\n };\n\n this.description.replaceWith(scrollable.container);\n\n scrollable.container.append(this.description);\n scrollable.container.classList.add('scrolled-top');\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from \".\";\nimport { Message } from \"../../layer\";\nimport { SettingSection } from \"../sidebarLeft\";\nimport ReactionsElement from \"../chat/reactions\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport Scrollable from \"../scrollable\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport appDialogsManager from \"../../lib/appManagers/appDialogsManager\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { wrapSticker } from \"../wrappers\";\nimport ReactionElement from \"../chat/reaction\";\nimport getUserStatusString from \"../wrappers/getUserStatusString\";\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', /* [{\n langKey: 'Close',\n isCancel: true\n }] */null, {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => {\n return {\n ...reactionCount,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block');\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n \n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n \n newMessage.reactions.results.forEach((reactionCount) => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = reactionCount.reaction !== 'checks';\n const skipReactionsList = reactionCount.reaction === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction)) {\n reactionCount.reaction = undefined;\n }\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 54,\n rippleEnabled: false,\n meAsSaved: false,\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24\n });\n \n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n \n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n });\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block');\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport noop from \"../../helpers/noop\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { Message, AvailableReaction } from \"../../layer\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport Scrollable, { ScrollableBase, ScrollableX } from \"../scrollable\";\nimport { wrapSticker } from \"../wrappers\";\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: string\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: string;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = 'CHAT-MENU-REACTIONS-' + Date.now();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: reaction.reaction\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n \n players.appear = player;\n \n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n \n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n \n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n \n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n \n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type Chat from \"./chat\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport PopupSponsored from \"../popups/sponsored\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport { IS_APPLE } from \"../../environment/userAgent\";\r\nimport PopupReactedList from \"../popups/reactedList\";\r\nimport { ChatReactionsMenu, REACTION_CONTAINER_SIZE } from \"./reactionsMenu\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport getServerMessageId from \"../../lib/appManagers/utils/messageId/getServerMessageId\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport positionMenu, { MenuPositionPadding } from \"../../helpers/positionMenu\";\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { attachContextMenuListener } from \"../../helpers/dom/attachContextMenuListener\";\r\nimport filterAsync from \"../../helpers/array/filterAsync\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport { SERVICE_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private isSponsored: boolean;\r\n private isOverBubble: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n private reactionsMenu: ChatReactionsMenu;\r\n private listenerSetter: ListenerSetter;\r\n private attachListenerSetter: ListenerSetter;\r\n\r\n private viewerPeerId: PeerId;\r\n private middleware: ReturnType;\r\n private canOpenReactedList: boolean;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.attachListenerSetter = new ListenerSetter();\r\n this.middleware = getMiddleware();\r\n }\r\n\r\n public attachTo(element: HTMLElement) {\r\n this.attachListenerSetter.removeAll();\r\n \r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(element, (e) => {\r\n if(this.chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n this.chat.log('touchend', e);\r\n\r\n const badSelectors = [\r\n '.name',\r\n '.peer-title',\r\n '.reply',\r\n '.document',\r\n 'audio-element',\r\n 'avatar-element',\r\n 'a',\r\n '.bubble-beside-button',\r\n 'replies-element',\r\n '[data-saved-from]:not(.bubble)',\r\n 'poll-element',\r\n 'attachment'\r\n ];\r\n let good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\r\n if(good) {\r\n cancelEvent(e);\r\n //onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n this.onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.attachListenerSetter});\r\n } else attachContextMenuListener(element, this.onContextMenu, this.attachListenerSetter);\r\n }\r\n\r\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n let element = this.element;\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(element && element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n \r\n const r = async() => {\r\n const isSponsored = this.isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n //this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' || \r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(this.chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = await this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n this.isOverBubble = !!contentWrapper;\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = await this.chat.getMessage(this.mid);\r\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n\r\n const initResult = await this.init();\r\n if(!initResult) {\r\n return;\r\n }\r\n \r\n element = initResult.element;\r\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\r\n let isReactionsMenuVisible = false;\r\n if(reactionsMenu) {\r\n const className = 'is-visible';\r\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\r\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\r\n\r\n if(reactionsMenuPosition === 'horizontal') {\r\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\r\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\r\n const INNER_CONTAINER_PADDING = 8;\r\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\r\n const nextVisiblePart = visibleLength % 1;\r\n const MIN_NEXT_VISIBLE_PART = 0.65;\r\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\r\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\r\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\r\n }\r\n // }\r\n }\r\n }\r\n \r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\r\n\r\n if(reactionsMenu) {\r\n reactionsMenu.widthContainer.style.top = element.style.top;\r\n reactionsMenu.widthContainer.style.left = element.style.left;\r\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\r\n element.parentElement.append(reactionsMenu.widthContainer);\r\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\r\n }\r\n\r\n contextMenuController.openBtnMenu(element, () => {\r\n if(reactionsMenu) {\r\n reactionsMenu.container.classList.remove('is-visible');\r\n }\r\n\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n cleanup();\r\n\r\n setTimeout(() => {\r\n destroy();\r\n }, 300);\r\n });\r\n\r\n if(isReactionsMenuVisible) {\r\n reactionsMenu.container.classList.add('is-visible');\r\n }\r\n };\r\n \r\n r();\r\n };\r\n\r\n public cleanup() {\r\n this.listenerSetter.removeAll();\r\n this.reactionsMenu && this.reactionsMenu.cleanup();\r\n this.middleware.clean();\r\n }\r\n\r\n public destroy() {\r\n this.cleanup();\r\n this.attachListenerSetter.removeAll();\r\n }\r\n\r\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\r\n if(this.isSponsored) {\r\n return buttons.filter((button) => {\r\n return button.isSponsored;\r\n });\r\n } else {\r\n return filterAsync(buttons, async(button) => {\r\n let good: boolean;\r\n\r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(this.chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ? \r\n await button.verify() : \r\n button.notDirect && await button.verify() && button.notDirect();\r\n }\r\n\r\n return !!good;\r\n });\r\n }\r\n }\r\n\r\n private setButtons() {\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: async() => await this.chat.canSend() && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: async() => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n const message = (await this.managers.appMessagesManager.getMessageByPeer(peerId, mid)) as Message.message;\r\n if(!!message.message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: async() => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n await this.managers.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n appDownloadManager.downloadToDisc({media: (this.message as any).media.document});\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: async() => {\r\n const poll = (this.message as any).media?.poll;\r\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n onClick: () => {\r\n if(this.viewerPeerId) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: this.viewerPeerId\r\n });\r\n } else if(this.canOpenReactedList) {\r\n new PopupReactedList(this.message as Message.message);\r\n } else {\r\n return false;\r\n }\r\n },\r\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\r\n notDirect: () => true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n }\r\n\r\n private async init() {\r\n this.cleanup();\r\n this.setButtons();\r\n \r\n const filteredButtons = await this.filterButtons(this.buttons);\r\n if(!filteredButtons.length) {\r\n return;\r\n }\r\n\r\n const element = this.element = ButtonMenu(filteredButtons, this.listenerSetter);\r\n element.id = 'bubble-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n const viewsButton = filteredButtons.find((button) => !button.icon);\r\n if(viewsButton) {\r\n const reactions = (this.message as Message.message).reactions;\r\n const recentReactions = reactions?.recent_reactions;\r\n const isViewingReactions = !!recentReactions?.length;\r\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ? ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count : undefined;\r\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\r\n\r\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\r\n const i18nElem = new I18n.IntlElement({\r\n key: isViewingReactions ? (\r\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\r\n ) : 'NobodyViewed',\r\n args: isViewingReactions ? (\r\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\r\n ) : undefined,\r\n element: viewsButton.textElement\r\n });\r\n\r\n let fakeText: HTMLElement;\r\n if(isViewingReactions) {\r\n if(participantsCount === undefined) {\r\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\r\n } else {\r\n fakeText = i18n(\r\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n [recentReactions.length, participantsCount]\r\n );\r\n }\r\n } else {\r\n fakeText = i18n('Loading');\r\n }\r\n\r\n fakeText.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeText);\r\n\r\n const AVATAR_SIZE = 22;\r\n const MAX_AVATARS = 3;\r\n const PADDING_PER_AVATAR = 1.125;\r\n i18nElem.element.style.visibility = 'hidden';\r\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\r\n const middleware = this.middleware.get();\r\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(fakeText) {\r\n fakeText.remove();\r\n }\r\n\r\n const reactions = result.combined;\r\n const reactedLength = participantsCount === undefined ? \r\n result.reactionsCount : \r\n (\r\n isViewingReactions ? \r\n reactions.filter((reaction) => reaction.reaction).length : \r\n reactions.length\r\n );\r\n\r\n let fakeElem: HTMLElement;\r\n if(reactions.length === 1) {\r\n fakeElem = new PeerTitle({\r\n peerId: reactions[0].peerId,\r\n onlyFirstName: true,\r\n dialog: false,\r\n }).element;\r\n\r\n if(!isViewingReactions || result.readParticipants.length <= 1) {\r\n this.viewerPeerId = reactions[0].peerId;\r\n }\r\n } else if(isViewingReactions) {\r\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\r\n fakeElem = i18n(\r\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n isFull ? [reactedLength] : [reactedLength, reactions.length]\r\n );\r\n } else {\r\n if(!reactions.length) {\r\n i18nElem.element.style.visibility = '';\r\n } else {\r\n fakeElem = i18n('MessageSeen', [reactions.length]);\r\n }\r\n }\r\n\r\n if(fakeElem) {\r\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\r\n fakeElem.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeElem);\r\n }\r\n\r\n if(reactions.length) {\r\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\r\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\r\n viewsButton.element.append(avatars.container);\r\n\r\n // if(reactions.length > 1) {\r\n // if(isViewingReactions) {\r\n this.canOpenReactedList = true;\r\n // }\r\n }\r\n });\r\n }\r\n\r\n let menuPadding: MenuPositionPadding;\r\n let reactionsMenu: ChatReactionsMenu;\r\n let reactionsMenuPosition: 'horizontal' | 'vertical';\r\n if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\r\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\r\n // element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 36;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n const paddingLeft = 0, paddingRight = 0;\r\n if(reactionsMenuPosition === 'vertical') {\r\n menuPadding = {\r\n top: paddingLeft,\r\n // bottom: 36, // positionMenu will detect it itself somehow\r\n left: totalSize\r\n };\r\n } else {\r\n menuPadding = {\r\n top: totalSize,\r\n right: paddingRight,\r\n left: paddingLeft\r\n };\r\n }\r\n }\r\n\r\n this.chat.container.append(element);\r\n\r\n return {\r\n element, \r\n cleanup: () => {\r\n this.cleanup();\r\n reactionsMenu && reactionsMenu.cleanup();\r\n },\r\n destroy: () => {\r\n element.remove();\r\n reactionsMenu && reactionsMenu.widthContainer.remove();\r\n },\r\n menuPadding,\r\n reactionsMenu,\r\n reactionsMenuPosition\r\n };\r\n }\r\n\r\n private onSendScheduledClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = async() => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n return message?.message ? message.message + '\\n' : '';\r\n }));\r\n\r\n const str = parts.join('');\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = async() => {\r\n let threadMessage: Message.message;\r\n const {peerId, mid} = this;\r\n const threadId = this.chat.threadId;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\r\n }\r\n\r\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\r\n const msgId = getServerMessageId(mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.managers.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.managers.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const peerId = this.peerId;\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { attachContextMenuListener } from \"../../helpers/dom/attachContextMenuListener\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n contextMenuController.openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n this.construct();\r\n }\r\n \r\n private async construct() {\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach((el) => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter((v) => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public async send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n ...this.chat.getMessageSendingParams()\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption', \r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId, \r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '', \r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n \r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement, \r\n position: 'center'\r\n });\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"./schedulers/pause\";\r\nimport { makeMediaSize } from \"./mediaSize\";\r\nimport scaleMediaElement from \"./canvas/scaleMediaElement\";\r\nimport preloadVideo from \"./preloadVideo\";\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo } from \"../../helpers/createPoster\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport createVideo from \"../../helpers/dom/createVideo\";\nimport prepareAlbum from \"../prepareAlbum\";\nimport { MediaSize } from \"../../helpers/mediaSize\";\nimport { ThumbCache } from \"../../lib/storages/thumbs\";\nimport onMediaLoad from \"../../helpers/onMediaLoad\";\nimport apiManagerProxy from \"../../lib/mtproto/mtprotoworker\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n private captionLengthMax: number;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n const config = await this.managers.apiManager.getConfig();\n this.captionLengthMax = config.caption_length_max;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: this.captionLengthMax\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter((file) => {\n const found = this.files.find((_file) => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach((d) => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map((d) => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private async attachMedia(params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(async() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n return promise;\n }\n\n private async attachDocument(params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: 'full'\n };\n }\n\n const docDiv = await wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any,\n cacheContext\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params, itemDiv) : this.attachDocument(params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach((file) => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter((n) => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach((p) => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map((s) => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map((o) => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport cancelEvent from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string[]\r\n}) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS)); \r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable, \r\n element: target as HTMLElement, \r\n position: 'center', \r\n forceDuration: 100, \r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n hiding: () => void\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller?: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller && this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list, \r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\r\n if(this.init) {\r\n return;\r\n }\r\n \r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller && this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController && this.controller) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n const useRafs = this.controller || hide ? 0 : 2;\r\n\r\n if(hide) {\r\n this.dispatchEvent('hiding');\r\n }\r\n\r\n SetTransition(\r\n this.container, \r\n 'is-visible', \r\n !hide, \r\n rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0, \r\n () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n }, \r\n useRafs\r\n );\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport preloadAnimatedEmojiSticker from \"../../helpers/preloadAnimatedEmojiSticker\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n preloadAnimatedEmojiSticker(emoticon);\r\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach((sticker) => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP, this.managers);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\nimport combineSameEntities from \"../../lib/richTextProcessor/combineSameEntities\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach((emoji) => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\r\n if(!middleware()) {\r\n return;\r\n }\r\n \r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n protected className: string, \r\n onSelect: (target: Element) => boolean | void\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach((d) => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n if(!doNotShow) {\r\n this.toggle(!data.length);\r\n }\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n \r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: options.peerId\r\n });\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n setInnerHTML(name, wrapEmojiText(options.name));\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n setInnerHTML(description, wrapEmojiText(options.description));\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { BotInfo, ChatFull, UserFull } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex; \n \n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n \n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId, \n command: command, \n name: c, \n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n \n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private managers: AppManagers\n ) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach((helper) => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private managers: AppManagers\n ) {\n super(\n appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n \n str += ' ';\n chatInput.insertAtCaret(str, entity);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { KeyboardButton, ReplyMarkup } from \"../../layer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ListenerSetter, { Listener } from \"../../helpers/listenerSetter\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport confirmationPopup from \"../confirmationPopup\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private managers: AppManagers;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n managers: AppManagers,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n await this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', async() => {\r\n await this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public async checkForceReply() {\r\n const replyMarkup = await this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private async getReplyMarkup() {\r\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup() as any;\r\n }\r\n\r\n this.element.textContent = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n setInnerHTML(btn, wrapEmojiText(button.text));\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup();\r\n }\r\n\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport GifsMasonry from \"../gifsMasonry\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport renderImageWithFadeIn from \"../../helpers/dom/renderImageWithFadeIn\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\r\nimport generateQId from \"../../lib/appManagers/utils/inlineBots/generateQId\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n ...this.chat.getMessageSendingParams(),\r\n clearDraft: true,\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.managers.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n setInnerHTML(title, wrapEmojiText(item.title));\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n setInnerHTML(description, wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n }));\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then((blob) => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then((dataURL) => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport callbackify from \"../../helpers/callbackify\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport { processPeerFullForCommands } from \"./commandsHelper\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n \n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n \n // this.container.style.top = \n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { AckedResult } from \"../lib/mtproto/superMessagePort\";\r\nimport { Modify } from \"../types\";\r\n\r\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\r\n return {\r\n cached: acked.cached,\r\n result: acked.cached ? await acked.result : acked.result\r\n };\r\n}\r\n\r\nexport function modifyAckedPromise(promise: Promise>) {\r\n return promise.then(modifyAckedResult);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport callbackify from \"../../helpers/callbackify\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { modifyAckedPromise } from \"../../helpers/modifyAckedResult\";\r\nimport { ChatFull } from \"../../layer\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { AckedResult } from \"../../lib/mtproto/superMessagePort\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport getChatMembersString from \"../wrappers/getChatMembersString\";\r\n\r\nconst SEND_AS_ANIMATION_DURATION = 300;\r\n\r\nexport default class ChatSendAs {\r\n private avatar: AvatarElement;\r\n private container: HTMLElement;\r\n private closeBtn: HTMLElement;\r\n private btnMenu: HTMLElement;\r\n private sendAsPeerIds: PeerId[];\r\n private sendAsPeerId: PeerId;\r\n private updatingPromise: ReturnType;\r\n private middleware: ReturnType;\r\n private listenerSetter: ListenerSetter;\r\n private peerId: PeerId;\r\n private addedListener: boolean;\r\n\r\n constructor(\r\n private managers: AppManagers,\r\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\r\n private onChange: (sendAsPeerId: PeerId) => void\r\n ) {\r\n this.middleware = getMiddleware();\r\n this.listenerSetter = new ListenerSetter();\r\n this.construct();\r\n }\r\n \r\n private construct() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('new-message-send-as-container');\r\n\r\n this.closeBtn = document.createElement('div');\r\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\r\n\r\n const sendAsButtons: ButtonMenuItemOptions[] = [{\r\n text: 'SendMessageAsTitle',\r\n onClick: undefined\r\n }];\r\n\r\n let previousAvatar: HTMLElement;\r\n const onSendAsMenuToggle = (visible: boolean) => {\r\n if(visible) {\r\n previousAvatar = this.avatar;\r\n }\r\n\r\n const isChanged = this.avatar !== previousAvatar;\r\n const useRafs = !visible && isChanged ? 2 : 0;\r\n\r\n SetTransition(this.closeBtn, 'is-visible', visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n if(!isChanged) {\r\n SetTransition(previousAvatar, 'is-visible', !visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n }\r\n };\r\n\r\n ButtonMenuToggle({\r\n noRipple: true, \r\n listenerSetter: this.listenerSetter, \r\n container: this.container\r\n }, 'top-right', sendAsButtons, () => {\r\n onSendAsMenuToggle(true);\r\n }, () => {\r\n onSendAsMenuToggle(false);\r\n });\r\n\r\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\r\n this.btnMenu = this.container.firstElementChild as any;\r\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\r\n this.container.append(this.closeBtn);\r\n }\r\n\r\n private async updateButtons(peerIds: PeerId[]) {\r\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\r\n const textElement = document.createElement('div');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('btn-menu-item-subtitle');\r\n if(sendAsPeerId.isUser()) {\r\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\r\n } else if(sendAsPeerId === this.peerId) {\r\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\r\n } else {\r\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\r\n }\r\n\r\n textElement.append(\r\n new PeerTitle({peerId: sendAsPeerId}).element,\r\n subtitle\r\n );\r\n\r\n return {\r\n onClick: idx ? async() => {\r\n const currentPeerId = this.peerId;\r\n this.changeSendAsPeerId(sendAsPeerId);\r\n\r\n const middleware = this.middleware.get();\r\n const executeButtonsUpdate = () => {\r\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\r\n const peerIds = this.sendAsPeerIds.slice();\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n };\r\n \r\n if(rootScope.settings.animationsEnabled) {\r\n setTimeout(executeButtonsUpdate, 250);\r\n } else {\r\n executeButtonsUpdate();\r\n }\r\n\r\n // return;\r\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\r\n } : undefined,\r\n textElement\r\n };\r\n });\r\n\r\n const buttons = await Promise.all(promises);\r\n const btnMenu = ButtonMenu(buttons/* , this.listenerSetter */);\r\n buttons.forEach((button, idx) => {\r\n const peerId = peerIds[idx];\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\r\n avatar.updateWithOptions({peerId});\r\n\r\n if(!idx) {\r\n avatar.classList.add('active');\r\n }\r\n \r\n button.element.prepend(avatar);\r\n });\r\n\r\n Array.from(this.btnMenu.children).slice(1).forEach((node) => node.remove());\r\n this.btnMenu.append(...Array.from(btnMenu.children));\r\n }\r\n\r\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n const previousAvatar = this.avatar;\r\n if(previousAvatar) {\r\n if(previousAvatar.peerId === sendAsPeerId) {\r\n return;\r\n }\r\n }\r\n \r\n if(!previousAvatar) {\r\n skipAnimation = true;\r\n }\r\n \r\n let useRafs = skipAnimation ? 0 : 2;\r\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\r\n const avatar = this.avatar = new AvatarElement();\r\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\r\n await avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: sendAsPeerId\r\n });\r\n\r\n SetTransition(avatar, 'is-visible', true, duration, undefined, useRafs); \r\n if(previousAvatar) {\r\n SetTransition(previousAvatar, 'is-visible', false, duration, () => {\r\n previousAvatar.remove();\r\n }, useRafs);\r\n }\r\n \r\n this.container.append(avatar);\r\n }\r\n\r\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n this.sendAsPeerId = sendAsPeerId;\r\n this.onChange(sendAsPeerId);\r\n return this.updateAvatar(sendAsPeerId, skipAnimation);\r\n }\r\n\r\n private getDefaultSendAs(): Promise> {\r\n // return rootScope.myId;\r\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\r\n return {\r\n cached: acked.cached,\r\n result: acked.result.then((channelFull) => {\r\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\r\n })\r\n };\r\n });\r\n }\r\n \r\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\r\n const peerId = this.peerId;\r\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\r\n return;\r\n }\r\n\r\n const middleware = this.middleware.get(() => {\r\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\r\n });\r\n\r\n const {container} = this;\r\n const chatId = peerId.toChatId();\r\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\r\n // const result = Promise.resolve(this.getDefaultSendAs());\r\n\r\n const wasSkippingAnimation = skipAnimation;\r\n if(result instanceof Promise) {\r\n skipAnimation = undefined;\r\n }\r\n\r\n const auto = wasSkippingAnimation && !skipAnimation;\r\n\r\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\r\n if(!middleware() || sendAsPeerId === undefined) return;\r\n \r\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\r\n if(!middleware()) return;\r\n\r\n this.managers.appChatsManager.getSendAs(chatId).then((peers) => {\r\n if(!middleware()) return;\r\n\r\n const peerIds = peers.map((peer) => getPeerId(peer));\r\n this.sendAsPeerIds = peerIds.slice();\r\n\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n });\r\n\r\n const callback = () => {\r\n this.onReady(container, skipAnimation);\r\n\r\n if(!this.addedListener) {\r\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\r\n if(this.peerId === peerId) {\r\n this.update();\r\n }\r\n });\r\n\r\n this.addedListener = true;\r\n }\r\n };\r\n\r\n if(auto) {\r\n callback();\r\n return;\r\n }\r\n\r\n return callback;\r\n });\r\n\r\n updatingPromise.finally(() => {\r\n if(this.updatingPromise === updatingPromise) {\r\n this.updatingPromise = undefined;\r\n }\r\n });\r\n\r\n if(!auto) {\r\n return updatingPromise;\r\n }\r\n }\r\n\r\n public update(skipAnimation?: boolean) {\r\n return this.updateManual(skipAnimation).then((callback) => callback && callback());\r\n }\r\n\r\n public setPeerId(peerId?: PeerId) {\r\n /* if(this.avatar) {\r\n this.avatar.remove();\r\n this.avatar = undefined;\r\n } */\r\n\r\n this.middleware.clean();\r\n this.updatingPromise = undefined;\r\n this.peerId = peerId;\r\n }\r\n\r\n public destroy() {\r\n this.container.remove();\r\n this.setPeerId();\r\n this.listenerSetter.removeAll();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message, ChatFull, UserFull } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { putPreloader } from '../putPreloader';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { BOT_START_PARAM, NULL_PEER_ID } from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ChatBotCommands from './botCommands';\r\nimport copy from '../../helpers/object/copy';\r\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\r\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\r\nimport PopupElement from '../popups';\r\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\r\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\r\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\r\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\r\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\r\nimport wrapDraft from '../wrappers/draft';\r\nimport wrapMessageForReply from '../wrappers/messageForReply';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport { AppManagers } from '../../lib/appManagers/managers';\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { emojiFromCodePoints } from \"../../vendor/emoji\";\r\nimport { modifyAckedPromise } from \"../../helpers/modifyAckedResult\";\r\nimport ChatSendAs from \"./sendAs\";\r\nimport filterAsync from \"../../helpers/array/filterAsync\";\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean | Promise})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n private botCommandsToggle: HTMLElement;\r\n private botCommands: ChatBotCommands;\r\n private botCommandsIcon: HTMLDivElement;\r\n private hasBotCommands: boolean;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n private sendAs: ChatSendAs;\r\n public sendAsPeerId: PeerId;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appImManager: AppImManager, \r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input', 'hide');\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach((group) => {\r\n const container = RadioForm(group.elements.map((e) => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((mid) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n \r\n if(mid) {\r\n this.chat.setMessageId(mid);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n managers: this.managers,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n\r\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\r\n this.botCommandsToggle = document.createElement('div');\r\n this.botCommandsToggle.classList.add('new-message-bot-commands');\r\n\r\n const scaler = document.createElement('div');\r\n scaler.classList.add('new-message-bot-commands-icon-scale');\r\n\r\n const icon = this.botCommandsIcon = document.createElement('div');\r\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\r\n scaler.append(icon);\r\n this.botCommandsToggle.append(scaler);\r\n\r\n attachClickEvent(this.botCommandsToggle, (e) => {\r\n cancelEvent(e);\r\n const isShown = icon.classList.contains('state-back');\r\n if(isShown) {\r\n this.botCommands.toggle(true);\r\n icon.classList.remove('state-back');\r\n } else {\r\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\r\n icon.classList.add('state-back');\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.botCommands.addEventListener('visible', () => {\r\n icon.classList.add('state-back');\r\n });\r\n\r\n this.botCommands.addEventListener('hiding', () => {\r\n icon.classList.remove('state-back');\r\n });\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n //this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.managers);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.chat.peerId]) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then((result) => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.managers.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n \r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n //scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform, \r\n borderRadius, \r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer && \r\n neededFakeContainer.classList.contains('chat-input-control') && \r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom, \r\n widthTo\r\n };\r\n }\r\n\r\n public async center(animate = false) {\r\n return this._center(await this.getNeededFakeContainer(), animate);\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public async getNeededFakeContainer() {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(\r\n this.startParam !== undefined || \r\n !(await this.chat.canSend()) || \r\n this.chat.type === 'pinned' || \r\n await this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public async setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n \r\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true),\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.classList.add('hide');\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n const wrappedDraft = wrapDraft(draft);\r\n\r\n if(this.messageInputField.value === wrappedDraft && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n private createSendAs() {\r\n this.sendAsPeerId = undefined;\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n let firstChange = true;\r\n this.sendAs = new ChatSendAs(\r\n this.managers,\r\n (container, skipAnimation) => {\r\n let useRafs = 0;\r\n if(!container.parentElement) {\r\n this.newMessageWrapper.prepend(container);\r\n useRafs = 2;\r\n }\r\n\r\n this.updateOffset('as', true, skipAnimation, useRafs);\r\n },\r\n (sendAsPeerId) => {\r\n this.sendAsPeerId = sendAsPeerId;\r\n\r\n // do not change placeholder earlier than finishPeerChange does\r\n if(firstChange) {\r\n firstChange = false;\r\n return;\r\n }\r\n\r\n this.getPlaceholderKey().then((key) => {\r\n this.updateMessageInputPlaceholder(key);\r\n });\r\n }\r\n );\r\n } else {\r\n this.sendAs = undefined;\r\n }\r\n\r\n return this.sendAs;\r\n }\r\n\r\n public async finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\r\n \r\n const previousSendAs = this.sendAs;\r\n const sendAs = this.createSendAs();\r\n\r\n const [\r\n isBroadcast, \r\n canPinMessage, \r\n isBot, \r\n canSend, \r\n neededFakeContainer, \r\n ackedPeerFull, \r\n ackedScheduledMids, \r\n setSendAsCallback,\r\n filteredAttachMenuButtons\r\n ] = await Promise.all([\r\n this.managers.appPeersManager.isBroadcast(peerId),\r\n this.managers.appPeersManager.canPinMessage(peerId),\r\n this.managers.appPeersManager.isBot(peerId),\r\n this.chat.canSend(),\r\n this.getNeededFakeContainer(),\r\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\r\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\r\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\r\n this.filterAttachMenuButtons()\r\n ]);\r\n\r\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\r\n\r\n return () => {\r\n // console.warn('[input] finishpeerchange start');\r\n \r\n chatInput.classList.remove('hide');\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n \r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n \r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', canPinMessage);\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n \r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n \r\n if(btnScheduled && ackedScheduledMids) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n callbackify(ackedScheduledMids.result, (mids) => {\r\n if(!middleware() || !mids) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n \r\n if(this.newMessageWrapper) {\r\n this.updateOffset(null, false, true);\r\n }\r\n \r\n if(botCommandsToggle) {\r\n this.hasBotCommands = undefined;\r\n this.botCommands.toggle(true, undefined, true);\r\n this.updateBotCommandsToggle(true);\r\n botCommandsToggle.remove();\r\n if(isBot) {\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const result = ackedPeerFull.result;\r\n callbackify(result, (userFull) => {\r\n if(!middleware()) return;\r\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\r\n });\r\n }\r\n }\r\n\r\n if(previousSendAs) {\r\n previousSendAs.destroy();\r\n }\r\n\r\n if(setSendAsCallback) {\r\n setSendAsCallback();\r\n }\r\n \r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n \r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n \r\n if(this.messageInput) {\r\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n \r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n \r\n this.startParam = startParam;\r\n \r\n this._center(neededFakeContainer, false);\r\n\r\n // console.warn('[input] finishpeerchange ends');\r\n };\r\n }\r\n\r\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\r\n if(type) {\r\n this.newMessageWrapper.dataset.offset = type;\r\n } else {\r\n delete this.newMessageWrapper.dataset.offset;\r\n }\r\n\r\n SetTransition(this.newMessageWrapper, 'has-offset', forwards, skipAnimation ? 0 : 300, undefined, useRafs);\r\n }\r\n\r\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\r\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\r\n this.updateBotCommandsToggle(skipAnimation);\r\n }\r\n\r\n private updateBotCommandsToggle(skipAnimation?: boolean) {\r\n const {botCommandsToggle, hasBotCommands} = this;\r\n\r\n const show = !!hasBotCommands && this.isInputEmpty();\r\n if(!hasBotCommands) {\r\n if(!botCommandsToggle.parentElement) {\r\n return;\r\n }\r\n \r\n botCommandsToggle.remove();\r\n }\r\n \r\n const forwards = show;\r\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\r\n\r\n if(!botCommandsToggle.parentElement) {\r\n this.newMessageWrapper.prepend(botCommandsToggle);\r\n }\r\n\r\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\r\n }\r\n\r\n private async getPlaceholderKey() {\r\n const {peerId, threadId} = this.chat;\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(\r\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) || \r\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\r\n ) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n return key;\r\n }\r\n\r\n private updateMessageInputPlaceholder(key: LangPackKey) {\r\n // console.warn('[input] update placeholder');\r\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\r\n if(!i) {\r\n return;\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n\r\n private filterAttachMenuButtons() {\r\n if(!this.attachMenuButtons) return;\r\n const {peerId, threadId} = this.chat;\r\n return filterAsync(this.attachMenuButtons, (button) => {\r\n return button.verify(peerId, threadId);\r\n });\r\n }\r\n\r\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canSend;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canSend);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n this.updateMessageInputPlaceholder(placeholderKey);\r\n\r\n this.attachMenuButtons && this.attachMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !visible.includes(button));\r\n });\r\n\r\n if(!canSend) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n if(attachMenu) {\r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n }\r\n \r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const MONOSPACE_FONT = 'var(--font-monospace)';\r\n const SPOILER_FONT = 'spoiler';\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\r\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace' || type === 'spoiler') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(this.resetCurrentFormatting());\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private resetCurrentFormatting() {\r\n return document.execCommand('fontName', false, 'Roboto');\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = parseEntities(value);\r\n const value = parseMarkdown(richValue, markdownEntities, true);\r\n const entities = mergeEntities(markdownEntities, parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n //console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n \r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n const isEmpty = !richValue.trim();\r\n if(isEmpty) {\r\n if(this.lastTimeType) {\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n\r\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\r\n // * so have to reset formatting\r\n if(document.activeElement === this.messageInput) {\r\n // document.execCommand('styleWithCSS', false, 'true');\r\n setTimeout(() => {\r\n if(document.activeElement === this.messageInput) {\r\n this.resetCurrentFormatting();\r\n }\r\n }, 0);\r\n // document.execCommand('styleWithCSS', false, 'false');\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n\r\n if(this.botCommands) {\r\n this.botCommands.toggle(true);\r\n }\r\n }\r\n\r\n if(this.botCommands) {\r\n this.updateBotCommandsToggle();\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = parseEntities(fullValue);\r\n mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach((entity) => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = parseMarkdown(value, entities, true);\r\n entities = mergeEntities(entities, parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n await this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\r\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = async(e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend('send_media'))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach((value) => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n contextMenuController.openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const forwarding = copy(this.forwarding);\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(forwarding, () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = await this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter((entity) => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach((entity) => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {peerId} = chat;\r\n const {noWebPage} = this;\r\n const sendingParams = this.chat.getMessageSendingParams();\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.managers.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.managers.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n ...sendingParams,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n ...sendingParams,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public async sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = await this.managers.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.managers.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n ...this.chat.getMessageSendingParams(),\r\n isMedia: true, \r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public async initMessageEditing(mid: number) {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n\r\n let input = documentFragmentToHTML(wrapDraftText(message.message, {entities: message.totalEntities}));\r\n const f = async() => {\r\n const replyFragment = await wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = async() => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n const p = fromPeerIds.map(async(fromPeerId) => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n const promises = mids.map(async(mid) => {\r\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n await Promise.all(promises);\r\n\r\n length += mids.length;\r\n });\r\n\r\n await Promise.all(p);\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map((smth) => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = await wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public async initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message = await this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(!message) { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.managers.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(!message) {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const {container} = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(container);\r\n } else {\r\n replyParent.insertBefore(container, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n container.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return container;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport documentFragmentToHTML from \"../../helpers/dom/documentFragmentToHTML\";\nimport { DraftMessage } from \"../../layer\";\nimport mergeEntities from \"../../lib/richTextProcessor/mergeEntities\";\nimport parseEntities from \"../../lib/richTextProcessor/parseEntities\";\nimport wrapDraftText from \"../../lib/richTextProcessor/wrapDraftText\";\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return documentFragmentToHTML(wrapDraftText(draft.message, {entities: totalEntities}));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport ripple from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Message } from \"../../layer\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n \r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n \r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n \r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n \r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n \r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n \r\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n \r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n \r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public isVisible() {\r\n return !this.divAndCaption.container.classList.contains('hide');\r\n }\r\n\r\n public isFloating() {\r\n return this.divAndCaption.container.classList.contains('is-floating');\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport rootScope from \"../lib/rootScope\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport RangeSelector from \"./rangeSelector\";\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01, \n min: 0, \n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n //console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n },\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController, { AppMediaPlaybackController } from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport ButtonIcon from \"../buttonIcon\";\nimport { DocumentAttribute } from \"../../layer\";\nimport MediaProgressLine from \"../mediaProgressLine\";\nimport VolumeSelector from \"../volumeSelector\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n \n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport { Message } from \"../../layer\";\r\nimport { logger } from \"../../lib/logger\";\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n \r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);//this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n //this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\r\n const byDecimal = Array.from('' + number).map((n) => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n //const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n //decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n //this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n private static LOAD_COUNT = 50;\r\n private static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n private pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n private pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n private wasPinnedIndex = 0;\r\n private wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n private waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n private mids: number[] = [];\r\n private offsetIndex = 0;\r\n\r\n private loading = false;\r\n private loadedBottom = false;\r\n private loadedTop = false;\r\n\r\n private animatedSubtitle: AnimatedSuper;\r\n private animatedMedia: AnimatedSuper;\r\n private animatedCounter: AnimatedCounter;\r\n\r\n private listenerSetter: ListenerSetter;\r\n private scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n private getCurrentIndexPromise: Promise = null;\r\n private btnOpen: HTMLButtonElement;\r\n \r\n private setPinnedMessage: () => void;\r\n\r\n private isStatic: boolean;\r\n\r\n private debug: boolean;\r\n \r\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\r\n\r\n private log: ReturnType;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.log = logger('PM');\r\n this.debug = true;\r\n this.isStatic = false;\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\r\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.chat.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n // return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.log('setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.log('testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.log('testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\r\n log && log('start', mid, correctAfter);\r\n\r\n let gotRest = false;\r\n const promises = [\r\n this.managers.appMessagesManager.getSearch({\r\n peerId: this.chat.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then((r) => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).then((p) => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map((message) => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.log.error('getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.log.error('handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = await this.chat.getMessage(mid);\r\n if(!message) {\r\n return;\r\n }\r\n \r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = await this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: (message as Message.message).message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n //});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from \"../../helpers/tsNow\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport { MUTE_UNTIL } from \"../../lib/mtproto/mtproto_config\";\nimport RadioField from \"../radioField\";\nimport Row, { RadioFormFromRows } from \"../row\";\nimport { SettingSection } from \"../sidebarLeft\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer(peerId, time === -1 ? MUTE_UNTIL : tsNow(true) + time);\n }\n }],\n body: true\n });\n\n const ONE_HOUR = 3600;\n const times: {time: number, langKey: LangPackKey}[] = [{\n time: ONE_HOUR, \n langKey: 'ChatList.Mute.1Hour'\n }, {\n time: ONE_HOUR * 4, \n langKey: 'ChatList.Mute.4Hours'\n }, {\n time: ONE_HOUR * 8, \n langKey: 'ChatList.Mute.8Hours'\n }, {\n time: ONE_HOUR * 24, \n langKey: 'ChatList.Mute.1Day'\n }, {\n time: ONE_HOUR * 24 * 3,\n langKey: 'ChatList.Mute.3Days'\n }, {\n time: -1,\n langKey: 'ChatList.Mute.Forever'\n }];\n \n const name = 'mute-time';\n const rows = times.map((time) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: time.langKey, \n name, \n value: '' + time.time\n })\n });\n\n return row;\n });\n\n let time: number;\n const radioForm = RadioFormFromRows(rows, (value) => {\n time = +value;\n });\n\n rows[rows.length - 1].radioField.checked = true;\n\n const section = new SettingSection({noShadow: true, noDelimiter: true});\n section.content.append(radioForm);\n this.body.append(section.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n \n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\r\n\r\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getGroupCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'group_call_connect.mp3',\r\n 'group_call_end.mp3',\r\n 'group_call_start.mp3',\r\n 'voip_onallowtalk.mp3'\r\n ]);\r\n}\r\n","import constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../../environment/constraintSupport\";\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach((constraint) => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean, \n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamConstraints = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n \n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach((x) => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from \"./getScreenStream\";\nimport getStream from \"./getStream\";\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true, \n constraints: DisplayMediaStreamConstraints,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints, \n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then((stream) => out.audio = stream),\n constraints.video && cache.video.then((stream) => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","import simulateEvent from \"../../../helpers/dom/dispatchEvent\";\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n \n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport LocalConferenceDescription, { ConferenceEntry } from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport { GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n \n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n \n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach((ssrcGroup) => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n \n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n \n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n \n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map((type) => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`,\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n \n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach((hdrext) => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n \n payloadTypes.forEach((type) => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n \n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n \n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach((fb) => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n \n public addConference(options: {\n conference: LocalConferenceDescription, \n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean, \n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n \n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { fixMediaLineType, WebRTCLineType } from './sdpBuilder';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach((track) => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find((item) => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter((x) => x.type === 'input');\n const audioItems = filteredItems.filter((x) => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n StreamManager.ANALYSER_LISTENER.dispatchEvent('amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach((track) => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n \n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type, \n /* type === 'video' || type === 'screencast' ? \n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry((entry) => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find((transceiver) => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch((err) => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach((track) => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\nimport noop from \"../../helpers/noop\";\nimport { logger } from \"../logger\";\nimport getAudioConstraints from \"./helpers/getAudioConstraints\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getStreamCached from \"./helpers/getStreamCached\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager, { StreamItem } from \"./streamManager\";\n\nexport type TryAddTrackOptions = {\n stream: MediaStream, \n track: MediaStreamTrack, \n type: StreamItem['type'], \n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n \n return this.getStream({\n constraints, \n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0], \n track: event.track, \n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream, \n track, \n type: 'input', \n source: type || 'main'\n });\n }\n \n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n \n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n \n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n \n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n \n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach((track) => {\n stopTrack(track);\n });\n }\n }\n}\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT } from './sdpBuilder';\nimport { AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec } from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n \n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n \n return {\n endpoint,\n type,\n source,\n sourceGroups,\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n \n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n \n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n \n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find((entry) => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n \n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport { logger } from \"../logger\";\nimport createDataChannel from \"./helpers/createDataChannel\";\nimport createPeerConnection from \"./helpers/createPeerConnection\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find((line) => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map((section) => section.lines))\n .map((line) => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach((str) => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter((line) => line.key === 'o').map((line) => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach((lineStr) => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach((ssrc) => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \"../sdp\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { toTelegramSource } from \"../utils\";\nimport { parseSourceGroups } from \"./parseSourceGroups\";\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n fingerprint: true,\n setup: true,\n ssrc: true,\n mid: true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find((line) => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipantVideoSourceGroup } from \"../../../layer\";\nimport { toTelegramSource } from \"../utils\";\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map((str) => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map((ssrc) => +ssrc)\n sources: rest.map((ssrc) => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex((g) => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCallConnectionType, JoinGroupCallJsonPayload } from \"../appManagers/appGroupCallsManager\";\nimport { AppManagers } from \"../appManagers/managers\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport GroupCallInstance from \"./groupCallInstance\";\nimport filterServerCodecs from \"./helpers/filterServerCodecs\";\nimport fixLocalOffer from \"./helpers/fixLocalOffer\";\nimport processMediaSection from \"./helpers/processMediaSection\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({ \n iceServers: [], \n iceTransportPolicy: 'all', \n bundlePolicy: 'max-bundle', \n rtcpMuxPolicy: 'require', \n iceCandidatePoolSize: 0, \n // sdpSemantics: \"unified-plan\", \n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach((type) => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map((section) => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n const audioChannel = processedChannels.find((channel) => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find((channel) => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach((entry) => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n\n const update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n \n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer, \n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter((media) => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n \n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n \n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find((section) => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle, \n entries, \n isAnswer\n })\n };\n\n entriesToDelete.forEach((entry) => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n \n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n \n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { DataJSON } from \"../../../layer\";\nimport { JoinGroupCallJsonPayload } from \"../../appManagers/appGroupCallsManager\";\nimport SDP from \"../sdp\";\nimport { Ssrc } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n fingerprints: [sectionInfo.fingerprint],\n pwd: sectionInfo.pwd,\n ssrc: sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n ufrag: sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params, \n source: sectionInfo.source, \n media, \n sourceGroups: sectionInfo.sourceGroups, \n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { UpdateGroupCallConnectionData, Codec } from \"../types\";\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map((data) => {\n return */['audio' as const, 'video' as const].filter((type) => data[type]).map((type) => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find((line) => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec[\"rtp-hdrexts\"], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\nimport copy from \"../../../helpers/object/copy\";\nimport { ConferenceEntry } from \"../localConferenceDescription\";\nimport { parseSdp, addSimulcast } from \"../sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"../sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find((line) => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map((payload) => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { GroupCallConnectionType, GroupCallId, GroupCallOutputSource } from \"../appManagers/appGroupCallsManager\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport { logger } from \"../logger\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport CallInstanceBase, { TryAddTrackOptions } from \"./callInstanceBase\";\nimport GroupCallConnectionInstance from \"./groupCallConnectionInstance\";\nimport GROUP_CALL_STATE from \"./groupCallState\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getScreenStream from \"./helpers/getScreenStream\";\nimport getStream from \"./helpers/getStream\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription from \"./localConferenceDescription\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\nimport getPeerId from \"../appManagers/utils/peers/getPeerId\";\nimport { AppManagers } from \"../appManagers/managers\";\nimport { generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant } from \"./groupCallsController\";\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n \n // will be set with negotiation\n public joined: boolean;\n \n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return this.managers.appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(participant, {muted});\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise ??= this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n });\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await this.editParticipant(this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise ??= this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n });\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await this.editParticipant(this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n \n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n // let processUpdate = true;\n if(participant) {\n // const {currentGroupCall} = this;\n // const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach((oldSsrc) => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find((ssrc) => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getGroupCallAudioAsset from \"../../components/groupCall/getAudioAsset\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup } from \"../../layer\";\r\nimport { GroupCallId, GroupCallConnectionType } from \"../appManagers/appGroupCallsManager\";\r\nimport { AppManagers } from \"../appManagers/managers\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport GroupCallInstance from \"./groupCallInstance\";\r\nimport GROUP_CALL_STATE from \"./groupCallState\";\r\nimport createMainStreamManager from \"./helpers/createMainStreamManager\";\r\nimport { generateSsrc } from \"./localConferenceDescription\";\r\nimport { WebRTCLineType } from \"./sdpBuilder\";\r\nimport StreamManager from \"./streamManager\";\r\nimport { Ssrc } from \"./types\";\r\n\r\nlet IS_MUTED = true;\r\n\r\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\r\n return [\r\n makeSsrcFromParticipant(participant, 'audio', participant.source),\r\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\r\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\r\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\r\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\r\n ].filter(Boolean);\r\n};\r\n\r\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\r\n return generateSsrc(type, source, endpoint);\r\n}\r\n\r\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\r\n return source && {\r\n _: 'groupCallParticipantVideo',\r\n pFlags: {},\r\n endpoint: '',\r\n source_groups: source.sourceGroups,\r\n audio_source: audioSource\r\n };\r\n}\r\n\r\nexport class GroupCallsController extends EventListenerBase<{\r\n instance: (instance: GroupCallInstance) => void\r\n}> {\r\n private audioAsset: ReturnType;\r\n private log: ReturnType;\r\n private currentGroupCall: GroupCallInstance;\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.audioAsset = getGroupCallAudioAsset();\r\n this.log = logger('GCC');\r\n\r\n rootScope.addEventListener('group_call_update', (groupCall) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCall.id) {\r\n currentGroupCall.groupCall = groupCall;\r\n \r\n if(groupCall._ === 'groupCallDiscarded') {\r\n currentGroupCall.hangUp(false, false, true);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCallId) {\r\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\r\n }\r\n });\r\n }\r\n\r\n get groupCall() {\r\n return this.currentGroupCall;\r\n }\r\n\r\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\r\n this.currentGroupCall = groupCall;\r\n\r\n if(groupCall) {\r\n this.dispatchEvent('instance', groupCall);\r\n }\r\n }\r\n\r\n public startConnectingSound() {\r\n this.stopConnectingSound();\r\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\r\n }\r\n \r\n public stopConnectingSound() {\r\n this.audioAsset.stopSound();\r\n this.audioAsset.cancelDelayedPlay();\r\n }\r\n\r\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\r\n this.audioAsset.createAudio();\r\n\r\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\r\n \r\n let streamManager: StreamManager;\r\n if(rejoin) {\r\n streamManager = this.currentGroupCall.connections.main.streamManager;\r\n } else {\r\n streamManager = await createMainStreamManager(muted, joinVideo);\r\n }\r\n\r\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\r\n }\r\n\r\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\r\n const log = this.log.bindPrefix('joinGroupCallInternal');\r\n log('start', groupCallId);\r\n\r\n const type: GroupCallConnectionType = 'main';\r\n\r\n let {currentGroupCall} = this;\r\n if(currentGroupCall && rejoin) {\r\n // currentGroupCall.connections.main.connection = connection;\r\n currentGroupCall.handleUpdateGroupCallParticipants = false;\r\n currentGroupCall.updatingSdp = false;\r\n log('update currentGroupCall', groupCallId, currentGroupCall);\r\n } else {\r\n currentGroupCall = new GroupCallInstance({\r\n chatId,\r\n id: groupCallId,\r\n managers: this.managers\r\n });\r\n\r\n currentGroupCall.fixSafariAudio();\r\n\r\n currentGroupCall.addEventListener('state', (state) => {\r\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\r\n this.setCurrentGroupCall(null);\r\n this.stopConnectingSound();\r\n this.audioAsset.playSound('group_call_end.mp3');\r\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\r\n }\r\n });\r\n\r\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\r\n\r\n const connectionInstance = currentGroupCall.createConnectionInstance({\r\n streamManager,\r\n type,\r\n options: {\r\n type,\r\n isMuted: muted,\r\n joinVideo,\r\n rejoin\r\n }\r\n });\r\n\r\n const connection = connectionInstance.createPeerConnection();\r\n connection.addEventListener('negotiationneeded', () => {\r\n connectionInstance.negotiate();\r\n });\r\n\r\n connection.addEventListener('track', (event) => {\r\n log('ontrack', event);\r\n currentGroupCall.onTrack(event);\r\n });\r\n \r\n connection.addEventListener('iceconnectionstatechange', () => {\r\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\r\n \r\n const {iceConnectionState} = connection;\r\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\r\n this.startConnectingSound();\r\n } else {\r\n this.stopConnectingSound();\r\n }\r\n \r\n switch(iceConnectionState) {\r\n case 'checking': {\r\n break;\r\n }\r\n \r\n case 'closed': {\r\n currentGroupCall.hangUp();\r\n break;\r\n }\r\n \r\n case 'completed': {\r\n break;\r\n }\r\n \r\n case 'connected': {\r\n if(!currentGroupCall.joined) {\r\n currentGroupCall.joined = true;\r\n this.audioAsset.playSound('group_call_start.mp3');\r\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\r\n }\r\n \r\n break;\r\n }\r\n \r\n case 'disconnected': {\r\n break;\r\n }\r\n \r\n case 'failed': {\r\n //TODO: replace with ICE restart\r\n currentGroupCall.hangUp();\r\n // connection.restartIce();\r\n break;\r\n }\r\n \r\n case 'new': {\r\n break;\r\n }\r\n }\r\n });\r\n\r\n connectionInstance.createDescription();\r\n connectionInstance.createDataChannel();\r\n\r\n connectionInstance.appendStreamToConference();\r\n\r\n this.setCurrentGroupCall(currentGroupCall);\r\n log('set currentGroupCall', groupCallId, currentGroupCall);\r\n\r\n this.startConnectingSound();\r\n\r\n return connectionInstance.negotiate();\r\n }\r\n }\r\n}\r\n\r\nconst groupCallsController = new GroupCallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\r\nexport default groupCallsController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../constants\";\nimport StreamManager from \"../streamManager\";\nimport getAudioConstraints from \"./getAudioConstraints\";\nimport getStream from \"./getStream\";\nimport getVideoConstraints from \"./getVideoConstraints\";\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n \n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull, Chat as MTChat, GroupCall } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport { CallType } from \"../../lib/calls/types\";\nimport PopupMute from \"../popups/mute\";\nimport generateTitleIcons from \"../generateTitleIcons\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport hasRights from \"../../lib/appManagers/utils/chats/hasRights\";\nimport wrapPeerTitle from \"../wrappers/peerTitle\";\nimport groupCallsController from \"../../lib/calls/groupCallsController\";\nimport apiManagerProxy from \"../../lib/mtproto/mtprotoworker\";\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: ButtonToVerify['verify']})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null, \n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null, \n this.btnJoin, \n this.btnPinned, \n this.btnCall, \n this.btnGroupCall, \n this.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n \n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n //if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n //}\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n //const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: ButtonToVerify['verify']) {\n if(!element) {\n return;\n }\n \n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const r = async() => {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n if(isMenuOpen) {\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n \n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') || \n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((channelFull) => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: async() => {\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.appPeersManager.isContact(this.peerId))\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.managers.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: async() => this.chat.type === 'chat' && !!(await this.managers.appMessagesManager.getDialogOnly(this.peerId))\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n \n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId, \n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, \n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n //this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n if(this.chatAudio) {\n this.chatAudio.destroy();\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const peerId = this.peerId;\n\n let newAvatar: AvatarElement;\n if(this.avatarElement) {\n newAvatar = this.constructAvatar();\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(isAnyChat) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !chat?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(newAvatar) {\n this.avatarElement.replaceWith(newAvatar);\n this.avatarElement = newAvatar;\n }\n \n this.setUtilsWidth();\n \n this.verifyButtons();\n \n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.chat.wasAlreadyUsed) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n \n setTitleCallback();\n setStatusCallback && setStatusCallback();\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const peerId = this.peerId;\n const middleware = () => this.peerId === peerId;\n let titleEl: HTMLElement, icons: Element[];\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.managers.appMessagesManager.getScheduledMessages(peerId).then((mids) => {\n if(!middleware()) return;\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.managers.appMessagesManager.getHistory(peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(([historyResult]) => {\n if(!middleware()) return;\n const count = historyResult?.count;\n if(typeof(count) !== 'number') {\n setTimeout(() => {\n if(!middleware()) return;\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n [titleEl, icons] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true\n }),\n generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n if(icons) {\n this.title.append(...icons);\n }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = await this.managers.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(await this.managers.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus(\n peerId, \n this.subtitle, \n needClear, \n false, \n () => peerId === this.peerId\n );\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n if(callback) {\n callback();\n }\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupElement from \"../../popups\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport ripple from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\nimport PopupElement from \"../popups\";\r\nimport { DIALOG_LIST_ELEMENT_TAG } from \"../../lib/appManagers/appDialogsManager\";\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n \r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n \r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.container.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n \r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n \r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.container.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private img: HTMLImageElement;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise = \n // this.pattern = \n // this.exportCanvasPatternToImagePromise = \n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.img = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => img);\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n \n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n if(context.fillStyle instanceof CanvasPattern) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n // const perf = performance.now();\n const img = this.img;\n\n let imageWidth = img.width, imageHeight = img.height;\n // if(imageHeight < canvas.height) {\n const ratio = canvas.height / imageHeight;\n imageWidth *= ratio;\n imageHeight = canvas.height;\n // }\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, canvas.width, canvas.height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n for(let x = 0; x < canvas.width; x += imageWidth) {\n for(let y = 0; y < canvas.height; y += imageHeight) {\n context.drawImage(img, x, y, imageWidth, imageHeight);\n }\n }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, canvas.width, canvas.height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n canvas.width = this.options.width * devicePixelRatio;\n canvas.height = this.options.height * devicePixelRatio * (mediaSizes.activeScreen === ScreenSize.large ? 1.5 : 1);\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { ChatRights } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { MessagesStorageKey } from \"../../lib/appManagers/appMessagesManager\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport getAutoDownloadSettingsByPeerId, { ChatAutoDownloadSettings } from \"../../helpers/autoDownload\";\nimport ChatBackgroundGradientRenderer from \"./gradientRenderer\";\nimport ChatBackgroundPatternRenderer from \"./patternRenderer\";\nimport pause from \"../../helpers/schedulers/pause\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport SlicedArray from \"../../helpers/slicedArray\";\nimport themeController from \"../../helpers/themeController\";\nimport AppSharedMediaTab from \"../sidebarRight/tabs/sharedMedia\";\nimport noop from \"../../helpers/noop\";\nimport middlewarePromise from \"../../helpers/middlewarePromise\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { Message } from \"../../layer\";\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n \n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n //this.log.error('Chat construction');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground && \n document.documentElement.style.cursor === 'grabbing' && \n this.gradientRenderer && \n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer = \n this.patternRenderer = \n this.gradientCanvas = \n this.patternCanvas = \n // this.renderDarkPattern = \n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n \n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n \n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + Math.abs(intensity));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas, \n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition(item, 'is-visible', true, !skipAnimation ? 200 : 0, prev ? () => {\n if(previousPatternRenderer) {\n previousPatternRenderer.cleanup(previousPatternCanvas);\n }\n\n if(previousGradientRenderer) {\n previousGradientRenderer.cleanup();\n }\n\n prev.remove();\n } : null, 2);\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n promise = Promise.resolve();\n // }\n \n promise.then(cb);\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n if(this.type !== 'scheduled' && !IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.topbar.cleanup();\n this.selection.cleanup();\n }\n \n public async onChangePeer(m: ReturnType) {\n const {peerId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n const [noForwards, isRestricted, isAnyGroup, _, isMegagroup] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId)\n ]));\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer(false, peerId);\n this.appImManager.dispatchEvent('peer_changed', peerId);\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer(samePeer, peerId, lastMsgId, startParam);\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n sharedMediaTab.loadSidebarMedia(true);\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n ]);\n\n const [callbacks] = await Promise.all([\n callbacksPromise,\n sharedMediaTab.fillProfileElements()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', peerId);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(peerId));\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams() {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n sendSilent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { State } from \"../config/state\";\nimport rootScope from \"../lib/rootScope\";\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n \n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport clamp from \"../../helpers/number/clamp\";\r\nimport matchUrl from \"../../lib/richTextProcessor/matchUrl\";\r\nimport matchUrlProtocol from \"../../lib/richTextProcessor/matchUrlProtocol\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach((c) => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach((node) => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\r\n\r\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\r\n \r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n \r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n \r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n \r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n \r\n this.setTooltipPosition();\r\n \r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n \r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n //this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e?: Event) => {\r\n //this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n e && cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n //this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n //this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n const messageInput = this.appImManager.chat.input.messageInput;\r\n if(document.activeElement !== messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else if(this.container && this.container.classList.contains('is-visible')) {\r\n this.setTooltipPosition();\r\n } else if(messageInput.matches(':active')) {\r\n this.setMouseUpEvent();\r\n } else {\r\n this.show();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter((node) => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach((el) => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach((el) => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n \n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n \n this.N = n;\n this.radius = new Array(n + 1);\n \n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n \n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n \n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n \n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n \n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n \n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n \n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n \n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n \n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n \n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n \n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n \n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n \n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n \n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n \n return gradient;\n }\n \n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n \n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n \n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n \n private mounted: boolean;\n private media: MediaQueryList;\n \n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n \n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n \n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n \n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)],\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n \n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n \n this.setSize();\n this.forceUpdate();\n \n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n \n this.draw();\n }\n \n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n \n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n \n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n \n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n \n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n \n this.forceUpdate();\n this.invokeDraw();\n }\n \n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n \n public handleBlur = () => {\n this.focused = false;\n }\n \n private invokeDraw = () => {\n if(this.raf) return;\n \n this.draw();\n }\n \n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n \n // console.log('[top] draw', [focused, resizing, this.mounted]);\n \n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n \n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n \n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n \n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n \n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n \n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n \n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n \n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n \n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n \n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n \n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n \n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n \n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n \n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n \n if(currentState?.stateId === stateId) {\n return;\n }\n \n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n \n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n \n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from \"../../lib/rootScope\";\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(let i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport rootScope from \"../rootScope\";\nimport lottieLoader, { LottieAssetName } from \"./lottieLoader\";\nimport type RLottiePlayer from \"./rlottiePlayer\";\nimport { RLottieColor } from \"./rlottiePlayer\";\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n \n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map((options) => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then((player) => {\n return lottieLoader.waitForFirstFrame(player);\n }).then((player) => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find((part) => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n \n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame, \n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n \n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../helpers/noop\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport { LottieAssetName } from \"../lib/rlottie/lottieLoader\";\nimport RLottieIcon, { RLottieIconItemPartOptions, RLottieIconItemPart } from \"../lib/rlottie/rlottieIcon\";\nimport { RLottieColor } from \"../lib/rlottie/rlottiePlayer\";\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map((item) => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n \n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n \n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach((item) => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RLottieIconItemPartOptions } from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_MICROPHONE_BUTTON_STATE } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, \n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from \"../popups\";\nimport { hexToRgb } from \"../../helpers/color\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport customProperties from \"../../helpers/dom/customProperties\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport { RLottieColor } from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIcon from \"./microphoneIcon\";\nimport GroupCallParticipantsElement from \"./participants\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\nimport PopupPeer from \"../popups/peer\";\nimport GroupCallDescriptionElement from \"./description\";\nimport GroupCallTitleElement from \"./title\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport Scrollable from \"../scrollable\";\nimport { MovableState } from \"../movableElement\";\nimport animationIntersector from \"../animationIntersector\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport makeButton from \"../call/button\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport themeController from \"../../helpers/themeController\";\nimport groupCallsController from \"../../lib/calls/groupCallsController\";\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let color: RLottieColor, colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n color = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor() {\n super('popup-group-call', undefined, {\n body: true,\n withoutOverlay: true,\n closable: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n \n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n \n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n \n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') || \n findUpClassName(target, 'group-call-button') || \n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n \n private onLeaveClick = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true,\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach((element) => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach((element) => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { i18n } from \"../../lib/langPack\";\nimport { GROUP_CALL_PARTICIPANT_MUTED_STATE } from \".\";\nimport { GroupCallParticipantVideoType } from \"./participantVideo\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter((type) => !!participant[type]).map((type) => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n \n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } from \"../../lib/appManagers/appDialogsManager\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport type GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport type LazyLoadQueue from \"../lazyLoadQueue\";\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize = 54;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n \n (base as SortedParticipant).dom = dom;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport EventListenerBase from \"../eventListenerBase\";\nimport ListenerSetter from \"../listenerSetter\";\nimport safeAssign from \"../object/safeAssign\";\nimport findUpClassName from \"./findUpClassName\";\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n \n public setup(options: {\n element: HTMLElement, \n listenerSetter: ListenerSetter, \n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n \n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n \n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n \n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n \n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport { i18n } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport callVideoCanvasBlur from \"../call/videoCanvasBlur\";\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n \n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n \n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n \n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n \n this.container.append(this.header);\n // }\n \n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n \n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport GroupCallParticipantVideoElement, { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n \n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return; \n }\n \n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some((type) => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach((type) => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.managers, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n \n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n \n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n (await instance.participants).forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from \".\";\nimport filterAsync from \"../../helpers/array/filterAsync\";\nimport contextMenuController from \"../../helpers/contextMenuController\";\nimport { attachContextMenuListener } from \"../../helpers/dom/attachContextMenuListener\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, isFullScreen } from \"../../helpers/dom/fullScreen\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport noop from \"../../helpers/noop\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport positionMenu from \"../../helpers/positionMenu\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport Scrollable from \"../scrollable\";\nimport GroupCallParticipantsList from \"./participantsList\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean | Promise})[];\n private element: HTMLDivElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n \n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, async(e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n \n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.closeBtnMenu();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.closeBtnMenu();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n \n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n \n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n const participants = await instance.participants;\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n \n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport I18n, { LangPackKey, FormatterArguments } from \"../../lib/langPack\";\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n } \n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport ripple from \"../ripple\";\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport clamp from \"../helpers/number/clamp\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport windowSize from \"../helpers/windowSize\";\nimport SwipeHandler from \"./swipeHandler\";\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n \n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n \n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach((handler) => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map((side) => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, { MovableElementOptions, MovableState } from \"../components/movableElement\";\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport ListenerSetter from \"./listenerSetter\";\nimport mediaSizes, { ScreenSize } from \"./mediaSizes\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n \n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n \n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport toHHMMSS from \"../../helpers/string/toHHMMSS\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = toHHMMSS(instance.duration, true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport { IS_MOBILE } from \"../../environment/userAgent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport onMediaLoad from \"../../helpers/onMediaLoad\";\nimport themeController from \"../../helpers/themeController\";\nimport toggleClassName from \"../../helpers/toggleClassName\";\nimport CallInstance from \"../../lib/calls/callInstance\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport animationIntersector from \"../animationIntersector\";\nimport AvatarElement from \"../avatar\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIconMini from \"../groupCall/microphoneIconMini\";\nimport { MovableState } from \"../movableElement\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport SetTransition from \"../singleTransition\";\nimport makeButton from \"./button\";\nimport CallDescriptionElement from \"./description\";\nimport callVideoCanvasBlur from \"./videoCanvasBlur\";\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n \n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', undefined, {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n \n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container, \n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') || \n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n \n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n \n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true,\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition(this.partyMutedState, 'is-visible', !!outputState?.muted, 300);\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n this.emojisSubtitle.append(wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach((container) => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n \n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \"../sdp\";\nimport { CallSignalingData, P2PVideoCodec } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n \n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n fingerprints: [info.fingerprint],\n ufrag: info.ufrag,\n pwd: info.pwd,\n audio: undefined,\n video: undefined,\n screencast: undefined\n };\n \n const convertNumber = (number: number) => '' + number;\n \n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n \n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n \n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map((sourceGroup) => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n \n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n \n const payloadTypesMap: Map = new Map();\n \n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n \n return payloadType;\n };\n \n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n \n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n \n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n \n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n \n return data;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport CallInstance from \"./callInstance\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport { parseSdp } from \"./sdp/utils\";\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\r\n\r\nexport type CallAudioAssetName = \"call_busy.mp3\" | \"call_connect.mp3\" | \"call_end.mp3\" | \"call_incoming.mp3\" | \"call_outgoing.mp3\" | \"voip_failed.mp3\" | \"voip_connecting.mp3\";\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'call_busy.mp3',\r\n 'call_connect.mp3',\r\n 'call_end.mp3',\r\n 'call_incoming.mp3',\r\n 'call_outgoing.mp3',\r\n 'voip_failed.mp3'\r\n ]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getCallAudioAsset, { CallAudioAssetName } from \"../../components/call/getAudioAsset\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\r\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport { PhoneCallProtocol } from \"../../layer\";\r\nimport { CallId } from \"../appManagers/appCallsManager\";\r\nimport { AppManagers } from \"../appManagers/managers\";\r\nimport { logger } from \"../logger\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\nimport rootScope from \"../rootScope\";\r\nimport CallInstance from \"./callInstance\";\r\nimport CALL_STATE from \"./callState\";\r\n\r\nconst CALL_REQUEST_TIMEOUT = 45e3;\r\n\r\nexport class CallsController extends EventListenerBase<{\r\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\r\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\r\n incompatible: (userId: UserId) => void,\r\n}> {\r\n private log: ReturnType;\r\n private managers: AppManagers;\r\n private audioAsset: AudioAssetPlayer;\r\n private instances: Map;\r\n private sortedInstances: Array;\r\n private tempId: number;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.log = logger('CC');\r\n\r\n if(!IS_CALL_SUPPORTED) {\r\n return;\r\n }\r\n\r\n this.audioAsset = getCallAudioAsset();\r\n this.tempId = 0;\r\n this.instances = new Map();\r\n this.sortedInstances = [];\r\n\r\n rootScope.addEventListener('call_update', async(call) => {\r\n let instance = this.instances.get(call.id);\r\n\r\n if(instance) {\r\n instance.setPhoneCall(call);\r\n }\r\n \r\n switch(call._) {\r\n case 'phoneCallDiscarded': {\r\n if(instance) {\r\n instance.hangUp(call.reason?._, true);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCallAccepted': {\r\n if(instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n instance.hangUp('phoneCallDiscardReasonDisconnect');\r\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\r\n break;\r\n } */\r\n\r\n instance.confirmCall();\r\n }\r\n\r\n break;\r\n }\r\n \r\n case 'phoneCallRequested': {\r\n if(!instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\r\n break;\r\n } */\r\n\r\n instance = this.createCallInstance({\r\n isOutgoing: false,\r\n interlocutorUserId: call.admin_id\r\n });\r\n \r\n instance.overrideConnectionState(CALL_STATE.PENDING);\r\n instance.setPhoneCall(call);\r\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\r\n }\r\n \r\n break;\r\n }\r\n\r\n case 'phoneCall': {\r\n if(!instance || instance.encryptionKey) {\r\n break;\r\n }\r\n\r\n const g_a = instance.dh.g_a = call.g_a_or_b;\r\n const dh = instance.dh;\r\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\r\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\r\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\r\n break;\r\n }\r\n\r\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\r\n if(call.key_fingerprint !== key_fingerprint) {\r\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint);\r\n break;\r\n }\r\n\r\n instance.encryptionKey = key;\r\n instance.joinCall();\r\n\r\n break;\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\r\n const instance = this.instances.get(callId);\r\n if(instance?.id !== callId) {\r\n return;\r\n }\r\n \r\n instance.onUpdatePhoneCallSignalingData(data);\r\n });\r\n }\r\n\r\n public get currentCall() {\r\n return this.sortedInstances[0];\r\n }\r\n\r\n public getCallByUserId(userId: UserId) {\r\n for(const [callId, instance] of this.instances) {\r\n if(instance.interlocutorUserId === userId) {\r\n return instance;\r\n }\r\n }\r\n }\r\n\r\n private createCallInstance(options: {\r\n isOutgoing: boolean,\r\n interlocutorUserId: UserId,\r\n protocol?: PhoneCallProtocol\r\n }) {\r\n const call = new CallInstance({\r\n managers: this.managers,\r\n ...options,\r\n });\r\n\r\n call.addEventListener('state', (state) => {\r\n const currentCall = this.currentCall;\r\n if(state === CALL_STATE.CLOSED) {\r\n this.instances.delete(call.id);\r\n indexOfAndSplice(this.sortedInstances, call);\r\n } else {\r\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\r\n }\r\n\r\n if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n call.wasTryingToJoin = true;\r\n }\r\n\r\n const hasConnected = call.connectedAt !== undefined;\r\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\r\n } else {\r\n call.clearHangUpTimeout();\r\n }\r\n\r\n if(currentCall === call || !currentCall) {\r\n if(state === CALL_STATE.CLOSED) {\r\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\r\n this.audioAsset.stopSound();\r\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\r\n this.audioAsset.playSound('voip_failed.mp3');\r\n } else {\r\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\r\n }\r\n } else if(state === CALL_STATE.PENDING) {\r\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\r\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\r\n } else if(state === CALL_STATE.CONNECTING) {\r\n if(call.duration) {\r\n this.audioAsset.playSound('voip_connecting.mp3', true);\r\n }\r\n } else {\r\n this.audioAsset.stopSound();\r\n }\r\n }\r\n });\r\n\r\n call.addEventListener('id', (id, prevId) => {\r\n if(prevId !== undefined) {\r\n this.instances.delete(prevId);\r\n }\r\n\r\n const hasCurrent = !!this.currentCall;\r\n this.instances.set(id, call);\r\n\r\n if(prevId === undefined) {\r\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\r\n }\r\n });\r\n\r\n return call;\r\n }\r\n\r\n public async startCallInternal(userId: UserId, isVideo: boolean) {\r\n this.log('p2pStartCallInternal', userId, isVideo);\r\n \r\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\r\n if(!fullInfo) return;\r\n \r\n const {video_calls_available} = fullInfo.pFlags;\r\n \r\n const call = this.createCallInstance({\r\n isOutgoing: true,\r\n interlocutorUserId: userId\r\n });\r\n\r\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\r\n\r\n call.overrideConnectionState(CALL_STATE.REQUESTING);\r\n call.setPhoneCall({\r\n _: 'phoneCallWaiting',\r\n access_hash: '',\r\n admin_id: NULL_PEER_ID,\r\n date: tsNow(true),\r\n id: --this.tempId,\r\n participant_id: userId,\r\n protocol: call.protocol,\r\n pFlags: {\r\n video: isVideo || undefined\r\n }\r\n });\r\n\r\n // return;\r\n this.managers.appCallsManager.generateDh().then(async(dh) => {\r\n call.dh = dh;\r\n\r\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\r\n }).then((phoneCall) => {\r\n call.overrideConnectionState(CALL_STATE.PENDING);\r\n call.setPhoneCall(phoneCall);\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\r\n });\r\n }\r\n}\r\n\r\nconst callsController = new CallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\r\nexport default callsController;\r\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n \n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n \n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n \n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, //this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n \n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n \n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n \n return result;\n }\n \n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n \n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n \n return this.encryptPrepared(result);\n }\n \n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n \n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n \n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n \n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n \n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n \n return !msgKeyEquals;\n }\n \n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n \n const {isOutgoing, type} = this;\n \n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n \n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n \n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n \n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n \n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n \n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n \n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n \n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0', \n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`, \n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2', \n 'a=extmap-allow-mixed', \n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux', \n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0',\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from \"../../environment/ctx\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport safeAssign from \"../../helpers/object/safeAssign\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport { GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update } from \"../../layer\";\nimport { emojiFromCodePoints } from \"../../vendor/emoji\";\nimport type { CallId } from \"../appManagers/appCallsManager\";\nimport type { AppManagers } from \"../appManagers/managers\";\nimport { logger } from \"../logger\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport CallConnectionInstance from \"./callConnectionInstance\";\nimport CallInstanceBase from \"./callInstanceBase\";\nimport callsController from \"./callsController\";\nimport CALL_STATE from \"./callState\";\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"./constants\";\nimport parseSignalingData from \"./helpers/parseSignalingData\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription, { ConferenceEntry, generateSsrc } from \"./localConferenceDescription\";\nimport getCallProtocol from \"./p2P/getCallProtocol\";\nimport getRtcConfiguration from \"./p2P/getRtcConfiguration\";\nimport P2PEncryptor from \"./p2P/p2PEncryptor\";\nimport { p2pParseCandidate, P2PSdpBuilder } from \"./p2P/p2PSdpBuilder\";\nimport { parseSdp } from \"./sdp/utils\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec } from \"./types\";\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n \n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n \n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n \n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n \n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n type: 'input',\n lowBattery: false,\n muted: true,\n screencastState: 'inactive',\n videoRotation: 0,\n videoState: 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n \n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p,\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n \n const {isOutgoing, encryptionKey, streamManager} = this;\n \n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection'),\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n \n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n \n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n \n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry; \n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n \n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n \n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n \n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n \n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates', \n candidates: [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n \n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n \n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n let bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n \n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n \n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n \n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n \n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n \n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n pwd: data.pwd,\n ufrag: data.ufrag,\n fingerprints: data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n \n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n \n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n let bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n \n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n \n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n \n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n \n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n \n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCallProtocol } from \"../../../layer\";\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { PhoneCall } from \"../../../layer\";\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n \n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n \n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport GROUP_CALL_STATE from \"../lib/calls/groupCallState\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonIcon from \"./buttonIcon\";\nimport TopbarWeave from \"./topbarWeave\";\nimport SetTransition from \"./singleTransition\";\nimport PopupGroupCall from \"./groupCall\";\nimport GroupCallDescriptionElement from \"./groupCall/description\";\nimport GroupCallTitleElement from \"./groupCall/title\";\nimport PopupElement from \"./popups\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport GroupCallInstance from \"../lib/calls/groupCallInstance\";\nimport CALL_STATE from \"../lib/calls/callState\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport CallDescriptionElement from \"./call/description\";\nimport PopupCall from \"./call\";\nimport GroupCallMicrophoneIconMini from \"./groupCall/microphoneIconMini\";\nimport CallInstance from \"../lib/calls/callInstance\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport groupCallsController from \"../lib/calls/groupCallsController\";\nimport StreamManager from \"../lib/calls/streamManager\";\nimport callsController from \"../lib/calls/callsController\";\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n \n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n \n constructor(\n private managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n \n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n \n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n \n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n let state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n \n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\n }\n \n if(isClosed) {\n return;\n }\n \n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n \n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n \n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n \n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n \n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n \n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n \n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n \n const end = ButtonIcon('endcall_filled');\n right.append(end);\n \n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n \n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).show();\n }\n }, {listenerSetter});\n \n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n \n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { fontFamily } from \"../../components/middleEllipsis\";\nimport getPeerTitle from \"../../components/wrappers/getPeerTitle\";\nimport wrapMessageForReply from \"../../components/wrappers/messageForReply\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { IS_MOBILE } from \"../../environment/userAgent\";\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport idleController from \"../../helpers/idleController\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { Message, MessagePeerReaction, PeerNotifySettings } from \"../../layer\";\nimport I18n, { FormatterArguments, LangPackKey } from \"../langPack\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport singleInstance from \"../mtproto/singleInstance\";\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\nimport fixEmoji from \"../richTextProcessor/fixEmoji\";\nimport wrapPlainText from \"../richTextProcessor/wrapPlainText\";\nimport rootScope from \"../rootScope\";\nimport appImManager from \"./appImManager\";\nimport appRuntimeManager from \"./appRuntimeManager\";\nimport { AppManagers } from \"./managers\";\nimport generateMessageId from \"./utils/messageId/generateMessageId\";\nimport getPeerId from \"./utils/peers/getPeerId\";\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n \n private managers: AppManagers;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n //unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n if(notificationData.custom.channel_id &&\n !(await this.managers.appChatsManager.hasChat(notificationData.custom.channel_id))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({message, fwdCount, peerReaction, peerTypeNotifySettings}: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const peerString = await this.managers.appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply(message, undefined, undefined, true);\n\n if(peerReaction) {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(peerReaction.reaction), // can be plain heart\n notificationMessage\n ];\n \n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n \n notificationMessage = I18n.format(langPackKey, true, args);\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle(peerId, true, undefined, undefined, this.managers);\n if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle(notificationFromPeerId, true, undefined, undefined, this.managers) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').then((url) => {\n // ! WARNING, message can be already read\n if(message.pFlags.unread || peerReaction) {\n notification.image = url;\n this.notify(notification);\n }\n });\n } else {\n this.notify(notification);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = () => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle();\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n //this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n \n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n \n ctx.font = `700 ${fontSize}px ${fontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n \n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href: string = 'assets/img/favicon.ico') {\n if(this.prevFavicon === href) {\n return;\n }\n\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\n link.href = href;\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\n this.faviconEl = link;\n\n this.prevFavicon = href;\n }\n\n public notify(data: NotifyOptions) {\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\n \n if(this.stopped) {\n return;\n }\n\n // FFOS Notification blob src bug workaround\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n data.image = 'https://telegram.org/img/t_logo.png'\n }\n else if (data.image && !angular.isString(data.image)) {\n if (Config.Navigator.ffos2p) {\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n data.image = url\n notify(data)\n })\n return false\n } else {\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\n }\n }\n else */ if(!data.image) {\n data.image = 'assets/img/logo_filled_rounded.png';\n }\n // console.log('notify image', data.image)\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return false;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n let notification: MyNotification;\n\n if('Notification' in window) {\n try {\n if(data.tag) {\n for(let i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n notification = new Notification(data.title, {\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false\n });\n\n //console.log('notify constructed notification');\n } catch(e) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n } /* else if('mozNotification' in navigator) {\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n } else if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n window.external.msSiteModeActivate()\n notification = {\n index: idx\n }\n } */ else {\n return;\n }\n\n notification.onclick = () => {\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n if(data.onclick) {\n data.onclick();\n }\n };\n\n notification.onclose = () => {\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n if(notification.show) {\n notification.show();\n }\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification && typeof(notification) !== 'boolean') {\n try {\n if(notification.close) {\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.hidden = true;\n notification.close();\n }/* else if(notificationsMsSiteMode &&\n notification.index === notificationIndex) {\n window.external.msSiteModeClearIconOverlay()\n } */\n } catch(e) {}\n\n delete this.notificationsShown[key];\n }\n }\n\n public clear() {\n /* if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n } else { */\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.close();\n }\n } catch(e) {}\n }\n /* } */\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ? \n entry : \n (\n entry instanceof DataTransferItem ? \n entry.getAsFile() : \n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n \n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n \n return files;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport rootScope from '../rootScope';\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport stateStorage from '../stateStorage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatFull, ChatInvite, ChatParticipant, ChatParticipants, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport PopupElement from '../../components/popups';\nimport singleInstance, { InstanceDeactivateReason, SingleInstance } from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport type { GroupCallId, MyGroupCall } from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport { CallType } from '../calls/types';\nimport { Modify, SendMessageEmojiInteractionData } from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport { simulateClickEvent } from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport { AppManagers } from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport { PHONE_NUMBER_REG_EXP } from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport { STATE_INIT } from '../../config/state';\nimport CacheStorageController from '../cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport { AckedResult } from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport appRuntimeManager from './appRuntimeManager';\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId?: PeerId, \n lastMsgId?: number, \n threadId?: number,\n startParam?: string\n};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (peerId: PeerId) => void,\n peer_changing: (chat: Chat) => void,\n}> {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n \n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n \n public cacheStorage = new CacheStorageController('cachedFiles');\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n \n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n // uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\n \n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) \n && document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat || \n chat.peerId !== peerId || \n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile && \n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find((typing) => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && bubble.classList.contains('sticker') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach((a) => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n \n this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n \n apiManagerProxy.addEventListener('notificationBuild', (options) => {\n if(this.chat.peerId === options.message.peerId && !idleController.isIdle) {\n return;\n }\n \n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async(peerId) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\n });\n\n // stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', /* c || */{});\n // });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n \n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', (userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible', \n langPackArguments: [\n new PeerTitle({peerId: userId.toPeerId()}).element\n ]\n });\n });\n }\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then((peerId) => {\n this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n this.addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string,\n phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange(true);\n this.attachKeydownListener();\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(overlayCounter.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\n cancelEvent(e); // * prevent from scrolling\n }\n });\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n\n this.openUsername({\n userName: link.domain, \n lastMsgId: postId, \n commentId,\n startParam: link.start\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite);\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n \n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n const a = document.createElement('a');\n a.href = wrappedUrl;\n \n (window as any)[onclick](a);\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach((item) => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = this.parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n const {onclick} = wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p, \n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(), \n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(options: {\n userName: string, \n lastMsgId?: number, \n threadId?: number, \n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n \n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return this.managers.appMessagesManager.wrapSingleMessage(peerId, threadId).then((message) => {\n // const message: Message = this.managers.appMessagesManager.getMessageByPeer(peerId, threadId);\n if(!message) {\n lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return this.managers.appMessagesManager.getDiscussionMessage(peerId, msgId).then((message) => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n \n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(groupCallsController.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n \n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n \n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n // await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = themeController.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map((chat) => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n //const bubble = chat.bubbles.getBubbleByPoint('top');\n //if(bubble) {\n //const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n \n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом \n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) { \n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat', \n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await this.canDrag()) && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter((t) => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach((drop) => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false && mediaSizes.activeScreen !== ScreenSize.large) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this, \n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach((chat) => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\n }\n\n spliced.forEach((chat) => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach((chat) => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public async setPeer(options: ChatSetPeerOptions = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && chat.peerId !== peerId) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(peerId, lastMsgId, options.startParam);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n //window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(options.threadId) {\n options.type = 'discussion';\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex((chat) => chat.peerId === peerId && chat.type === type);\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\n }\n\n this.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n //this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId, \n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n //default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public async getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId);\n if(!typings?.length) {\n // log('have no typing');\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = isUser ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach((typing) => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n \n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId): Promise> {\n const typingEl = await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count || \n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length || \n 1;\n //if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n \n if(participants_count < 2) {\n return subtitle;\n }\n \n const onlines = await this.managers.appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n }; \n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n \n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId());\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(\n peerId: PeerId, \n element: HTMLElement, \n needClear: boolean, \n useWhitespace: boolean, \n middleware: () => boolean, \n ignoreSelf?: boolean\n ) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n \n const result = await this.getPeerStatus(peerId, ignoreSelf);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n \n return () => replaceContent(element, subtitle || placeholder);\n };\n \n const placeholder = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback && callback());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE, IS_MOBILE } from \"../environment/userAgent\";\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\nimport MediaProgressLine from \"../components/mediaProgressLine\";\nimport VolumeSelector from \"../components/volumeSelector\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport overlayCounter from \"../helpers/overlayCounter\";\nimport onMediaLoad from \"../helpers/onMediaLoad\";\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement, \n play?: boolean, \n streamable?: boolean, \n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper, \n listenerSetter: this.listenerSetter, \n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n \n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n \n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = toHHMMSS(video.duration | 0);\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n if(this.pipButton) {\n listenerSetter.add(this.pipButton)('click', () => {\n this.video.requestPictureInPicture();\n });\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('click', () => {\n this.togglePlay();\n });\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n listenerSetter.add(fullScreenButton)('click', () => {\n this.toggleFullScreen();\n });\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.innerHTML = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return { \n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x', \n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(\n this.playbackRateButton, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined, \n undefined, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n );\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n \n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n \n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n \n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n \n cancelFullScreen();\n }\n }\n \n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport type { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController, { AppMediaPlaybackController } from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport createVideo from \"../helpers/dom/createVideo\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport getStrippedThumbIfNeeded from \"../helpers/getStrippedThumbIfNeeded\";\nimport setAttachmentSize from \"../helpers/setAttachmentSize\";\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\nimport LazyLoadQueueBase from \"./lazyLoadQueueBase\";\nimport overlayCounter from \"../helpers/overlayCounter\";\nimport { ThumbCache } from \"../lib/storages/thumbs\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport wrapPeerTitle from \"./wrappers/peerTitle\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.managers = rootScope.managers;\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach((name) => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP, \n min: ZOOM_MIN_VALUE, \n max: ZOOM_MAX_VALUE, \n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n \n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv, \n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n //console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n //console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find((s) => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(overlayCounter.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n \n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n \n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map((r) => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n //let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map((v) => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.toggleWholeActive(false);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map((v) => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map((v) => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n let oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n const setAuthorPromise = this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n //if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n //if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n \n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n \n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n //const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */createVideo({pip: useController});\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n \n // if(!video.parentElement) {\n div.append(video);\n // }\n \n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n \n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n \n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video, \n play, \n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n \n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n \n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch((err) => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport getMediaFromMessage from \"../lib/appManagers/utils/messages/getMediaFromMessage\";\nimport wrapRichText from \"../lib/richTextProcessor/wrapRichText\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n detachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\n }\n };\n\n attachClickEvent(this.content.caption, onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = async(e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n \n appImManager.setInnerPeer({\n peerId: message.peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId\n });\n });\n }\n };\n\n onDownloadClick = async() => {\n const {peerId, mid} = this.target;\n const message = await this.getMessageByPeer(peerId, mid);\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = getMediaFromMessage(message);\n\n const cantForwardMessage = message._ === 'messageService' || !this.managers.appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach((button) => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n \n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach((button) => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = this.managers.appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach((button) => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../layer\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return this.managers.appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then((value) => {\n const items = value.photos.map((photoId) => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport rootScope from \"../lib/rootScope\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = async() => {\n appDownloadManager.downloadToDisc({\n media: await this.managers.appPhotosManager.getPhoto(this.target.photoId), \n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = await this.managers.appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport type LazyLoadQueue from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport isObject from \"../helpers/object/isObject\";\r\nimport { ArgumentTypes } from \"../types\";\r\nimport putPhoto from \"./putPhoto\";\r\nimport { recordPromise } from \"../helpers/recordPromise\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n (Array.from(document.querySelectorAll('avatar-element[data-peer-id=\"' + peerId + '\"]')) as AvatarElement[]).forEach((elem) => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', async(peerId) => {\r\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(peerId))) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await rootScope.managers.appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then((value) => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(\r\n photo.id, \r\n getTarget(), \r\n undefined, \r\n prevTargets ? f(prevTargets) : undefined, \r\n nextTargets ? f(nextTargets) : undefined\r\n );\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n public peerId: PeerId;\r\n public isDialog: boolean;\r\n public peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public isBig: boolean;\r\n private addedToQueue = false;\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n public attachClickEvent() {\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n //console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n\r\n public updateOptions(options: Partial[0]>) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n public updateWithOptions(options: {\r\n peerId: PeerId,\r\n isDialog?: boolean,\r\n isBig?: boolean,\r\n peerTitle?: string,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n loadPromises?: Promise[]\r\n }) {\r\n const wasPeerId = this.peerId;\r\n this.updateOptions(options);\r\n const newPeerId = this.peerId;\r\n\r\n if(wasPeerId === newPeerId) {\r\n return;\r\n }\r\n\r\n this.peerId = /* rootScope.managers.appPeersManager.getPeerMigratedTo(newPeerId) || */newPeerId;\r\n this.dataset.peerId = '' + newPeerId;\r\n\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n return this.update();\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const promise = putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb, this.isBig);\r\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises.push(promise);\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return this.r(true);\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const promise = this.r();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, { DIALOG_LIST_ELEMENT_TAG } from \"../lib/appManagers/appDialogsManager\";\nimport type { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\nimport PopupMute from \"./popups/mute\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport positionMenu from \"../helpers/positionMenu\";\nimport contextMenuController from \"../helpers/contextMenuController\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n constructor(private managers: AppManagers) {\n\n }\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n const isPinned = this.filterId > 1 ? \n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) : \n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n const isPinned = this.filterId > 1 ? \n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) : \n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.selectedId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId)); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.selectedId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId)); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n this.managers.appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(async(err) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n const config = await this.managers.apiManager.getConfig();\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n appSidebarLeft.createTab(AppChatFoldersTab);\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n new PopupMute(this.selectedId);\n };\n\n private onUnreadClick = async() => {\n const selectedId = this.selectedId;\n const dialog = await this.managers.appMessagesManager.getDialogOnly(selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(selectedId, dialog.top_message);\n this.managers.appMessagesManager.markDialogUnread(selectedId, true);\n } else {\n this.managers.appMessagesManager.markDialogUnread(selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.filterId = appDialogsManager.filterId;\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = await this.managers.appMessagesManager.getDialogOnly(this.selectedId);\n \n await Promise.all(this.buttons.map(async(button) => {\n const good = await button.verify();\n \n button.element.classList.toggle('hide', !good);\n }));\n \n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(await this.managers.appPeersManager.getDeleteButtonText(this.selectedId)));\n \n li.classList.add('menu-open');\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\n });\n };\n\n r();\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport singleInstance from \"../lib/mtproto/singleInstance\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n Promise.all([\r\n sessionStorage.get('dc'),\r\n rootScope.managers.rootScope.getConnectionStatus()\r\n ]).then(([baseDcId, connectionStatus]) => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n this.managers.apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n attachClickEvent(a, (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n if(singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n}\n","export default function roundRect(\n ctx: CanvasRenderingContext2D, \n x: number, \n y: number, \n width: number, \n height: number, \n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number, \n fill?: boolean, \n stroke?: boolean\n) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] ? (dpr ? radius[side] * dpr : radius[side]) : defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../helpers/animation\";\nimport customProperties from \"../helpers/dom/customProperties\";\nimport easeInOutSine from \"../helpers/easing/easeInOutSine\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport roundRect from \"../helpers/canvas/roundRect\";\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n \n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n \n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n \n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n \n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n \n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n \n height *= DPR;\n const y = (SIZE - height) / 2;\n \n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","import customProperties from \"../dom/customProperties\";\nimport clamp from \"../number/clamp\";\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = \"30pt Helvetica\";\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide','slide','slide','slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n \n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n \n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n \n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log(\"unknown animation type: \" + String(currentAnimation));\n }\n }\n \n private animateGlow() {\n var glowEnd = 255, \n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval){\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd){\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return \"rgb(\"+ r + \",\" + r + \",\" + r + \")\";\n };\n }\n \n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6; \n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) { \n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n \n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n \n return gradient;\n }\n \n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n \n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\n }\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from \"../components/scrollable\";\nimport rootScope from \"../lib/rootScope\";\nimport { animate } from \"./animation\";\nimport { drawCircleFromStart } from \"./canvas/drawCircle\";\nimport roundRect from \"./canvas/roundRect\";\nimport Shimmer from \"./canvas/shimmer\";\nimport customProperties from \"./dom/customProperties\";\nimport easeInOutSine from \"./easing/easeInOutSine\";\nimport mediaSizes from \"./mediaSizes\";\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n \n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n \n private getRectFrom: Element;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor() {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = 54;\n this.marginVertical = 9;\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement, \n rect?: {width: number, height: number},\n getRectFrom?: HTMLElement,\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = getRectFrom || container;\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n \n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n \n this.availableLength = availableLength;\n this.detachTime = Date.now();\n \n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.onRemove) {\n this.onRemove();\n this.onRemove = undefined;\n }\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n }\n\n private updateCanvasSize(rect: {width: number, height: number} = this.getRectFrom.getBoundingClientRect()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas, \n ctx, \n detachTime, \n length, \n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0, \n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n \n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n \n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n \n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n \n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n \n const dialogHeight = this.dialogHeight = (this.avatarSize + this.marginVertical * 2) * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16,\n };\n }\n \n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize, \n marginVertical, \n lineHeight, \n lineBorderRadius, \n lineMarginVertical, \n } = this;\n\n let marginLeft = 17;\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n\n marginLeft += avatarSize + 10;\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDialogFilter as DialogFilter, MyDialogFilter } from \"../storages/filters\";\nimport type LazyLoadQueue from \"../../components/lazyLoadQueue\";\nimport type { Dialog, MyMessage } from \"./appMessagesManager\";\nimport type { MyPhoto } from \"./appPhotosManager\";\nimport type { MyDocument } from \"./appDocsManager\";\nimport type { State } from \"../../config/state\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport ripple from \"../../components/ripple\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport appImManager from \"./appImManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../rlottie/lottieLoader\";\nimport { wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport groupCallActiveIcon from \"../../components/groupCallActiveIcon\";\nimport { Chat, Message, NotifyPeer } from \"../../layer\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport appNavigationController, { NavigationItem } from \"../../components/appNavigationController\";\nimport assumeType from \"../../helpers/assumeType\";\nimport generateTitleIcons from \"../../components/generateTitleIcons\";\nimport appMediaPlaybackController from \"../../components/appMediaPlaybackController\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { AppManagers } from \"./managers\";\nimport appSidebarRight from \"../../components/sidebarRight\";\nimport PopupElement from \"../../components/popups\";\nimport choosePhotoSize from \"./utils/photos/choosePhotoSize\";\nimport wrapEmojiText from \"../richTextProcessor/wrapEmojiText\";\nimport wrapMessageForReply from \"../../components/wrappers/messageForReply\";\nimport isMessageRestricted from \"./utils/messages/isMessageRestricted\";\nimport getMediaFromMessage from \"./utils/messages/getMediaFromMessage\";\nimport getMessageSenderPeerIdOrName from \"./utils/messages/getMessageSenderPeerIdOrName\";\nimport wrapStickerEmoji from \"../../components/wrappers/stickerEmoji\";\nimport getDialogIndexKey from \"./utils/dialogs/getDialogIndexKey\";\nimport getProxiedManagers from \"./getProxiedManagers\";\nimport getDialogIndex from \"./utils/dialogs/getDialogIndex\";\nimport { attachContextMenuListener } from \"../../helpers/dom/attachContextMenuListener\";\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport wrapPeerTitle from \"../../components/wrappers/peerTitle\";\nimport middlewarePromise from \"../../helpers/middlewarePromise\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport groupCallsController from \"../calls/groupCallsController\";\nimport callsController from \"../calls/callsController\";\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\nimport noop from \"../../helpers/noop\";\nimport DialogsPlaceholder from \"../../helpers/dialogsPlaceholder\";\nimport pause from \"../../helpers/schedulers/pause\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise = obj[key];\n if(oldPromise) {\n oldPromise.reject();\n }\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if(obj[key] === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => obj[key] === deferred);\n return {deferred, middleware};\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public managers: AppManagers,\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void,\n ) {\n super({\n getIndex: (element) => managers.dialogsStorage.getDialogIndex(element.id, this.indexKey),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({peerId: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private loadDialogsPromise: Promise<{cached: boolean, renderPromise: AppDialogsManager['loadDialogsRenderPromise']}>;\n private loadDialogsRenderPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n private sortedList: SortedDialogList;\n public placeholders: {[filterId: number]: DialogsPlaceholder} = {};\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n\n constructor() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n apiManagerProxy.getState().then(async(state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n this.setFilterId(0, 0);\n this.addFilter({\n id: this.filterId,\n title: '',\n orderIndex: 0\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(!IS_MOBILE_SAFARI) {\n if(id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n \n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n return this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n const placeholder = this.placeholders[folderId];\n if(placeholder) {\n placeholder.remove();\n }\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n \n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number, orderIndex: MyDialogFilter['orderIndex']) {\n this.indexKey = getDialogIndexKey(orderIndex);\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId);\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', async(userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && peerId !== rootScope.myId && !(await this.managers.appUsersManager.isBot(userId))) {\n const user = await this.managers.appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setLastMessageN({\n dialog, \n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setUnreadMessagesN({dialog});\n this.validateDialogForFilter(dialog);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.validateDialogForFilter(dialog);\n this.setUnreadMessagesN({dialog}); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n appImManager.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n return {\n indexKey: await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId), \n filter: await this.managers.filtersStorage.getFilter(filterId)\n };\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = indexKey;\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', async({peerId, typings}) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n const loadDialogsPromise = this.onChatsScroll();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n const haveFilters = !!(state.filters && Object.keys(state.filters).length);\n const getDialogsFiltersPromise = haveFilters ? Promise.resolve(Object.values(state.filters).sort((a, b) => a.orderIndex - b.orderIndex)) : this.managers.filtersStorage.getDialogFilters();\n const renderFiltersPromise = getDialogsFiltersPromise.then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(haveFilters) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(state.notifySettings) {\n const promises: Promise[] = [];\n for(const key in state.notifySettings) {\n assumeType>(key);\n const promise = this.managers.appNotificationsManager.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n promises.push(promise);\n }\n\n await Promise.all(promises);\n }\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await loadDialogsPromise).renderPromise;\n this.managers.appMessagesManager.fillConversations();\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessageN({\n dialog,\n dom,\n setUnread: true\n });\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n return this.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {foundUnmuted, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n unreadSpan.innerText = unreadCount ? '' + unreadCount : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(\n !dialog || \n (this.filterId > 1 ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id)\n // (filter && !(await this.managers.filtersStorage.testDialogForFilter(dialog, filter)))\n ) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n this.managers,\n list, \n getDialogIndexKey(filter.orderIndex),\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === 1) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n return;\n }\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.id === 0) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scroll.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const {chatList, filterId, indexKey} = this;\n \n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n let placeholder = this.placeholders[filterId];\n try {\n const getConversationsResult = this.managers.acknowledged.appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(\n !chatList.childElementCount && \n !placeholder && \n (\n !this.loadedDialogsAtLeastOnce || \n !(await getConversationsResult).cached\n )\n ) {\n placeholder = this.placeholders[filterId] = new DialogsPlaceholder();\n const getRectFrom = filterId === 1 ? this.chatsContainer : this.folders.container;\n placeholder.attach({\n container: chatList.parentElement, \n getRectFrom, \n onRemove: () => {\n delete this.placeholders[filterId];\n },\n blockScrollable: this.scroll\n });\n\n cachedInfoPromise.resolve(false);\n }\n \n const a = await getConversationsResult;\n const result = await a.result;\n if(this.loadDialogsRenderPromise !== renderPromise) {\n reject();\n cachedInfoPromise.reject();\n return;\n }\n\n cachedInfoPromise.resolve(a.cached);\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n // const isBuggedDialog = !this.managers.appMessagesManager.getDialogOnly(dialog.peerId);\n // if(isBuggedDialog) {\n // return;\n // }\n\n const element = this.sortedList.add(dialog.peerId, true, /* undefined, false, */cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n loadPromises.push(fastRafPromise()); // it is needed here\n await Promise.all(loadPromises).finally();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n reject();\n cachedInfoPromise.reject();\n return;\n }\n\n callbacks.forEach((callback) => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, indexKey);\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n \n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n return this.loadDialogsPromise = cachedInfoPromise.then((cached) => ({\n cached,\n renderPromise\n }));\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find((el) => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n \n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n const div = document.createElement('div');\n const emoji = '📂';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n appSidebarLeft.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\n return this.updateContactsLengthPromise = this.managers.appUsersManager.getContacts().then((users) => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n \n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n \n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n this.managers.appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then((contacts) => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false, \n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = async(peerId: PeerId) => {\n return await this.managers.appPeersManager.isContact(peerId) && !(await this.managers.appMessagesManager.getDialogOnly(peerId));\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach((el) => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private async setOffsets() {\n const chatList = this.chatList;\n const firstDialog = await this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = await this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return this.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n }\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n \n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n \n if(!elem) {\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href, '_blank');\n cancelEvent(e);\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\n }\n }, {capture: true});\n\n // cancel link click\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', this.managers.appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* , \n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n // if(options.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: {\n dialog: Dialog, \n lastMessage?: Message.message | Message.messageService, \n dom?: DialogDom, \n highlightWord?: string, \n isBatch?: boolean,\n setUnread?: boolean\n }) {\n const promise = this.setLastMessage(options.dialog, options.lastMessage, options.dom, options.highlightWord, options.isBatch, options.setUnread);\n return promise.catch(noop);\n }\n\n private async setLastMessage(\n dialog: Dialog, \n lastMessage: Message.message | Message.messageService, \n dom: DialogDom, \n highlightWord?: string, \n isBatch = false,\n setUnread = false\n ) {\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n return;\n }\n }\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft?._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n\n lastMessage = dialog.topMessage;\n if(!lastMessage || lastMessage.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n if(setUnread) {\n this.setUnreadMessagesN({dialog, dom, isBatch, setLastMessagePromise: promise});\n }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.textContent = '';\n dom.lastTimeSpan.textContent = '';\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const peerId = dialog.peerId;\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n \n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n willPrepend.unshift(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const senderBold = document.createElement('b');\n\n if(lastMessage.fromId === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n willPrepend.unshift(senderBold);\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n })).then((element) => {\n senderBold.prepend(element);\n return senderBold;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply(draftMessage));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null && !setUnread) { // means search\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n }\n\n promise.resolve();\n }\n\n private setUnreadMessagesN(options: {\n dialog: Dialog,\n dom?: DialogDom,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n return this.setUnreadMessages(options.dialog, options.dom, options.isBatch, options.setLastMessagePromise).catch(() => {});\n }\n\n private async setUnreadMessages(\n dialog: Dialog, \n dom = this.getDialogDom(dialog.peerId), \n isBatch = false,\n setLastMessagePromise?: Promise\n ) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const isMuted = await middleware(this.managers.appNotificationsManager.isPeerLocalMuted(dialog.peerId, true));\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = await middleware(this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message));\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n const filter = await middleware(this.managers.filtersStorage.getFilter(this.filterId));\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = await middleware(this.managers.appMessagesManager.isDialogUnread(dialog));\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n // return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, transitionDuration);\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n deferred.resolve();\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private async getDialog(dialog: Dialog | PeerId) {\n if(typeof(dialog) !== 'object') {\n const originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n \n const ret = this.addDialogNew(options);\n \n if(ret) {\n const promise = this.getDialog(options.peerId).then((dialog) => {\n const {peerId} = dialog;\n const promises: Promise[] = [];\n if(!peerId.isUser()) {\n promises.push(this.processDialogForCallStatus(dialog, ret.dom));\n }\n\n if(peerId !== rootScope.myId && peerId.isUser()) {\n promises.push(this.managers.appUsersManager.getUser(peerId).then((user) => {\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n \n promises.push(this.setLastMessageN({\n dialog,\n dom: ret.dom,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n if(options.loadPromises) {\n options.loadPromises.push(promise);\n }\n }\n\n return ret;\n }\n\n private async processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage, \n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId,\n });\n\n // this.setLastMessage(ret.dialog, message, ret.dom, query);\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n peerId: Parameters[0],\n container?: Parameters[1],\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string\n }) {\n return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName);\n }\n\n public addDialog(\n peerId: PeerId, \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string\n ) {\n // const dialog = await this.getDialog(_dialog);\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n if(loadPromises) {\n loadPromises.push(peerTitlePromise);\n }\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n titleSpanContainer.append(...elements);\n });\n\n if(loadPromises) {\n loadPromises.push(titleIconsPromise);\n }\n //}\n \n const span = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n\n const li = document.createElement(DIALOG_LIST_ELEMENT_TAG);\n li.classList.add('chatlist-chat');\n (li as HTMLAnchorElement).href = '#' + peerId;\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom};\n }\n\n public async setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessageN({\n dialog, \n lastMessage: null, \n dom,\n setUnread: null\n });\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","CodeInputField","constructor","super","plainText","input","this","type","autocomplete","lastLength","addEventListener","e","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","PasswordMonkey","passwordInputField","size","needFrame","container","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","TrackingMonkey","inputField","max","playAnimation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","PasswordInputField","onVisibilityClick","toggleVisible","toggle","name","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","elapsedTime","cb","delay","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","isRippleUnneeded","target","includes","tagName","touchEnd","touches","once","cancelBubble","stopPropagation","passive","dataset","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","cleanSearchText","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","toLowerCase","fixCyrillic","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","htmlToSpan","span","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","SearchGroup","clearable","clickable","autonomous","onFound","list","nameEl","clear","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","i","messages","setVirtualContainer","onChange","reset","searchMore","onScrolledBottom","trim","peerId","beginSearch","focus","maxId","inputFilter","_","limit","res","count","history","mid","shift","searchGroup","forEach","message","fromId","avatarSize","meAsSaved","err","console","error","replaceContent","catch","InputSearch","placeholder","prevValue","timeout","onInput","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","SliderSuperTab","slider","destroyable","_constructor","header","closeBtn","title","content","addTab","close","closeTab","open","args","init","result","selectTab","onCloseAfterTimeout","tabs","delete","removeAll","setTitle","key","SliderSuperTabEventable","eventListener","dispatchEvent","cleanup","SidebarSlider","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","navigationType","id","animate","isNavigation","closingId","pop","onCloseTab","tab","_selectTab","safeAssign","Map","tabsContainer","sidebarEl","Array","from","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","onPop","canAnimate","push","removeTabFromHistory","indexOfAndSplice","sliceTabsUntilTab","tabConstructor","preserveTab","getTab","find","t","isTabExists","onClose","createTab","ctor","doNotAppend","managers","AvatarEdit","getContext","clearRect","months","days","ONE_DAY","getWeekNumber","date","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","time","today","timestamp","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","dates","q","indexOf","setFullYear","setHours","minDate","maxDate","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","getUserStatusString","user","pFlags","bot","support","status","was_online","diff","AppNewGroupTab","uploadAvatar","isGeoChat","avatarEdit","_upload","section","SettingSection","inputWrapper","groupNameInputField","label","maxLength","groupLocationInputField","canBeEdited","valueCheck","userLocationCoords","userLocationAddress","nextBtn","appChatsManager","createChannel","about","geo_point","address","megagroup","chatId","inputFile","editPhoto","peerIds","inviteToChannel","createChat","map","toUserId","toPeerId","chatsSection","nameArgs","new","startLocating","userId","dom","rippleEnabled","lastMessageSpan","appUsersManager","getUser","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","set","visible","smth","getVisible","clearVisible","isVisible","disconnect","refresh","targets","keys","observe","refreshVisible","unobserve","unlock","unlockAndRefresh","lock","findAndSpliceAll","array","verify","out","idx","findIndex","splice","LazyLoadQueueIntersector","parallelLimit","queue","inProcess","Set","intersector","loadItem","item","addElement","method","setProcessQueueTimeout","intersectorTimeout","processQueue","unshift","LazyLoadQueue","wasSeen","getItem","findAndSplice","processItem","hasOwnProperty","choosePhotoSize","photo","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","sizes","thumbs","concat","w","h","photoSize","calcImageInBox","accumulate","arr","initialValue","reduce","acc","Layouter","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","static","ratio","join","cropRatios","clamp","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","optimalCounts","optimalHeights","rowCount","index","row","colCount","lineHeight","col","prepareAlbum","widthItem","heightItem","children","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","loadedURLs","url","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","useCache","isImage","loader","Image","renderImageFromUrlPromise","renderImageWithFadeIn","image","needFadeIn","aspecter","thumbImage","ProgressivePreloader","tempId","detached","isUpload","cancelable","streamable","tryAgainOnFail","attachMethod","onClick","cancelEvent","preloader","loadFunc","cancel","constructContainer","color","bold","constructDownloadIcon","construct","totalLength","downloadSvg","cancelSvg","previousElementSibling","circle","firstElementChild","setDownloadFunction","func","setManual","setProgress","attachPromise","notify","notifyAll","detach","attach","addNotifyListener","details","percents","done","total","useRafs","isInDOM","getTotalLength","strokeDasharray","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","results","reject","f","start","performance","possiblePromise","process","apply","context","realResult","timedChunk","finally","requireBlurPromise","fastBlurFunc","processBlurNext","img","radius","iterations","ctx","alpha","filter","drawImage","m","default","cache","dataUri","cached","onload","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewURLFromBytes","bytes","isSticker","mimeType","Uint8Array","IS_SAFARI","btoa","String","fromCharCode","bytesToDataURL","getPreviewURLFromThumb","thumb","getImageFromStrippedThumb","useBlur","getStrippedThumbIfNeeded","cacheContext","ignoreCache","downloaded","setAttachmentSize","noZoom","isDocument","boxSize","aspect","isFit","aspectCovered","reply_to_mid","media","webpage","replies","comments","channel_id","toChatId","wrapPhoto","withTail","isOut","lazyLoadQueue","middleware","withoutPreloader","loadPromises","autoDownloadSize","noBlur","noThumb","noFadeIn","blurAfter","full","images","noAutoDownload","mediaSizes","loadThumbPromise","isGif","mime_type","thumbsStorage","getCacheContext","gotThumb","uploadingFileName","appDownloadManager","renderOnLoad","onLoad","toDataURL","canAttachPreloader","haveToDownload","queueId","onlyCache","getDownloadPromise","renderPromise","download","render","createVideo","video","pip","disablePictureInPicture","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","toHHMMSS","str","leadZero","sec_num","hours","floor","minutes","seconds","getTextWidth","font","measureText","testQueue","fontFamily","pendingTest","setTestQueue","testElement","getElementWidth","sizeType","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","capture","MiddleEllipsisElement","HTMLElement","connectedCallback","disconnectedCallback","formatBytes","decimals","dm","log","parseFloat","pow","toFixed","attachGrabListeners","onStart","onMove","onMouseMove","event","pageX","pageY","onMouseUp","onMouseDown","onTouchMove","preventDefault","isTouch","onTouchEnd","onTouchStart","customElements","define","RangeSelector","mousedown","events","withTransition","useTransform","vertical","scrub","seek","setFilled","onScrub","filled","step","stepStr","setHandlers","setListeners","_removeListeners","addProgress","transform","rectMax","offsetAxisValue","bottom","removeListeners","MediaProgressLine","progressRAF","onLoadedData","onEnded","onPlay","paused","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","setMedia","filledLoad","currentTime","wasPlaying","setSeekMax","scrubTime","appMediaPlaybackController","buf","buffered","numRanges","nearestStart","end","getMessageSenderPeerIdOrName","fromName","fwd_from","from_name","weakMap","WeakMap","peerTitle","update","PeerTitle","onlyFirstName","dialog","setOptions","limitSymbols","setInnerHTML","wrapEmojiText","getPeerTitle","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","constructDownloadPreloader","mids","attr","findMediaTargets","anchor","anchorMid","prev","next","isBubbles","findUpClassName","justAudioSelector","selectors","prefix","s","selector","elements","mediaItems","reverse","AudioElement","withTime","voiceAsMusic","showSender","doc","getMediaFromMessage","isRealVoice","isVoice","isOutgoing","is_outgoing","durationStr","downloadDiv","media_unread","onTypeLoad","audioEl","waveform","attributes","attribute","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","createElementNS","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","progress","audio","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","wrapVoiceMessage","descriptionEl","audioAttribute","parts","performer","titleEl","middleEllipsisEl","file_name","subtitleDiv","launched","progressLine","supportsStreaming","lastChild","replaceWith","wrapAudio","audioTimeDiv","autoload","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","togglePlay","hadSearchContext","searchContext","useSearch","imgs","wrapped","autoDownload","shouldPlay","is_scheduled","onDownloadInit","pauseListener","deferred","Error","playListener","roundVideoCircumference","wrapVideo","noInfo","group","onlyPreview","noPlayButton","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","muted","divRound","halfSize","strokeWidth","PI","strokeDashoffset","globalVideo","onPaused","onFrame","foreignObject","getAttributeNS","uploadFileName","renderDeferred","code","isFulfilled","onMediaLoad","animationIntersector","videoWidth","loadPhotoThumbFunc","apiFileManager","downloadMediaURL","to","wrapAlbum","groupId","attachmentDiv","uploading","chat","storage","appMessagesManager","getMidsByAlbum","getMessage","wrapDocument","audioElement","extSplitted","split","ext","isArray","docDiv","docId","icoDiv","hadContext","perf","fileName","wrapPlainText","descriptionParts","nameDiv","_downloadDiv","save","isTrusted","appDocsManager","getDoc","canOpenAfter","downloadFileName","getDownloadMediaDetails","isDownloading","uploadPromise","savingLottiePreview","saveLottiePreview","toneIndex","saving","toBlob","blob","wrapStickerAnimation","side","skipRatio","animationDiv","stickerPromise","withThumb","assumeType","frameNo","maxFrame","onScroll","vibrate","generateRandomSigned","random","randomOffsetX","randomOffsetY","stableOffsetX","setPosition","right","onlyThumb","emoji","needUpscale","asStatic","stickerType","sticker","lottieLoader","isAnimated","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","path","num","getPathFromBytes","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","animationData","data","a","v","sendInteractionThrottled","appStickersManager","preloadAnimatedEmojiStickerAnimation","getAnimatedEmojiSoundDocument","restart","isUser","getAnimatedEmojiSticker","bubble","throttle","setTyping","msg_id","getServerMessageId","emoticon","interaction","JSON","stringify","isSavingLottiePreview","EditPeer","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","updateWithOptions","doNotEditAvatar","lockWithPromise","unlockOnSuccess","RadioForm","radios","form","checked","Row","freezed","radioField","checkboxField","subtitle","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","titleRightSecondary","titleRightEl","navigationTab","createMedia","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","position","body","select","execCommand","removeChild","fallbackCopyTextToClipboard","RadioField","alignRight","stateKey","state","getDeepProperty","main","langKey","Event","bubbles","toastEl","toast","toastNew","langPackKey","langPackArguments","isUsernameValid","username","test","UsernameInputField","checkUsernameDebounced","debounce","checkUsername","getValue","originalValue","setState","I","setError","invalidText","head","checkUsernamePromise","available","availableText","takenText","isValidToChange","PopupPeer","buttons","overlayClosable","avatarEl","AvatarElement","isDialog","noTitle","titleLangArgs","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","original","nextElementSibling","AppChatTypeTab","isBroadcast","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","appProfileManager","getChatInviteLink","show","caption","noDelimiter","linkInputField","applyBtn","migrateChat","channelId","updateUsername","setOriginalValue","toggleNoForwards","onChatUpdate","noforwards","ScrollableLoader","loading","loaded","getPromise","checkForTriggers","windowSize","visualViewport","innerWidth","innerHeight","filterAsync","Boolean","numberThousandSplitter","toString","getChatMembersString","getCachedFullChat","participants_count","participants","broadcast","AppSelectPeers","chatsContainer","selected","folderId","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","cachedContacts","getMoreResults","renderResultsFunc","renderResults","splitUp","notRendered","has","filterPeerTypeBy","isPeerId","appPeersManager","getPeer","deleted","innerContainer","topContainer","selectedContainer","selectedScrollable","li","click","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","dialogs","archived","pageCount","getConversations","newOffsetIndex","getDialogIndex","chatRightsAction","filterByRights","isEnd","contacts","getMoreContacts","peer","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","filterUnique","getMoreChannelParticipants","channelParticipants","getChannelParticipants","participant","getParticipantPeerId","isNonContactUser","containerEl","subtitleEl","isAnyChat","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","getSelected","addInitial","values","forceDirection","PopupPickUser","closable","onSelect","hide","peerTypes","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","takeOut","deepEqual","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","copy","defaultRights","combineParticipantBannedRights","restrictionText","info","mainFlag","restriction","until_date","flag","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","DIALOG_LIST_ELEMENT_TAG","setSubtitle","bannedRights","cantWhat","getPeerId","listEl","setLength","exceptionsCount","setLoader","isChannel","migrateFrom","migrateTo","PopupDeleteDialog","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","isDanger","textArgs","AppChatReactionsTab","availableReactions","appReactionsManager","getActiveAvailableReactions","getChatFull","originalReactions","available_reactions","enabledReactions","toggleSection","toggleCheckboxField","toggleRow","reactionsSection","checkboxFields","availableReaction","reaction","saveReactionsDebounced","wrapStickerToRow","static_icon","every","saveReactions","newReactions","sort","setChatAvailableReactions","AppEditChatTab","_init","chatUpdateListeners","addChatUpdateListener","canChangeType","canChangePermissions","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","reactionsRow","setReactionsLength","availableReactionsLength","getAvailableReactions","inactive","reactions","permissionsRow","setPermissionsLength","getChatTyped","editTitle","editAbout","race","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","formatUserPhone","phone","formatPhoneNumber","formatted","AppEditContactTab","isNew","isContact","nameInputField","lastNameInputField","setDraftValue","first_name","last_name","notificationsCheckboxField","togglePeerMute","enabled","appNotificationsManager","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","AppAddMembersTab","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","generateFakeIcon","isScam","generateTitleIcons","verified","use","use2","generateVerifiedIcon","fake","scam","DialogColorsFg","DialogColors","DialogColorsMap","getPeerColorById","pic","getAbbreviation","onlyFirst","splitted","last","putAvatar","renderThumbPromise","isFullLoaded","stripped_thumb","putPhoto","isBig","myId","getPeerPhoto","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","abbr","getPeerInitials","ContextMenuController","openedMenu","diffX","diffY","closeBtnMenu","menuOverlay","openedMenuOnClose","IS_MOBILE_SAFARI","isOpened","openBtnMenu","menuElement","getEvent","attachGlobalListenerTo","RESET_GLOBAL","SwipeHandler","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","setProperty","onFirstSwipe","onSwipeResult","onSwipe","setCursor","PeerProfileAvatars","photoId","avatar","BASE_CLASS","avatars","appPhotosManager","getPhoto","action","draggable","loadCallback","intersectionObserver","loadCallbacks","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","SWITCH_ZONE","freeze","listLoader","previous","current","prevTargets","nextTargets","openAvatarViewer","toRight","offsetLeft","go","cancelNextClick","lastDiffX","minX","swipeHandler","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","loadCount","loadMore","older","getUserPhotos","photos","getSearch","Number","MAX_SAFE_INTEGER","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","onJump","activeTab","photo_id","wrapPeerTitle","setText","PeerProfile","setPeerStatus","needClear","bio","getProfileByPeerId","notifications","setMoreDetails","fillUsername","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","cleanupHTML","clearSetMoreDetailsTimeout","canBeDetailed","oldAvatars","getPeerUsername","fillNotifications","fillRows","icons","fillProfileElements","cleaned","_setMoreDetails","peerFull","wrapRichText","exportedInvite","setMoreDetailsTimeout","override","isRestricted","acknowledged","setPromise","destroy","clearInterval","historiesStorage","AppSharedMediaTab","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","setIsSharedMedia","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","msgs","deleteDeletedMessages","AppSearchSuper","mediaTabs","onChangeTab","mediaTab","btnAddMembers","scrollStartCallback","showConfirmation","b","onError","addChatUser","getMessageByPeer","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","setLoadMutex","loadMutex","peerChanged","setQuery","historyStorage","loadSidebarMedia","single","justLoad","RIGHT_COLUMN_ACTIVE_CLASSNAME","appSidebarRight","getElementById","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","proportion","scrollWidth","documentElement","enable","active","willChange","animationPromise","AppPollResultsTab","resultsDiv","poll","appPollsManager","getPoll","quiz","question","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","user_id","showMore","next_offset","down","CLASS_NAME","StackedAvatars","avatarContainer","AVATAR_CLASS_NAME","updateOptions","parentNode","lineTotalLength","minIndex","minRemainder","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","period","closeTime","quizInterval","timeLeft","stroke","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","textEl","entities","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","setResults","recent_voters","stackedAvatars","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","times","votersCount","DivAndCaption","fill","border","htmlToDocumentFragment","DocumentFragment","template","platforms","ignore","getRestrictionReason","reasons","reason","platform","escapeRegExp","isMessageRestricted","restriction_reason","CALL_DURATION_LANG_KEYS","formatCallDuration","plain","showLast","modulus","formatDuration","strings","wrapJoinVoiceChatAnchor","onclick","wrapUrl","call","access_hash","href","wrapMessageActionTextNew","unsafeMessage","noLinebreaks","getNameDivHTML","endsWith","post","users","schedule_date","daysToStart","tomorrowDate","pinnedMessage","savedFrom","dir","wrapMessageForReply","fetchMessageReplyTo","originalMessage","storageKey","isMessageIsTopMessage","getDialogOnly","joined","anchorHTML","domain","langPack","waited","wrapMessageActionTextNewUnsafe","usingMids","highlightWord","withoutMediaType","hasAlbumKey","addPart","part","totalEntities","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","game","stickerEmojiRaw","actionWrapped","match","found","regExp","sortEntities","messageWrapped","noLinks","noTextFormat","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","isRound","mediaChildren","CHAT_ANIMATION_GROUP","child","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","fillPromise","hex","g","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","animated","videos","URL","createObjectURL","getStickerSet","stickerSet","documents","previousMedia","_size","positionElementByIndex","pos","prevPos","whichChild","SortedList","updateElementWith","updateListWith","sorted","clean","_updateList","onSort","updateList","canUpdate","getAll","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","insertInDescendSortedArray","SortedUserList","getUserStatusForSort","onListLengthChange","willChangeLength","createChatListOptions","doTimeout","good","SORT_INTERVAL","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","IS_APPLE","onCancel","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","ButtonMenuItem","noCheckboxClickListener","textElement","regularText","keepOpen","menu","PopupForward","peerIdMids","overrideOnSelect","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","_hasRights","canRevoke","PopupSendNow","sendScheduledMessages","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","AppSelection","selectedMids","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","getElementFromTarget","verifyMouseMoveTarget","listenElement","documentListenerOptions","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","attachListeners","selectedText","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","toggleElementCheckbox","hasCheckbox","getCheckboxInputFromElement","updateContainer","forceSelection","cantForward","cantDelete","cantSend","isScheduled","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","lastMsgId","obj","fromPeerId","isPrivate","transitionElement","opacity","ChatSelection","recording","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","skippedMids","isGrouped","groupedCheckboxInput","wrapWebPageDescription","webPage","shortDescriptionText","wrapWebPageTitle","shortTitle","author","site_name","positionMenu","additionalPadding","getScrollWidthFromElement","menuWidth","scrollHeight","menuHeight","windowWidth","windowHeight","paddingTop","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","intermediateX","intermediateY","possibleSides","SearchContextMenu","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","withSelection","canForward","canDeleteMessage","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","skipScroll","startCallback","newMediaTab","fromMediaTab","offsetTop","rect2","onMediaClick","targetClassName","warn","AppMediaViewer","setSearchContext","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","filterMessagesByInputFilter","processEmptyFilter","setLastMessagePromise","lastMessage","processPhotoVideoFilter","processDocumentFilter","processUrlFilter","entity","display_url","sliced","matchUrl","same","hostname","hash","previewDiv","subtitleFragment","HTMLAnchorElement","decodeURIComponent","firstChild","elemsToAppend","sharedMediaDiv","processCallback","awaited","monthContainer","getMonthContainerByTimestamp","afterPerforming","loadChats","inputMessagesFilterEmpty","showMembersCount","titleSpan","arg","globalContacts","intlElement","isShort","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","loadMembers","renderParticipants","membersList","LOAD_COUNT","loadType","used","slicedLength","ids","notFilteredMessages","nextRate","next_rate","loadFirstTime","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","loadFirstTimePromise","toLoad","dateTimestamp","containers","dateElement","haveTimestamps","getObjectKeysAndSort","goFirst","revokeObjectURL","newInputFilter","ButtonMenuToggleHandler","btnMenu","getPrivacyRulesDetails","rules","types","allowPeers","chats","disallowPeers","rule","PrivacyType","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","appPrivacyManager","getPrivacy","inputKey","setRadio","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","anchorCopy","phoneSection","sCaption","wrapStickerEmoji","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onContinueClick","btnContinue","btnSkip","E","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","has_password","labelText","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","country","date_active","date_created","midtitle","device_model","system_version","authorizations","session","btnTerminate","apiManager","invokeApi","otherSection","onTerminateClick","AppBlockedUsersTab","btnAdd","toggleBlock","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyAndSecurityTab","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","settings","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","appDraftsManager","clearAllDrafts","auths","averageColorFromCanvas","pixel","pixels","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","onWheel","_animatingToNextPosition","_scrollDelta","deltaY","_onWheelRAF","drawOnWheel","changeTail","curPos","curPosition","_phase","_tail","drawGradient","drawNextPositionAnimated","frames","_frames","drawImageData","leftLength","_incrementalCurve","hexToRgb","getPositions","positions","getNextPositions","phase","curveMax","curve","distances","nextPos","tail","getGradientImageData","_hctx","createImageData","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","colors","getAttribute","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","curves","scrollAnimate","_addedScrollListener","createCanvas","gradientRenderer","ColorPicker","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","appStateManager","pushToState","onColorChange","applyColor","themeController","gridSection","grid","backgroundColor","isColored","scaleMediaElement","mediaSize","aspectFitted","quality","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","file","files","requestFile","naturalWidth","naturalHeight","File","wallPaper","prepareWallPaperUpload","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","blur","onGridClick","wallpaper","saveToCache","_tempId","onReady","getPixelPromise","imageUrl","averageColor","create","getColorsFromWallPaper","getWallPaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","getWallPapers","wallPapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","ANIMATION_GROUP","PopupStickers","stickerSetInput","onStickersClick","fileId","h6","stickersDiv","stickersFooter","btn","loadStickerSet","installed_date","toggleStickerSet","AppQuickReactionTab","getQuickReaction","quickReaction","setDefaultReaction","RangeSettingSelector","minValue","writeValue","valueDiv","valueContainer","range","AppGeneralSettingsTab","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","eachMinute","toLocaleTimeString","suggestCheckboxField","bigCheckboxField","renderQuickReaction","loopCheckboxField","stickerSets","stickersContent","renderStickerSet","getAllStickers","allStickers","sets","AppEditProfileTab","appConfig","getAppConfig","firstNameInputField","bioInputField","about_length_limit_premium","about_length_limit_default","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","userFull","getProfile","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","forEachReverse","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","originalFilter","AppEditFolderTab","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","loadAnimationPromise","player","onCreateOpen","onEditOpen","documentFragmentToHTML","wrapDraftText","ul","ignoreClick","hasPeer","renderMore","_length","exclude_peers","AppChatFoldersTab","filtersRendered","renderFolder","dialogFilter","Object","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","dialog_filters_limit_premium","dialog_filters_limit_default","onFiltersContainerUpdate","getSuggestedFilters","order","getSuggestedDialogsFilters","suggestedFilters","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","invokeApiCacheable","lang_pack","languages","language","lang_code","native_name","confirmationPopup","cancelButton","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","setByKey","MIN","MAX_RANGE","MAX","upTo","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","onDisabledChange","gifsCheckboxField","videosCheckboxField","peerKeys","enabledKeys","isAll","logOut","edit","changeAvatarBtn","upload","updateChangeAvatarBtn","buttonsDiv","devicesRow","languageRow","buttonsSection","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","PopupCreateContact","withConfirm","btnConfirm","importContact","telInputField","validate","country_code","AppContactsTab","inputSearch","openContacts","sortedUserList","createList","IS_MOBILE","renderPage","AppArchivedTab","wasFilterId","chatList","AppPeopleNearbyTab","isLocationWatched","parseDistance","retryBtn","latestLocationSaved","accuracy","getLocated","updates","orderedPeers","groupsCounter","usersCounter","peopleSection","locatedPeers","sortedList","errorCategory","startWatching","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","formatNumber","LEFT_COLUMN_ACTIVE_CLASSNAME","fakeGradientDelimiter","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","filteredButtons","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","newBtnMenu","updateBtn","reload","initSearch","archivedCount","unreadDialogsCount","navigationItem","noHistory","checkUpdateInterval","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","BubbleGroup","createAvatar","avatarLoadPromise","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastMid","lastItem","updateClassNames","insertItem","foundMidOnSameTimestamp","_timestamp","_mid","removeItem","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","siblings","getSiblingsAtIndex","modifiedGroups","previousSibling","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","bad","partition","getLastGroup","changeBubbleMid","changeItemBubble","changeBubbleByBubble","item1","item2","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","previousGroup","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","addSentinel","sentinel","observeStickyHeaderChanges","headerSentinel","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","REACTIONS_ELEMENTS","ReactionsElement","onConnectCallback","getReactionCount","reactionElement","isPlaceholder","changeMessage","changedResults","hasReactions","availableReactionsResult","isReactionActive","some","totalReactions","can_see_list","reactionElementIdx","recent_reactions","handleChangedResults","childNodes","timeSpan","RepliesElement","updated","postKey","leftPart","recent_repliers","isUnread","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","reactionsElement","reactionsMessage","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","pinned","inner","clonedArgs","_reactionsElement","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","reply_to","reply_to_peer_id","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","elementFromPoint","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","overflow","horizontal","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ScrollSaver","getSaved","clientHeight","findAnchor","containerRect","elementRect","findAndSetAnchor","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","setScrollTopSilently","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","callbacks","toggleObservingNew","isMentionUnread","mentioned","middlewarePromise","throwWhat","getEmojiEntityFromEmoji","unicode","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","fixEmoji","getEmojiFromElement","nodeType","nodeValue","EmojiTab","closeScrollTop","onContentClick","divs","category","emojis","titleDiv","itemsDiv","unified","emojiScroll","appEmojiManager","getRecentEmojis","hasRecent","activeId","EmoticonsDropdown","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","LazyLoadQueueRepeat2","spliced","GifsMasonry","scrollPromise","processInvisibleDiv","processVisibleDiv","gifWidth","gifHeight","willUseWidth","GifsTab","gifsContainer","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","LazyLoadQueueRepeat","_queue","SuperStickerRenderer","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","StickersTab","recentStickers","queueCategoryPush","categoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","stickers","menuWrapper","menuScroll","getRecentStickers","pushRecentSticker","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","search","gifsDiv","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","AppStickersTab","setsDiv","renderSet","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","covered","searchStickerSets","DropdownHover","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","dispatchResultableEvent","attachButtonListener","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","savedRange","getGoodRange","emojiTab","stickersTab","gifsTab","HIDE_EMOJI_TAB","IS_APPLE_MOBILE","INIT_TAB_ID","addLazyLoadQueueRepeat","getSavedRange","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueuePromise","messagesQueue","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","random_id","viewSponsoredMessage","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getMiddleware","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","appImManager","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","spoiler","showDuration","spoilerTimeout","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","messageId","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","ignoreHeavyAnimation","scrollDimensions","sliceViewportDebounced","topbar","setCorrectIndexThrottled","lastScrollDirection","setStickyDateManually","distanceToEnd","getDistanceToEnd","setPeerPromise","requestHistory","setMessageId","constructBubbles","bubbleGroups","messagesStorageKey","newItem","_items","groupBubbles","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","scrollSaver","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","contextMenu","highlightBubble","canSend","initMessageReply","replyAfter","shouldReply","_target","constructPeerHelpers","renderNewMessagesByIds","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","postViewsElements","different","postViews","incrementMessageViews","createResizeObserver","resizeObserver","wasHeight","resizing","skip","scrolled","rAF","onResizeEnd","offsetHeight","isScrolledDown","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","overlayCounter","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","readMessages","readHistory","constructPinnedHelpers","constructScheduledHelpers","getScheduledMessagesStorage","onGoDownClick","getBubbleByPoint","getGroupedBubble","findNextMountedBubbleByMsgId","filterCallback","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","setLoaded","onScrolledTop","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","permanent","ignoreOnScroll","emptyPlaceholderBubble","ignoreNextScrollEvent","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","_renderNewMessagesByIds","replyTo","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","messageInput","margin","axis","getNormalSize","dimensions","lastScrollPosition","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","cancelMeasure","samePeer","startParam","bindPrefix","onChangePeer","topMessage","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","unread_count","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","unread_mark","markDialogUnread","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","historyMaxId","canWrite","renderMessagesQueue","setMessagesQueuePromise","renderQueue","renderQueuePromises","loadQueue","filterQueue","avatarPromises","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","local","updatePlaceholderPosition","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","unread","chat_id","is_single","messageMessage","messageMedia","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","forward","replyMarkup","reply_markup","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","popup","switchInlineQuery","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","processingWebPage","IS_ANDROID","previewResizer","preview","quote","quoteTextDiv","strong","textDiv","isSquare","emojiSticker","animatedSticker","staticSticker","newNameContainer","getMidsByMid","wrapper","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","contactNumberDiv","phone_number","wrapPoll","needName","titleVia","isHidden","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","getViewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","getHistory","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","getOutputPeer","saveMessages","extraSize","invisibleTop","invisibleBottom","foundVisible","visibleRect","minTop","maxBottom","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","_log","getSponsoredMessage","sponsoredMessages","messagePromise","processPromise","bot_info","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","buttonsEl","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","newMessage","btnClose","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","dialogSize","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","animationGroup","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","selectWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","onContextMenu","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","noForwards","viewerPeerId","canOpenReactedList","initResult","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","attachListenerSetter","closest","filterButtons","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","onMessageSent","canEditMessage","hasTarget","isGoodType","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","visibility","reactionsCount","fakeElem","readParticipants","isFull","totalSize","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","questionInputField","sendSilent","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","HTMLInputElement","getRichValue","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","videoHeight","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","placeCaretAtEnd","attachFile","willAttach","shouldCompress","params","itemDiv","attachMedia","attachDocument","sendFileDetails","config","getConfig","captionLengthMax","caption_length_max","mediaContainer","wasInputValue","messageInputField","attachFiles","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","isMedia","sendingParams","sendText","sendAlbum","assign","replyToMsgId","startsWith","source","objectURL","controls","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","isPhoto","isAudio","finish","onRender","foundPhotos","foundVideos","foundFiles","n","appendMediaToContainer","firstType","albumContainer","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","AutocompleteHelper","hidden","onVisible","resetTarget","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","_onKeyDown","attachListNavigation","listType","noBlurOnPop","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","ready","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","node","alt","getRichElementValue","caretPos","combineSameEntities","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","botInfo","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","helpers","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","separator","dcId","readBlobAsDataURL","dataURL","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","addedListener","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","shiftKey","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","Blob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","getNeededFakeContainer","hasMentions","unread_mentions_count","tsNow","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","inputFake","wrappedDraft","myEntities","apiEntities","wrapDraft","setInputValue","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","ctrlKey","metaKey","setStart","collapse","addRange","readAllHistory","commandsMap","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","suffix","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","wrapSingleMessage","_message","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","VolumeSelector","onMuteClick","setVolume","volume","iconIndex","ICONS","ChatAudio","onPlaybackParams","playbackParams","fasterEl","playbackRate","repeatEl","onPause","toggleEl","onStop","onMediaPlay","isMusic","volumeSelector","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","cssText","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","getRow","animateFirst","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","debug","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","lastY","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","PopupMute","mutePeer","ONE_HOUR","radioForm","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","audioAsset","getAudioConstraints","constraints","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","getScreenConstraints","skipAudio","frameRate","getScreenStream","screenStream","getDisplayMedia","getVideoTracks","contentHint","getStream","stream","getUserMedia","getTracks","getStreamCached","_cache","screen","isScreen","stopTrack","track","StringFromLineBuilder","newLine","strs","word","addJoined","finalize","toTelegramSource","fromTelegramSource","fixMediaLineType","mediaType","getConnectionTypeForMediaType","generateMediaFirstLine","port","payloadIds","connectionType","SDPBuilder","addCandidate","foundation","component","protocol","priority","generation","performCandidate","addHeader","sId","bundleMids","bundle","addTransport","transport","skipCandidates","ufrag","pwd","fingerprint","fingerprints","setup","candidates","candidate","addSsrc","streamName","sourceGroups","addSource","ssrc","addMsid","ssrcGroup","sources","semantics","addSsrcEntry","isAnswer","isApplication","codec","isInactive","shouldBeSkipped","payloadTypes","hdrexts","hdrext","clockrate","parameters","fbs","fb","subtype","addConference","conference","sessionId","IS_FIREFOX","recvEntry","sendEntry","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","interval","getAmplitude","streamAnalyser","rms","analyse","amplitudes","ANALYSER_LISTENER","AudioContext","webkitAudioContext","outputStream","MediaStream","inputStream","canCreateConferenceEntry","addStream","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","hasInputTrackKind","substring","handled","replaceInputAudio","oldTrack","timer","appendToConference","transceiverInit","streams","tracks","findEntry","createEntry","transceiver","createTransceiver","connection","mediaTrackType","trackIdx","sender","replaceTrack","CallInstanceBase","fixSafariAudio","isSharingAudio","streamManager","isSharingVideo","requestAudioSource","requestInputSource","isAudioGood","isVideoGood","onInputStream","requestScreen","getElement","endpoint","onTrack","tryAddTrack","saveInputVideoStream","isOutput","isVideo","elementEndpoint","useStream","srcObject","sinkId","outputDeviceId","setSinkId","setMuted","getAudioTracks","isClosing","ConferenceEntry","originalDirection","setPort","setEndpoint","addTransceiver","setSource","generateSsrc","LocalConferenceDescription","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","setData","deleteEntry","setEntrySource","setEntryPeerId","findFreeSendRecvEntry","isSending","getEntryByMid","getEntryBySource","getEntriesByPeerId","generateSdp","fromConference","CallConnectionInstanceBase","createPeerConnection","RTCPeerConnection","signalingState","connectionState","iceConnectionState","createDataChannel","dict","dataChannel","channel","createDescription","appendStreamToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","SDP","mediaSections","parsed","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","mediaLineParts","SDPAttributeInner","missed","exists","rest","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","mediaLine","isReceiving","lookupAttributeKeys","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","parseMediaSectionInfo","sdp","clientInfo","telegramSourceGroups","sdpLines","parseSourceGroups","raw","GROUP_CALL_STATE","GroupCallConnectionInstance","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","groupCall","groupCallId","processedChannels","processed","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","parse","appGroupCallsManager","joinGroupCall","connections","extmap","performExtmap","filterServerCodecs","isNewConnection","originalOffer","createOffer","iceRestart","offer","hasMunged","skipAddingMulticast","generator","originalSsrcs","ssrcs","ssrcs2","ssrcsStrLines","ssrc2","addSimulcast","localMLine","codecIds","newData","newChannel","mungedSdp","fixLocalOffer","setLocalDescription","entriesToDelete","answerDescription","iceGatheringState","setRemoteDescription","updateConstraints","getTransceivers","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","can_self_unmute","getCachedParticipants","isSharingScreen","presentation","pinSource","unpinSource","unpinAll","getParticipantByPeerId","toggleMuted","changeUserMuted","editParticipant","getVideoElementFromParticipantByType","source_groups","clone","createConnectionInstance","changeRaiseHand","raise","raiseHand","startScreenSharingInternal","connectionInstance","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","toggleScreenSharing","startVideoSharingInternal","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","stopVideoSharing","toggleVideoSharing","hangUp","discard","rejoin","isDiscarded","isUpdatingMeInCurrentCall","raise_hand_rating","audio_source","audioSource","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","makeSsrcFromParticipant","makeSsrcsFromParticipant","modifiedTypes","oldSsrc","oldSource","oldEntry","GroupCallsController","currentGroupCall","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","createMainStreamManager","joinGroupCallInternal","getGroupCallFull","getGroupCallParticipants","handleUpdateGroupCallParticipants","updatingSdp","groupCallsController","ChatTopbar","verifyButtons","isMenuOpen","btnMore","deleteButtonText","getDeleteButtonText","menuButtons","buttonsToVerify","verifyVideoChatButton","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","onResize","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","constructDiscussionHelpers","byCurrent","newAvatar","setTitleCallback","setStatusCallback","setTitleManual","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","instance","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","objectUrl","CanvasPattern","imageWidth","imageHeight","mask","globalCompositeOperation","setCanvasDimensions","Chat","backgroundEl","Log","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","patternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","beforeDestroy","cleanupBackground","searchTab","_isAnyGroup","setAutoDownloadMedia","bubblesSetPeerPromise","destroySharedMediaTab","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","setPrefix","getMessageFromStorage","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","getActiveMarkupButton","nodes","getSelectedNodes","currentMarkups","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","draw","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","createLinearGradient","addColorStop","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","customProperties","computedStyle","getProperty","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","withIcons","iconClassName","element2","actionClassName","GroupCallParticipantsList","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","ControlsHover","hideControls","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","canHideControls","showControls","toggleControls","ignoreClickClassName","relatedTarget","showOnLeaveToClassName","lockControls","callVideoCanvasBlur","renderFrame","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","setElementDisplay","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","isPinned","hasAnyVideo","participantElements","participantVideo","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","canManageCall","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","onScreenClick","btnScreen","onLeaveClick","onFullScreenChange","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CALL_STATE","CallDescriptionElement","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","big","isPendingIncoming","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","parseSignalingData","screencast","convertNumber","ssrcGroups","sourceGroup","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","feedbackTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","offerSent","initialSetup","sendCallSignalingData","CALL_REQUEST_TIMEOUT","CallsController","instances","sortedInstances","setPhoneCall","confirmCall","createCallInstance","admin_id","overrideConnectionState","setHangUpTimeout","encryptionKey","g_a","dh","g_a_or_b","g_a_hash","bytesCmp","key_fingerprint","appCallsManager","computeKey","joinCall","callId","onUpdatePhoneCallSignalingData","currentCall","getCallByUserId","CallInstance","hasConnected","clearHangUpTimeout","discardReason","hasCurrent","startCallInternal","fullInfo","participant_id","generateDh","requestCall","phoneCall","callsController","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","convertToUint8Array","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","stringBuilder","addExtmap","addPayloadTypes","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","userAgent","isSafari","j","fmtp","getOwnPropertyNames","pName","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","relAddress","tcpType","networkId","networkCost","generateOffer","generateAnswer","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","lowBattery","videoRotation","Proxy","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","sortIndex","wasStartingScreen","wasStartingVideo","isSharingVideoType","audioTrack","hangUpTimeout","canAccept","g_b","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","configuration","ipv6","password","urls","turn","stun","credential","p2p_allowed","getRtcConfiguration","sendIceCandidate","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","p2pParseCandidate","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","sdpDescription","videoTrack","onMutedChange","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","sendRecvEntry","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","TopbarCall","onState","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconEl","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","notificationsUiSupport","notifySoundEl","topMessagesDeferred","singleInstance","idle","toggleToggler","peerString","soundReset","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","setFavicon","titleInterval","arc","fontSize","textBaseline","textAlign","fillText","prevFavicon","replaceChild","testSound","permission","appRuntimeManager","onclose","getLocalSettings","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","webkitGetAsEntry","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","onHashChange","saveState","parseUriParams","tgaddr","postId","openUsername","userName","setSettings","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","apiUpdatesManager","backgroundPromises","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","compareVersion","deleteFilesIterative","headers","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typings","typing","onInstanceDeactivated","isUpdated","stateStorage","topbarCall","discardCurrentCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","makeLink","VOICE_CHAT","USER_PHONE_NUMBER","PRIVATE_POST","thread","comment","MESSAGE","attachKeydownListener","timeoutOperation","requests","request","isBad","activatingChat","IGNORE_KEYS","altKey","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","checkChatInvite","saveApiChat","resolvePhone","openUrl","wrappedUrl","noPathnameParams","pathname","noUriParams","openComment","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","prevTab","prevIdx","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","drop","transitionTime","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","justReturn","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","dot","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","peerTitlePromise","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getUserStatus","ignoreSelf","getPeerStatus","useWhitespace","typingContainer","VideoPlayer","onPlaybackRackMenuToggle","onPip","onPipClose","playbackRateButton","skin","stylePlayer","setBtnMenuToggle","initDuration","buildControls","timeDuration","pipButton","fullScreenButton","timeElapsed","leftControls","requestPictureInPicture","debounceTime","debouncedPip","listener","pictureInPictureElement","toggleFullScreen","nextIdx","PLAYBACK_RATES","onFullScreen","setPlaybackRateIcon","pictureInPictureEnabled","rate","PLAYBACK_RATES_ICONS","webkitEnterFullscreen","enterFullscreen","AppMediaViewerBase","topButtons","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","classNames","ctrlKeyDown","changeZoom","onKeyUp","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","authorRight","zoom","onLoadedMore","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","zoomSwipeHandler","lastDiffY","btnMenuToggle","setMoverToTarget","appMediaViewer","removeGlobalListeners","toggleOverlay","toggleGlobalListeners","setGlobalListeners","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGForeignObjectElement","needOpacity","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","setAuthorInfo","wrapTitlePromise","oldAvatar","_openMedia","setAuthorPromise","setTargets","useContainerAsTarget","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","otherMediaViewer","releaseSingleMedia","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","cancellablePromise","haveImage","captionTimeout","isForDocument","onAuthorClick","onEmptied","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","onCaptionClick","getScheduledMessageByPeer","setCaption","cantForwardMessage","cantDownloadMessage","AvatarListLoader","loadedAllUp","AppMediaViewerAvatar","onAvatarUpdate","getTarget","hadMessage","isObject","believeMe","addedToQueue","wasPeerId","newPeerId","DialogsContextMenu","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","SENDING_STATUS","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","rootScope","baseDcId","connectionStatus","setFirstConnectionTimeout","online","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","forceReconnectTimeout","setStateTimeout","statusContainer","easeInOutSine","roundRect","dpr","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","animations","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","shimmerColor","on","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","completed","elapsedRowTime","dialogHeight","createPattern","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","drawCircle","drawCircleFromStart","setPromiseMiddleware","oldPromise","SortedDialogList","indexKey","appDialogsManager","addListDialog","isBatch","AppDialogsManager","placeholders","sortedLists","scrollables","folders","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","onTabChange","loadDialogsRenderPromise","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","setListClickListener","onChatsRegularScroll","sliceTimeout","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","getProxiedManagers","allUnreadCount","bottomPart","allChatsIntlElement","onStateLoaded","setFilterId","addFilter","foldersScrollable","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","getDialogIndexKey","getDialogIndexKeyByFilterId","setOnlineStatus","hasClassName","initListeners","getDialogDom","processDialogForCallStatus","setFilterUnreadCount","setLastMessageN","setUnread","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessagesN","setDialogActive","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","haveFilters","renderFiltersPromise","showFiltersPromise","savePeerSettings","getNotifyPeerTypeSettings","fillConversations","getOffsetIndex","isDialogMustBeInViewport","migratedTo","testDialogForFilter","topOffset","bottomOffset","unreadSpan","foundUnmuted","unreadCount","getFolderUnreadCount","generateScrollable","sortedDialogList","createChatList","clientWidth","wasShowing","cachedInfoPromise","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","cccc","offsetDialog","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","setLastMessage","draftMessage","lastTimeSpan","willPrepend","videoTypes","playIcon","senderBold","setUnreadMessages","wasMuted","setStatusMessage","hasUnreadBadge","transitionDuration","disableAnimationIfRippleFound","setSendingStatus","statusSpan","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","isMention","getDialog","originalDialog","setCallStatus","START_X","wasMounted","itemProgress","groupCallActiveIcon","addDialogNew","call_not_empty","addDialogAndSetLastMessage","addDialog","captionDiv","titleSpanContainer","titleIconsPromise","titleP","rightSpan","oldTypingElement","newTypingElement","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function"],"sourceRoot":""} \ No newline at end of file diff --git a/public/960.7ae964ab6031f51a0275.bundle.js b/public/960.7ae964ab6031f51a0275.bundle.js new file mode 100644 index 000000000..5d7d52111 --- /dev/null +++ b/public/960.7ae964ab6031f51a0275.bundle.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[960],{410:(e,t,s)=>{s.d(t,{GO:()=>i,ZP:()=>o});const n=s(1267).Z.debug,i="undefined"!=typeof window?window:self,o=n},1267:(e,t,s)=>{s.d(t,{Z:()=>i});const n={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};n.http=location.search.indexOf("http=1")>0,n.http&&(n.transport="https");const i=n},6761:(e,t,s)=>{s.d(t,{Z:()=>n});const n="undefined"!=typeof window?window:self},4064:(e,t,s)=>{function n(e,t){const s=e.findIndex(t);return-1!==s?e.splice(s,1)[0]:void 0}s.d(t,{Z:()=>n})},1655:(e,t,s)=>{function n(e,t){const s=e.indexOf(t),n=-1!==s&&e.splice(s,1);return n&&n[0]}s.d(t,{Z:()=>n})},4903:(e,t,s)=>{function n(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),s=new Uint8Array(t);let n=0;return e.forEach((e=>{s.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length})),s}s.d(t,{Z:()=>n})},1352:(e,t,s)=>{s.d(t,{N5:()=>i,SU:()=>n,kC:()=>o,sj:()=>c});const n="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,i="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!n,o=i||n,r=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},a=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((s=>{s.length&&s.slice(e?0:-1).forEach((e=>{r(e,...t)}))}))},c=(n&&a.bind(null,!1),n?a.bind(null,!0):i?(...e)=>{r(self,...e)}:()=>{})},5289:(e,t,s)=>{s.d(t,{Z:()=>i});const n=Date.now();function i(){return"["+((Date.now()-n)/1e3).toFixed(3)+"]"}},3241:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(4064);class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var n;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null==s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&(0,n.Z)(this.listeners[e],(e=>e.callback===t))}invokeListenerCallback(e,t,...s){var n;let i;try{i=t.callback(...s)}catch(e){console.error(e)}return(null===(n=t.options)||void 0===n?void 0:n.once)&&this.removeEventListener(e,t.callback),i}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const n=t&&[],i=this.listeners[e];return i&&i.slice().forEach((t=>{if(-1===i.findIndex((e=>e.callback===t.callback)))return;const o=this.invokeListenerCallback(e,t,...s);n&&n.push(o)})),n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},8630:(e,t,s)=>{s.d(t,{Z:()=>c});var n=s(153),i=s(410),o=s(1352);class r extends n.Z{invokeCrypto(e,...t){const s={method:e,args:t},n=this.listeners.invoke;if(null==n?void 0:n.length){let e=n[0].callback(s);return o.kC||e instanceof Promise||(e=Promise.resolve(e)),e}return this.invoke("invoke",s)}}const a=new r;i.GO&&(i.GO.cryptoMessagePort=a);const c=a},153:(e,t,s)=>{s.d(t,{Z:()=>h});var n=s(410),i=s(6761),o=s(1655),r=s(1352),a=s(3241),c=s(5003);class h extends a.Z{constructor(){super(!1),this.onMessage=e=>{const t=e.data,s=e.source||e.currentTarget;this.processTaskMap[t.type](t,s,e)},this.processResultTask=e=>{const{taskId:t,result:s,error:n}=e.payload,i=this.awaiting[t];i&&(this.debug&&this.log.debug("done",i.taskType,s,n),"error"in e.payload?i.reject(n):i.resolve(s),delete this.awaiting[t])},this.processAckTask=e=>{const t=e.payload,s=this.awaiting[t.taskId];s&&(0,s.resolve)({cached:t.cached,result:t.cached?"result"in t?Promise.resolve(t.result):Promise.reject(t.error):new Promise(((e,t)=>{s.resolve=e,s.reject=t}))})},this.processPingTask=(e,t,s)=>{this.pushTask(this.createTask("pong",void 0),s.source)},this.processPongTask=(e,t,s)=>{const n=this.pingResolves.get(t);n&&(this.pingResolves.delete(t),n())},this.processCloseTask=(e,t,s)=>{this.detachPort(t)},this.processInvokeTask=(e,t,s)=>{return n=this,i=void 0,r=function*(){const n=e.id,i=e.payload;let o,r,a,c;i.void||(o={taskId:n},r=this.createTask("result",o)),i.withAck&&(a=this.createTask("ack",{taskId:n,cached:!0}));try{const e=this.listeners[i.type];if(!(null==e?void 0:e.length))throw new Error("no listener");const n=e[0];let r=this.invokeListenerCallback(i.type,n,i.payload,t,s);if(i.void)return;if(c=r instanceof Promise,a){const e=!c;if(a.payload.cached=e,e&&(a.payload.result=r),this.pushTask(a,t),e)return}c&&(r=yield r),o.result=r}catch(s){if(this.log.error("worker task error:",s,e),i.void)return;if(a&&a.payload.cached)return a.payload.error=s,void this.pushTask(a,t);o.error=s}this.pushTask(r,t)},new((o=void 0)||(o=Promise))((function(e,t){function s(e){try{c(r.next(e))}catch(e){t(e)}}function a(e){try{c(r.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((r=r.apply(n,i||[])).next())}));var n,i,o,r},this.processTaskMap={result:this.processResultTask,ack:this.processAckTask,invoke:this.processInvokeTask,ping:this.processPingTask,pong:this.processPongTask,close:this.processCloseTask}}_constructor(){super._constructor(!1),this.listenPorts=[],this.sendPorts=[],this.pingResolves=new Map,this.taskId=0,this.awaiting={},this.pending=new Map,this.log=(0,c.kg)("MP"),this.debug=n.ZP,"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{const e=this.createTask("close",void 0);this.postMessage(void 0,e)}))}setOnPortDisconnect(e){this.onPortDisconnect=e}attachPort(e){this.attachListenPort(e),this.attachSendPort(e)}attachListenPort(e){this.listenPorts.push(e),e.addEventListener("message",this.onMessage)}attachSendPort(e){this.log.warn("attaching port"),e.start&&e.start(),this.sendPorts.push(e)}detachPort(e){this.log.warn("disconnecting port"),e.removeEventListener("message",this.onMessage),(0,o.Z)(this.listenPorts,e),(0,o.Z)(this.sendPorts,e),e.close&&e.close(),this.onPortDisconnect&&this.onPortDisconnect(e)}postMessage(e,t){(Array.isArray(e)?e:e?[e]:this.sendPorts).forEach((e=>{e.postMessage(t,t.transfer)}))}releasePending(){this.listenPorts.length&&!this.releasingPending&&(this.releasingPending=!0,this.debug&&this.log.debug("releasing tasks, length:",this.pending.size),this.pending.forEach(((e,t)=>{e.forEach((e=>{try{r.SU?(0,r.sj)(e):this.postMessage(t,e)}catch(s){this.log.error("postMessage error:",s,e,t)}}))})),this.debug&&this.log.debug("released tasks"),this.pending.clear(),this.releasingPending=!1)}createTask(e,t,s){return{type:e,payload:t,id:this.taskId++,transfer:s}}createInvokeTask(e,t,s,n,i){return this.createTask("invoke",{type:e,payload:t,withAck:s,void:n},i)}pushTask(e,t){let s=this.pending.get(t);s||this.pending.set(t,s=[]),s.push(e),this.releasePending()}invokeVoid(e,t,s,n){const i=this.createInvokeTask(e,t,void 0,!0,n);this.pushTask(i,s)}invoke(e,t,s,n,o){let a;this.debug&&this.log.debug("start",e,t);const c=new Promise(((i,r)=>{a=this.createInvokeTask(e,t,s,void 0,o),this.awaiting[a.id]={resolve:i,reject:r,taskType:e},this.pushTask(a,n)}));if(r.kC){c.finally((()=>{clearInterval(e)}));const e=i.Z.setInterval((()=>{this.log.error("task still has no result",a,n)}),5e3)}return c}invokeExceptSource(e,t,s){const n=this.sendPorts.slice();(0,o.Z)(n,s),n.forEach((s=>{this.invokeVoid(e,t,s)}))}}},690:(e,t,s)=>{var n=s(4903);Uint8Array.prototype.concat=function(...e){return(0,n.Z)(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(e){const t=t=>Promise.resolve(e()).then(t);return this.then((e=>t((()=>e))),(e=>t((()=>Promise.reject(e)))))}}}]); +//# sourceMappingURL=960.7ae964ab6031f51a0275.bundle.js.map \ No newline at end of file diff --git a/public/960.7ae964ab6031f51a0275.bundle.js.map b/public/960.7ae964ab6031f51a0275.bundle.js.map new file mode 100644 index 000000000..a922bb70a --- /dev/null +++ b/public/960.7ae964ab6031f51a0275.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"960.7ae964ab6031f51a0275.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/helpers/array/findAndSplice.ts","webpack://tweb/./src/helpers/array/indexOfAndSplice.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/dT.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/mtproto/superMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = (process.env.NODE_ENV !== 'production' || Modes.debug)/* && false */;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\r\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","export default function findAndSplice(array: Array, verify: (value: T, index?: number, array?: Array) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({includeUncontrolled: false, type: 'window'});\r\n};\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","const _logTimer = Date.now();\r\nexport default function dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\nimport findAndSplice from \"./array/findAndSplice\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\ntype ListenerObject = {callback: T, options: boolean | AddEventListenerOptions};\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n findAndSplice(this.listeners[name], l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n protected invokeListenerCallback>(name: T, listener: L, ...args: ArgumentTypes) {\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n const result = this.invokeListenerCallback(name, listener, ...args);\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CryptoMethods } from './crypto_methods';\r\nimport SuperMessagePort from '../mtproto/superMessagePort';\r\nimport { Awaited } from '../../types';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { IS_WORKER } from '../../helpers/context';\r\n\r\ntype CryptoEvent = {\r\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\r\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\r\n};\r\n\r\nexport class CryptoMessagePort extends SuperMessagePort {\r\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\r\n const payload = {method, args};\r\n const listeners = this.listeners['invoke'];\r\n if(listeners?.length) { // already in worker\r\n // try {\r\n // @ts-ignore\r\n let result: any = listeners[0].callback(payload);\r\n if(!IS_WORKER && !(result instanceof Promise)) {\r\n result = Promise.resolve(result);\r\n }\r\n\r\n return result;\r\n // } catch(err) {\r\n // return Promise.reject(err);\r\n // }\r\n }\r\n\r\n // @ts-ignore\r\n return this.invoke('invoke', payload);\r\n }\r\n}\r\n\r\nconst cryptoMessagePort = new CryptoMessagePort();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\r\nexport default cryptoMessagePort;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../../config/debug\";\nimport ctx from \"../../environment/ctx\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { IS_SERVICE_WORKER, IS_WORKER, notifyAll } from \"../../helpers/context\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { Awaited, WorkerTaskTemplate, WorkerTaskVoidTemplate } from \"../../types\";\nimport { logger } from \"../logger\";\n\ntype SuperMessagePortTask = WorkerTaskTemplate & {\n transfer?: Transferable[]\n};\n\ninterface InvokeTask extends SuperMessagePortTask {\n type: 'invoke',\n payload: WorkerTaskVoidTemplate & {withAck?: boolean, void?: boolean}\n}\n\ninterface ResultTask extends SuperMessagePortTask {\n type: 'result',\n payload: {\n taskId: number,\n result?: any,\n error?: any\n }\n}\n\ninterface AckTask extends SuperMessagePortTask {\n type: 'ack',\n payload: {\n cached: boolean,\n taskId: number\n result?: any,\n error?: any,\n }\n}\n\ninterface PingTask extends SuperMessagePortTask {\n type: 'ping'\n}\n\ninterface PongTask extends SuperMessagePortTask {\n type: 'pong'\n}\n\ninterface BatchTask extends SuperMessagePortTask {\n type: 'batch',\n payload: Task[]\n}\n\ninterface CloseTask extends SuperMessagePortTask {\n type: 'close'\n}\n\ntype Task = InvokeTask | ResultTask | AckTask | PingTask | PongTask | BatchTask | CloseTask;\ntype TaskMap = {\n [type in Task as type['type']]?: (task: Extract, source: MessageEventSource, event: MessageEvent) => void | Promise\n};\n\nexport type AckedResult = {\n cached: boolean,\n result: Promise\n};\n// export type AckedResult = {\n// cached: true,\n// result: T\n// } | {\n// cached: false,\n// result: Promise\n// };\n\ntype ListenPort = WindowProxy | MessagePort | ServiceWorker | Worker | ServiceWorkerContainer;\ntype SendPort = WindowProxy | MessagePort | ServiceWorker | Worker;\n\ntype ListenerCallback = (payload: any, source: MessageEventSource, event: MessageEvent) => any;\ntype Listeners = Record;\n\n// const PING_INTERVAL = DEBUG && false ? 0x7FFFFFFF : 5000;\n// const PING_TIMEOUT = DEBUG && false ? 0x7FFFFFFF : 10000;\n\nexport default class SuperMessagePort<\n Workers extends Listeners, \n Masters extends Listeners,\n IsMaster extends boolean,\n Receive extends Listeners = IsMaster extends true ? Masters : Workers,\n Send extends Listeners = IsMaster extends true ? Workers : Masters\n> extends EventListenerBase {\n protected listenPorts: Array;\n protected sendPorts: Array;\n protected pingResolves: Map void>;\n\n protected taskId: number;\n protected awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskType: string\n }\n };\n protected pending: Map;\n\n protected log: ReturnType;\n protected debug: boolean;\n protected releasingPending: boolean;\n\n protected processTaskMap: TaskMap;\n\n protected onPortDisconnect: (source: MessageEventSource) => void;\n\n constructor() {\n super(false);\n\n this.processTaskMap = {\n result: this.processResultTask,\n ack: this.processAckTask,\n invoke: this.processInvokeTask,\n ping: this.processPingTask,\n pong: this.processPongTask,\n close: this.processCloseTask\n };\n }\n\n public _constructor() {\n super._constructor(false);\n\n this.listenPorts = [];\n this.sendPorts = [];\n this.pingResolves = new Map();\n this.taskId = 0;\n this.awaiting = {};\n this.pending = new Map();\n this.log = logger('MP');\n this.debug = DEBUG;\n\n if(typeof(window) !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n const task = this.createTask('close', undefined);\n this.postMessage(undefined, task);\n });\n }\n }\n\n public setOnPortDisconnect(callback: (source: MessageEventSource) => void) {\n this.onPortDisconnect = callback;\n }\n\n public attachPort(port: MessageEventSource) {\n this.attachListenPort(port);\n this.attachSendPort(port);\n }\n\n public attachListenPort(port: ListenPort) {\n this.listenPorts.push(port);\n port.addEventListener('message', this.onMessage as any);\n }\n\n public attachSendPort(port: SendPort) {\n this.log.warn('attaching port');\n\n if((port as MessagePort).start) {\n (port as MessagePort).start();\n }\n\n this.sendPorts.push(port);\n // this.sendPing(port);\n }\n\n // ! Can't rely on ping because timers can be suspended\n // protected sendPing(port: SendPort, loop = IS_WORKER) {\n // let timeout: number;\n // const promise = new Promise((resolve, reject) => {\n // this.pingResolves.set(port, resolve);\n // this.pushTask(this.createTask('ping', undefined), port);\n\n // timeout = ctx.setTimeout(() => {\n // reject();\n // }, PING_TIMEOUT);\n // });\n\n // promise.then(() => {\n // // this.log('got pong');\n\n // clearTimeout(timeout);\n // this.pingResolves.delete(port);\n\n // if(loop) {\n // this.sendPingWithTimeout(port);\n // }\n // }, () => {\n // this.pingResolves.delete(port);\n // this.detachPort(port);\n // });\n // }\n\n // protected sendPingWithTimeout(port: SendPort, timeout = PING_INTERVAL) {\n // ctx.setTimeout(() => {\n // if(!this.sendPorts.includes(port)) {\n // return;\n // }\n\n // this.sendPing(port);\n // }, timeout);\n // }\n\n protected detachPort(port: SendPort) {\n this.log.warn('disconnecting port');\n \n port.removeEventListener('message', this.onMessage as any);\n indexOfAndSplice(this.listenPorts, port);\n indexOfAndSplice(this.sendPorts, port);\n if((port as MessagePort).close) {\n (port as MessagePort).close();\n }\n\n this.onPortDisconnect && this.onPortDisconnect(port as any);\n }\n\n protected postMessage(port: SendPort | SendPort[], task: Task) {\n const ports = Array.isArray(port) ? port : (port ? [port] : this.sendPorts);\n ports.forEach((port) => {\n port.postMessage(task, task.transfer as any);\n });\n }\n\n protected onMessage = (event: MessageEvent) => {\n const task: Task = event.data;\n // this.log('got message', task);\n\n const source: MessageEventSource = event.source || event.currentTarget as any; // can have no source\n /* if(task.type === 'batch') {\n const newEvent: MessageEvent = {data: event.data, source: event.source, currentTarget: event.currentTarget} as any;\n task.payload.forEach((task) => {\n // @ts-ignore\n newEvent.data = task;\n this.onMessage(newEvent);\n });\n } */\n\n // @ts-ignore\n this.processTaskMap[task.type](task, source, event);\n };\n\n protected /* async */ releasePending() {\n //return;\n\n if(!this.listenPorts.length || this.releasingPending) {\n return;\n }\n\n this.releasingPending = true;\n // const perf = performance.now();\n // await pause(0);\n\n this.debug && this.log.debug('releasing tasks, length:', this.pending.size/* , performance.now() - perf */);\n\n this.pending.forEach((portTasks, port) => {\n // let batchTask: BatchTask;\n // const tasks: Task[] = [];\n // portTasks.forEach((task) => {\n // if(task.transfer) {\n // batchTask = undefined;\n // tasks.push(task);\n // } else {\n // if(!batchTask) {\n // batchTask = this.createTask('batch', []);\n // tasks.push(batchTask);\n // }\n\n // batchTask.payload.push(task);\n // }\n // });\n\n const tasks = portTasks;\n\n tasks.forEach((task) => {\n // if(task.type === 'batch') {\n // this.log(`batching ${task.payload.length} tasks`);\n // }\n\n try {\n if(IS_SERVICE_WORKER) {\n notifyAll(task);\n } else {\n this.postMessage(port, task);\n }\n } catch(err) {\n this.log.error('postMessage error:', err, task, port);\n }\n });\n });\n\n this.debug && this.log.debug('released tasks');\n this.pending.clear();\n\n this.releasingPending = false;\n }\n\n protected processResultTask = (task: ResultTask) => {\n const {taskId, result, error} = task.payload;\n const deferred = this.awaiting[taskId];\n if(!deferred) {\n return;\n }\n\n this.debug && this.log.debug('done', deferred.taskType, result, error);\n 'error' in task.payload ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n };\n\n protected processAckTask = (task: AckTask) => {\n const payload = task.payload;\n const deferred = this.awaiting[payload.taskId];\n if(!deferred) {\n return;\n }\n\n // * will finish the init promise with incoming result\n const previousResolve: (acked: AckedResult) => void = deferred.resolve;\n // const previousReject = deferred.reject;\n\n // if(payload.cached) {\n // if('result' in payload) {\n // previousResolve({\n // cached: true,\n // result: payload.result\n // });\n // } else {\n // previousReject(payload.error);\n // }\n // } else {\n // const ret: AckedResult = {\n // cached: false,\n // result: new Promise((resolve, reject) => {\n // deferred.resolve = resolve;\n // deferred.reject = reject;\n // })\n // };\n\n // previousResolve(ret);\n // }\n\n const ret: AckedResult = {\n cached: payload.cached,\n result: payload.cached ? ('result' in payload ? Promise.resolve(payload.result) : Promise.reject(payload.error)) : new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n })\n };\n\n previousResolve(ret);\n };\n\n protected processPingTask = (task: PingTask, source: MessageEventSource, event: MessageEvent) => {\n this.pushTask(this.createTask('pong', undefined), event.source);\n };\n\n protected processPongTask = (task: PongTask, source: MessageEventSource, event: MessageEvent) => {\n const pingResolve = this.pingResolves.get(source);\n if(pingResolve) {\n this.pingResolves.delete(source);\n pingResolve();\n }\n };\n\n protected processCloseTask = (task: CloseTask, source: MessageEventSource, event: MessageEvent) => {\n this.detachPort(source);\n };\n\n protected processInvokeTask = async(task: InvokeTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.id;\n const innerTask = task.payload;\n \n let resultTaskPayload: ResultTask['payload'];\n let resultTask: ResultTask, ackTask: AckTask;\n if(!innerTask.void) {\n resultTaskPayload = {taskId: id};\n resultTask = this.createTask('result', resultTaskPayload);\n }\n\n if(innerTask.withAck) {\n ackTask = this.createTask('ack', {\n taskId: id,\n cached: true\n });\n }\n\n let isPromise: boolean;\n try {\n const listeners = this.listeners[innerTask.type];\n if(!listeners?.length) {\n throw new Error('no listener');\n }\n\n const listener = listeners[0];\n\n // @ts-ignore\n let result = this.invokeListenerCallback(innerTask.type, listener, innerTask.payload, source, event);\n if(innerTask.void) {\n return;\n }\n\n isPromise = result instanceof Promise;\n\n if(ackTask) {\n const cached = !isPromise;\n ackTask.payload.cached = cached;\n if(cached) ackTask.payload.result = result;\n this.pushTask(ackTask, source);\n\n if(cached) {\n return;\n }\n }\n\n if(isPromise) {\n result = await result;\n }\n \n resultTaskPayload.result = result;\n } catch(error) {\n this.log.error('worker task error:', error, task);\n if(innerTask.void) {\n return;\n }\n\n if(ackTask && ackTask.payload.cached) {\n ackTask.payload.error = error;\n this.pushTask(ackTask, source);\n return;\n }\n\n resultTaskPayload.error = error;\n }\n\n this.pushTask(resultTask, source);\n };\n\n protected createTask[0]>(type: T, payload: K['payload'], transfer?: Transferable[]): K {\n return {\n type,\n payload,\n id: this.taskId++,\n transfer\n } as K;\n }\n\n protected createInvokeTask(type: string, payload: any, withAck?: boolean, _void?: boolean, transfer?: Transferable[]): InvokeTask {\n return this.createTask('invoke', {\n type,\n payload,\n withAck,\n void: _void\n }, transfer);\n }\n\n protected pushTask(task: Task, port?: SendPort) {\n let tasks = this.pending.get(port);\n if(!tasks) {\n this.pending.set(port, tasks = []);\n }\n\n tasks.push(task);\n this.releasePending();\n }\n\n public invokeVoid(type: T, payload: Parameters[0], port?: SendPort, transfer?: Transferable[]) {\n const task = this.createInvokeTask(type as string, payload, undefined, true, transfer);\n this.pushTask(task, port);\n }\n\n public invoke(type: T, payload: Parameters[0], withAck?: false, port?: SendPort, transfer?: Transferable[]): Promise>>;\n public invoke(type: T, payload: Parameters[0], withAck?: true, port?: SendPort, transfer?: Transferable[]): Promise>>>;\n public invoke(type: T, payload: Parameters[0], withAck?: boolean, port?: SendPort, transfer?: Transferable[]) {\n this.debug && this.log.debug('start', type, payload);\n\n let task: InvokeTask;\n const promise = new Promise>>((resolve, reject) => {\n task = this.createInvokeTask(type as string, payload, withAck, undefined, transfer);\n this.awaiting[task.id] = {resolve, reject, taskType: type as string};\n this.pushTask(task, port);\n });\n\n if(IS_WORKER) {\n promise.finally(() => {\n clearInterval(interval);\n });\n \n const interval = ctx.setInterval(() => {\n this.log.error('task still has no result', task, port);\n }, 5e3);\n } else if(false) {\n // let timedOut = false;\n const startTime = Date.now();\n promise.finally(() => {\n const elapsedTime = Date.now() - startTime;\n if(elapsedTime >= TIMEOUT) {\n this.log.error(`task was processing ${Date.now() - startTime}ms`, task.payload.payload, port);\n }/* else {\n clearTimeout(timeout);\n } */\n });\n\n const TIMEOUT = 10;\n // const timeout = ctx.setTimeout(() => {\n // timedOut = true;\n // // this.log.error(`task is processing more than ${TIMEOUT} milliseconds`, task, port);\n // }, TIMEOUT);\n }\n\n return promise;\n }\n\n public invokeExceptSource(type: T, payload: Parameters[0], source?: SendPort) {\n const ports = this.sendPorts.slice();\n indexOfAndSplice(ports, source);\n\n ports.forEach((target) => {\n this.invokeVoid(type, payload, target);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from \"../helpers/bytes/bufferConcats\";\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n"],"names":["DEBUG","MOUNT_CLASS_TO","window","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","findAndSplice","array","verify","index","findIndex","splice","undefined","indexOfAndSplice","item","idx","spliced","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","slice","notifyAll","bind","_logTimer","Date","now","dT","toFixed","EventListenerBase","constructor","reuseResults","this","_constructor","listenerResults","addEventListener","name","callback","options","push","hasOwnProperty","once","pop","addMultipleEventsListeners","obj","i","removeEventListener","l","invokeListenerCallback","result","_dispatchEvent","collectResults","arr","dispatchResultableEvent","dispatchEvent","cleanup","CryptoMessagePort","invokeCrypto","method","payload","Promise","resolve","invoke","cryptoMessagePort","SuperMessagePort","super","onMessage","event","task","data","source","currentTarget","processTaskMap","processResultTask","taskId","deferred","awaiting","log","taskType","reject","processAckTask","previousResolve","cached","processPingTask","pushTask","createTask","processPongTask","pingResolve","pingResolves","get","delete","processCloseTask","detachPort","processInvokeTask","id","innerTask","resultTaskPayload","resultTask","ackTask","isPromise","void","withAck","Error","ack","ping","pong","close","listenPorts","sendPorts","Map","pending","setOnPortDisconnect","onPortDisconnect","attachPort","port","attachListenPort","attachSendPort","warn","start","Array","isArray","transfer","releasePending","releasingPending","size","portTasks","clear","createInvokeTask","_void","tasks","invokeVoid","promise","finally","clearInterval","interval","invokeExceptSource","ports","target","prototype","concat","toJSON","fn","onFinally","reason"],"sourceRoot":""} \ No newline at end of file diff --git a/public/changelogs/en_1.5.0.md b/public/changelogs/en_1.5.0.md new file mode 100644 index 000000000..af2beae26 --- /dev/null +++ b/public/changelogs/en_1.5.0.md @@ -0,0 +1,21 @@ +1️⃣ Introducing support for **Multiple Tabs** – a first for Telegram Web Apps – customizing how you browse Telegram to increase comfort and productivity. + +• Open several tabs or browser windows to view multiple chats or channels simultaneously. +• Organize your Telegram workflow on multiple monitors by moving tabs to different screens. +• Use `⌘/Ctrl + click` or `middle-click` on any conversation in your chat list to open it in a separate tab. + +All messages and content are seamlessly synced across the tabs. To use multiple tabs on Safari, kindly consider switching to another browser for the best experience. Due to Safari’s [technical limitations](https://t.me/WebK_en/5), the WebK app can still only be used there in a single tab. + +2️⃣ WebK gets even more stylish, adding: + +• Animated placeholders when loading the chat list. +• Scrolling profile pictures in groups that move up and down with their messages. +• Menu redesigns with beautiful new blur effects. +• Colored reply previews that match the color of your chat partners' names. + +This update also includes several bug fixes, removing issues with: +- Incorrect unread values +- Visual errors in placeholders +- Failing to mark messages as read +- Performance drops when returning to previous chats. +- and many more 🛠 diff --git a/public/changelogs/ru_1.5.0.md b/public/changelogs/ru_1.5.0.md new file mode 100644 index 000000000..9eabbb185 --- /dev/null +++ b/public/changelogs/ru_1.5.0.md @@ -0,0 +1,21 @@ +1️⃣ WebK представляет поддержку работы **нескольких вкладок одновременно** – первым среди веб-приложений Telegram. Исследуйте новые возможности за границами привычного Вам опыта: + +• Открывайте столько вкладок или окон браузера, сколько Вам нужно – для доступа к разным чатам и каналам в одно и то же время. +• Если вы пользуетесь несколькими дисплеями, разнесите вкладки по разным экранам – и организуйте процесс работы с Telegram так, как удобно Вам. +• Задействуйте `⌘/Ctrl + клик` или `кликните колесом мыши` по нужному чату в списке бесед – выбранный чат будет открыт в отдельной вкладке. + +Все сообщения, включая текст и медиа, а так же Ваш список чатов автоматически синхронизируются между всеми вкладками. Если Вы пользуетесь Safari и хотите насладиться одновременной работой нескольких вкладок, пожалуйста, смените браузер. Это к лучшему, поверьте. Из-за [технических ограничений Safari](https://t.me/WebK_en/5), на данный момент WebK будет работать там только в единственной вкладке. + +2️⃣ WebK продолжает привносить красоту, добавляя в этом обновлении: + +• Анимированные заглушки при загрузке Вашего списка чатов. +• Скользящие аватары. Когда Вы проматываете историю переписки в групповом чате, фотографии участников всегда будут видны рядом с сообщениями, чтобы было удобнее ориентироваться. +• Обновленные меню – теперь с красивым эффектом размытия. +• Цветовые плашки предпросмотра ответов – в которых цвет плашки совпадает с цветом имени собеседников. + +В приложении были так же устранены следущие недоработки: +- Проблемы со счётчиком непрочитанных сообщений; +- Резкая отрисовка заглушек в чатах; +- Невозможность прочесть сообщение в части случаев; +- Снижение производительности приложения по возвращению в предыдущие чаты; +- и многое другое 🛠 diff --git a/public/crypto.worker.9c324dbbd162911309c3.chunk.js b/public/crypto.worker.9c324dbbd162911309c3.chunk.js new file mode 100644 index 000000000..8f0d25e72 --- /dev/null +++ b/public/crypto.worker.9c324dbbd162911309c3.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,r,o,i,f={4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>f,IS_SAFARI:()=>i});var r=n(6761);const o=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&r.Z.MSStream,!!("safari"in r.Z)||!(!o||!(/\b(iPad|iPhone|iPod)\b/.test(o)||o.match("Safari")&&!o.match("Chrome")))),f=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},9685:(e,t,n)=>{n(690);var r=n(4736),o=n.n(r);function i(e,t=256){return o().fromArray(e instanceof Uint8Array?[...e]:e,t)}function f(e){return new Uint8Array(e.toArray(256).value)}function a(e,t,n){const r=i(e),o=i(t),a=i(n);return f(r.modPow(o,a))}var c=n(745),s=n.n(c),u=n(6761),h=n(8630);function l(e){const t=e.length,n=8*t;let r=o()(e[0]).and(127).shiftLeft(n-8);for(let i=1;i0&&f>7),f[i[s]^s]=s;for(;!m[a];a^=e||1)n=(n=c^c<<1^c<<2^c<<3^c<<4)>>8^255&n^99,m[a]=n,A[n]=a,o=16843009*i[t=i[e=i[a]]]^65537*t^257*e^16843008*a,r=257*i[n]^16843008*n,k[a]=r=r<<24^r>>>8,U[a]=r=r<<24^r>>>8,S[a]=r=r<<24^r>>>8,P[a]=r=r<<24^r>>>8,Z[n]=o=o<<24^o>>>8,C[n]=o=o<<24^o>>>8,K[n]=o=o<<24^o>>>8,x[n]=o=o<<24^o>>>8,c=f[c]||1}();var F=function(){function e(e){var t=E(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var n,r=1,o=t.length;o<4*t.length+28;o++)n=this.encKey[o-1],(o%t.length==0||8===t.length&&o%t.length==4)&&(n=m[n>>>24]<<24^m[n>>16&255]<<16^m[n>>8&255]<<8^m[255&n],o%t.length==0&&(n=n<<8^n>>>24^r<<24,r=r<<1^283*(r>>7))),this.encKey[o]=this.encKey[o-t.length]^n;for(var i=0;o;i++,o--)n=this.encKey[3&i?o:o-4],this.decKey[i]=o<=4||i<4?n:Z[m[n>>>24]]^C[m[n>>16&255]]^K[m[n>>8&255]]^x[m[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=E(e),i=new Uint32Array(4),f=o[0]^this.encKey[0],a=o[1]^this.encKey[1],c=o[2]^this.encKey[2],s=o[3]^this.encKey[3],u=this.encKey.length/4-2,h=4,l=0;l>>24]^U[a>>16&255]^S[c>>8&255]^P[255&s]^this.encKey[h],n=k[a>>>24]^U[c>>16&255]^S[s>>8&255]^P[255&f]^this.encKey[h+1],r=k[c>>>24]^U[s>>16&255]^S[f>>8&255]^P[255&a]^this.encKey[h+2],s=k[s>>>24]^U[f>>16&255]^S[a>>8&255]^P[255&c]^this.encKey[h+3],f=t,a=n,c=r,h+=4;for(l=0;l<4;l++)i[l]=m[f>>>24]<<24^m[a>>16&255]<<16^m[c>>8&255]<<8^m[255&s]^this.encKey[h++],t=f,f=a,a=c,c=s,s=t;return i},e.prototype.decrypt=function(e){for(var t,n,r,o=E(e),i=new Uint32Array(4),f=o[0]^this.decKey[0],a=o[3]^this.decKey[1],c=o[2]^this.decKey[2],s=o[1]^this.decKey[3],u=this.decKey.length/4-2,h=4,l=0;l>>24]^C[a>>16&255]^K[c>>8&255]^x[255&s]^this.decKey[h],n=Z[a>>>24]^C[c>>16&255]^K[s>>8&255]^x[255&f]^this.decKey[h+1],r=Z[c>>>24]^C[s>>16&255]^K[f>>8&255]^x[255&a]^this.decKey[h+2],s=Z[s>>>24]^C[f>>16&255]^K[a>>8&255]^x[255&c]^this.decKey[h+3],f=t,a=n,c=r,h+=4;for(l=0;l<4;l++)i[3&-l]=A[f>>>24]<<24^A[a>>16&255]<<16^A[c>>8&255]<<8^A[255&s]^this.decKey[h++],t=f,f=a,a=c,c=s,s=t;return i},e}(),_=function(){function e(e,t,n){void 0===n&&(n=16),this.key=E(e),this.iv=E(t),this.cipher=new F(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=E(e),r=t||new Uint32Array(n.length),o=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),f=new Uint32Array(this.blockSize),a=0;a>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}function z(e,t,n,r=!0){return function(e){const t=new Uint8Array(e.byteLength);for(let n=0,r=4*e.length;n>>2]>>>24-n%4*8&255;return t}(new _(O(t),O(n))[r?"encrypt":"decrypt"](O(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=E(e),this.counter=E(t),this.cipher=new F(e),this.blockSize=n/4,4!==this.counter.length)throw new Error("AES-CTR mode counter must be 16 bytes length")}e.prototype.encrypt=function(e,t){for(var n=E(e),r=t||new Uint32Array(n.length),o=this.offset,i=0;i=this.blockSize&&this.incrementCounter(),o&&(i-=o,o=0)}return this.offset=(this.offset+n.length%4)%4,r},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}();const I={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function M(e,t){return o().randBetween(e,t,(()=>function(e){const t=I[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function R(e){const t=o()[2];if(e.remainder(t).isZero())return t;const n=o()(1e3);let r,i,f,a,c,s,u;do{r=M(o().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=M(o().one,e.minus(1)),c=o().one,s=o().one;const h=o()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),l=n=>((n=(n=n.pow(t).mod(e)).add(r)).lesser(r)&&(n=n.add(h)),n.mod(e));do{i=f;for(let e=0;o()(e).lesser(c);++e)f=l(f);let t=o().zero;do{a=f;const r=o().min(n,c.minus(t));for(let t=0;o()(t).lesser(r);++t)f=l(f),s=s.multiply(i.greater(f)?i.minus(f):f.minus(i)).mod(e);u=o().gcd(s,e),t=t.add(n)}while(t.lesser(c)&&u.eq(o().one));c=c.shiftLeft(o().one)}while(u.eq(o().one));if(u.eq(e))do{a=l(a),u=o().gcd(i.minus(a).abs(),e)}while(u.eq(o().one));return u}const N="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var B=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,a)}c((r=r.apply(e,t||[])).next())}))};class q{constructor(e,t,n){this.mode=e,this.cryptoKey=t,this.queue=[],this.counter=i(n)}update(e){return B(this,void 0,void 0,(function*(){return new Promise((t=>{this.queue.push({data:e,resolve:t}),this.release()}))}))}release(){return B(this,void 0,void 0,(function*(){if(!this.releasing){for(this.releasing=!0;this.queue.length;){const{data:e,resolve:t}=this.queue.shift();t(yield this._update(e))}this.releasing=!1}}))}perform(e){return B(this,void 0,void 0,(function*(){return yield N[this.mode]({name:"AES-CTR",counter:v(f(this.counter),16,!0,!0,!0),length:128},this.cryptoKey,e)}))}_update(e){return B(this,void 0,void 0,(function*(){let t,n,r=e;if(this.leftLength){const e=this.leftLength,n=16-e,o=new Uint8Array(e).concat(r.slice(0,n)),i=yield this.perform(o);t=new Uint8Array(i.slice(e)),r=r.slice(n),this.counter=this.counter.add(1)}n=new Uint8Array(yield this.perform(r));const o=t?t.concat(n):n;let i=r.length;const f=i%16;i-=f;const a=i/16;return this.counter=this.counter.add(a),this.leftLength=f||void 0,o}))}}var T=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,a)}c((r=r.apply(e,t||[])).next())}))};const j=new Map;let D=-1;console.log("CryptoWorker start");const W={sha1:function(e){return N.digest("SHA-1",w(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return N.digest("SHA-256",w(e)).then((e=>new Uint8Array(e)))},pbkdf2:function(e,t,n){return r=this,o=void 0,f=function*(){const r=yield N.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return N.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:{name:"SHA-512"}},r,512).then((e=>new Uint8Array(e)))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(f.next(e))}catch(e){t(e)}}function a(e){try{c(f.throw(e))}catch(e){t(e)}}function c(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,a)}c((f=f.apply(r,o||[])).next())}));var r,o,i,f},"aes-encrypt":function(e,t,n){return z(v(e),t,n,!0)},"aes-decrypt":function(e,t,n){return z(e,t,n,!1)},"rsa-encrypt":function(e,t){return a(e,g(t.exponent),g(t.modulus))},factorize:function(e){let t=function(e){const t=i(e),n=[],r=[];let f=R(t);n.push(t.divide(f)),n.push(f);do{const e=n.pop();if(!e.eq(o().one))if(e.isPrime(!0)){r.push(e);for(let t=0;te.compare(t))),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce(((e,t)=>e.multiply(t)),o().one)]);const n=t[0],r=t[t.length-1];return(n.lesser(r)?[n,r]:[r,n]).map((e=>f(e)))},"mod-pow":a,gzipUncompress:function(e,t){return s().inflate(e,t?{to:"string"}:void 0)},computeSRP:function(e,t,n){return b(this,void 0,void 0,(function*(){const r=n?t.new_algo:t.current_algo,a=i(r.p),c=o()(r.g),s=yield function(e,t,n){return b(this,void 0,void 0,(function*(){let r=yield h.Z.invokeCrypto("sha256",(0,p.Z)(t,(new TextEncoder).encode(e),t));r=(0,p.Z)(n,r,n),r=yield h.Z.invokeCrypto("sha256",r);let o=yield h.Z.invokeCrypto("pbkdf2",new Uint8Array(r),t,1e5);return o=(0,p.Z)(n,o,n),r=yield h.Z.invokeCrypto("sha256",o),r}))}(e,r.salt1,r.salt2),u=o()(function(e){const t=e.length,n=new Array(t);for(let r=0;r{const t=new Uint8Array(e.length);for(let n=0;n{const n=t.subtract(e);return!(n.isNegative()||n.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:P,a_for_hash:Z,u:C}=yield(()=>b(this,void 0,void 0,(function*(){for(;;){const e=i(y(t.secure_random)),n=c.modPow(e,a);if(S(n,a)){const t=f(n),r=i(yield h.Z.invokeCrypto("sha256",(0,p.Z)(t,k)));if(!r.isZero()&&!r.isNegative())return{a:e,a_for_hash:t,u:r}}}})))();let K;K=g.greater(U)?g:g.add(a),K=K.subtract(U).mod(a);const x=C.multiply(u),E=P.add(x),L=K.modPow(E,a),F=yield h.Z.invokeCrypto("sha256",l(f(L),256));let _=yield h.Z.invokeCrypto("sha256",m);_=function(e,t){const n=e.length,r=new Uint8Array(n);for(let o=0;o{for(;;){const t=y(new Uint8Array(e.length)),n=i(t);if(!n.greater(o().one))continue;const r=i(e);if(n.lesser(r.subtract(o().one)))return t}})(t),f=g(n.toString(16)),a=v(yield h.Z.invokeCrypto("mod-pow",f,r,t),256,!0,!0,!0);return{a:r,g_a:a,g_a_hash:yield h.Z.invokeCrypto("sha256",a),p:t}},new((r=void 0)||(r=Promise))((function(e,o){function i(e){try{c(f.next(e))}catch(e){o(e)}}function a(e){try{c(f.throw(e))}catch(e){o(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(i,a)}c((f=f.apply(t,n||[])).next())}));var t,n,r,f},"compute-dh-key":function(e,t,n){return r=this,o=void 0,a=function*(){const r=yield h.Z.invokeCrypto("mod-pow",e,t,n);return{key:r,key_fingerprint:i((yield h.Z.invokeCrypto("sha1",r)).slice(-8).reverse()).toString(10)}},new((f=void 0)||(f=Promise))((function(e,t){function n(e){try{c(a.next(e))}catch(e){t(e)}}function i(e){try{c(a.throw(e))}catch(e){t(e)}}function c(t){var r;t.done?e(t.value):(r=t.value,r instanceof f?r:new f((function(e){e(r)}))).then(n,i)}c((a=a.apply(r,o||[])).next())}));var r,o,f,a},"get-emojis-fingerprint":function(e,t){return n=this,r=void 0,i=function*(){const n=e.concat(t),r=yield h.Z.invokeCrypto("sha256",n),o=[],i=d.length;for(let e=0;e!=r.length;e+=8){const t=l(r.slice(e,e+8)).mod(i).toJSNumber(),n=d[t];o.push(n)}return o},new((o=void 0)||(o=Promise))((function(e,t){function f(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(f,a)}c((i=i.apply(n,r||[])).next())}));var n,r,o,i},"aes-ctr-prepare":function({encKey:e,encIv:t,decKey:n,decIv:r}){return T(this,void 0,void 0,(function*(){const o=++D,i=[["encrypt",e],["decrypt",n]].map((([e,t])=>N.importKey("raw",t,{name:"AES-CTR"},!1,[e]))),[f,a]=yield Promise.all(i),c={enc:new q("encrypt",f,t.slice()),dec:new q("decrypt",a,r.slice())};return j.set(o,c),o}))},"aes-ctr-process":function({id:e,data:t,operation:n}){return T(this,void 0,void 0,(function*(){const r=j.get(e);return yield("encrypt"===n?r.enc:r.dec).update(t)}))},"aes-ctr-destroy":function(e){j.delete(e)}};h.Z.addEventListener("invoke",(({method:e,args:t})=>W[e](...t))),"undefined"!=typeof MessageChannel&&function(e,t,n){const r=n=>{e.attachPort(n),t&&t(n)};"undefined"!=typeof SharedWorkerGlobalScope?u.Z.addEventListener("connect",(e=>r(e.source))):r(u.Z)}(h.Z,(e=>{const t=new MessageChannel;h.Z.attachPort(t.port1),h.Z.invokeVoid("port",void 0,e,[t.port2])}))},5003:(e,t,n)=>{n.d(t,{kg:()=>d});var r,o=n(410),i=n(4762),f=n(1352),a=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(r||(r={}));const c=[r.None,r.Error,r.Warn,r.Log,r.Debug],s=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",l=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log],["group",r.Log],["groupCollapsed",r.Log],["groupEnd",r.Log]];function d(e,t=r.Log|r.Warn|r.Error,n=!1,i=""){let y;o.ZP||n||(t=r.Error),s?i||(f.SU?i=u:f.N5&&(i=h)):i="";let p=i;i=i?`%s ${i}%s`:"%s";const v=function(...n){return t&r.Log&&console.log(i,(0,a.Z)(),e,...n)};return l.forEach((([n,r])=>{v[n]=function(...o){return t&r&&console[n](i,(0,a.Z)(),e,...o)}})),v.setPrefix=function(t){y=t,e="["+t+"]"},v.setPrefix(e),v.setLevel=function(e){t=c.slice(0,e+1).reduce(((e,t)=>e|t),0)},v.bindPrefix=function(e){return d(`${y}] [${e}`,t,n,p)},v}}},a={};function c(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,c),n.loaded=!0,n.exports}c.m=f,c.x=()=>{var e=c.O(void 0,[699,211,960],(()=>c(9685)));return c.O(e)},e=[],c.O=(t,n,r,o)=>{if(!n){var i=1/0;for(u=0;u=o)&&Object.keys(c.O).every((e=>c.O[e](n[a])))?n.splice(a--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o]},c.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return c.d(t,{a:t}),t},c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((t,n)=>(c.f[n](e,t),t)),[])),c.u=e=>960===e?"960.7ae964ab6031f51a0275.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"a7ea0f3283af2967a6ae",699:"f16d6f756c34f3914132"}[e]+".chunk.js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var t=c.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),c.p=e})(),t=c.u,n=c.e,r=new Map,o=new Map,c.u=function(e){return t(e)+(r.has(e)?"?"+r.get(e):"")},c.e=function(e){return n(e).catch((function(n){var i=o.has(e)?o.get(e):999999;if(i<1){var f=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();r.set(e,n),o.set(e,i-1),t(c.e(e))}),3e3)}))}))},(()=>{var e={589:1};c.f.i=(t,n)=>{e[t]||importScripts(c.p+c.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,o,i]=t;for(var f in o)c.o(o,f)&&(c.m[f]=o[f]);for(i&&i(c);r.length;)e[r.pop()]=1;n(t)}})(),i=c.x,c.x=()=>Promise.all([699,211,960].map(c.e,c)).then(i),c.x()})(); +//# sourceMappingURL=crypto.worker.9c324dbbd162911309c3.chunk.js.map \ No newline at end of file diff --git a/public/crypto.worker.9c324dbbd162911309c3.chunk.js.map b/public/crypto.worker.9c324dbbd162911309c3.chunk.js.map new file mode 100644 index 000000000..7ccf11d3f --- /dev/null +++ b/public/crypto.worker.9c324dbbd162911309c3.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crypto.worker.9c324dbbd162911309c3.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,0ECQG,MAAMC,EAAaC,UAAYA,UAAUC,UAAY,KAU/CC,GATWF,UAAUC,UAAUE,OAAO,yBACzBH,UAAUC,UAAUG,cAAcC,QAAQ,WACzC,SAASC,KAAKN,UAAUC,YAAc,aAAaK,KAAKN,UAAUO,SAG7D,mBAAmBD,KAAKN,UAAUQ,WACxC,aAAvBR,UAAUQ,UAA2BR,UAAUS,eAAiB,IAC/D,gBAEwB,oBAAuBV,KAAe,yBAAyBO,KAAKP,IAAkBA,EAAWW,MAAM,YAAcX,EAAWW,MAAM,aACrJC,EAAaX,UAAUC,UAAUG,cAAcC,QAAQ,YAAc,EAIbL,UAAUS,eAAiB,GAAKT,UAAUC,UAAUE,OAAO,mH,6CCrBzH,SAASS,EAAgBC,EAA8BC,EAAO,KACnE,OAAO,cAAiBD,aAAiBE,WAAa,IAAIF,GAASA,EAAOC,GAGrE,SAASE,EAAcC,GAC5B,OAAO,IAAIF,WAAWE,EAAOC,QAAQ,KAAKC,OCL7B,SAASC,EAAYP,EAA8BQ,EAA4BC,GAC5F,MAAMC,EAAcX,EAAgBC,GAC9BW,EAAYZ,EAAgBS,GAC5BI,EAAYb,EAAgBU,GAElC,OAAON,EADWO,EAAYG,OAAOF,EAAWC,I,0CCGlD,SAASE,EAAsBd,GAC7B,MAAMe,EAASf,EAAMe,OACfC,EAAgB,EAATD,EACb,IAAIT,EAAQ,IAAON,EAAM,IAAIiB,IAAI,KAAMC,UAAUF,EAAO,GACxD,IAAI,IAAIG,EAAI,EAAGA,EAAIJ,IAAUI,EAAG,CAC9B,MAAMC,EAAQJ,EAAiB,GAATG,EAAI,GACpBE,EAAI,IAAOrB,EAAMmB,IACvBb,EAAQA,EAAMgB,GAAGF,EAAQC,EAAEH,UAAUE,GAASC,GAGhD,OAAOf,EAIT,MAAMiB,EAAS,CACb,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,OAAQ,OAAQ,QAAS,QAAS,QAAS,QACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,OAAQ,OAAQ,OAC5D,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,OAAQ,QAAS,QAAS,QAAS,QACrD,QAAS,OAAQ,OAAQ,OAAQ,QAAS,QAAS,QACnD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,QAAS,QACrD,QAAS,QAAS,OAAQ,QAAS,QAAS,OAAQ,OACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OACtD,OAAQ,QAAS,QAAS,QAAS,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,OAAQ,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,OAAQ,QAAS,OAAQ,QAAS,QACpD,QAAS,QAAS,QAAS,OAAQ,QAAS,QAAS,QACrD,OAA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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,960].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","import bigInt from 'big-integer';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n","import { bigIntFromBytes, bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n \n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\n}\n","import randomize from \"../array/randomize\";\nimport bufferConcats from \"./bufferConcats\";\n\nexport default function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","import convertToUint8Array from \"./convertToUint8Array\";\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n //console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n //console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from \"big-integer\";\nimport { nextRandomUint } from \"../random\";\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from \"big-integer\";\nimport { bigIntFromBytes, bigIntToBytes } from \"../../../../helpers/bigInt/bigIntConversion\";\nimport bigIntRandom from \"../../../../helpers/bigInt/bigIntRandom\";\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do \n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0], \n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n \n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { BigInteger } from \"big-integer\";\r\nimport { bigIntFromBytes, bigIntToBytes } from \"../../../helpers/bigInt/bigIntConversion\";\r\nimport addPadding from \"../../../helpers/bytes/addPadding\";\r\nimport subtle from \"../subtle\";\r\n\r\nconst COUNTER_LENGTH = 16;\r\n\r\nexport default class CTR {\r\n private cryptoKey: CryptoKey;\r\n // private encLeft: Uint8Array;\r\n private leftLength: number;\r\n private mode: 'encrypt' | 'decrypt';\r\n private counter: BigInteger;\r\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\r\n private releasing: boolean;\r\n \r\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\r\n this.mode = mode;\r\n this.cryptoKey = cryptoKey;\r\n this.queue = [];\r\n this.counter = bigIntFromBytes(counter);\r\n }\r\n\r\n public async update(data: Uint8Array) {\r\n return new Promise((resolve) => {\r\n this.queue.push({data, resolve});\r\n this.release();\r\n });\r\n }\r\n\r\n private async release() {\r\n if(this.releasing) {\r\n return;\r\n }\r\n\r\n this.releasing = true;\r\n while(this.queue.length) {\r\n const {data, resolve} = this.queue.shift();\r\n resolve(await this._update(data));\r\n }\r\n this.releasing = false;\r\n }\r\n\r\n private async perform(data: Uint8Array) {\r\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\r\n name: 'AES-CTR',\r\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\r\n length: 128\r\n },\r\n this.cryptoKey,\r\n data\r\n );\r\n\r\n return arrayBuffer;\r\n }\r\n\r\n private async _update(data: Uint8Array) {\r\n let toEncrypt = data;\r\n let head: Uint8Array, tail: Uint8Array;\r\n if(this.leftLength) {\r\n // const leftLength = this.encLeft.byteLength;\r\n const leftLength = this.leftLength;\r\n const leftLength2 = COUNTER_LENGTH - leftLength;\r\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\r\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\r\n\r\n const performed = await this.perform(left);\r\n\r\n head = new Uint8Array(performed.slice(leftLength));\r\n\r\n toEncrypt = toEncrypt.slice(leftLength2);\r\n\r\n this.counter = this.counter.add(1);\r\n }\r\n\r\n tail = new Uint8Array(await this.perform(toEncrypt));\r\n\r\n const result = head ? head.concat(tail) : tail;\r\n\r\n let length = toEncrypt.length;\r\n const leftAfter = length % COUNTER_LENGTH;\r\n length -= leftAfter;\r\n\r\n const a = length / COUNTER_LENGTH;\r\n this.counter = this.counter.add(a);\r\n\r\n this.leftLength = leftAfter || undefined;\r\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\r\n\r\n return result;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CTR from \"./utils/aesCTR\";\nimport subtle from \"./subtle\";\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR, \n dec: CTR, \n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n \n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec, \n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport '../polyfill'; // just to include\r\n\r\nimport bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport listenMessagePort from \"../../helpers/listenMessagePort\";\r\nimport getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport computeDhKey from \"./computeDhKey\";\r\nimport cryptoMessagePort from \"./cryptoMessagePort\";\r\nimport { CryptoMethods } from \"./crypto_methods\";\r\nimport generateDh from \"./generateDh\";\r\nimport computeSRP from \"./srp\";\r\nimport { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\nimport pbkdf2 from \"./utils/pbkdf2\";\r\nimport rsaEncrypt from \"./utils/rsa\";\r\nimport sha1 from \"./utils/sha1\";\r\nimport sha256 from \"./utils/sha256\";\r\nimport { aesCtrDestroy, aesCtrPrepare, aesCtrProcess } from './aesCtrUtils';\r\n\r\nconsole.log('CryptoWorker start');\r\n\r\nconst cryptoMethods: CryptoMethods = {\r\n 'sha1': sha1,\r\n 'sha256': sha256,\r\n 'pbkdf2': pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': factorizeTdlibPQ, \r\n // 'factorize-new-new': pqPrimeLeemonNew, \r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP,\r\n 'generate-dh': generateDh,\r\n 'compute-dh-key': computeDhKey,\r\n 'get-emojis-fingerprint': getEmojisFingerprint,\r\n 'aes-ctr-prepare': aesCtrPrepare,\r\n 'aes-ctr-process': aesCtrProcess,\r\n 'aes-ctr-destroy': aesCtrDestroy\r\n};\r\n\r\ncryptoMessagePort.addEventListener('invoke', ({method, args}) => {\r\n // @ts-ignore\r\n const result: any = cryptoMethods[method](...args);\r\n return result;\r\n});\r\n\r\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\r\n const channel = new MessageChannel();\r\n cryptoMessagePort.attachPort(channel.port1);\r\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\r\n});\r\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then((b) => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","import subtle from \"../subtle\";\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then((buffer) => new Uint8Array(buffer));\n}\n","import type { RSAPublicKeyHex } from \"../../mtproto/rsaKeysManager\";\nimport bytesModPow from \"../../../helpers/bytes/bytesModPow\";\nimport bytesFromHex from \"../../../helpers/bytes/bytesFromHex\";\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cryptoWorker from \"./cryptoMessagePort\";\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport addPadding from \"../../helpers/bytes/addPadding\";\r\nimport bufferConcats from \"../../helpers/bytes/bufferConcats\";\r\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\r\nimport convertToUint8Array from \"../../helpers/bytes/convertToUint8Array\";\r\nimport bigInt from 'big-integer';\r\nimport { bigIntFromBytes, bigIntToBytes } from \"../../helpers/bigInt/bigIntConversion\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\r\n\r\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\r\n\r\n return buffer;\r\n}\r\n\r\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n\r\n const p = bigIntFromBytes(algo.p);\r\n const g = bigInt(algo.g);\r\n\r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = bigInt(bytesToHex(pw_hash), 16);\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = g.modPow(x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bigIntToBytes(v);\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = bigIntFromBytes(state.srp_B);\r\n \r\n const pForHash = padArray(bigIntToBytes(p), 256);\r\n const gForHash = padArray(bigIntToBytes(g), 256);\r\n const b_for_hash = padArray(bigIntToBytes(B), 256);\r\n\r\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\r\n const k = bigIntFromBytes(kHash);\r\n\r\n const k_v = k.multiply(v).mod(p);\r\n\r\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\r\n const diff = prime.subtract(modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(diff.isNegative() ||\r\n diff.bitLength().toJSNumber() < min_diff_bits_count || \r\n modexp.bitLength().toJSNumber() < min_diff_bits_count || \r\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = bigIntFromBytes(flipper(state.secure_random));\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n const A = g.modPow(a, p);\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bigIntToBytes(A);\r\n\r\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\r\n // const u = bigInt(s.hex, 16);\r\n const u = bigIntFromBytes(s);\r\n if(!u.isZero() && !u.isNegative())\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n let g_b: bigInt.BigInteger;\r\n if(!B.greater(k_v)) {\r\n g_b = B.add(p);\r\n } else g_b = B;\r\n g_b = g_b.subtract(k_v).mod(p);\r\n\r\n const ux = u.multiply(x);\r\n const a_ux = a.add(ux);\r\n const S = g_b.modPow(a_ux, p);\r\n\r\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\r\n\r\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\r\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(\r\n h1, \r\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\r\n\r\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n };\r\n\r\n return out;\r\n}\r\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from \"big-integer\";\nimport randomize from \"../../helpers/array/randomize\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport { MessagesDhConfig } from \"../../layer\";\nimport CallInstance from \"../calls/callInstance\";\nimport cryptoWorker from \"./cryptoMessagePort\";\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n \n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n \n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n \n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n \n return a;\n }\n };\n \n const a = generateA(p);\n // const a = new Uint8Array([0]);\n \n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n \n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n \n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport cryptoWorker from \"./cryptoMessagePort\";\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse(); // key_fingerprint: key_fingerprint as any // ! it doesn't work\n const key_fingerprint_long = bigIntFromBytes(key_fingerprint).toString(10); // bigInt2str(str2bigInt(bytesToHex(key_fingerprint), 16), 10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from \"../environment/ctx\";\r\nimport SuperMessagePort from \"../lib/mtproto/superMessagePort\";\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort, \r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (s: any) => {\r\n messagePort.attachPort(s);\r\n onConnect && onConnect(s);\r\n };\r\n\r\n onDisconnect && messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source));\r\n } else {\r\n attachPort(ctx);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\nimport dT from \"../helpers/dT\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n [\"group\", LogTypes.Log],\n [\"groupCollapsed\", LogTypes.Log],\n [\"groupEnd\", LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,960], () => (__webpack_require__(9685)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 960) return \"960.7ae964ab6031f51a0275.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"a7ea0f3283af2967a6ae\",\"699\":\"f16d6f756c34f3914132\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","bigIntFromBytes","bytes","base","Uint8Array","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","readBigIntFromBytesBE","length","bits","and","shiftLeft","i","_bits","b","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","byteLength","needPadding","padding","ArrayBuffer","bufferConcats","buffer","concat","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","this","encKey","decKey","set","tmp","rcon","j","prototype","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","pow","add","lesser","condition","multiply","greater","abs","window","subtle","self","CTR","constructor","mode","cryptoKey","queue","update","data","Promise","resolve","push","release","releasing","shift","_update","perform","name","head","tail","toEncrypt","leftLength","leftLength2","slice","performed","result","leftAfter","undefined","aesCTRs","Map","lastCTRId","console","log","cryptoMethods","then","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","divide","pop","isPrime","primeFactors","sort","compare","splice","reduce","acc","v","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","all","enc","dec","operation","ctrs","get","delete","cryptoMessagePort","method","args","messagePort","onConnect","onDisconnect","attachPort","ctx","e","source","listenMessagePort","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","type","ignoreDebugReset","style","originalPrefix","originalStyle","forEach","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","has","catch","error","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 540ad113b..aabfdaf8c 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,3 @@ -Telegram Web \ No newline at end of file + \ No newline at end of file diff --git a/public/main.18d052b0bbd55d76b776.css b/public/main.18d052b0bbd55d76b776.css deleted file mode 100644 index 70dbabcb8..000000000 --- a/public/main.18d052b0bbd55d76b776.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:before,.no-transition:after{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word} -:root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--messages-secondary-line-height: calc(var(--messages-secondary-text-size) + 4px);--line-height: 1.3125;--line-height-16: 21px;--line-height-14: 18px;--line-height-12: 16px;--font-size-16: 16px;--font-size-14: 14px;--font-size-12: 12px;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--menu-box-shadow: 0px 0px 10px var(--menu-box-shadow-color);--menu-background-color: rgba(var(--surface-color-rgb), .75);--menu-backdrop-filter: blur(50px);--font-monospace: "Roboto Mono", monospace;--font-weight-bold: 500;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color-rgb: 255, 255, 255;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--menu-box-shadow-color: rgba(0, 0, 0, .15);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--light-filled-primary-color: #eff6fd;--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--monospace-text-color: var(--danger-color);--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-primary-color: var(--primary-color);--light-filled-message-primary-color: var(--light-filled-primary-color);--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--light-filled-message-out-primary-color: #e1f9d2;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color-rgb: 33, 33, 33;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--light-filled-primary-color: #292830;--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--monospace-text-color: var(--primary-text-color);--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--light-filled-message-out-primary-color: #917fe3;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}@font-face{font-family:"tgico";src:url("assets/fonts/tgico.ttf?5o4186") format("truetype"),url("assets/fonts/tgico.woff?5o4186") format("woff"),url("assets/fonts/tgico.svg?5o4186#tgico") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=" tgico-"]:before,[class*=" tgico-"]:after{font-family:"tgico" !important;speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete:before{content:""}.tgico-delete_filled:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-flip:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward:before{content:""}.tgico-forward_filled:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-microphone_crossed:before{content:""}.tgico-microphone_crossed_filled:before{content:""}.tgico-microphone_filled:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-pip:before{content:""}.tgico-play:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply:before{content:""}.tgico-reply_filled:before{content:""}.tgico-rightpanel:before{content:""}.tgico-rotate_left:before{content:""}.tgico-rotate_right:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings:before{content:""}.tgico-settings_filled:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Roboto Mono";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"Roboto Mono";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:" ";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:rgba(255, 255, 255, .75);background-color:var(--menu-background-color);z-index:3;top:100%;padding:.3125rem 0;border-radius:10px;opacity:0;transform:scale(0.8) !important;transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:1rem;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);min-width:11.25rem;-webkit-user-select:none;-webkit-touch-callout:none}.btn-menu-old{padding:.5rem 0;background-color:#fff;background-color:var(--surface-color);-webkit-backdrop-filter:none;backdrop-filter:none;min-width:auto}.btn-menu-old .btn-menu-item{--padding-left: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;height:3rem;line-height:21px;line-height:var(--line-height-16);font-size:16px;font-size:var(--font-size-16);border-radius:0;margin:0;font-weight:400;transform:none !important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0px 0px 10px rgba(0, 0, 0, .15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1) !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left: .75rem;--padding-right: .75rem;--icon-margin: 1.25rem;--icon-size: 1.25rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:2rem;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;align-items:center;text-align:left;font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);border-radius:.3125rem;margin:0 .3125rem;font-weight:500;transform:scale(1)}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(0.96)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width: 600px){.btn-menu-item{--padding-right: 1.875rem}}.btn-menu-item-text{position:relative;flex:1 1 auto}.btn-menu-item-text,.btn-menu-item-text-fake{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left: calc(var(--icon-size) + var(--icon-margin));position:absolute;margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.btn-menu-item-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);height:2rem;font-weight:500;font-weight:var(--font-weight-bold);pointer-events:none !important}.btn-menu-item .stacked-avatars{--margin-right: -.6875rem;flex:0 0 auto;right:1rem;position:absolute;pointer-events:none}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0;display:block !important}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:rgba(255, 255, 255, .75);background-color:var(--menu-background-color);position:absolute;opacity:0;transform:scale(0.8);-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, 0.24));transform-origin:bottom left}.btn-menu-reactions-container{--height: 2.25rem;--bubble-side-offset: 0rem;--other-side-offset: 0rem;--menu-offset: calc((var(--height) + .5rem) * -1);--width: calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);margin-top:var(--menu-offset);width:var(--width);max-width:var(--width);margin-left:var(--other-side-offset);display:flex;justify-content:flex-start;height:var(--height);position:fixed;z-index:4}.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right !important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center !important}.btn-menu-reactions-container-vertical{width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column;margin-top:0;margin-left:var(--menu-offset)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column;transform-origin:top right}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical: var(--padding-base);--padding-horizontal: 0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{right:calc(var(--size) / -2);bottom:var(--offset)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{position:absolute;background-color:inherit;border-radius:50%;z-index:-1}.btn-menu-reactions-bubble-big{--size: 1rem;--offset: calc(var(--height) / 2);width:var(--size);height:var(--size);right:var(--offset);bottom:calc(var(--size) / -2)}.btn-menu-reactions:after{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";pointer-events:none;border-radius:inherit;background:linear-gradient(var(--inner-shadow-degree), #fff 0%, rgba(255, 255, 255, 0) 1rem, rgba(255, 255, 255, 0) calc(100% - 1rem), #fff 100%);background:linear-gradient(var(--inner-shadow-degree), var(--surface-color) 0%, rgba(var(--surface-color-rgb), 0) 1rem, rgba(var(--surface-color-rgb), 0) calc(100% - 1rem), var(--surface-color) 100%)}.btn-menu-reactions .scrollable{position:relative;display:flex;border-radius:inherit}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 0.25rem}.btn-menu-reactions .scrollable-y{align-items:center;padding:0.25rem 0;flex-direction:column}.btn-menu-reactions-reaction{--size: 1.625rem;--padding-base: .25rem;--padding-vertical: 0rem;--padding-horizontal: var(--padding-base);width:calc(var(--size) + var(--padding-horizontal) * 2);height:calc(var(--size) + var(--padding-vertical) * 2);flex:0 0 auto;padding:var(--padding-vertical) var(--padding-horizontal);cursor:pointer}.btn-menu-reactions-reaction-scale{width:100%;height:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{position:relative;width:100%;height:100%}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;font-weight:var(--font-weight-bold);cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:hover,html.no-touch .btn-transparent.primary:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{width:auto;padding:0 2rem !important;border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);right:auto}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{--color: var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:""}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-menu-close-icon{margin-top:-0.625rem}.animated-menu-close-icon:before{top:.3125rem;opacity:1}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translate(0, 0.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{transform:rotate(45deg);opacity:0}.animated-menu-close-icon.state-back:after{transform:translate(0rem, -0.625rem) rotate(90deg)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;font-weight:var(--font-weight-bold);flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;font-weight:var(--font-weight-bold);color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;position:absolute;opacity:1;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem}@media only screen and (min-width: 601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size: 2.25rem;--icon-margin-right: .5rem;--selector-size: 50px;--selector-thumb-size: .75rem;--hide-width: var(--icon-size);--show-width: calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size) * .75);display:flex;align-items:center;width:var(--hide-width);overflow:hidden}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4, .0, .2, 1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:hover,html.no-touch .default .player-volume:active{width:var(--show-width)}.default .player-volume__icon{color:#fff;width:var(--icon-size);height:var(--icon-size);margin-right:var(--icon-margin-right);cursor:pointer;padding:.375rem;font-size:1.5rem;display:flex}.default .player-volume .progress-line{--color: #fff;--thumb-size: var(--selector-thumb-size);--height: 4px;margin:0;width:var(--selector-size);min-width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:" ";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:" ";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:calc((var(--thumb-size) - var(--height)) / -2);transform:translateX(calc(var(--thumb-size) / 2)) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size) / 2)) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;line-height:var(--line-height);cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:"";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:" ";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;font-weight:var(--font-weight-bold);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:"";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active .badge-fake{color:#fff;border-color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.125rem;margin-top:-0.125rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:1rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:"" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;background-color:#df3f40 !important;background-color:var(--danger-color) !important;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:"";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec !important;background-color:var(--primary-color) !important;z-index:3}.chat-input .btn-send .tgico-check{height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;color:#fff !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:" ";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item.is-image{background-image:url("assets/img/bg.jpeg");background-position:center center;background-color:inherit;background-size:cover}.chat-background-item.is-pattern{margin:0 !important;background-image:none !important;background-size:contain;background-repeat:repeat-x;background-color:#000 !important;display:flex;align-items:center;justify-content:center}@media only screen and (min-width: 1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat-background-item-canvas{--opacity-max: 1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-position:center;mask-position:center}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);--button-size: 2.125rem;--button-horizontal-margin: .125rem;display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold);flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:100%;padding:.5625rem var(--padding-horizontal) 0;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{padding-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:45px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + .5rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.25rem;order:0;margin:0 var(--icon-margin) 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{--send-as-size: 1.875rem;--send-as-margin-left: .25rem;--send-as-margin-right: .375rem;--send-as-total-size: calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size: 2.375rem;--commands-margin-left: .25rem;--commands-margin-right: .375rem;--commands-total-size: calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX: 0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{position:absolute;flex:0 0 auto;bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;transform:scale(0);z-index:2;opacity:0}.rows-wrapper .new-message-wrapper .new-message-bot-commands{width:var(--commands-size);height:1.875rem;border-radius:1.875rem;background-color:#3390ec;background-color:var(--primary-color);display:flex;align-items:center;justify-content:center;margin-left:var(--commands-margin-left);cursor:pointer}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{transform:scale(0.875);display:flex;align-items:center;justify-content:center}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color: #fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{width:var(--send-as-size);height:var(--send-as-size);margin-left:var(--send-as-margin-left);background:none !important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{max-height:20rem;max-width:20rem;top:auto;right:auto;left:calc(var(--padding-horizontal) * -1 - .25rem) !important;width:auto;height:auto;transform:scale3d(1, 1, 1)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset: -.125rem;content:" ";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:50%}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1 !important;display:flex;flex-direction:column;justify-content:center}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{position:absolute;transform:scale(0);opacity:0;pointer-events:none}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){transform:scale(1);opacity:1}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{width:inherit;height:inherit;background-color:#3390ec;background-color:var(--primary-color);font-size:1.375rem;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX: var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX: 48px}.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset .input-message-container{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX: calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands{transform:scale(1);opacity:1}.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size);height:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:" ";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto;max-width:100%}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0;flex:0 0 auto}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}}@media only screen and (max-width: 480px){.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}@media only screen and (min-width: 1276px){.topbar-call-center{padding:0 calc(var(--right-column-width) / 2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:" ";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:"Unread messages";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-weight:var(--font-weight-bold);font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size: 1.875rem;--offset: calc(var(--size) * -.75);position:absolute;right:var(--offset);bottom:-0.125rem;width:var(--size);height:1.625rem;border-radius:var(--size);z-index:2;background-color:#fff;background-color:var(--surface-color);cursor:pointer;opacity:0;transform:scale(0.8);display:flex;align-items:center;justify-content:center;box-shadow:0px 0px 10px rgba(0, 0, 0, .15);box-shadow:var(--menu-box-shadow)}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34, 1.56, .64, 1),transform .2s cubic-bezier(.34, 1.56, .64, 1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){transform:scale(1);opacity:1}.bubble-hover-reaction-sticker{width:1.125rem;height:1.125rem;position:relative}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{position:absolute;top:0;left:50%;transform:translateX(-50%);opacity:1 !important;transition:none !important;visibility:visible !important}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .bubble-content,.bubble.emoji-big:not(.sticker) .bubble-content{align-self:flex-start}.bubble.sticker .message,.bubble.emoji-big:not(.sticker) .message{position:relative !important;margin-left:auto;right:0 !important}.bubble.sticker .attachment{position:absolute;border-radius:0;z-index:1}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;transform:translateY(-50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 0;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web+.time{display:block}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name,.bubble .web .text,.bubble .web .title{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:" "}.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:hover,html.no-touch .bubble:not(.just-media) .reply:active{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document,.bubble .audio{--icon-size: 2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;--icon-margin: .6875rem}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{--icon-margin: .75rem;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{--icon-margin: .5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem;line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.document .time,.bubble .document-message+.audio .time{display:none !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top: .25rem;--margin-left: .125rem;left:auto;top:auto;background:#fff;border-radius:50%;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top))}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:" ";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message .audio .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color: var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:"";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:.3125rem .625rem 0 .625rem;font-weight:500 !important;font-weight:var(--font-weight-bold) !important;color:#3390ec;color:var(--primary-color);font-size:.875rem;line-height:1.25rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;vertical-align:middle;margin-top:-2px}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:.375rem 0 .5rem}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{height:3.1875rem;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{font-weight:500;font-weight:var(--font-weight-bold);font-size:.9375rem;margin-left:.5rem;display:flex;align-items:center;color:#3390ec;color:var(--primary-color);line-height:1.125rem}.bubble .replies-footer-avatars{--margin-right: -.875rem;--border-size: 2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{content:" ";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color: var(--light-filled-message-primary-color)}.bubble .message .reaction:not(.is-chosen),.bubble .message .reaction.is-chosen.backwards{--counter-color: var(--message-primary-color)}.bubble .message .reaction:not(.is-chosen) .stacked-avatars,.bubble .message .reaction.is-chosen.backwards .stacked-avatars{--border-color: var(--background-color)}.bubble .message .reactions-block .time{position:unset !important;right:auto !important;bottom:auto !important;order:100}.bubble code{cursor:pointer}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1;display:flex;flex-direction:column}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-in pre,.bubble.is-in code{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color);--message-primary-color: var(--message-out-primary-color);--light-filled-message-primary-color: var(--light-filled-message-out-primary-color)}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:""}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:""}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:""}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color: var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color: var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{right:auto;left:var(--offset)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:" ";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:" ";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:" ";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:" "}.pinned-audio-volume .player-volume__icon{display:flex;cursor:pointer}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:252px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:672px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:" ";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-weight:var(--font-weight-bold);font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding: 24px;--offset: .5rem;position:absolute !important;bottom:calc(100% - var(--border-radius-padding));right:calc(var(--offset) * -1);left:calc(var(--offset) * -1);width:auto !important;max-height:20rem;max-width:none;border-radius:12px 12px 0 0 !important;background-color:transparent !important;pointer-events:none;overflow:hidden;padding:var(--offset) var(--offset) 0 !important;box-shadow:none;-webkit-animation:none !important;animation:none !important;visibility:visible !important;transition:none !important}body.animation-level-2 .bot-commands{display:flex !important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);border-radius:inherit;height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{transform:translateY(0);opacity:1}.bot-commands-list{border-radius:inherit;width:100%;height:var(--height);padding-bottom:0}.bot-commands-list-element{border-radius:0 !important;flex-direction:column;align-items:flex-start;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{position:absolute;left:.75rem}.bot-commands-list-element-name,.bot-commands-list-element-description{margin-left:0;font-size:.875rem;line-height:18px;line-height:var(--line-height-14)}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:" ";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width: 600px){.profile-button{border-radius:0}}.profile-change-avatar{--size: 3.375rem;position:absolute !important;top:calc(var(--size) / -2);right:1.25rem;transform:none;transition:none !important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:" ";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:" ";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible;pointer-events:none}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:" ";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible;justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{padding-bottom:0;height:15rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:1.875rem;padding:0 .75rem;font-size:.9375rem;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:.9375rem;line-height:1.875rem}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important;font-weight:var(--font-weight-bold) !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0 !important}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-content.full-width{margin:0 !important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{font-size:12px;font-size:var(--font-size-12);color:#707579;color:var(--secondary-text-color);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{position:absolute;width:100%;height:100%;-webkit-mask-position:center;-webkit-mask-size:contain}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;font-weight:var(--font-weight-bold);color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:" ";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size: 3rem;--icon-margin: .75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;font-weight:var(--font-weight-bold);margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0 !important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0, 0, 0, .2) rgba(0,0,0,0);scrollbar-color:var(--scrollbar-color) rgba(0,0,0,0)}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,0) rgba(0,0,0,0);transition:scrollbar-color .3s ease;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:"";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:500;font-weight:var(--font-weight-bold)}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(25px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:" ";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.6875}avatar-element.avatar-26{--size: 26px;--multiplier: 2.076923}avatar-element.avatar-24{--size: 24px;--multiplier: 2.25}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.avatar-full{position:absolute;width:100%;height:100%;border-radius:inherit;display:inline-flex;align-items:center;justify-content:center}.avatar-full .avatar-photo{width:100% !important;height:100% !important;-o-object-fit:cover;object-fit:cover}.document{--background-color: var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:"";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-weight:var(--font-weight-bold);font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16)}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);text-overflow:ellipsis;overflow:hidden}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{--icon-size: 3.375rem;--icon-margin: .875rem;--padding-left: calc(var(--icon-size) + var(--icon-margin));padding-left:var(--padding-left);display:flex;flex-direction:column;justify-content:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;margin-left:calc(var(--padding-left) * -1);width:var(--icon-size);height:var(--icon-size);color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.document .checkbox-field-round,.audio .checkbox-field-round{--margin-top: .25rem;--margin-left: .125rem;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto;left:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{overflow:visible !important;--icon-size: 3rem;--icon-margin: .5625rem;height:var(--icon-size)}.audio-toggle,.audio-download{border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:0 !important;top:57.5%;left:57.5%;background:none;display:flex !important}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:hover,html.no-touch .audio-waveform-background rect:active{opacity:1}.audio-waveform-fake{position:absolute;top:0;right:0;bottom:0;left:0;width:0;overflow:hidden;pointer-events:none}.audio-waveform-container{position:relative;height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:" • "}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:" ";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:" ";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:" ";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;font-weight:var(--font-weight-bold);margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:500;font-weight:var(--font-weight-bold);font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold);border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:18px;line-height:var(--line-height-14);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:3rem !important;height:3rem !important;position:absolute !important;margin:0 !important;left:.5rem}.row-media-small{width:2rem !important;height:2rem !important;left:.75rem !important}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-weight:var(--font-weight-bold);font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:unset}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction{display:flex;align-items:center}.reaction-sticker{position:relative;width:var(--reaction-size);height:var(--reaction-size);display:flex;align-items:center;justify-content:center}.reaction-sticker-activate{position:absolute;top:var(--reaction-offset);right:var(--reaction-offset);bottom:var(--reaction-offset);left:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size: calc(var(--reaction-size) + var(--reaction-offset) * -2);width:var(--size) !important;height:var(--size) !important;max-width:var(--size);max-height:var(--size);top:auto;right:auto;bottom:auto;left:auto}.reaction-inline{--reaction-size: .875rem;--reaction-offset: -.4375rem;min-width:var(--reaction-size);min-height:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit !important;order:-1;margin-right:.0625rem !important}.reaction-block{--additional-height: .5rem;--margin: .375rem;--reaction-size: 1.375rem;--reaction-offset: -.5625rem;--background-color: var(--message-highlightning-color);--chosen-background-color: var(--message-primary-color);--counter-color: #fff;--reaction-total-size: calc(var(--reaction-size) + var(--additional-height));height:var(--reaction-total-size);border-radius:var(--reaction-total-size);padding:0 .5rem;background-color:#f4f4f5;background-color:var(--background-color);cursor:pointer;position:relative;margin-top:var(--margin);margin-right:var(--margin);color:var(--counter-color)}.reaction-block:last-child{margin-right:0}.reaction-block:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--chosen-background-color);border-radius:inherit;transform:scale3d(0, 0, 0);opacity:0}.reaction-block.is-chosen:not(.backwards):before{transform:scale3d(1, 1, 1);opacity:1}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color: var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4, .0, .2, 1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4, .0, .2, 1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color: transparent;--border-size: .125rem;--margin-right: -.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem !important;font-weight:500;font-weight:var(--font-weight-bold);margin:0 .0625rem 0 .375rem;line-height:1.125rem;position:relative}.stacked-avatars{--border-color: var(--surface-color);--border-size: 1px;--margin-right: -.3125rem;--avatar-size: 1rem;--avatar-total-size: calc(var(--avatar-size) + var(--border-size) * 2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{width:var(--avatar-size);height:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{width:var(--avatar-total-size);height:var(--avatar-total-size);border:var(--border-size) solid #dfe1e5;border:var(--border-size) solid var(--border-color);display:flex;align-items:center;justify-content:center;border-radius:50%;position:relative}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;font-weight:var(--font-weight-bold);padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-weight:var(--font-weight-bold);font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold);color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.show-controls .call-title,.call.show-controls .call-subtitle,.call.show-controls .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.no-video .call-title,.call.no-video .call-subtitle,.call.no-video .popup-header,.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{transform:scale(1.3125);margin-right:1rem}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7;border-radius:inherit}.call-avatar .avatar-full{font-size:6rem}.call-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:1.25rem}.call-subtitle{font-size:1rem}.call-title,.call-subtitle,.call-emojis,.call .popup-header{opacity:0}body.animation-level-2 .call-title,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-emojis,body.animation-level-2 .call .popup-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second{--margin-length: 2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * var(--margin-length)));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length: .656875}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit;opacity:1}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px;cursor:pointer}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{display:flex;flex-direction:column;position:absolute;bottom:calc(1.75rem + 3.375rem + 1.5rem + 1rem);bottom:calc(1.75rem + var(--call-button-size) + 1.5rem + 1rem);z-index:2;width:100%;align-items:center;padding:0 1rem;pointer-events:none}.call-party-state{height:1.625rem;border-radius:1.625rem;line-height:1.625rem;background-color:rgba(255,255,255,.2);color:#fff;padding:0 .625rem;font-size:.875rem;display:flex;align-items:center;margin-top:1rem;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);font-weight:500;font-weight:var(--font-weight-bold);opacity:0;transform:scale(0) translateY(0);max-width:100%}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{width:1.875rem !important;height:1.875rem !important;margin-right:.25rem;margin-left:-0.25rem;flex:0 0 auto}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:" ";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{opacity:1;color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:" ";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -0.625rem}.popup-mute .sidebar-left-section{margin-bottom:0 !important;padding:0 !important}.popup-mute .sidebar-left-section-content{margin:0 !important}.popup-reacted-list .popup-container{width:25rem;height:600px;max-height:600px;padding:0}.popup-reacted-list .popup-header{min-height:3.5625rem;margin:0;padding:.25rem .75rem .75rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-reacted-list .popup-close{margin-top:.375rem;margin-right:.5rem;height:40px;order:-1}.popup-reacted-list .reaction{--additional-height: .75rem;--reaction-size: 1.5rem;--margin: .5rem;--background-color: var(--light-filled-primary-color);--counter-color: var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color: #fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem !important;margin:0;display:flex;align-items:center}.popup-reacted-list .sidebar-left-section{margin-bottom:0 !important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{width:1.5rem;height:1.5rem;margin:0;top:50%;transform:translateY(-50%)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;line-height:var(--line-height);text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}html.no-backdrop{--menu-background-color: var(--surface-color);--menu-backdrop-filter: none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}pre,code,kbd,samp{font-family:"Roboto Mono", monospace;font-family:var(--font-monospace)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}[contenteditable] [style*=bold]{font-weight:500 !important;font-weight:var(--font-weight-bold) !important}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{position:absolute;width:100%;height:100%}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:" "}.media-round.is-paused .video-time:after{content:"";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:" ";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-top:.8125rem;margin-bottom:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px !important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px !important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem;position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:"Roboto" !important;font-weight:500;font-weight:var(--font-weight-bold);width:1.5rem;text-align:center}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.quick-reaction-title{display:flex;align-items:center}.quick-reaction-sticker{width:32px !important;height:32px !important;position:relative !important;margin:0 .5rem 0 0 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.badge-fake{flex:0 0 auto;color:#df3f40;color:var(--danger-color);border:1px solid #df3f40;border:1px solid var(--danger-color);padding:.125rem .25rem;border-radius:.185rem;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1 !important;margin:0 .25rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0} - -/*# sourceMappingURL=main.18d052b0bbd55d76b776.css.map*/ \ No newline at end of file diff --git a/public/main.18d052b0bbd55d76b776.css.map b/public/main.18d052b0bbd55d76b776.css.map deleted file mode 100644 index 057017db7..000000000 --- a/public/main.18d052b0bbd55d76b776.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss"],"names":[],"mappings":"AAAA,iFAAiF,iBAAiB,0BAA0B,8BAA8B,KAAK,SAAS,wCAAwC,cAAc,GAAG,cAAc,eAAe,uBAAuB,cAAc,OAAO,gBAAgB,GAAG,uBAAuB,SAAS,iBAAiB,IAAI,gCAAgC,cAAc,EAAE,6BAA6B,qCAAqC,YAAY,mBAAmB,0BAA0B,yCAAyC,iCAAiC,SAAS,oBAAoB,SAAS,mBAAmB,cAAc,gCAAgC,cAAc,IAAI,kBAAkB,KAAK,sBAAsB,WAAW,MAAM,cAAc,QAAQ,cAAc,cAAc,kBAAkB,wBAAwB,IAAI,eAAe,IAAI,WAAW,YAAY,qBAAqB,sBAAsB,aAAa,SAAS,IAAI,kBAAkB,eAAe,gBAAgB,sCAAsC,uBAAuB,eAAe,iBAAiB,SAAS,aAAa,iBAAiB,cAAc,oBAAoB,qDAAqD,0BAA0B,wHAAwH,kBAAkB,UAAU,4GAA4G,8BAA8B,SAAS,2BAA2B,OAAO,sBAAsB,cAAc,cAAc,eAAe,UAAU,mBAAmB,SAAS,qBAAqB,wBAAwB,SAAS,cAAc,6BAA6B,sBAAsB,UAAU,kFAAkF,YAAY,cAAc,6BAA6B,oBAAoB,qFAAqF,wBAAwB,6BAA6B,0BAA0B,aAAa,aAAa,cAAc,QAAQ,kBAAkB,OAAO,qBAAqB,SAAS,aAAa,SAAS,aAAa,KAAK,sBAAsB,mBAAmB,mBAAmB,yBAAyB,eAAe,qBAAqB,4BAA4B,qBAAqB,EAAE,qBAAqB,wCAAwC,UAAU,uBAAuB,gBAAgB,aAAa,mBAAmB,WAAW,2BAA2B,WAAW,iGAAiG,gBAAgB,iGAAiG,WAAW,kGAAkG,WAAW,uGAAuG,WAAW,yGAAyG,WAAW,0GAA0G,MAAM,wBAAwB,eAAe,gBAAgB,WAAW,yBAAyB,sBAAsB,qBAAqB,iBAAiB,0DAA0D,2BAA2B,QAAQ,eAAe,2BAA2B,kBAAkB,eAAe,sCAAsC,oBAAoB,mCAAmC,kBAAkB,iCAAiC,iBAAiB,6BAA6B,SAAS,QAAQ,gCAAgC,WAAW,2BAA2B,YAAY,qBAAqB,gBAAgB,yBAAyB,UAAU,gCAAgC,kBAAkB,2BAA2B,eAAe,+BAA+B,EAAE,qBAAqB,KAAK,gBAAgB,mBAAmB,kBAAkB,gBAAgB,GAAG,kBAAkB,OAAO,gBAAgB,MAAM,cAAc,SAAS,qBAAqB,0BAA0B,sBAAsB,wBAAwB,qB;ACAz0I,MAAM,UAAU,cAAc,oBAAoB,0DAA0D,mCAAmC,qCAAqC,+FAA+F,iGAAiG,iCAAiC,oDAAoD,2CAA2C,oCAAoC,sDAAsD,6CAA6C,wDAAwD,8BAA8B,6DAA6D,gEAAgE,gEAAgE,sCAAsC,uCAAuC,uFAAuF,8CAA8C,oEAAoE,kCAAkC,2BAA2B,sEAAsE,kFAAkF,sBAAsB,uBAAuB,uBAAuB,uBAAuB,qBAAqB,qBAAqB,qBAAqB,yBAAyB,uBAAuB,0BAA0B,6DAA6D,6DAA6D,mCAAmC,2CAA2C,wBAAwB,4BAA4B,2BAA2B,mCAAmC,6BAA6B,2BAA2B,+BAA+B,kCAAkC,kCAAkC,qCAAqC,kCAAkC,qCAAqC,iCAAiC,oCAAoC,gCAAgC,mCAAmC,gCAAgC,mCAAmC,gCAAgC,mCAAmC,0CAA0C,MAAM,4BAA4B,yBAAyB,0BAA0B,4BAA4B,6BAA6B,qCAAqC,0CAA0C,MAAM,uCAAuC,4BAA4B,gCAAgC,oCAAoC,2CAA2C,MAAM,4BAA4B,qCAAqC,kEAAkE,MAAM,4BAA4B,MAAM,8BAA8B,iCAAiC,iDAAiD,wBAAwB,mCAAmC,sBAAsB,qCAAqC,+CAA+C,4CAA4C,sCAAsC,qCAAqC,yBAAyB,gDAAgD,sCAAsC,8BAA8B,2BAA2B,2BAA2B,gCAAgC,wDAAwD,wBAAwB,8CAA8C,+BAA+B,gDAAgD,sDAAsD,oDAAoD,iCAAiC,yBAAyB,sBAAsB,mCAAmC,yCAAyC,oCAAoC,0CAA0C,4CAA4C,iDAAiD,kCAAkC,sCAAsC,8CAA8C,wEAAwE,kDAAkD,wCAAwC,gEAAgE,6CAA6C,4CAA4C,qCAAqC,kDAAkD,6DAA6D,4CAA4C,+BAA+B,+CAA+C,gDAAgD,gDAAgD,+CAA+C,wCAAwC,sCAAsC,0BAA0B,yBAAyB,wBAAwB,8BAA8B,mCAAmC,+BAA+B,8BAA8B,6BAA6B,kCAAkC,OAAO,iCAAiC,iCAAiC,iDAAiD,wBAAwB,gCAAgC,yBAAyB,2CAA2C,+CAA+C,yCAAyC,qCAAqC,yBAAyB,iDAAiD,sCAAsC,8BAA8B,2BAA2B,2BAA2B,gCAAgC,wDAAwD,wBAAwB,8CAA8C,+BAA+B,kDAAkD,wDAAwD,8CAA8C,gDAAgD,yBAAyB,mCAAmC,yCAAyC,0BAA0B,oCAAoC,0CAA0C,kDAAkD,iDAAiD,+CAA+C,sCAAsC,kDAAkD,wCAAwC,gEAAgE,6CAA6C,+BAA+B,kCAAkC,kDAAkD,oDAAoD,2EAA2E,WAAW,oBAAoB,0KAA0K,mBAAmB,kBAAkB,mBAAmB,8FAA8F,+BAA+B,YAAY,kBAAkB,mBAAmB,6BAA6B,oBAAoB,oBAAoB,cAAc,mCAAmC,kCAAkC,oBAAoB,YAAY,qBAAqB,YAAY,6BAA6B,YAAY,kBAAkB,YAAY,2BAA2B,YAAY,+BAA+B,YAAY,sBAAsB,YAAY,oBAAoB,YAAY,sBAAsB,YAAY,yBAAyB,YAAY,sBAAsB,YAAY,yBAAyB,YAAY,yBAAyB,YAAY,qBAAqB,YAAY,2BAA2B,YAAY,kCAAkC,YAAY,yBAAyB,YAAY,6BAA6B,YAAY,mBAAmB,YAAY,qBAAqB,YAAY,mBAAmB,YAAY,kBAAkB,YAAY,uBAAuB,YAAY,6BAA6B,YAAY,qBAAqB,YAAY,wBAAwB,YAAY,kBAAkB,YAAY,sBAAsB,YAAY,2BAA2B,YAAY,0BAA0B,YAAY,+BAA+B,YAAY,qBAAqB,YAAY,uBAAuB,YAAY,4BAA4B,YAAY,4BAA4B,YAAY,yBAAyB,YAAY,2BAA2B,YAAY,yBAAyB,YAAY,oBAAoB,YAAY,4BAA4B,YAAY,uBAAuB,YAAY,uBAAuB,YAAY,8BAA8B,YAAY,mBAAmB,YAAY,uBAAuB,YAAY,mBAAmB,YAAY,qBAAqB,YAAY,4BAA4B,YAAY,6BAA6B,YAAY,yBAAyB,YAAY,yBAAyB,YAAY,sBAAsB,YAAY,uBAAuB,YAAY,mBAAmB,YAAY,uBAAuB,YAAY,wBAAwB,YAAY,wBAAwB,YAAY,mBAAmB,YAAY,mBAAmB,YAAY,oBAAoB,YAAY,6BAA6B,YAAY,oBAAoB,YAAY,mBAAmB,YAAY,mBAAmB,YAAY,2BAA2B,YAAY,0BAA0B,YAAY,yBAAyB,YAAY,mBAAmB,YAAY,mBAAmB,YAAY,qBAAqB,YAAY,uBAAuB,YAAY,sBAAsB,YAAY,6BAA6B,YAAY,yBAAyB,YAAY,4BAA4B,YAAY,+BAA+B,YAAY,mBAAmB,YAAY,oBAAoB,YAAY,mBAAmB,YAAY,oBAAoB,YAAY,mBAAmB,YAAY,oBAAoB,YAAY,qBAAqB,YAAY,uBAAuB,YAAY,mBAAmB,YAAY,uBAAuB,YAAY,yBAAyB,YAAY,wBAAwB,YAAY,mBAAmB,YAAY,mBAAmB,YAAY,8BAA8B,YAAY,2BAA2B,YAAY,uBAAuB,YAAY,mBAAmB,YAAY,sBAAsB,YAAY,+BAA+B,YAAY,8BAA8B,YAAY,qBAAqB,YAAY,sBAAsB,YAAY,mBAAmB,YAAY,sBAAsB,YAAY,4BAA4B,YAAY,yBAAyB,YAAY,iCAAiC,YAAY,wCAAwC,YAAY,gCAAgC,YAAY,oBAAoB,YAAY,wBAAwB,YAAY,mBAAmB,YAAY,mBAAmB,YAAY,oBAAoB,YAAY,yBAAyB,YAAY,6BAA6B,YAAY,uBAAuB,YAAY,yBAAyB,YAAY,mBAAmB,YAAY,0BAA0B,YAAY,sBAAsB,YAAY,0BAA0B,YAAY,oBAAoB,YAAY,0BAA0B,YAAY,oBAAoB,YAAY,kBAAkB,YAAY,sBAAsB,YAAY,4BAA4B,YAAY,yBAAyB,YAAY,kBAAkB,YAAY,mBAAmB,YAAY,0BAA0B,YAAY,0BAA0B,YAAY,0BAA0B,YAAY,0BAA0B,YAAY,mBAAmB,YAAY,mBAAmB,YAAY,uBAAuB,YAAY,uBAAuB,YAAY,sBAAsB,YAAY,wBAAwB,YAAY,wBAAwB,YAAY,qBAAqB,YAAY,sBAAsB,YAAY,oBAAoB,YAAY,2BAA2B,YAAY,yBAAyB,YAAY,0BAA0B,YAAY,2BAA2B,YAAY,oBAAoB,YAAY,4BAA4B,YAAY,uBAAuB,YAAY,wBAAwB,YAAY,qBAAqB,YAAY,qBAAqB,YAAY,mBAAmB,YAAY,oBAAoB,YAAY,sBAAsB,YAAY,2BAA2B,YAAY,uBAAuB,YAAY,8BAA8B,YAAY,iCAAiC,YAAY,sBAAsB,YAAY,0BAA0B,YAAY,oBAAoB,YAAY,sBAAsB,YAAY,oBAAoB,YAAY,uBAAuB,YAAY,mBAAmB,YAAY,4BAA4B,YAAY,uBAAuB,YAAY,kBAAkB,YAAY,oBAAoB,YAAY,wBAAwB,YAAY,wBAAwB,YAAY,qBAAqB,YAAY,oBAAoB,YAAY,qBAAqB,YAAY,iBAAiB,YAAY,mBAAmB,YAAY,uBAAuB,YAAY,0BAA0B,YAAY,yCAAyC,YAAY,iCAAiC,YAAY,wBAAwB,YAAY,0BAA0B,YAAY,0BAA0B,YAAY,yBAAyB,YAAY,wBAAwB,YAAY,qBAAqB,YAAY,sBAAsB,YAAY,2BAA2B,YAAY,0BAA0B,WAAW,qBAAqB,kBAAkB,gBAAgB,kBAAkB,iHAAiH,+CAA+C,WAAW,qBAAqB,kBAAkB,gBAAgB,kBAAkB,iHAAiH,4FAA4F,WAAW,qBAAqB,kBAAkB,gBAAgB,kBAAkB,+GAA+G,4HAA4H,WAAW,qBAAqB,kBAAkB,gBAAgB,kBAAkB,2HAA2H,+CAA+C,WAAW,qBAAqB,kBAAkB,gBAAgB,kBAAkB,2HAA2H,4FAA4F,WAAW,qBAAqB,kBAAkB,gBAAgB,kBAAkB,yHAAyH,4HAA4H,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,iFAAiF,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,yDAAyD,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,0BAA0B,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,yGAAyG,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,2GAA2G,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,yJAAyJ,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,iFAAiF,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,yDAAyD,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,0BAA0B,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,yGAAyG,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,qHAAqH,2GAA2G,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,yJAAyJ,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,iFAAiF,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,yDAAyD,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,0BAA0B,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,yGAAyG,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,2GAA2G,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,gHAAgH,yJAAyJ,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,iFAAiF,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,yDAAyD,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,0BAA0B,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,yGAAyG,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,mHAAmH,2GAA2G,WAAW,0BAA0B,kBAAkB,gBAAgB,kBAAkB,gHAAgH,yJAAyJ,eAAe,YAAY,cAAc,aAAa,eAAe,sBAAsB,kBAAkB,0CAA0C,aAAa,gBAAgB,yBAAyB,kBAAkB,YAAY,QAAQ,SAAS,WAAW,eAAe,SAAS,QAAQ,qBAAqB,yCAAyC,kBAAkB,yBAAyB,qBAAqB,YAAY,sBAAsB,UAAU,gBAAgB,wBAAwB,gCAAgC,mBAAmB,mBAAmB,kBAAkB,cAAc,MAAM,UAAU,WAAW,UAAU,cAAc,0BAA0B,sBAAsB,sCAAsC,6BAA6B,oBAAoB,8CAA8C,yBAAyB,sBAAsB,qBAAqB,iBAAiB,mBAAmB,0CAA0C,oEAAoE,oBAAoB,kBAAkB,MAAM,QAAQ,SAAS,OAAO,yBAAyB,sCAAsC,UAAU,mCAAmC,oBAAoB,UAAU,2CAA2C,uBAAuB,mBAAmB,gBAAgB,2BAA2B,oBAAoB,yCAAyC,kEAAkE,mCAAmC,sBAAsB,sCAAsC,mDAAmD,sBAAsB,WAAW,yBAAyB,2BAA2B,kBAAkB,UAAU,mBAAmB,+BAA+B,mKAAmK,6CAA6C,6DAA6D,mNAAmN,8JAA8J,0BAA0B,sBAAsB,2CAA2C,0CAA0C,mBAAmB,qBAAqB,0CAA0C,2BAA2B,uJAAuJ,qBAAqB,kCAAkC,4BAA4B,mKAAmK,cAAc,2BAA2B,yBAAyB,qBAAqB,kCAAkC,yBAAyB,qBAAqB,iCAAiC,+BAA+B,yBAAyB,qCAAqC,6CAA6C,gCAAgC,4CAA4C,yBAAyB,qBAAqB,+BAA+B,yBAAyB,6CAA6C,gCAAgC,qCAAqC,gBAAgB,yBAAyB,qBAAqB,kCAAkC,+BAA+B,cAAc,2BAA2B,gBAAgB,oCAAoC,6CAA6C,UAAU,qIAAqI,8EAA8E,cAAc,UAAU,wBAAwB,UAAU,oBAAoB,6BAA6B,MAAM,OAAO,uBAAuB,sBAAsB,uBAAuB,WAAW,mBAAmB,kBAAkB,mBAAmB,cAAc,UAAU,uBAAuB,cAAc,UAAU,cAAc,cAAc,UAAU,uBAAuB,cAAc,wBAAwB,cAAc,yBAAyB,aAAa,aAAa,aAAa,YAAY,UAAU,0CAA0C,yBAAyB,qCAAqC,gDAAgD,uDAAuD,+CAA+C,+BAA+B,GAAG,wBAAwB,IAAI,8BAA8B,IAAI,6BAA6B,KAAK,yBAAyB,uBAAuB,GAAG,wBAAwB,IAAI,8BAA8B,IAAI,6BAA6B,KAAK,yBAAyB,cAAc,kBAAkB,WAAW,qBAAqB,sBAAsB,gBAAgB,sBAAsB,0CAA0C,cAAc,kBAAkB,oBAAoB,eAAe,sBAAsB,sDAAsD,4DAA4D,qBAAqB,oCAAoC,oCAAoC,qBAAqB,8CAA8C,0BAA0B,2CAA2C,wCAAwC,yGAAyG,gCAAgC,+CAA+C,0BAA0B,6BAA6B,qBAAqB,kCAAkC,iCAAiC,cAAc,2BAA2B,UAAU,iHAAiH,0CAA0C,4CAA4C,wDAAwD,aAAa,uDAAuD,aAAa,mDAAmD,aAAa,qBAAqB,kBAAkB,QAAQ,6BAA6B,kBAAkB,eAAe,cAAc,kCAAkC,WAAW,cAAc,UAAU,4CAA4C,mDAAmD,4BAA4B,WAAW,YAAY,cAAc,oBAAoB,2BAA2B,UAAU,UAAU,WAAW,YAAY,kCAAkC,kBAAkB,yCAAyC,qBAAqB,yBAAyB,wDAAwD,kBAAkB,iDAAiD,cAAc,cAAc,iBAAiB,0CAA0C,wDAAwD,kBAAkB,wBAAwB,oEAAoE,eAAe,sCAAsC,kBAAkB,cAAc,UAAU,iBAAiB,cAAc,eAAe,qBAAqB,cAAc,aAAa,mBAAmB,uBAAuB,QAAQ,2BAA2B,6CAA6C,YAAY,wDAAwD,YAAY,qHAAqH,WAAW,gCAAgC,sCAAsC,wBAAwB,4CAA4C,gCAAgC,cAAc,qCAAqC,eAAe,gBAAgB,aAAa,YAAY,eAAe,6DAA6D,gBAAgB,gHAAgH,2CAA2C,mDAAmD,gaAAga,0CAA0C,4CAA4C,4IAA4I,yCAAyC,2CAA2C,iCAAiC,+BAA+B,WAAW,gCAAgC,UAAU,kBAAkB,iBAAiB,cAAc,6BAA6B,cAAc,kCAAkC,6BAA6B,YAAY,cAAc,kBAAkB,6FAA6F,aAAa,mBAAmB,uBAAuB,aAAa,gBAAgB,iBAAiB,cAAc,2BAA2B,YAAY,kBAAkB,yCAAyC,6BAA6B,qBAAqB,oBAAoB,oEAAoE,6DAA6D,+CAA+C,UAAU,yBAAyB,sBAAsB,qBAAqB,iBAAiB,yBAAyB,sCAAsC,kBAAkB,iBAAiB,WAAW,YAAY,aAAa,eAAe,aAAa,mBAAmB,uBAAuB,qBAAqB,uBAAuB,gBAAgB,mCAAmC,2BAA2B,qBAAqB,qBAAqB,8BAA8B,gCAAgC,aAAa,cAAc,UAAU,kBAAkB,kBAAkB,0CAA0C,8CAA8C,UAAU,SAAS,mBAAmB,mBAAmB,UAAU,gCAAgC,qIAAqI,yHAAyH,eAAe,mCAAmC,2BAA2B,oDAAoD,4CAA4C,mBAAmB,yBAAyB,2BAA2B,cAAc,gBAAgB,sBAAsB,sCAAsC,6BAA6B,qBAAqB,eAAe,6BAA6B,qBAAqB,wBAAwB,sBAAsB,oBAAoB,YAAY,iBAAiB,kCAAkC,eAAe,8BAA8B,gBAAgB,SAAS,gBAAgB,0BAA0B,oCAAoC,cAAc,kCAAkC,UAAU,2CAA2C,kCAAkC,iCAAiC,gBAAgB,iBAAiB,mBAAmB,UAAU,sCAAsC,sBAAsB,QAAQ,SAAS,2BAA2B,uBAAuB,OAAO,SAAS,0BAA0B,wBAAwB,4BAA4B,mBAAmB,SAAS,YAAY,QAAQ,YAAY,8BAA8B,oBAAoB,SAAS,YAAY,OAAO,YAAY,6BAA6B,qBAAqB,+BAA+B,sBAAsB,8BAA8B,uBAAuB,6BAA6B,eAAe,uBAAuB,wBAAwB,uBAAuB,qBAAqB,aAAa,kBAAkB,qDAAqD,YAAY,0BAA0B,8BAA8B,WAAW,gCAAgC,oBAAoB,mBAAmB,mBAAmB,gBAAgB,eAAe,8BAA8B,iBAAiB,kCAAkC,uBAAuB,kBAAkB,gBAAgB,mBAAmB,sCAAsC,oDAAoD,gDAAgD,sBAAsB,sBAAsB,uEAAuE,2CAA2C,mDAAmD,qFAAqF,yCAAyC,2CAA2C,sBAAsB,WAAW,gCAAgC,2BAA2B,0CAA0C,gCAAgC,kBAAkB,oBAAoB,cAAc,0CAA0C,eAAe,2BAA2B,oBAAoB,kBAAkB,cAAc,6CAA6C,eAAe,oBAAoB,yBAAyB,2DAA2D,kBAAkB,+BAA+B,uFAAuF,mBAAmB,uBAAuB,gBAAgB,wBAAwB,kBAAkB,cAAc,kCAAkC,sBAAsB,cAAc,kCAAkC,YAAY,gBAAgB,oCAAoC,+BAA+B,gCAAgC,0BAA0B,cAAc,WAAW,kBAAkB,oBAAoB,kBAAkB,0BAA0B,OAAO,QAAQ,MAAM,SAAS,UAAU,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,YAAY,aAAa,WAAW,cAAc,sBAAsB,0BAA0B,qBAAqB,iBAAiB,iBAAiB,cAAc,aAAa,mBAAmB,uBAAuB,kCAAkC,mCAAmC,kBAAkB,mBAAmB,aAAa,UAAU,eAAe,yBAAyB,iBAAiB,6BAA6B,cAAc,kCAAkC,oBAAoB,6BAA6B,eAAe,gBAAgB,eAAe,4BAA4B,0CAA0C,8CAA8C,kBAAkB,UAAU,qBAAqB,mCAAmC,2BAA2B,oDAAoD,4CAA4C,0DAA0D,6BAA6B,8BAA8B,kBAAkB,2BAA2B,0BAA0B,kDAAkD,+FAA+F,8BAA8B,mBAAmB,uBAAuB,qCAAqC,aAAa,2BAA2B,qBAAqB,eAAe,UAAU,sJAAsJ,yCAAyC,6EAA6E,0CAA0C,uCAAuC,oBAAoB,oBAAoB,wBAAwB,wBAAwB,sBAAsB,aAAa,+BAA+B,2DAA2D,8BAA8B,cAAc,YAAY,aAAa,sBAAsB,2BAA2B,oEAAoE,wCAAwC,2BAA2B,sEAAsE,6BAA6B,qBAAqB,2CAA2C,6FAA6F,yFAAyF,+BAA+B,UAAU,mBAAmB,2BAA2B,kBAAkB,yBAAyB,kBAAkB,WAAW,+BAA+B,aAAa,kCAAkC,kBAAkB,mBAAmB,oBAAoB,8BAA8B,0BAA0B,kBAAkB,MAAM,QAAQ,SAAS,OAAO,YAAY,oBAAoB,sBAAsB,kJAAkJ,wMAAwM,gCAAgC,kBAAkB,aAAa,sBAAsB,kCAAkC,mBAAmB,kBAAkB,kCAAkC,mBAAmB,kBAAkB,sBAAsB,6BAA6B,iBAAiB,uBAAuB,yBAAyB,0CAA0C,wDAAwD,uDAAuD,cAAc,0DAA0D,eAAe,mCAAmC,WAAW,YAAY,wDAAwD,mBAAmB,+EAA+E,gCAAgC,kEAAkE,mBAAmB,iJAAiJ,sBAAsB,yFAAyF,qDAAqD,mDAAmD,oDAAoD,kBAAkB,WAAW,YAAY,aAAa,mBAAmB,WAAW,kBAAkB,YAAY,YAAY,gBAAgB,oCAAoC,eAAe,gBAAgB,kBAAkB,UAAU,uBAAuB,mEAAmE,4CAA4C,mBAAmB,qCAAqC,yBAAyB,cAAc,2BAA2B,6BAA6B,2FAA2F,oCAAoC,sCAAsC,2CAA2C,0CAA0C,4CAA4C,yGAAyG,yCAAyC,2CAA2C,6DAA6D,eAAe,4BAA4B,oCAAoC,gBAAgB,kCAAkC,yBAAyB,WAAW,UAAU,sBAAsB,+BAA+B,WAAW,gCAAgC,aAAa,WAAW,YAAY,mBAAmB,sBAAsB,mBAAmB,sBAAsB,aAAa,0BAA0B,iBAAiB,qBAAqB,iBAAiB,WAAW,gCAAgC,6BAA6B,aAAa,mBAAmB,eAAe,cAAc,mBAAmB,mBAAmB,+BAA+B,0CAA0C,iBAAiB,aAAa,2EAA2E,2CAA2C,mDAAmD,yFAAyF,yCAAyC,2CAA2C,2FAA2F,0CAA0C,4CAA4C,wBAAwB,cAAc,kCAAkC,iBAAiB,kBAAkB,kCAAkC,kBAAkB,4CAA4C,yBAAyB,WAAW,UAAU,SAAS,SAAS,4DAA4D,YAAY,iBAAiB,kBAAkB,4BAA4B,8BAA8B,0BAA0B,8BAA8B,8DAA8D,2CAA2C,mDAAmD,2BAA2B,iBAAiB,YAAY,aAAa,kBAAkB,mBAAmB,kBAAkB,wBAAwB,0CAA0C,YAAY,cAAc,iBAAiB,UAAU,cAAc,+BAA+B,0BAA0B,yBAAyB,6CAA6C,qBAAqB,yBAAyB,iCAAiC,4BAA4B,mBAAmB,mBAAmB,gCAAgC,WAAW,aAAa,eAAe,8BAA8B,gBAAgB,+BAA+B,aAAa,mBAAmB,uBAAuB,eAAe,iBAAiB,kBAAkB,kBAAkB,mCAAmC,2BAA2B,uBAAuB,aAAa,sBAAsB,mBAAmB,eAAe,eAAe,8BAA8B,gCAAgC,oBAAoB,6CAA6C,oBAAoB,+FAA+F,WAAW,kBAAkB,mBAAmB,kBAAkB,kBAAkB,yCAAyC,mDAAmD,iDAAiD,oCAAoC,oGAAoG,gGAAgG,wEAAwE,iBAAiB,sCAAsC,YAAY,WAAW,0BAA0B,0BAA0B,eAAe,gBAAgB,oCAAoC,WAAW,qBAAqB,kBAAkB,yBAAyB,oBAAoB,4EAA4E,eAAe,eAAe,sBAAsB,yBAAyB,6CAA6C,uDAAuD,kBAAkB,OAAO,MAAM,WAAW,4BAA4B,wBAAwB,iJAAiJ,qCAAqC,oDAAoD,gCAAgC,yBAAyB,uCAAuC,2DAA2D,sCAAsC,2DAA2D,oBAAoB,qCAAqC,kBAAkB,yEAAyE,eAAe,eAAe,sBAAsB,8BAA8B,oBAAoB,8IAA8I,0BAA0B,qDAAqD,kBAAkB,OAAO,WAAW,2BAA2B,eAAe,0BAA0B,aAAa,+BAA+B,yBAAyB,sCAAsC,qEAAqE,qCAAqC,qEAAqE,0BAA0B,qBAAqB,iCAAiC,aAAa,UAAU,wDAAwD,2CAA2C,gCAAgC,YAAY,qCAAqC,iDAAiD,4CAA4C,wBAAwB,UAAU,2CAA2C,mDAAmD,6BAA6B,kBAAkB,YAAY,iBAAiB,0DAA0D,qDAAqD,6CAA6C,oDAAoD,kBAAkB,kCAAkC,0BAA0B,qBAAqB,sBAAsB,6BAA6B,0BAA0B,gBAAgB,qBAAqB,8CAA8C,eAAe,OAAO,sBAAsB,sCAAsC,aAAa,gCAAgC,kBAAkB,uDAAuD,4DAA4D,oDAAoD,6BAA6B,wFAAwF,mBAAmB,+GAA+G,uCAAuC,+BAA+B,4BAA4B,0CAA0C,qBAAqB,uDAAuD,sCAAsC,kBAAkB,iBAAiB,+BAA+B,gBAAgB,uCAAuC,gBAAgB,aAAa,4BAA4B,mBAAmB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,mBAAmB,+BAA+B,0CAA0C,uCAAuC,sBAAsB,4CAA4C,oBAAoB,gBAAgB,oCAAoC,cAAc,mDAAmD,qBAAqB,cAAc,kCAAkC,mBAAmB,uBAAuB,gBAAgB,8CAA8C,cAAc,OAAO,qBAAqB,gBAAgB,oCAAoC,WAAW,8BAA8B,kBAAkB,kBAAkB,8BAA8B,4CAA4C,yBAAyB,aAAa,UAAU,eAAe,kBAAkB,+BAA+B,kBAAkB,UAAU,cAAc,iBAAiB,8BAA8B,gBAAgB,uBAAuB,iBAAiB,eAAe,yBAAyB,sCAAsC,YAAY,yBAAyB,wCAAwC,cAAc,qBAAqB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,+BAA+B,eAAe,MAAM,OAAO,QAAQ,SAAS,YAAY,WAAW,iBAAiB,gBAAgB,2BAA2B,aAAa,qCAAqC,WAAW,YAAY,sBAAsB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,WAAW,0CAA0C,oBAAoB,sBAAsB,SAAS,kBAAkB,YAAY,aAAa,mBAAmB,uBAAuB,6BAA6B,eAAe,iBAAiB,WAAW,gBAAgB,mBAAmB,kBAAkB,sBAAsB,gBAAgB,SAAS,cAAc,WAAW,kBAAkB,UAAU,UAAU,kBAAkB,UAAU,QAAQ,SAAS,8CAA8C,eAAe,0CAA0C,sBAAsB,qBAAqB,6CAA6C,mDAAmD,2CAA2C,0CAA0C,sBAAsB,gBAAgB,4CAA4C,UAAU,mBAAmB,kBAAkB,SAAS,QAAQ,OAAO,gBAAgB,cAAc,UAAU,0CAA0C,qDAAqD,6CAA6C,kCAAkC,cAAc,mCAAmC,0CAA0C,mBAAmB,gCAAgC,0CAA0C,sBAAsB,kCAAkC,iCAAiC,0CAA0C,kCAAkC,oBAAoB,0BAA0B,YAAY,iBAAiB,SAAS,UAAU,2BAA2B,WAAW,kBAAkB,2BAA2B,oCAAoC,qPAAqP,oBAAoB,iDAAiD,qDAAqD,6CAA6C,0CAA0C,0DAA0D,cAAc,wBAAwB,YAAY,mCAAmC,kCAAkC,4BAA4B,kCAAkC,0CAA0C,4BAA4B,mCAAmC,2FAA2F,wBAAwB,wCAAwC,YAAY,sFAAsF,UAAU,8HAA8H,YAAY,wBAAwB,qBAAqB,2BAA2B,sBAAsB,8BAA8B,+BAA+B,0HAA0H,aAAa,mBAAmB,wBAAwB,gBAAgB,+CAA+C,iDAAiD,yCAAyC,sCAAsC,aAAa,kDAAkD,kBAAkB,yFAAyF,wBAAwB,8BAA8B,WAAW,uBAAuB,wBAAwB,sCAAsC,eAAe,gBAAgB,iBAAiB,aAAa,uCAAuC,cAAc,yCAAyC,cAAc,SAAS,2BAA2B,+BAA+B,mDAAmD,aAAa,8BAA8B,wBAAwB,wCAAwC,wBAAwB,eAAe,8BAA8B,cAAc,qBAAqB,mBAAmB,mCAAmC,qBAAqB,kBAAkB,eAAe,sBAAsB,kBAAkB,OAAO,MAAM,QAAQ,SAAS,cAAc,YAAY,sBAAsB,qBAAqB,wBAAwB,qBAAqB,uBAAuB,WAAW,eAAe,UAAU,SAAS,aAAa,yBAAyB,kBAAkB,YAAY,eAAe,2BAA2B,aAAa,2CAA2C,aAAa,uCAAuC,aAAa,QAAQ,SAAS,uCAAuC,aAAa,oDAAoD,aAAa,uBAAuB,eAAe,mDAAmD,8BAA8B,UAAU,yDAAyD,YAAY,cAAc,yBAAyB,wBAAwB,kBAAkB,8BAA8B,eAAe,kBAAkB,QAAQ,mDAAmD,2DAA2D,gFAAgF,uCAAuC,mFAAmF,8DAA8D,6CAA6C,WAAW,yBAAyB,wCAAwC,8CAA8C,mCAAmC,kBAAkB,MAAM,SAAS,6EAA6E,qBAAqB,oDAAoD,WAAW,6BAA6B,6BAA6B,kBAAkB,6BAA6B,gBAAgB,WAAW,YAAY,6BAA6B,kBAAkB,+BAA+B,kBAAkB,+BAA+B,aAAa,mBAAmB,iBAAiB,kBAAkB,eAAe,aAAa,8BAA8B,mBAAmB,0CAA0C,iBAAiB,iBAAiB,gBAAgB,gBAAgB,wBAAwB,cAAc,gBAAgB,kBAAkB,eAAe,sBAAsB,uBAAuB,uCAAuC,uBAAuB,kCAAkC,+BAA+B,WAAW,gCAAgC,0CAA0C,gBAAgB,oBAAoB,8BAA8B,kBAAkB,OAAO,QAAQ,2BAA2B,kBAAkB,mBAAmB,qBAAqB,gBAAgB,6CAA6C,2EAA2E,kHAAkH,kBAAkB,MAAM,OAAO,qCAAqC,QAAQ,SAAS,sBAAsB,yBAAyB,yCAAyC,SAAS,WAAW,YAAY,UAAU,yBAAyB,sCAAsC,mBAAmB,kBAAkB,wCAAwC,gEAAgE,2BAA2B,oCAAoC,cAAc,wCAAwC,yCAAyC,QAAQ,SAAS,gCAAgC,wCAAwC,YAAY,kBAAkB,qBAAqB,6BAA6B,oBAAoB,oEAAoE,mBAAmB,+DAA+D,2BAA2B,kCAAkC,kBAAkB,sBAAsB,eAAe,qBAAqB,gBAAgB,eAAe,iBAAiB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,uBAAuB,cAAc,yDAAyD,gBAAgB,6BAA6B,aAAa,mBAAmB,cAAc,oBAAoB,cAAc,eAAe,2CAA2C,UAAU,iBAAiB,gBAAgB,mBAAmB,kEAAkE,oBAAoB,sBAAsB,eAAe,oCAAoC,kBAAkB,cAAc,+CAA+C,MAAM,QAAQ,SAAS,OAAO,2CAA2C,yBAAyB,wCAAwC,UAAU,0CAA0C,0DAA0D,mDAAmD,wBAAwB,aAAa,iBAAiB,kBAAkB,gBAAgB,iBAAiB,mBAAmB,+BAA+B,eAAe,2BAA2B,eAAe,yGAAyG,kBAAkB,qDAAqD,qBAAqB,kCAAkC,oDAAoD,oCAAoC,+BAA+B,oBAAoB,kBAAkB,cAAc,6EAA6E,WAAW,cAAc,kBAAkB,OAAO,QAAQ,kBAAkB,mBAAmB,2BAA2B,uCAAuC,yBAAyB,6CAA6C,kBAAkB,UAAU,8DAA8D,kDAAkD,sCAAsC,cAAc,aAAa,cAAc,kBAAkB,mBAAmB,gCAAgC,oCAAoC,wBAAwB,6DAA6D,8BAA8B,wDAAwD,UAAU,QAAQ,uDAAuD,UAAU,eAAe,6BAA6B,sBAAsB,UAAU,UAAU,WAAW,uBAAuB,kBAAkB,0FAA0F,yBAAyB,kBAAkB,8DAA8D,2FAA2F,0CAA0C,mBAAmB,8HAA8H,eAAe,WAAW,gCAAgC,iDAAiD,aAAa,qDAAqD,0BAA0B,2CAA2C,oDAAoD,8BAA8B,wCAAwC,kCAAkC,kFAAkF,gGAAgG,0CAA0C,uBAAuB,iGAAiG,yBAAyB,qCAAqC,uBAAuB,aAAa,kBAAkB,UAAU,aAAa,mBAAmB,oBAAoB,wCAAwC,cAAc,0BAA0B,0BAA0B,eAAe,yBAAyB,wCAAwC,mBAAmB,kBAAkB,aAAa,mBAAmB,uBAAuB,+DAA+D,gCAAgC,+CAA+C,cAAc,eAAe,yBAAyB,wCAAwC,sBAAsB,sCAAsC,YAAY,+CAA+C,kBAAkB,kBAAkB,sEAAsE,0CAA0C,gEAAgE,yBAAyB,sCAAsC,uEAAuE,qBAAqB,kCAAkC,0EAA0E,oBAAoB,kBAAkB,0CAA0C,sDAAsD,iBAAiB,kCAAkC,WAAW,qBAAqB,mBAAmB,0CAA0C,kCAAkC,iBAAiB,wCAAwC,cAAc,kCAAkC,eAAe,oBAAoB,gBAAgB,oCAAoC,yBAAyB,sBAAsB,qBAAqB,iBAAiB,0CAA0C,wCAAwC,uBAAuB,gBAAgB,2CAA2C,gCAAgC,4CAA4C,0CAA0C,2CAA2C,mBAAmB,+DAA+D,6BAA6B,6CAA6C,mBAAmB,gDAAgD,kBAAkB,gBAAgB,sDAAsD,iBAAiB,aAAa,8BAA8B,YAAY,gBAAgB,0CAA0C,YAAY,WAAW,UAAU,SAAS,aAAa,sBAAsB,kBAAkB,WAAW,sBAAsB,sCAAsC,sBAAsB,qBAAqB,iBAAiB,yBAAyB,2BAA2B,eAAe,oBAAoB,YAAY,mBAAmB,aAAa,uBAAuB,mBAAmB,kBAAkB,eAAe,iBAAiB,gBAAgB,6BAA6B,0CAA0C,eAAe,iBAAiB,uEAAuE,+CAA+C,0CAA0C,cAAc,YAAY,cAAc,mCAAmC,mBAAmB,oBAAoB,iGAAiG,2DAA2D,mDAAmD,2FAA2F,qEAAqE,6DAA6D,iBAAiB,SAAS,aAAa,mBAAmB,uBAAuB,YAAY,iBAAiB,cAAc,+BAA+B,WAAW,gCAAgC,yBAAyB,gDAAgD,0CAA0C,sBAAsB,8CAA8C,kMAAkM,WAAW,kCAAkC,WAAW,kBAAkB,wBAAwB,sBAAsB,wCAAwC,2BAA2B,2CAA2C,qBAAqB,sCAAsC,wBAAwB,qCAAqC,mGAAmG,sBAAsB,qBAAqB,kCAAkC,mEAAmE,iCAAiC,cAAc,2BAA2B,6CAA6C,eAAe,kBAAkB,mBAAmB,gBAAgB,uBAAuB,iBAAiB,iCAAiC,qCAAqC,mDAAmD,oBAAoB,2BAA2B,gCAAgC,iBAAiB,wBAAwB,cAAc,kBAAkB,2BAA2B,gBAAgB,iCAAiC,yBAAyB,eAAe,kBAAkB,kBAAkB,cAAc,iCAAiC,cAAc,eAAe,kBAAkB,cAAc,sBAAsB,qBAAqB,qBAAqB,qBAAqB,sBAAsB,0CAA0C,kBAAkB,sDAAsD,kBAAkB,6CAA6C,kBAAkB,UAAU,WAAW,SAAS,QAAQ,gCAAgC,cAAc,eAAe,8CAA8C,cAAc,eAAe,oBAAoB,iBAAiB,sBAAsB,kCAAkC,kBAAkB,UAAU,SAAS,sBAAsB,sCAAsC,gBAAgB,kBAAkB,yBAAyB,4CAA4C,WAAW,YAAY,UAAU,iHAAiH,gBAAgB,mBAAmB,UAAU,uKAAuK,mBAAmB,qIAAqI,UAAU,qIAAqI,sGAAsG,8GAA8G,yJAAyJ,2IAA2I,6JAA6J,sDAAsD,gBAAgB,mBAAmB,UAAU,iFAAiF,mBAAmB,gEAAgE,UAAU,gEAAgE,sGAAsG,8GAA8G,0EAA0E,2IAA2I,6JAA6J,yBAAyB,cAAc,wBAAwB,gBAAgB,cAAc,kCAAkC,cAAc,4CAA4C,iDAAiD,oBAAoB,kBAAkB,sBAAsB,wBAAwB,mBAAmB,gCAAgC,mBAAmB,eAAe,WAAW,YAAY,uCAAuC,WAAW,YAAY,gBAAgB,mDAAmD,YAAY,uDAAuD,kBAAkB,0BAA0B,qBAAqB,qBAAqB,sBAAsB,cAAc,mCAAmC,cAAc,cAAc,eAAe,kBAAkB,kBAAkB,sBAAsB,iCAAiC,sBAAsB,6BAA6B,uBAAuB,2DAA2D,mCAAmC,oCAAoC,cAAc,mCAAmC,UAAU,2CAA2C,UAAU,6BAA6B,kBAAkB,oCAAoC,kBAAkB,MAAM,OAAO,mBAAmB,UAAU,oCAAoC,yDAAyD,+BAA+B,4BAA4B,yBAAyB,kBAAkB,wDAAwD,yBAAyB,8CAA8C,4BAA4B,yBAAyB,wCAAwC,mEAAmE,YAAY,qBAAqB,0EAA0E,iBAAiB,wFAAwF,QAAQ,cAAc,YAAY,iBAAiB,qBAAqB,uCAAuC,iBAAiB,2BAA2B,+BAA+B,UAAU,6BAA6B,cAAc,iBAAiB,mBAAmB,4BAA4B,oBAAoB,gBAAgB,uBAAuB,mBAAmB,8BAA8B,0CAA0C,+BAA+B,mBAAmB,iCAAiC,kBAAkB,yEAAyE,eAAe,0CAA0C,yEAAyE,YAAY,gBAAgB,oBAAoB,uEAAuE,2BAA2B,0CAA0C,uEAAuE,sBAAsB,uMAAuM,mBAAmB,+CAA+C,YAAY,0CAA0C,+CAA+C,aAAa,yFAAyF,eAAe,yCAAyC,cAAc,wCAAwC,sBAAsB,2CAA2C,oBAAoB,YAAY,gBAAgB,yBAAyB,gCAAgC,aAAa,WAAW,eAAe,mBAAmB,sBAAsB,cAAc,kBAAkB,sDAAsD,oDAAoD,+CAA+C,mCAAmC,2BAA2B,iEAAiE,YAAY,2BAA2B,sDAAsD,0CAA0C,YAAY,2BAA2B,2CAA2C,YAAY,0BAA0B,2CAA2C,YAAY,wDAAwD,uCAAuC,qDAAqD,mDAAmD,8FAA8F,sBAAsB,mBAAmB,qDAAqD,mDAAmD,0DAA0D,6BAA6B,SAAS,4DAA4D,gBAAgB,sBAAsB,gDAAgD,aAAa,qBAAqB,uBAAuB,gBAAgB,0CAA0C,cAAc,WAAW,oCAAoC,cAAc,kBAAkB,6BAA6B,kCAAkC,6BAA6B,8BAA8B,wDAAwD,oBAAoB,wEAAwE,UAAU,iEAAiE,kCAAkC,gCAAgC,8EAA8E,0CAA0C,UAAU,kEAAkE,oBAAoB,UAAU,oBAAoB,6DAA6D,mBAAmB,2DAA2D,0DAA0D,wEAAwE,0CAA0C,gEAAgE,6BAA6B,uDAAuD,yBAAyB,wFAAwF,6CAA6C,uBAAuB,SAAS,0BAA0B,iCAAiC,gBAAgB,YAAY,WAAW,uBAAuB,gBAAgB,gCAAgC,gBAAgB,YAAY,YAAY,aAAa,eAAe,oCAAoC,mBAAmB,+BAA+B,qCAAqC,eAAe,SAAS,wDAAwD,sBAAsB,2CAA2C,iCAAiC,2CAA2C,0CAA0C,iCAAiC,kBAAkB,gEAAgE,sCAAsC,cAAc,oBAAoB,qCAAqC,YAAY,iDAAiD,YAAY,+CAA+C,uBAAuB,+BAA+B,kBAAkB,UAAU,UAAU,UAAU,kBAAkB,QAAQ,MAAM,oCAAoC,gDAAgD,6EAA6E,iCAAiC,WAAW,kBAAkB,QAAQ,UAAU,YAAY,aAAa,kBAAkB,mBAAmB,yCAAyC,sCAAsC,aAAa,cAAc,sDAAsD,eAAe,mCAAmC,iEAAiE,gEAAgE,wDAAwD,mBAAmB,kBAAkB,wBAAwB,+BAA+B,0CAA0C,gEAAgE,wDAAwD,8EAA8E,mBAAmB,iCAAiC,sDAAsD,wBAAwB,gCAAgC,kBAAkB,gCAAgC,SAAS,uBAAuB,aAAa,mBAAmB,uBAAuB,kDAAkD,UAAU,sBAAsB,sDAAsD,6CAA6C,gBAAgB,sBAAsB,oCAAoC,iDAAiD,UAAU,mCAAmC,uBAAuB,eAAe,0CAA0C,gBAAgB,oCAAoC,oLAAoL,8BAA8B,gRAAgR,gEAAgE,wDAAwD,qDAAqD,iBAAiB,mBAAmB,sBAAsB,yBAAyB,YAAY,iBAAiB,aAAa,+BAA+B,YAAY,WAAW,YAAY,yBAAyB,qCAAqC,kBAAkB,aAAa,qBAAqB,sDAAsD,6CAA6C,qCAAqC,2BAA2B,kBAAkB,gCAAgC,YAAY,aAAa,mBAAmB,kBAAkB,kBAAkB,0CAA0C,2BAA2B,YAAY,cAAc,sBAAsB,oBAAoB,mFAAmF,cAAc,4DAA4D,UAAU,mBAAmB,+GAA+G,mBAAmB,wDAAwD,mBAAmB,uDAAuD,uDAAuD,sDAAsD,aAAa,sDAAsD,cAAc,sDAAsD,4CAA4C,kDAAkD,qDAAqD,iDAAiD,qBAAqB,sEAAsE,6CAA6C,kEAAkE,wCAAwC,kDAAkD,eAAe,UAAU,iCAAiC,UAAU,qEAAqE,UAAU,iEAAiE,0BAA0B,6IAA6I,yBAAyB,2EAA2E,2BAA2B,yEAAyE,0BAA0B,+BAA+B,GAAG,UAAU,IAAI,WAAW,KAAK,WAAW,uBAAuB,GAAG,UAAU,IAAI,WAAW,KAAK,WAAW,eAAe,WAAW,kBAAkB,OAAO,0CAA0C,yCAAyC,mCAAmC,0CAA0C,mCAAmC,wBAAwB,gEAAgE,eAAe,0BAA0B,OAAO,MAAM,SAAS,QAAQ,wBAAwB,sCAAsC,qDAAqD,6CAA6C,yCAAyC,wCAAwC,+DAA+D,0BAA0B,iBAAiB,YAAY,MAAM,wBAAwB,WAAW,mBAAmB,sBAAsB,8DAA8D,0EAA0E,6BAA6B,2BAA2B,oCAAoC,uBAAuB,0CAA0C,mBAAmB,iFAAiF,8BAA8B,yEAAyE,2CAA2C,mBAAmB,+EAA+E,8BAA8B,uEAAuE,kEAAkE,mBAAmB,mCAAmC,8BAA8B,mCAAmC,0CAA0C,mBAAmB,mCAAmC,8BAA8B,oCAAoC,gDAAgD,aAAa,2BAA2B,oCAAoC,iCAAiC,gCAAgC,4BAA4B,iBAAiB,gBAAgB,yBAAyB,4BAA4B,yBAAyB,qCAAqC,sCAAsC,2BAA2B,uCAAuC,6BAA6B,MAAM,OAAO,SAAS,QAAQ,+BAA+B,2CAA2C,kCAAkC,yBAAyB,sBAAsB,iCAAiC,oBAAoB,iCAAiC,wBAAwB,2BAA2B,iCAAiC,aAAa,mBAAmB,uBAAuB,2CAA2C,iCAAiC,YAAY,UAAU,6CAA6C,oDAAoD,kDAAkD,UAAU,wEAAwE,mDAAmD,iDAAiD,UAAU,2CAA2C,6CAA6C,2BAA2B,mBAAmB,6BAA6B,0GAA0G,sGAAsG,mEAAmE,6BAA6B,wGAAwG,qGAAqG,6BAA6B,iBAAiB,2BAA2B,kBAAkB,WAAW,yEAAyE,uBAAuB,mCAAmC,YAAY,wBAAwB,gBAAgB,6BAA6B,qBAAqB,uBAAuB,gBAAgB,8BAA8B,gEAAgE,2CAA2C,kDAAkD,uCAAuC,0CAA0C,uBAAuB,iBAAiB,YAAY,gBAAgB,wBAAwB,oGAAoG,sBAAsB,oBAAoB,6BAA6B,sDAAsD,6DAA6D,wBAAwB,oCAAoC,aAAa,mBAAmB,sBAAsB,qDAAqD,yDAAyD,uBAAuB,mBAAmB,kCAAkC,iBAAiB,cAAc,kBAAkB,UAAU,2BAA2B,YAAY,kBAAkB,MAAM,QAAQ,SAAS,OAAO,sBAAsB,2CAA2C,sBAAsB,sBAAsB,sCAAsC,UAAU,oBAAoB,6BAA6B,sDAAsD,6DAA6D,kBAAkB,cAAc,WAAW,8BAA8B,uBAAuB,sBAAsB,sCAAsC,UAAU,kBAAkB,2BAA2B,UAAU,2BAA2B,cAAc,kBAAkB,uBAAuB,0CAA0C,2BAA2B,gBAAgB,mCAAmC,kBAAkB,2CAA2C,kBAAkB,MAAM,eAAe,uDAAuD,uCAAuC,UAAU,mBAAmB,sBAAsB,sCAAsC,0BAA0B,aAAa,wCAAwC,aAAa,8BAA8B,YAAY,sBAAsB,gBAAgB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,eAAe,aAAa,8BAA8B,mBAAmB,WAAW,2FAA2F,aAAa,8BAA8B,mBAAmB,wBAAwB,8CAA8C,cAAc,8CAA8C,WAAW,gCAAgC,gBAAgB,oCAAoC,YAAY,mBAAmB,0BAA0B,kDAAkD,mBAAmB,YAAY,WAAW,iBAAiB,qDAAqD,cAAc,WAAW,0CAA0C,qDAAqD,gBAAgB,iEAAiE,eAAe,0CAA0C,qDAAqD,YAAY,4DAA4D,UAAU,uDAAuD,kBAAkB,+CAA+C,qBAAqB,oBAAoB,sDAAsD,kBAAkB,cAAc,kBAAkB,WAAW,kBAAkB,mBAAmB,+BAA+B,MAAM,oFAAoF,sBAAsB,WAAW,aAAa,mFAAmF,UAAU,kFAAkF,UAAU,mBAAmB,yFAAyF,UAAU,gKAAgK,8BAA8B,4EAA4E,8CAA8C,oLAAoL,2BAA2B,sFAAsF,4CAA4C,cAAc,kCAAkC,6BAA6B,2BAA2B,UAAU,0CAA0C,cAAc,yBAAyB,0CAA0C,cAAc,gBAAgB,2CAA2C,cAAc,yBAAyB,2BAA2B,kBAAkB,YAAY,aAAa,WAAW,YAAY,UAAU,0BAA0B,qBAAqB,qCAAqC,cAAc,2BAA2B,qDAAqD,uDAAuD,wCAAwC,WAAW,gCAAgC,kBAAkB,aAAa,8BAA8B,mBAAmB,WAAW,kBAAkB,sBAAsB,sCAAsC,qBAAqB,uBAAuB,6BAA6B,2BAA2B,SAAS,WAAW,6CAA6C,yBAAyB,mBAAmB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,UAAU,UAAU,oBAAoB,oDAAoD,sDAAsD,8EAA8E,6BAA6B,qBAAqB,0BAA0B,oDAAoD,qBAAqB,YAAY,UAAU,oCAAoC,QAAQ,cAAc,iBAAiB,yCAAyC,QAAQ,oBAAoB,2CAA2C,QAAQ,6CAA6C,yBAAyB,6CAA6C,gDAAgD,gBAAgB,uCAAuC,SAAS,0BAA0B,cAAc,8BAA8B,4CAA4C,qBAAqB,iDAAiD,QAAQ,4DAA4D,gBAAgB,QAAQ,gCAAgC,sIAAsI,aAAa,oEAAoE,YAAY,iCAAiC,0CAA0C,uCAAuC,2CAA2C,mCAAmC,yBAAyB,8BAA8B,gCAAgC,2GAA2G,0BAA0B,+BAA+B,iCAAiC,+GAA+G,yBAAyB,qBAAqB,kCAAkC,+HAA+H,kBAAkB,cAAc,gDAAgD,eAAe,mBAAmB,UAAU,UAAU,6DAA6D,2BAA2B,gBAAgB,uBAAuB,yBAAyB,sCAAsC,aAAa,mBAAmB,uBAAuB,wCAAwC,eAAe,uFAAuF,kBAAkB,wEAAwE,uBAAuB,aAAa,mBAAmB,uBAAuB,uFAAuF,cAAc,kEAAkE,0BAA0B,2BAA2B,uCAAuC,2BAA2B,4EAA4E,iBAAiB,gBAAgB,SAAS,WAAW,8DAA8D,WAAW,YAAY,2BAA2B,iFAAiF,eAAe,wFAAwF,gBAAgB,sFAAsF,8CAA8C,oGAAoG,mBAAmB,YAAY,kBAAkB,kBAAkB,oBAAoB,qBAAqB,mBAAmB,8BAA8B,2CAA2C,kBAAkB,sFAAsF,mBAAmB,uBAAuB,gBAAgB,yBAAyB,aAAa,sBAAsB,uBAAuB,0FAA0F,mBAAmB,gBAAgB,+DAA+D,kBAAkB,mBAAmB,UAAU,oBAAoB,0FAA0F,mBAAmB,UAAU,oFAAoF,6FAA6F,yFAAyF,8DAA8D,cAAc,eAAe,yBAAyB,sCAAsC,mBAAmB,WAAW,kBAAkB,aAAa,mBAAmB,uBAAuB,UAAU,8DAA8D,+CAA+C,oEAAoE,0BAA0B,uIAAuI,wBAAwB,gFAAgF,+CAA+C,uFAAuF,6CAA6C,gCAAgC,uCAAuC,qLAAqL,mBAAmB,UAAU,2JAA2J,qDAAqD,mDAAmD,yKAAyK,6FAA6F,yFAAyF,6CAA6C,6BAA6B,8EAA8E,6CAA6C,6BAA6B,sDAAsD,qDAAqD,uDAAuD,oDAAoD,uCAAuC,SAAS,mBAAmB,cAAc,kBAAkB,gBAAgB,kBAAkB,sEAAsE,aAAa,mBAAmB,mDAAmD,kBAAkB,wBAAwB,cAAc,iBAAiB,cAAc,kCAAkC,6CAA6C,UAAU,yBAAyB,0BAA0B,+BAA+B,cAAc,2BAA2B,SAAS,gBAAgB,WAAW,cAAc,kBAAkB,+CAA+C,sDAAsD,oDAAoD,gCAAgC,2BAA2B,2EAA2E,qDAAqD,mDAAmD,oBAAoB,0CAA0C,2EAA2E,qBAAqB,0FAA0F,qDAAqD,mDAAmD,mDAAmD,qBAAqB,YAAY,cAAc,2CAA2C,oCAAoC,qDAAqD,mDAAmD,mFAAmF,qEAAqE,sCAAsC,sFAAsF,eAAe,UAAU,mBAAmB,6GAA6G,+EAA+E,uEAAuE,yFAAyF,2DAA2D,6CAA6C,uBAAuB,eAAe,WAAW,aAAa,sBAAsB,cAAc,gBAAgB,yBAAyB,mBAAmB,gBAAgB,0CAA0C,sDAAsD,oDAAoD,wBAAwB,sCAAsC,2BAA2B,2CAA2C,eAAe,8CAA8C,0CAA0C,eAAe,iBAAiB,sDAAsD,iBAAiB,0CAA0C,sDAAsD,iCAAiC,wDAAwD,gEAAgE,eAAe,2FAA2F,qEAAqE,2EAA2E,yEAAyE,gBAAgB,uCAAuC,0BAA0B,sDAAsD,mDAAmD,6EAA6E,qDAAqD,mDAAmD,6BAA6B,WAAW,2CAA2C,qDAAqD,eAAe,iBAAiB,eAAe,UAAU,kBAAkB,0BAA0B,gFAAgF,wEAAwE,oBAAoB,gBAAgB,eAAe,UAAU,kBAAkB,0HAA0H,0GAA0G,+BAA+B,eAAe,UAAU,mBAAmB,yHAAyH,yGAAyG,uBAAuB,kBAAkB,sBAAsB,sCAAsC,kBAAkB,cAAc,kCAAkC,iBAAiB,aAAa,mBAAmB,uBAAuB,gCAAgC,2DAA2D,UAAU,iBAAiB,8CAA8C,2BAA2B,8BAA8B,kBAAkB,aAAa,eAAe,6DAA6D,yBAAyB,8CAA8C,0CAA0C,8BAA8B,aAAa,gBAAgB,0CAA0C,mBAAmB,+DAA+D,wBAAwB,mGAAmG,sDAAsD,oDAAoD,+FAA+F,2BAA2B,gDAAgD,gDAAgD,yDAAyD,2CAA2C,2BAA2B,oEAAoE,QAAQ,wBAAwB,oCAAoC,sCAAsC,iJAAiJ,4BAA4B,8BAA8B,WAAW,UAAU,2CAA2C,2CAA2C,4CAA4C,kBAAkB,0BAA0B,eAAe,YAAY,kBAAkB,wEAAwE,uGAAuG,MAAM,QAAQ,OAAO,4CAA4C,oBAAoB,iCAAiC,2DAA2D,mCAAmC,+DAA+D,qDAAqD,kBAAkB,UAAU,4EAA4E,4DAA4D,mFAAmF,gBAAgB,0CAA0C,qBAAqB,aAAa,kEAAkE,cAAc,0CAA0C,gDAAgD,aAAa,qCAAqC,uBAAuB,2CAA2C,wCAAwC,sDAAsD,oDAAoD,mEAAmE,kEAAkE,qDAAqD,mDAAmD,+DAA+D,iBAAiB,8BAA8B,kBAAkB,oBAAoB,eAAe,mBAAmB,8BAA8B,aAAa,mBAAmB,+BAA+B,uBAAuB,kCAAkC,mBAAmB,uBAAuB,gBAAgB,mBAAmB,+BAA+B,0BAA0B,eAAe,mCAAmC,qBAAqB,sCAAsC,4CAA4C,0CAA0C,mCAAmC,qCAAqC,2CAA2C,UAAU,0CAA0C,yBAAyB,eAAe,mBAAmB,cAAc,gBAAgB,kBAAkB,0CAA0C,0CAA0C,mBAAmB,mBAAmB,2CAA2C,8CAA8C,uEAAuE,6BAA6B,aAAa,mBAAmB,8BAA8B,cAAc,kBAAkB,cAAc,eAAe,oBAAoB,aAAa,mBAAmB,cAAc,2CAA2C,oBAAoB,sDAAsD,oDAAoD,+CAA+C,kEAAkE,qDAAqD,mDAAmD,2CAA2C,iBAAiB,0CAA0C,oDAAoD,cAAc,mBAAmB,WAAW,eAAe,gBAAgB,kBAAkB,mBAAmB,mBAAmB,gDAAgD,aAAa,iBAAiB,cAAc,sBAAsB,eAAe,gBAAgB,gBAAgB,aAAa,mBAAmB,uBAAuB,cAAc,wBAAwB,kBAAkB,cAAc,kCAAkC,gCAAgC,cAAc,2BAA2B,oBAAoB,8BAA8B,sCAAsC,aAAa,4CAA4C,qBAAqB,uCAAuC,kBAAkB,uBAAuB,uBAAuB,4CAA4C,2BAA2B,kBAAkB,oBAAoB,yCAAyC,QAAQ,SAAS,WAAW,UAAU,0BAA0B,2CAA2C,2BAA2B,0CAA0C,uBAAuB,QAAQ,iCAAiC,cAAc,aAAa,cAAc,UAAU,cAAc,mCAAmC,gBAAgB,oCAAoC,mBAAmB,0CAA0C,+GAA+G,WAAW,6DAA6D,cAAc,0CAA0C,mGAAmG,cAAc,oEAAoE,cAAc,qCAAqC,cAAc,YAAY,kBAAkB,aAAa,mBAAmB,4BAA4B,qBAAqB,oCAAoC,mBAAmB,6CAA6C,gBAAgB,oCAAoC,oBAAoB,mBAAmB,uBAAuB,gBAAgB,2CAA2C,oBAAoB,sDAAsD,oDAAoD,+CAA+C,mEAAmE,qDAAqD,mDAAmD,2CAA2C,iBAAiB,2CAA2C,oBAAoB,+CAA+C,mBAAmB,aAAa,yBAAyB,2CAA2C,mBAAmB,sDAAsD,oDAAoD,8CAA8C,kEAAkE,qDAAqD,mDAAmD,0CAA0C,iBAAiB,mBAAmB,kBAAkB,MAAM,QAAQ,iBAAiB,OAAO,WAAW,uBAAuB,mDAAmD,6BAA6B,oBAAoB,2CAA2C,mBAAmB,sDAAsD,oDAAoD,8CAA8C,qDAAqD,mDAAmD,0CAA0C,iBAAiB,0BAA0B,WAAW,YAAY,kCAAkC,GAAG,UAAU,IAAI,UAAU,GAAG,WAAW,0BAA0B,GAAG,UAAU,IAAI,UAAU,GAAG,WAAW,oBAAoB,kBAAkB,0CAA0C,cAAc,MAAM,QAAQ,kBAAkB,UAAU,qBAAqB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,aAAa,eAAe,2BAA2B,wBAAwB,+CAA+C,sDAAsD,oDAAoD,sDAAsD,eAAe,wCAAwC,gBAAgB,yCAAyC,kBAAkB,QAAQ,oCAAoC,0CAA0C,2BAA2B,WAAW,kBAAkB,sDAAsD,oDAAoD,UAAU,aAAa,mBAAmB,uBAAuB,sCAAsC,kBAAkB,6DAA6D,8BAA8B,6EAA6E,qCAAqC,iEAAiE,mBAAmB,oCAAoC,qEAAqE,kBAAkB,UAAU,cAAc,iBAAiB,YAAY,WAAW,6BAA6B,sDAAsD,oDAAoD,0DAA0D,2CAA2C,mCAAmC,0CAA0C,wBAAwB,iBAAiB,+BAA+B,0BAA0B,YAAY,qBAAqB,iBAAiB,kBAAkB,kBAAkB,cAAc,2BAA2B,gBAAgB,gBAAgB,oCAAoC,eAAe,sBAAsB,sCAAsC,UAAU,kBAAkB,uFAAuF,0BAA0B,0BAA0B,sDAAsD,oDAAoD,uDAAuD,sDAAsD,8CAA8C,iEAAiE,gEAAgE,wDAAwD,6BAA6B,WAAW,cAAc,yEAAyE,aAAa,2CAA2C,UAAU,0DAA0D,2BAA2B,wBAAwB,UAAU,kBAAkB,OAAO,aAAa,SAAS,6CAA6C,kBAAkB,kDAAkD,iDAAiD,yBAAyB,+CAA+C,gDAAgD,iBAAiB,gCAAgC,gBAAgB,8CAA8C,0CAA0C,8NAA8N,+BAA+B,sGAAsG,oBAAoB,gBAAgB,eAAe,eAAe,mBAAmB,0CAA0C,kBAAkB,aAAa,8BAA8B,UAAU,yBAAyB,sBAAsB,qBAAqB,iBAAiB,sBAAsB,iDAAiD,uCAAuC,gBAAgB,mLAAmL,yBAAyB,sBAAsB,qBAAqB,iBAAiB,uBAAuB,iBAAiB,mCAAmC,kBAAkB,oBAAoB,iBAAiB,kBAAkB,gBAAgB,0BAA0B,UAAU,sBAAsB,sCAAsC,eAAe,UAAU,qBAAqB,aAAa,mBAAmB,uBAAuB,2CAA2C,kCAAkC,8CAA8C,qGAAqG,uFAAuF,kDAAkD,mBAAmB,UAAU,+BAA+B,eAAe,gBAAgB,kBAAkB,gBAAgB,gBAAgB,0CAA0C,gCAAgC,cAAc,eAAe,gBAAgB,gBAAgB,gBAAgB,WAAW,sBAAsB,UAAU,4BAA4B,eAAe,oBAAoB,6CAA6C,aAAa,uCAAuC,gBAAgB,0BAA0B,eAAe,4EAA4E,eAAe,sGAAsG,eAAe,mBAAmB,gDAAgD,kBAAkB,kDAAkD,aAAa,wBAAwB,kBAAkB,MAAM,SAAS,2BAA2B,qBAAqB,2BAA2B,8BAA8B,sBAAsB,kBAAkB,oCAAoC,0CAA0C,SAAS,eAAe,wCAAwC,gBAAgB,yCAAyC,iBAAiB,mBAAmB,aAAa,uBAAuB,WAAW,8BAA8B,kBAAkB,gDAAgD,8CAA8C,eAAe,oCAAoC,UAAU,2DAA2D,mCAAmC,oBAAoB,kBAAkB,yBAAyB,sCAAsC,YAAY,wBAAwB,WAAW,qGAAqG,UAAU,iBAAiB,kBAAkB,sBAAsB,qBAAqB,4BAA4B,gBAAgB,2EAA2E,gBAAgB,6BAA6B,aAAa,wEAAwE,aAAa,iHAAiH,gBAAgB,iEAAiE,aAAa,4DAA4D,0BAA0B,uBAAuB,kBAAkB,sCAAsC,eAAe,8CAA8C,gBAAgB,uCAAuC,2BAA2B,eAAe,0BAA0B,gBAAgB,0CAA0C,0BAA0B,mBAAmB,8BAA8B,aAAa,sBAAsB,+CAA+C,QAAQ,yBAAyB,aAAa,kBAAkB,YAAY,WAAW,sBAAsB,mBAAmB,kBAAkB,kBAAkB,YAAY,kCAAkC,cAAc,4CAA4C,kBAAkB,sBAAsB,0CAA0C,uCAAuC,kCAAkC,uDAAuD,YAAY,WAAW,oEAAoE,YAAY,yBAAyB,sBAAsB,qBAAqB,iBAAiB,yCAAyC,qBAAqB,6BAA6B,eAAe,uCAAuC,YAAY,WAAW,6BAA6B,eAAe,uCAAuC,YAAY,WAAW,6BAA6B,eAAe,uCAAuC,YAAY,WAAW,mCAAmC,2BAA2B,gBAAgB,uBAAuB,sBAAsB,mBAAmB,6CAA6C,gDAAgD,8CAA8C,gFAAgF,sBAAsB,kEAAkE,6BAA6B,iBAAiB,mBAAmB,4BAA4B,kBAAkB,gBAAgB,UAAU,0BAA0B,2BAA2B,6CAA6C,4BAA4B,8CAA8C,uBAAuB,yCAAyC,wBAAwB,0CAA0C,sDAAsD,kBAAkB,oBAAoB,2CAA2C,4BAA4B,6BAA6B,oCAAoC,YAAY,oBAAoB,eAAe,sBAAsB,gBAAgB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,aAAa,uBAAuB,kBAAkB,eAAe,kDAAkD,eAAe,8BAA8B,kBAAkB,OAAO,MAAM,YAAY,WAAW,eAAe,aAAa,uBAAuB,mBAAmB,mCAAmC,oCAAoC,gDAAgD,eAAe,WAAW,kBAAkB,+FAA+F,aAAa,kCAAkC,kBAAkB,cAAc,UAAU,gCAAgC,wCAAwC,2CAA2C,WAAW,mDAAmD,qEAAqE,6DAA6D,6BAA6B,UAAU,kCAAkC,2BAA2B,4BAA4B,0BAA0B,uBAAuB,kBAAkB,sCAAsC,oBAAoB,iBAAiB,WAAW,YAAY,4FAA4F,sBAAsB,6BAA6B,2BAA2B,gBAAgB,oBAAoB,sDAAsD,oDAAoD,eAAe,eAAe,kBAAkB,gBAAgB,2CAA2C,2BAA2B,kDAAkD,sBAAsB,0BAA0B,sBAAsB,iDAAiD,2BAA2B,4CAA4C,uBAAuB,UAAU,YAAY,UAAU,gCAAgC,gBAAgB,kDAAkD,mBAAmB,0CAA0C,0DAA0D,wDAAwD,4DAA4D,qGAAqG,iGAAiG,gDAAgD,yDAAyD,uDAAuD,kEAAkE,mGAAmG,+FAA+F,0BAA0B,kHAAkH,gBAAgB,6DAA6D,0BAA0B,cAAc,SAAS,iBAAiB,uBAAuB,mBAAmB,eAAe,qCAAqC,cAAc,sCAAsC,eAAe,uCAAuC,kBAAkB,QAAQ,2BAA2B,oEAAoE,sBAAsB,kCAAkC,uCAAuC,+DAA+D,kBAAkB,uFAAuF,gBAAgB,oCAAoC,0BAA0B,uEAAuE,gCAAgC,sEAAsE,WAAW,qGAAqG,iBAAiB,oDAAoD,oBAAoB,kBAAkB,sBAAsB,uBAAuB,6EAA6E,sBAAsB,4FAA4F,6CAA6C,UAAU,oBAAoB,0GAA0G,+BAA+B,sFAAsF,gBAAgB,4GAA4G,6BAA6B,yEAAyE,6BAA6B,kBAAkB,YAAY,aAAa,eAAe,oBAAoB,wBAAwB,yCAAyC,aAAa,aAAa,mBAAmB,eAAe,gBAAgB,mBAAmB,+BAA+B,mBAAmB,cAAc,sBAAsB,2BAA2B,4BAA4B,kBAAkB,gBAAgB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,eAAe,kBAAkB,0BAA0B,uBAAuB,kBAAkB,sDAAsD,eAAe,0CAA0C,aAAa,qDAAqD,kBAAkB,wFAAwF,kBAAkB,qBAAqB,qBAAqB,sCAAsC,eAAe,kEAAkE,2BAA2B,8CAA8C,yCAAyC,kDAAkD,2BAA2B,qBAAqB,+FAA+F,0BAA0B,mBAAmB,sBAAsB,eAAe,oBAAoB,eAAe,gBAAgB,WAAW,aAAa,yBAAyB,WAAW,eAAe,qBAAqB,sBAAsB,2BAA2B,cAAc,cAAc,sBAAsB,yBAAyB,sCAAsC,gCAAgC,YAAY,eAAe,2BAA2B,8CAA8C,wCAAwC,0BAA0B,uBAAuB,kBAAkB,2CAA2C,kBAAkB,8CAA8C,SAAS,WAAW,YAAY,YAAY,oBAAoB,oBAAoB,sCAAsC,0BAA0B,2BAA2B,SAAS,eAAe,eAAe,gCAAgC,eAAe,qBAAqB,gBAAgB,WAAW,qBAAqB,YAAY,uBAAuB,kBAAkB,+BAA+B,YAAY,gBAAgB,mBAAmB,uBAAuB,gBAAgB,wBAAwB,gBAAgB,yGAAyG,yBAAyB,2DAA2D,mDAAmD,aAAa,mBAAmB,kBAAkB,MAAM,gBAAgB,sDAAsD,oDAAoD,mBAAmB,gBAAgB,0CAA0C,mDAAmD,4CAA4C,yBAAyB,sBAAsB,yBAAyB,mBAAmB,+BAA+B,qCAAqC,2BAA2B,0BAA0B,YAAY,gBAAgB,0CAA0C,0BAA0B,yBAAyB,kCAAkC,aAAa,kBAAkB,0BAA0B,+FAA+F,sBAAsB,iCAAiC,gBAAgB,+FAA+F,yBAAyB,0BAA0B,iBAAiB,eAAe,oCAAoC,gCAAgC,eAAe,WAAW,gCAAgC,mBAAmB,+BAA+B,sBAAsB,qBAAqB,kBAAkB,4BAA4B,gBAAgB,0CAA0C,iCAAiC,sBAAsB,4BAA4B,gBAAgB,oCAAoC,0BAA0B,YAAY,0CAA0C,eAAe,gBAAgB,wBAAwB,8BAA8B,eAAe,gBAAgB,+BAA+B,iBAAiB,+BAA+B,YAAY,sCAAsC,0CAA0C,+BAA+B,YAAY,uCAAuC,iDAAiD,8BAA8B,2BAA2B,sBAAsB,8DAA8D,uBAAuB,+DAA+D,gBAAgB,iBAAiB,0CAA0C,aAAa,cAAc,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,iDAAiD,WAAW,kDAAkD,kBAAkB,eAAe,aAAa,sBAAsB,+CAA+C,eAAe,gBAAgB,oCAAoC,iDAAiD,eAAe,gBAAgB,8BAA8B,gBAAgB,kCAAkC,2BAA2B,4CAA4C,sBAAsB,YAAY,0CAA0C,4CAA4C,qBAAqB,YAAY,2DAA2D,iBAAiB,oFAAoF,wBAAwB,iDAAiD,gBAAgB,eAAe,gBAAgB,uBAAuB,aAAa,eAAe,kBAAkB,uBAAuB,aAAa,sBAAsB,uBAAuB,kBAAkB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,oBAAoB,kBAAkB,cAAc,iBAAiB,mBAAmB,gBAAgB,oCAAoC,sBAAsB,2BAA2B,8CAA8C,cAAc,kCAAkC,aAAa,mBAAmB,oBAAoB,uBAAuB,yCAAyC,kDAAkD,uCAAuC,sBAAsB,6BAA6B,YAAY,qBAAqB,yBAAyB,eAAe,uCAAuC,cAAc,0BAA0B,yCAAyC,cAAc,uCAAuC,0BAA0B,aAAa,8BAA8B,4CAA4C,kBAAkB,iFAAiF,wBAAwB,uCAAuC,qBAAqB,sBAAsB,kDAAkD,kBAAkB,sBAAsB,sEAAsE,kBAAkB,MAAM,SAAS,WAAW,YAAY,WAAW,iLAAiL,YAAY,kBAAkB,MAAM,QAAQ,SAAS,OAAO,iCAAiC,sBAAsB,qFAAqF,sDAAsD,oDAAoD,yOAAyO,2CAA2C,mCAAmC,kFAAkF,sDAAsD,oDAAoD,mOAAmO,sDAAsD,8CAA8C,uPAAuP,gEAAgE,wDAAwD,0EAA0E,qBAAqB,uBAAuB,UAAU,SAAS,gBAAgB,kBAAkB,iGAAiG,oEAAoE,0CAA0C,0EAA0E,kBAAkB,iFAAiF,sBAAsB,YAAY,kBAAkB,kDAAkD,mDAAmD,uBAAuB,sBAAsB,yBAAyB,wCAAwC,sBAAsB,oFAAoF,cAAc,kFAAkF,kBAAkB,+BAA+B,gCAAgC,mFAAmF,iBAAiB,iFAAiF,qBAAqB,kCAAkC,mCAAmC,mGAAmG,aAAa,iGAAiG,gBAAgB,wCAAwC,uBAAuB,0CAA0C,wCAAwC,wBAAwB,gDAAgD,sBAAsB,iDAAiD,qBAAqB,sDAAsD,qBAAqB,sBAAsB,yGAAyG,kBAAkB,QAAQ,SAAS,oDAAoD,gBAAgB,kCAAkC,kBAAkB,gBAAgB,eAAe,qBAAqB,oCAAoC,gDAAgD,mBAAmB,UAAU,wCAAwC,cAAc,aAAa,mBAAmB,UAAU,SAAS,mBAAmB,YAAY,+CAA+C,YAAY,aAAa,WAAW,eAAe,qDAAqD,WAAW,6DAA6D,YAAY,2IAA2I,SAAS,0DAA0D,8BAA8B,2BAA2B,sBAAsB,yCAAyC,gDAAgD,0CAA0C,eAAe,iCAAiC,4BAA4B,6BAA6B,cAAc,kBAAkB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,cAAc,sBAAsB,oBAAoB,oBAAoB,UAAU,YAAY,cAAc,YAAY,eAAe,gBAAgB,mBAAmB,qBAAqB,mBAAmB,oBAAoB,qCAAqC,gBAAgB,uBAAuB,iBAAiB,kBAAkB,qBAAqB,mBAAmB,kBAAkB,SAAS,QAAQ,aAAa,mBAAmB,cAAc,gBAAgB,mBAAmB,YAAY,mBAAmB,gCAAgC,qBAAqB,sBAAsB,WAAW,wCAAwC,oBAAoB,oBAAoB,kBAAkB,QAAQ,SAAS,mBAAmB,oCAAoC,gDAAgD,wBAAwB,UAAU,eAAe,WAAW,aAAa,mBAAmB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,gBAAgB,cAAc,uCAAuC,YAAY,oBAAoB,kBAAkB,WAAW,YAAY,eAAe,SAAS,oBAAoB,0BAA0B,oBAAoB,oCAAoC,gDAAgD,WAAW,kBAAkB,mBAAmB,aAAa,mBAAmB,uBAAuB,UAAU,6BAA6B,UAAU,wCAAwC,aAAa,cAAc,yBAAyB,sBAAsB,qBAAqB,iBAAiB,oBAAoB,eAAe,cAAc,mCAAmC,2BAA2B,+CAA+C,cAAc,2BAA2B,kBAAkB,oBAAoB,eAAe,gBAAgB,uBAAuB,0BAA0B,qBAAqB,sBAAsB,gBAAgB,oGAAoG,mBAAmB,wHAAwH,gBAAgB,2FAA2F,sBAAsB,iEAAiE,gBAAgB,yJAAyJ,eAAe,qBAAqB,aAAa,iDAAiD,kBAAkB,WAAW,YAAY,WAAW,cAAc,UAAU,qCAAqC,0BAA0B,0JAA0J,aAAa,oEAAoE,aAAa,mEAAmE,iBAAiB,yBAAyB,eAAe,sBAAsB,2CAA2C,mBAAmB,iBAAiB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,mCAAmC,0CAA0C,4CAA4C,qBAAqB,WAAW,YAAY,kBAAkB,MAAM,OAAO,gBAAgB,sBAAsB,eAAe,wBAAwB,sBAAsB,WAAW,gBAAgB,YAAY,gBAAgB,YAAY,mBAAmB,YAAY,wBAAwB,6BAA6B,iBAAiB,mBAAmB,wBAAwB,iBAAiB,kCAAkC,8CAA8C,kBAAkB,aAAa,mBAAmB,gBAAgB,kCAAkC,mCAAmC,cAAc,2BAA2B,gBAAgB,4EAA4E,iBAAiB,wCAAwC,oBAAoB,qBAAqB,6BAA6B,gBAAgB,oCAAoC,mBAAmB,kBAAkB,aAAa,mBAAmB,cAAc,2BAA2B,qBAAqB,gCAAgC,yBAAyB,mBAAmB,oCAAoC,kBAAkB,eAAe,6DAA6D,YAAY,yBAAyB,sCAAsC,YAAY,aAAa,mBAAmB,kBAAkB,uCAAuC,aAAa,wDAAwD,cAAc,2BAA2B,8DAA8D,0FAA0F,8CAA8C,4HAA4H,wCAAwC,wCAAwC,0BAA0B,sBAAsB,uBAAuB,UAAU,aAAa,eAAe,sDAAsD,qBAAqB,wBAAwB,iCAAiC,wBAAwB,UAAU,aAAa,sBAAsB,+CAA+C,+FAA+F,2FAA2F,mDAAmD,6FAA6F,yFAAyF,kCAAkC,6CAA6C,UAAU,0CAA0C,8CAA8C,eAAe,0CAA0C,wBAAwB,iCAAiC,wDAAwD,qCAAqC,kBAAkB,kBAAkB,SAAS,eAAe,2DAA2D,2BAA2B,wBAAwB,sDAAsD,oDAAoD,kFAAkF,gBAAgB,2EAA2E,iCAAiC,qDAAqD,mDAAmD,gBAAgB,kBAAkB,uBAAuB,kBAAkB,cAAc,gCAAgC,6BAA6B,sBAAsB,wCAAwC,eAAe,eAAe,6BAA6B,WAAW,sDAAsD,oDAAoD,mBAAmB,0BAA0B,oBAAoB,sBAAsB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,aAAa,mBAAmB,uBAAuB,kBAAkB,sBAAsB,+BAA+B,kBAAkB,+BAA+B,WAAW,yIAAyI,0BAA0B,eAAe,yCAAyC,eAAe,uCAAuC,kBAAkB,gFAAgF,gCAAgC,8FAA8F,4BAA4B,wHAAwH,4BAA4B,uDAAuD,mBAAmB,oIAAoI,+BAA+B,+DAA+D,uBAAuB,0CAA0C,+DAA+D,uBAAuB,8DAA8D,cAAc,2BAA2B,oBAAoB,iBAAiB,kBAAkB,2BAA2B,cAAc,kCAAkC,kBAAkB,yEAAyE,4BAA4B,sFAAsF,iBAAiB,sFAAsF,yBAAyB,6CAA6C,qCAAqC,cAAc,kCAAkC,eAAe,2BAA2B,gEAAgE,4EAA4E,0EAA0E,4CAA4C,0DAA0D,oFAAoF,+BAA+B,iBAAiB,kFAAkF,gCAAgC,qCAAqC,cAAc,uCAAuC,2CAA2C,uCAAuC,4EAA4E,iDAAiD,wFAAwF,kEAAkE,iCAAiC,yFAAyF,6FAA6F,yFAAyF,4EAA4E,8CAA8C,gGAAgG,6BAA6B,0HAA0H,6BAA6B,wDAAwD,aAAa,qCAAqC,sIAAsI,gCAAgC,iEAAiE,wBAAwB,mCAAmC,QAAQ,8CAA8C,yBAAyB,kDAAkD,sFAAsF,cAAc,uCAAuC,6BAA6B,yBAAyB,kDAAkD,oCAAoC,cAAc,uCAAuC,qBAAqB,kBAAkB,iBAAiB,4BAA4B,cAAc,sCAAsC,WAAW,6DAA6D,eAAe,gBAAgB,iBAAiB,cAAc,uCAAuC,+BAA+B,cAAc,uCAAuC,6EAA6E,YAAY,6EAA6E,YAAY,mFAAmF,YAAY,mCAAmC,sBAAsB,iDAAiD,wBAAwB,mDAAmD,oCAAoC,aAAa,sCAAsC,2CAA2C,wBAAwB,iDAAiD,0DAA0D,cAAc,sCAAsC,uHAAuH,yBAAyB,kDAAkD,qCAAqC,aAAa,qCAAqC,aAAa,sCAAsC,kDAAkD,yBAAyB,kDAAkD,mCAAmC,sBAAsB,4DAA4D,0EAA0E,6BAA6B,uFAAuF,kBAAkB,iDAAiD,yBAAyB,gDAAgD,oBAAoB,2DAA2D,eAAe,0DAA0D,gDAAgD,iEAAiE,iBAAiB,kGAAkG,cAAc,sCAAsC,4CAA4C,yBAAyB,qFAAqF,cAAc,uCAAuC,2CAA2C,eAAe,wCAAwC,kDAAkD,yBAAyB,kDAAkD,cAAc,0CAA0C,6EAA6E,yBAAyB,kDAAkD,YAAY,uFAAuF,cAAc,uCAAuC,2DAA2D,gDAAgD,mDAAmD,eAAe,wCAAwC,8CAA8C,yBAAyB,kDAAkD,2DAA2D,YAAY,uCAAuC,oBAAoB,qCAAqC,0CAA0C,yFAAyF,yBAAyB,kDAAkD,2CAA2C,yCAAyC,qCAAqC,WAAW,mCAAmC,yCAAyC,mDAAmD,yBAAyB,iFAAiF,sBAAsB,iDAAiD,wFAAwF,kDAAkD,sGAAsG,kBAAkB,6CAA6C,uDAAuD,sBAAsB,iDAAiD,sCAAsC,WAAW,mBAAmB,cAAc,WAAW,kBAAkB,oBAAoB,gBAAgB,kBAAkB,aAAa,6BAA6B,+BAA+B,gCAAgC,qBAAqB,mBAAmB,kBAAkB,UAAU,kBAAkB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,sBAAsB,aAAa,YAAY,WAAW,eAAe,kBAAkB,gBAAgB,gDAAgD,8CAA8C,gCAAgC,gCAAgC,2BAA2B,YAAY,cAAc,kBAAkB,MAAM,QAAQ,SAAS,OAAO,sBAAsB,UAAU,WAAW,sBAAsB,kDAAkD,6BAA6B,+FAA+F,aAAa,2BAA2B,0CAA0C,qBAAqB,qEAAqE,kBAAkB,cAAc,YAAY,cAAc,oCAAoC,YAAY,yBAAyB,6CAA6C,YAAY,uBAAuB,kBAAkB,YAAY,cAAc,cAAc,iCAAiC,kBAAkB,QAAQ,2BAA2B,YAAY,cAAc,kBAAkB,mBAAmB,gCAAgC,4BAA4B,uBAAuB,iBAAiB,qBAAqB,gBAAgB,qEAAqE,kBAAkB,OAAO,QAAQ,YAAY,cAAc,UAAU,0BAA0B,UAAU,mHAAmH,mCAAmC,mCAAmC,MAAM,8CAA8C,8DAA8D,kCAAkC,SAAS,8CAA8C,8DAA8D,0FAA0F,UAAU,+BAA+B,cAAc,2BAA2B,kBAAkB,sCAAsC,kBAAkB,YAAY,OAAO,MAAM,QAAQ,SAAS,cAAc,mBAAmB,gCAAgC,WAAW,4BAA4B,oBAAoB,iBAAiB,qBAAqB,sBAAsB,4BAA4B,kBAAkB,OAAO,MAAM,UAAU,wBAAwB,kBAAkB,qHAAqH,sBAAsB,sCAAsC,wBAAwB,eAAe,qBAAqB,sBAAsB,uBAAuB,uBAAuB,eAAe,aAAa,mBAAmB,gBAAgB,kBAAkB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,uCAAuC,YAAY,cAAc,gBAAgB,oBAAoB,kBAAkB,kBAAkB,mCAAmC,cAAc,2BAA2B,4EAA4E,eAAe,8BAA8B,iBAAiB,kCAAkC,mBAAmB,uBAAuB,gBAAgB,mCAAmC,uBAAuB,sBAAsB,gBAAgB,kBAAkB,OAAO,YAAY,qDAAqD,kBAAkB,2CAA2C,oBAAoB,iBAAiB,WAAW,YAAY,2BAA2B,kBAAkB,cAAc,kCAAkC,2CAA2C,YAAY,WAAW,mBAAmB,+BAA+B,oBAAoB,cAAc,YAAY,kBAAkB,cAAc,mBAAmB,gCAAgC,eAAe,oBAAoB,aAAa,qBAAqB,cAAc,2BAA2B,aAAa,kBAAkB,mBAAmB,gBAAgB,oCAAoC,kBAAkB,4BAA4B,aAAa,8BAA8B,mBAAmB,cAAc,iBAAiB,eAAe,8BAA8B,6BAA6B,yBAAyB,QAAQ,OAAO,SAAS,WAAW,+BAA+B,mCAAmC,iCAAiC,iDAAiD,wDAAwD,QAAQ,eAAe,YAAY,gBAAgB,UAAU,eAAe,0CAA0C,wDAAwD,iBAAiB,wDAAwD,mBAAmB,2CAA2C,mFAAmF,yCAAyC,qCAAqC,YAAY,6BAA6B,yCAAyC,gCAAgC,4CAA4C,kBAAkB,MAAM,QAAQ,SAAS,OAAO,0BAA0B,cAAc,gBAAgB,kBAAkB,oBAAoB,4BAA4B,iBAAiB,aAAa,uBAAuB,cAAc,0BAA0B,aAAa,cAAc,gBAAgB,mBAAmB,eAAe,qBAAqB,QAAQ,gCAAgC,cAAc,aAAa,mBAAmB,kBAAkB,gBAAgB,aAAa,WAAW,wBAAwB,4BAA4B,gCAAgC,WAAW,YAAY,kBAAkB,qBAAqB,uDAAuD,qCAAqC,0CAA0C,+CAA+C,wBAAwB,iGAAiG,8BAA8B,+DAA+D,mBAAmB,0CAA0C,gBAAgB,kCAAkC,kBAAkB,kEAAkE,aAAa,wDAAwD,aAAa,oBAAoB,QAAQ,iGAAiG,2BAA2B,4BAA4B,iDAAiD,sCAAsC,aAAa,sDAAsD,kBAAkB,sDAAsD,eAAe,+FAA+F,kBAAkB,+BAA+B,mCAAmC,iBAAiB,6IAA6I,qCAAqC,0CAA0C,sBAAsB,qBAAqB,qBAAqB,6CAA6C,eAAe,8BAA8B,iBAAiB,gBAAgB,mBAAmB,uBAAuB,kCAAkC,6DAA6D,uEAAuE,yDAAyD,gBAAgB,yCAAyC,YAAY,0DAA0D,sBAAsB,UAAU,oCAAoC,mBAAmB,sCAAsC,mBAAmB,iFAAiF,aAAa,8CAA8C,aAAa,kEAAkE,aAAa,0DAA0D,aAAa,sDAAsD,aAAa,wBAAwB,QAAQ,8DAA8D,wBAAwB,cAAc,0BAA0B,0BAA0B,+CAA+C,gCAAgC,sBAAsB,gBAAgB,kBAAkB,wCAAwC,4BAA4B,kDAAkD,yBAAyB,yBAAyB,YAAY,mCAAmC,YAAY,oBAAoB,gBAAgB,oCAAoC,uBAAuB,cAAc,kCAAkC,2CAA2C,eAAe,8BAA8B,iBAAiB,kCAAkC,WAAW,eAAe,mBAAmB,uBAAuB,gBAAgB,sBAAsB,mBAAmB,uBAAuB,mBAAmB,iCAAiC,sBAAsB,kBAAkB,QAAQ,SAAS,OAAO,kDAAkD,8EAA8E,6BAA6B,2CAA2C,uBAAuB,sDAAsD,oDAAoD,kDAAkD,qDAAqD,mDAAmD,8CAA8C,iBAAiB,qDAAqD,mCAAmC,0CAA0C,UAAU,uFAAuF,gBAAgB,oDAAoD,wBAAwB,4CAA4C,UAAU,+BAA+B,kBAAkB,aAAa,QAAQ,SAAS,OAAO,gBAAgB,qBAAqB,mBAAmB,kBAAkB,aAAa,cAAc,mCAAmC,aAAa,4BAA4B,kBAAkB,SAAS,OAAO,QAAQ,aAAa,YAAY,0CAA0C,aAAa,eAAe,8CAA8C,kBAAkB,SAAS,WAAW,oBAAoB,mBAAmB,yBAAyB,mBAAmB,sBAAsB,sCAAsC,2CAA2C,UAAU,kBAAkB,qDAAqD,qEAAqE,2BAA2B,yGAAyG,UAAU,mBAAmB,oDAAoD,gBAAgB,gBAAgB,gCAAgC,mBAAmB,wBAAwB,UAAU,mIAAmI,2GAA2G,eAAe,MAAM,QAAQ,SAAS,OAAO,YAAY,YAAY,gBAAgB,UAAU,aAAa,2BAA2B,uCAAuC,gBAAgB,wBAAwB,kBAAkB,OAAO,MAAM,aAAa,mBAAmB,2BAA2B,YAAY,YAAY,wBAAwB,qDAAqD,6CAA6C,eAAe,+CAA+C,gBAAgB,sBAAsB,aAAa,mBAAmB,8BAA8B,YAAY,cAAc,eAAe,kCAAkC,YAAY,iCAAiC,YAAY,2DAA2D,gBAAgB,0BAA0B,UAAU,YAAY,yBAAyB,qCAAqC,0BAA0B,6BAA6B,WAAW,YAAY,UAAU,iCAAiC,sBAAsB,oCAAoC,iDAAiD,iCAAiC,oBAAoB,2BAA2B,UAAU,wBAAwB,YAAY,gDAAgD,6BAA6B,2BAA2B,cAAc,2BAA2B,eAAe,qCAAqC,aAAa,mBAAmB,UAAU,mDAAmD,2CAA2C,oBAAoB,4DAA4D,gBAAgB,6BAA6B,cAAc,uBAAuB,eAAe,2EAA2E,UAAU,mBAAmB,6BAA6B,kBAAkB,oBAAoB,gBAAgB,mCAAmC,iBAAiB,0BAA0B,eAAe,mCAAmC,mIAAmI,gBAAgB,cAAc,YAAY,4BAA4B,0BAA0B,kBAAkB,WAAW,4BAA4B,cAAc,mBAAmB,qEAAqE,qBAAqB,YAAY,eAAe,yHAAyH,gBAAgB,kCAAkC,oCAAoC,iDAAiD,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,gCAAgC,2BAA2B,2BAA2B,kBAAkB,iBAAiB,yBAAyB,WAAW,WAAW,iBAAiB,yBAAyB,qCAAqC,oCAAoC,aAAa,4BAA4B,oBAAoB,wCAAwC,eAAe,8DAA8D,YAAY,+BAA+B,mBAAmB,+BAA+B,sEAAsE,kBAAkB,WAAW,sBAAsB,uBAAuB,gBAAgB,4EAA4E,WAAW,yBAAyB,kBAAkB,yBAAyB,sCAAsC,sBAAsB,aAAa,mBAAmB,uBAAuB,gCAAgC,sBAAsB,qFAAqF,oBAAoB,iBAAiB,WAAW,YAAY,sBAAsB,oBAAoB,kBAAkB,MAAM,QAAQ,SAAS,OAAO,sBAAsB,uBAAuB,kCAAkC,eAAe,mCAAmC,2DAA2D,8EAA8E,aAAa,wDAAwD,sBAAsB,uBAAuB,sBAAsB,kBAAkB,4BAA4B,gBAAgB,oCAAoC,mBAAmB,uBAAuB,gBAAgB,kCAAkC,kBAAkB,cAAc,kCAAkC,oBAAoB,qBAAqB,4BAA4B,uBAAuB,gBAAgB,qBAAqB,aAAa,6BAA6B,MAAM,QAAQ,OAAO,UAAU,oBAAoB,YAAY,cAAc,cAAc,WAAW,sBAAsB,sCAAsC,aAAa,8BAA8B,mBAAmB,6CAA6C,gBAAgB,uCAAuC,gBAAgB,cAAc,kCAAkC,gCAAgC,aAAa,yBAAyB,aAAa,yCAAyC,aAAa,sBAAsB,aAAa,qBAAqB,WAAW,YAAY,gBAAgB,gBAAgB,kBAAkB,MAAM,OAAO,kBAAkB,UAAU,sBAAsB,sCAAsC,oBAAoB,4CAA4C,gBAAgB,4BAA4B,UAAU,mBAAmB,uBAAuB,iBAAiB,iBAAiB,eAAe,6BAA6B,UAAU,mBAAmB,qBAAqB,sBAAsB,oBAAoB,aAAa,sBAAsB,uBAAuB,mBAAmB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,sBAAsB,kCAAkC,aAAa,4BAA4B,sDAAsD,8CAA8C,sCAAsC,gEAAgE,wDAAwD,MAAM,wBAAwB,sBAAsB,sCAAsC,kBAAkB,mBAAmB,WAAW,eAAe,aAAa,sBAAsB,mBAAmB,uBAAuB,cAAc,iCAAiC,mBAAmB,cAAc,sBAAsB,kBAAkB,2BAA2B,6BAA6B,8BAA8B,4BAA4B,oBAAoB,mBAAmB,UAAU,yBAAyB,eAAe,eAAe,qBAAqB,kCAAkC,oBAAoB,qCAAqC,wDAAwD,gDAAgD,eAAe,4BAA4B,WAAW,eAAe,aAAa,gBAAgB,oCAAoC,kBAAkB,8BAA8B,iBAAiB,2CAA2C,WAAW,YAAY,aAAa,gBAAgB,kBAAkB,cAAc,2BAA2B,YAAY,gBAAgB,qCAAqC,GAAG,oBAAoB,KAAK,yBAAyB,6BAA6B,GAAG,oBAAoB,KAAK,yBAAyB,6BAA6B,oBAAoB,cAAc,8BAA8B,gBAAgB,6BAA6B,iDAAiD,+BAA+B,8BAA8B,sBAAsB,iBAAiB,eAAe,uCAAuC,wCAAwC,oBAAoB,gBAAgB,iDAAiD,gBAAgB,kCAAkC,0BAA0B,8BAA8B,2BAA2B,qCAAqC,wBAAwB,0BAA0B,sBAAsB,sCAAsC,2CAA2C,sBAAsB,YAAY,mBAAmB,iDAAiD,UAAU,oCAAoC,+CAA+C,6FAA6F,yFAAyF,qDAAqD,wBAAwB,UAAU,mBAAmB,sBAAsB,WAAW,qBAAqB,iBAAiB,2BAA2B,2BAA2B,sBAAsB,uBAAuB,uBAAuB,sBAAsB,kCAAkC,kBAAkB,YAAY,uEAAuE,cAAc,kBAAkB,iBAAiB,kCAAkC,gEAAgE,uBAAuB,qDAAqD,uBAAuB,gCAAgC,WAAW,YAAY,cAAc,sBAAsB,mBAAmB,0BAA0B,uBAAuB,YAAY,cAAc,kBAAkB,oBAAoB,gBAAgB,kBAAkB,YAAY,sBAAsB,cAAc,gBAAgB,oBAAoB,eAAe,cAAc,kBAAkB,YAAY,gBAAgB,uBAAuB,kBAAkB,uDAAuD,YAAY,oBAAoB,kBAAkB,cAAc,oBAAoB,kBAAkB,MAAM,OAAO,WAAW,YAAY,sCAAsC,kBAAkB,gBAAgB,sBAAsB,sCAAsC,aAAa,mBAAmB,8BAA8B,eAAe,kBAAkB,cAAc,yBAAyB,sBAAsB,qBAAqB,iBAAiB,eAAe,0BAA0B,mBAAmB,0CAA0C,gBAAgB,iBAAiB,uBAAuB,OAAO,gBAAgB,oCAAoC,oBAAoB,kBAAkB,WAAW,gCAAgC,oCAAoC,kBAAkB,sBAAsB,cAAc,sBAAsB,4BAA4B,aAAa,cAAc,iBAAiB,WAAW,gBAAgB,YAAY,gBAAgB,aAAa,kBAAkB,cAAc,2BAA2B,WAAW,oBAAoB,kBAAkB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,6IAA6I,WAAW,uHAAuH,aAAa,6DAA6D,qBAAqB,yBAAyB,WAAW,YAAY,aAAa,iBAAiB,oCAAoC,0BAA0B,qCAAqC,kBAAkB,iDAAiD,0BAA0B,gCAAgC,YAAY,MAAM,QAAQ,SAAS,OAAO,wBAAwB,cAAc,eAAe,eAAe,gBAAgB,aAAa,sBAAsB,kBAAkB,sCAAsC,WAAW,YAAY,oBAAoB,iBAAiB,oBAAoB,0BAA0B,kBAAkB,OAAO,QAAQ,SAAS,YAAY,oFAAoF,sBAAsB,kBAAkB,SAAS,aAAa,sBAAsB,uBAAuB,YAAY,gBAAgB,oBAAoB,4EAA4E,WAAW,SAAS,gBAAgB,6CAA6C,cAAc,oCAAoC,mBAAmB,wCAAwC,WAAW,8BAA8B,yBAAyB,sBAAsB,aAAa,kBAAkB,UAAU,aAAa,cAAc,eAAe,oBAAoB,qBAAqB,cAAc,kBAAkB,iBAAiB,sBAAsB,WAAW,mCAAmC,eAAe,4BAA4B,WAAW,uBAAuB,kBAAkB,MAAM,OAAO,SAAS,qBAAqB,UAAU,8BAA8B,kBAAkB,QAAQ,2BAA2B,oBAAoB,WAAW,aAAa,8CAA8C,mCAAmC,+KAA+K,qBAAqB,4BAA4B,UAAU,QAAQ,mCAAmC,UAAU,cAAc,iBAAiB,cAAc,aAAa,sBAAsB,kBAAkB,WAAW,uCAAuC,kBAAkB,sBAAsB,sCAAsC,qBAAqB,gFAAgF,uBAAuB,kDAAkD,aAAa,0CAA0C,gBAAgB,iBAAiB,uBAAuB,iBAAiB,6BAA6B,2BAA2B,cAAc,eAAe,2BAA2B,+BAA+B,aAAa,sBAAsB,cAAc,kBAAkB,kBAAkB,mBAAmB,+BAA+B,gBAAgB,oCAAoC,gBAAgB,mBAAmB,cAAc,WAAW,gCAAgC,aAAa,qBAAqB,yBAAyB,uBAAuB,8BAA8B,2BAA2B,sBAAsB,0BAA0B,sBAAsB,uBAAuB,gBAAgB,6BAA6B,kBAAkB,4CAA4C,uBAAuB,0BAA0B,kBAAkB,kBAAkB,kBAAkB,cAAc,kCAAkC,kBAAkB,sBAAsB,eAAe,0CAA0C,kBAAkB,gBAAgB,0BAA0B,cAAc,2BAA2B,gBAAgB,uBAAuB,cAAc,0CAA0C,gBAAgB,mBAAmB,cAAc,mBAAmB,gDAAgD,cAAc,4BAA4B,0BAA0B,8BAA8B,kCAAkC,YAAY,kBAAkB,WAAW,gCAAgC,4CAA4C,SAAS,OAAO,QAAQ,WAAW,iDAAiD,mBAAmB,qBAAqB,uCAAuC,0BAA0B,WAAW,mBAAmB,aAAa,6BAA6B,mBAAmB,kBAAkB,UAAU,yBAAyB,sBAAsB,qBAAqB,iBAAiB,cAAc,kCAAkC,gCAAgC,4CAA4C,uFAAuF,YAAY,gCAAgC,cAAc,+DAA+D,mBAAmB,0BAA0B,YAAY,eAAe,eAAe,kBAAkB,cAAc,eAAe,gBAAgB,oCAAoC,kBAAkB,2BAA2B,aAAa,mBAAmB,uBAAuB,mBAAmB,+BAA+B,gBAAgB,6FAA6F,2CAA2C,mDAAmD,iCAAiC,cAAc,2BAA2B,mCAAmC,UAAU,mDAAmD,0CAA0C,4CAA4C,2GAA2G,0CAA0C,4CAA4C,wCAAwC,yBAAyB,sCAAsC,+BAA+B,kBAAkB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,uBAAuB,kBAAkB,6BAA6B,OAAO,UAAU,yBAAyB,sCAAsC,gBAAgB,WAAW,oCAAoC,oBAAoB,uBAAuB,sBAAsB,UAAU,+BAA+B,sCAAsC,4CAA4C,gBAAgB,eAAe,WAAW,aAAa,2BAA2B,wBAAwB,0BAA0B,aAAa,sBAAsB,iBAAiB,oBAAoB,yBAAyB,yCAAyC,gBAAgB,iDAAiD,2BAA2B,iCAAiC,aAAa,+CAA+C,sCAAsC,4CAA4C,+DAA+D,4FAA4F,wFAAwF,yEAAyE,8FAA8F,0FAA0F,aAAa,sBAAsB,cAAc,gBAAgB,2BAA2B,0CAA0C,aAAa,WAAW,eAAe,6CAA6C,mCAAmC,wBAAwB,0CAA0C,aAAa,iBAAiB,mBAAmB,kBAAkB,YAAY,cAAc,aAAa,UAAU,yBAAyB,qCAAqC,WAAW,MAAM,WAAW,gEAAgE,aAAa,aAAa,eAAe,OAAO,MAAM,cAAc,mCAAmC,qDAAqD,6CAA6C,gBAAgB,oCAAoC,gBAAgB,uCAAuC,yBAAyB,0CAA0C,aAAa,cAAc,2CAA2C,aAAa,QAAQ,2CAA2C,4BAA4B,qCAAqC,wBAAwB,uBAAuB,yCAAyC,oCAAoC,UAAU,sBAAsB,sCAAsC,kBAAkB,UAAU,0CAA0C,yCAAyC,6CAA6C,qDAAqD,kBAAkB,gDAAgD,gBAAgB,uEAAuE,qCAAqC,kBAAkB,mFAAmF,kBAAkB,kCAAkC,6BAA6B,2BAA2B,UAAU,gBAAgB,+BAA+B,0CAA0C,kCAAkC,gCAAgC,uCAAuC,cAAc,eAAe,0CAA0C,aAAa,qDAAqD,YAAY,6BAA6B,SAAS,QAAQ,UAAU,cAAc,qBAAqB,oEAAoE,mEAAmE,6DAA6D,yBAAyB,mFAAmF,WAAW,kFAAkF,UAAU,uCAAuC,aAAa,iBAAiB,0CAA0C,uCAAuC,kBAAkB,sDAAsD,eAAe,eAAe,qJAAqJ,0CAA0C,4CAA4C,mEAAmE,wBAAwB,6CAA6C,aAAa,sDAAsD,cAAc,6BAA6B,6DAA6D,aAAa,gFAAgF,yBAAyB,iDAAiD,YAAY,QAAQ,gCAAgC,iCAAiC,gBAAgB,kBAAkB,sBAAsB,sCAAsC,uEAAuE,mBAAmB,2CAA2C,8CAA8C,6BAA6B,kBAAkB,qDAAqD,cAAc,6BAA6B,YAAY,4CAA4C,kBAAkB,aAAa,cAAc,cAAc,aAAa,mBAAmB,uBAAuB,sDAAsD,kBAAkB,UAAU,kBAAkB,MAAM,QAAQ,SAAS,OAAO,6CAA6C,UAAU,SAAS,iKAAiK,gBAAgB,iEAAiE,UAAU,mBAAmB,0CAA0C,sDAAsD,qBAAqB,mCAAmC,WAAW,6CAA6C,YAAY,qCAAqC,2CAA2C,6DAA6D,sBAAsB,oBAAoB,0CAA0C,6DAA6D,iBAAiB,4DAA4D,sBAAsB,mEAAmE,aAAa,4CAA4C,aAAa,mBAAmB,iBAAiB,gBAAgB,mBAAmB,iDAAiD,YAAY,mBAAmB,eAAe,WAAW,mBAAmB,aAAa,sBAAsB,4BAA4B,iBAAiB,cAAc,0CAA0C,iDAAiD,WAAW,gBAAgB,2GAA2G,aAAa,gDAAgD,eAAe,oBAAoB,eAAe,0CAA0C,gDAAgD,gBAAgB,2DAA2D,kBAAkB,0CAA0C,2DAA2D,iBAAiB,gBAAgB,uEAAuE,kBAAkB,yCAAyC,iBAAiB,uBAAuB,mDAAmD,yBAAyB,uKAAuK,8BAA8B,qNAAqN,gEAAgE,wDAAwD,0CAA0C,qDAAqD,aAAa,YAAY,WAAW,0BAA0B,WAAW,qEAAqE,wBAAwB,gCAAgC,WAAW,sBAAsB,gBAAgB,cAAc,yEAAyE,aAAa,0JAA0J,qDAAqD,6CAA6C,mFAAmF,wBAAwB,mFAAmF,qDAAqD,mGAAmG,6CAA6C,uCAAuC,cAAc,kBAAkB,eAAe,oBAAoB,gBAAgB,cAAc,4BAA4B,wDAAwD,eAAe,0BAA0B,cAAc,4DAA4D,WAAW,UAAU,aAAa,cAAc,gFAAgF,eAAe,uCAAuC,kBAAkB,kBAAkB,OAAO,MAAM,SAAS,QAAQ,gBAAgB,sBAAsB,sCAAsC,wCAAwC,YAAY,4BAA4B,YAAY,cAAc,cAAc,iBAAiB,eAAe,gBAAgB,0CAA0C,4BAA4B,WAAW,kBAAkB,kBAAkB,aAAa,oBAAoB,gCAAgC,kBAAkB,cAAc,uHAAuH,sBAAsB,gIAAgI,cAAc,+FAA+F,kBAAkB,gBAAgB,iBAAiB,cAAc,kCAAkC,mBAAmB,0CAA0C,qBAAqB,mCAAmC,iBAAiB,iCAAiC,UAAU,iFAAiF,oBAAoB,mBAAmB,0BAA0B,uCAAuC,0BAA0B,+CAA+C,iBAAiB,aAAa,wCAAwC,WAAW,wEAAwE,yBAAyB,sBAAsB,qBAAqB,iBAAiB,iIAAiI,WAAW,YAAY,qBAAqB,cAAc,kBAAkB,mGAAmG,kBAAkB,cAAc,kCAAkC,eAAe,mBAAmB,+BAA+B,gBAAgB,cAAc,4CAA4C,iBAAiB,kCAAkC,mBAAmB,+DAA+D,iBAAiB,yDAAyD,qBAAqB,0CAA0C,gBAAgB,iBAAiB,mBAAmB,WAAW,qBAAqB,SAAS,kBAAkB,WAAW,QAAQ,2BAA2B,uBAAuB,qBAAqB,iEAAiE,gBAAgB,gCAAgC,mBAAmB,0CAA0C,sCAAsC,WAAW,gBAAgB,6CAA6C,oBAAoB,wDAAwD,qBAAqB,4BAA4B,iBAAiB,YAAY,2BAA2B,0BAA0B,oBAAoB,mBAAmB,mCAAmC,kBAAkB,0BAA0B,wBAAwB,YAAY,8FAA8F,8BAA8B,eAAe,gHAAgH,uBAAuB,gBAAgB,0HAA0H,eAAe,eAAe,mDAAmD,iBAAiB,+DAA+D,cAAc,8DAA8D,qBAAqB,6DAA6D,UAAU,2DAA2D,gBAAgB,sEAAsE,kBAAkB,yCAAyC,aAAa,8BAA8B,mBAAmB,+BAA+B,eAAe,0CAA0C,oCAAoC,YAAY,gBAAgB,mBAAmB,mCAAmC,gBAAgB,iCAAiC,2BAA2B,+CAA+C,oCAAoC,aAAa,wBAAwB,0CAA0C,2DAA2D,aAAa,8EAA8E,eAAe,oCAAoC,iBAAiB,0CAA0C,wDAAwD,mBAAmB,sBAAsB,qBAAqB,0CAA0C,yBAAyB,gBAAgB,8DAA8D,oBAAoB,qCAAqC,yBAAyB,0CAA0C,sBAAsB,sBAAsB,0CAA0C,8BAA8B,gBAAgB,2CAA2C,SAAS,4DAA4D,UAAU,0CAA0C,0FAA0F,iBAAiB,yCAAyC,oBAAoB,2BAA2B,aAAa,0CAA0C,2BAA2B,mBAAmB,mBAAmB,8BAA8B,gBAAgB,eAAe,cAAc,kCAAkC,mBAAmB,+BAA+B,eAAe,0CAA0C,8BAA8B,aAAa,mBAAmB,yEAAyE,SAAS,qDAAqD,cAAc,sCAAsC,aAAa,mBAAmB,cAAc,mBAAmB,+BAA+B,+BAA+B,YAAY,6CAA6C,WAAW,YAAY,qBAAqB,cAAc,kBAAkB,gCAAgC,UAAU,iBAAiB,cAAc,2BAA2B,eAAe,gBAAgB,oCAAoC,4BAA4B,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kDAAkD,iBAAiB,6DAA6D,qBAAqB,kKAAkK,iCAAiC,iDAAiD,qCAAqC,qBAAqB,uBAAuB,iCAAiC,iDAAiD,6CAA6C,2BAA2B,yDAAyD,cAAc,qDAAqD,kBAAkB,gBAAgB,iBAAiB,kBAAkB,uBAAuB,sDAAsD,8BAA8B,0DAA0D,yBAAyB,8CAA8C,YAAY,aAAa,8BAA8B,0EAA0E,kBAAkB,6DAA6D,+BAA+B,YAAY,aAAa,mDAAmD,YAAY,aAAa,0BAA0B,oDAAoD,YAAY,aAAa,+BAA+B,kDAAkD,YAAY,aAAa,2BAA2B,6HAA6H,aAAa,yDAAyD,mBAAmB,4CAA4C,kBAAkB,0CAA0C,+CAA+C,yBAAyB,kBAAkB,wBAAwB,gCAAgC,aAAa,iBAAiB,wBAAwB,kDAAkD,gBAAgB,oCAAoC,4CAA4C,eAAe,8BAA8B,cAAc,kCAAkC,iBAAiB,kCAAkC,kFAAkF,mBAAmB,gBAAgB,uBAAuB,6DAA6D,iBAAiB,wEAAwE,gBAAgB,oCAAoC,wCAAwC,YAAY,gBAAgB,mBAAmB,uCAAuC,oBAAoB,0CAA0C,qBAAqB,kBAAkB,0CAA0C,4BAA4B,oBAAoB,+CAA+C,iBAAiB,wBAAwB,qBAAqB,gCAAgC,aAAa,8BAA8B,mBAAmB,6BAA6B,WAAW,gCAAgC,8BAA8B,cAAc,kCAAkC,uCAAuC,cAAc,8BAA8B,qBAAqB,mBAAmB,yBAAyB,+CAA+C,yBAAyB,sCAAsC,uCAAuC,YAAY,cAAc,kBAAkB,MAAM,QAAQ,SAAS,OAAO,yBAAyB,sCAAsC,UAAU,mCAAmC,8CAA8C,UAAU,yDAAyD,sBAAsB,uCAAuC,qCAAqC,mBAAmB,kDAAkD,sBAAsB,+DAA+D,uBAAuB,yCAAyC,WAAW,YAAY,oBAAoB,iBAAiB,iDAAiD,UAAU,gDAAgD,kBAAkB,WAAW,YAAY,6BAA6B,0BAA0B,kDAAkD,qBAAqB,mBAAmB,QAAQ,2BAA2B,kBAAkB,mBAAmB,+BAA+B,yBAAyB,sBAAsB,qBAAqB,iBAAiB,uBAAuB,cAAc,eAAe,kBAAkB,0CAA0C,YAAY,aAAa,wBAAwB,kBAAkB,0BAA0B,kBAAkB,gBAAgB,oCAAoC,4BAA4B,cAAc,kCAAkC,kBAAkB,mBAAmB,gCAAgC,mBAAmB,+BAA+B,uCAAuC,qBAAqB,2BAA2B,UAAU,kDAAkD,mCAAmC,gCAAgC,wBAAwB,mCAAmC,UAAU,cAAc,kBAAkB,eAAe,iEAAiE,cAAc,gDAAgD,0CAA0C,+CAA+C,oCAAoC,0CAA0C,cAAc,sCAAsC,sDAAsD,oDAAoD,kBAAkB,QAAQ,UAAU,uDAAuD,+BAA+B,oCAAoC,oEAAoE,qDAAqD,mDAAmD,+BAA+B,qCAAqC,iBAAiB,2CAA2C,cAAc,4CAA4C,mEAAmE,8BAA8B,2CAA2C,8BAA8B,cAAc,iEAAiE,YAAY,0CAA0C,iEAAiE,aAAa,4DAA4D,kBAAkB,cAAc,8BAA8B,aAAa,qCAAqC,aAAa,6BAA6B,WAAW,eAAe,sDAAsD,gBAAgB,4BAA4B,+DAA+D,gBAAgB,6DAA6D,uBAAuB,iEAAiE,aAAa,sCAAsC,SAAS,oCAAoC,+CAA+C,oDAAoD,YAAY,qEAAqE,aAAa,mBAAmB,qDAAqD,YAAY,0CAA0C,oCAAoC,WAAW,YAAY,YAAY,WAAW,0BAA0B,WAAW,oEAAoE,wBAAwB,cAAc,WAAW,eAAe,kBAAkB,gBAAgB,aAAa,sBAAsB,sBAAsB,sCAAsC,uCAAuC,cAAc,2BAA2B,eAAe,gBAAgB,uCAAuC,6BAA6B,yCAAyC,0BAA0B,gBAAgB,oCAAoC,cAAc,kCAAkC,0CAA0C,uCAAuC,2BAA2B,sBAAsB,2BAA2B,mBAAmB,WAAW,cAAc,iBAAiB,6BAA6B,8BAA8B,2BAA2B,2BAA2B,QAAQ,UAAU,sBAAsB,sCAAsC,qCAAqC,kBAAkB,WAAW,WAAW,OAAO,MAAM,yBAAyB,cAAc,YAAY,WAAW,oEAAoE,SAAS,0CAA0C,kBAAkB,aAAa,6BAA6B,6BAA6B,wBAAwB,cAAc,iCAAiC,kBAAkB,iBAAiB,iCAAiC,iDAAiD,iDAAiD,wBAAwB,+BAA+B,wCAAwC,UAAU,6BAA6B,UAAU,0BAA0B,4CAA4C,YAAY,WAAW,2DAA2D,aAAa,6EAA6E,aAAa,8BAA8B,yBAAyB,cAAc,gBAAgB,eAAe,eAAe,cAAc,kCAAkC,qDAAqD,YAAY,yBAAyB,wCAAwC,kBAAkB,SAAS,QAAQ,YAAY,kBAAkB,oCAAoC,gDAAgD,wBAAwB,UAAU,eAAe,WAAW,iBAAiB,uCAAuC,gBAAgB,4CAA4C,aAAa,WAAW,4BAA4B,0CAA0C,mCAAmC,kBAAkB,kDAAkD,uCAAuC,yBAAyB,+CAA+C,8BAA8B,kBAAkB,UAAU,SAAS,sDAAsD,WAAW,gBAAgB,aAAa,qCAAqC,mBAAmB,aAAa,sDAAsD,2BAA2B,0CAA0C,sDAAsD,2BAA2B,sCAAsC,kBAAkB,sBAAsB,2BAA2B,yFAAyF,6BAA6B,2CAA2C,mBAAmB,WAAW,eAAe,gBAAgB,uBAAuB,+CAA+C,aAAa,sBAAsB,uBAAuB,kBAAkB,gBAAgB,oBAAoB,eAAe,2BAA2B,uCAAuC,YAAY,WAAW,sBAAsB,gBAAgB,kBAAkB,cAAc,6CAA6C,aAAa,mBAAmB,uBAAuB,eAAe,WAAW,yBAAyB,yBAAyB,sCAAsC,+CAA+C,kBAAkB,UAAU,mDAAmD,eAAe,0DAA0D,kBAAkB,MAAM,QAAQ,SAAS,OAAO,YAAY,eAAe,UAAU,yCAAyC,oBAAoB,iBAAiB,WAAW,YAAY,sBAAsB,uCAAuC,oBAAoB,0CAA0C,gBAAgB,qBAAqB,uBAAuB,sBAAsB,uCAAuC,eAAe,0CAA0C,cAAc,kBAAkB,4CAA4C,qBAAqB,oCAAoC,0CAA0C,sDAAsD,iBAAiB,0CAA0C,qDAAqD,sBAAsB,4GAA4G,2BAA2B,0CAA0C,4GAA4G,4BAA4B,sEAAsE,sBAAsB,qBAAqB,0CAA0C,sEAAsE,iBAAiB,8IAA8I,iBAAiB,wCAAwC,kBAAkB,qBAAqB,uDAAuD,eAAe,sDAAsD,oBAAoB,yDAAyD,kBAAkB,qBAAqB,2DAA2D,UAAU,yKAAyK,mCAAmC,wFAAwF,UAAU,6FAA6F,UAAU,6BAA6B,oBAAoB,gDAAgD,wCAAwC,kCAAkC,kBAAkB,MAAM,QAAQ,SAAS,OAAO,aAAa,mBAAmB,8BAA8B,eAAe,UAAU,sDAAsD,kBAAkB,0CAA0C,kCAAkC,iBAAiB,8BAA8B,YAAY,gBAAgB,oCAAoC,WAAW,gCAAgC,mBAAmB,0BAA0B,mBAAmB,oMAAoM,aAAa,2DAA2D,aAAa,kCAAkC,aAAa,sBAAsB,gBAAgB,iCAAiC,aAAa,sBAAsB,aAAa,eAAe,sCAAsC,gBAAgB,oCAAoC,uCAAuC,eAAe,cAAc,kCAAkC,wCAAwC,aAAa,kBAAkB,oBAAoB,8BAA8B,wCAAwC,YAAY,kBAAkB,mBAAmB,kBAAkB,eAAe,mBAAmB,gBAAgB,WAAW,qBAAqB,6CAA6C,mBAAmB,cAAc,kCAAkC,0CAA0C,aAAa,6BAA6B,yCAAyC,WAAW,YAAY,kBAAkB,+CAA+C,mBAAmB,2CAA2C,mDAAmD,6CAA6C,eAAe,gBAAgB,sCAAsC,aAAa,sBAAsB,kBAAkB,WAAW,6CAA6C,cAAc,kCAAkC,wBAAwB,SAAS,gBAAgB,oCAAoC,8BAA8B,aAAa,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,0CAA0C,6CAA6C,yBAAyB,2CAA2C,iBAAiB,oBAAoB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,0CAA0C,2CAA2C,kBAAkB,uDAAuD,WAAW,mBAAmB,oBAAoB,eAAe,cAAc,kCAAkC,yCAAyC,eAAe,gBAAgB,eAAe,mBAAmB,0CAA0C,yCAAyC,gBAAgB,yCAAyC,mBAAmB,eAAe,oDAAoD,qBAAqB,kDAAkD,mBAAmB,qDAAqD,YAAY,YAAY,0CAA0C,qDAAqD,kBAAkB,qCAAqC,kBAAkB,oCAAoC,iBAAiB,uBAAuB,2CAA2C,kBAAkB,mCAAmC,UAAU,uCAAuC,qBAAqB,oBAAoB,4CAA4C,uBAAuB,qCAAqC,kCAAkC,sCAAsC,iBAAiB,mBAAmB,+BAA+B,oDAAoD,kBAAkB,oBAAoB,qCAAqC,mBAAmB,cAAc,eAAe,MAAM,OAAO,QAAQ,SAAS,2BAA2B,aAAa,mBAAmB,uBAAuB,0CAA0C,cAAc,iBAAiB,qBAAqB,YAAY,eAAe,aAAa,mBAAmB,0CAA0C,qBAAqB,oBAAoB,sBAAsB,kBAAkB,0CAA0C,sBAAsB,cAAc,mBAAmB,mBAAmB,+BAA+B,gBAAgB,oCAAoC,kBAAkB,0CAA0C,mBAAmB,2BAA2B,mBAAmB,mBAAmB,+BAA+B,kBAAkB,sBAAsB,kBAAkB,MAAM,QAAQ,aAAa,qBAAqB,qBAAqB,gCAAgC,gBAAgB,gCAAgC,yGAAyG,WAAW,0CAA0C,sBAAsB,cAAc,sBAAsB,aAAa,sBAAsB,uBAAuB,mBAAmB,YAAY,gBAAgB,eAAe,gBAAgB,wBAAwB,kBAAkB,kBAAkB,eAAe,gBAAgB,gBAAgB,cAAc,aAAa,mBAAmB,oBAAoB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,WAAW,sBAAsB,gBAAgB,uBAAuB,UAAU,SAAS,OAAO,QAAQ,sBAAsB,UAAU,mBAAmB,+BAA+B,qBAAqB,6BAA6B,6CAA6C,gJAAgJ,wIAAwI,wBAAwB,yBAAyB,kCAAkC,sBAAsB,gBAAgB,gBAAgB,YAAY,kBAAkB,cAAc,+DAA+D,WAAW,qEAAqE,UAAU,+DAA+D,WAAW,0CAA0C,sBAAsB,WAAW,wBAAwB,iBAAiB,iBAAiB,kCAAkC,gBAAgB,YAAY,6DAA6D,mCAAmC,oDAAoD,kBAAkB,qFAAqF,sBAAsB,sBAAsB,iCAAiC,sBAAsB,qBAAqB,uBAAuB,kBAAkB,OAAO,YAAY,WAAW,2BAA2B,eAAe,UAAU,qCAAqC,4BAA4B,uDAAuD,UAAU,0CAA0C,uBAAuB,YAAY,6BAA6B,UAAU,QAAQ,oDAAoD,eAAe,kBAAkB,WAAW,eAAe,UAAU,QAAQ,yCAAyC,UAAU,wCAAwC,UAAU,0CAA0C,oDAAoD,eAAe,WAAW,0BAA0B,UAAU,WAAW,0CAA0C,0CAA0C,0BAA0B,YAAY,oBAAoB,0BAA0B,aAAa,uBAAuB,mBAAmB,2BAA2B,OAAO,MAAM,0BAA0B,gBAAgB,yCAAyC,gBAAgB,iCAAiC,2EAA2E,0CAA0C,oBAAoB,kBAAkB,kCAAkC,WAAW,YAAY,kBAAkB,OAAO,MAAM,wBAAwB,WAAW,YAAY,kDAAkD,WAAW,YAAY,eAAe,gBAAgB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,oBAAoB,iBAAiB,UAAU,wCAAwC,kBAAkB,0DAA0D,eAAe,2BAA2B,yIAAyI,mCAAmC,6GAA6G,2BAA2B,+CAA+C,kCAAkC,2BAA2B,2BAA2B,oBAAoB,mBAAmB,gDAAgD,gBAAgB,qCAAqC,gDAAgD,0CAA0C,2BAA2B,sBAAsB,uBAAuB,2BAA2B,qCAAqC,gDAAgD,mFAAmF,cAAc,gFAAgF,sBAAsB,mBAAmB,yCAAyC,WAAW,sBAAsB,mBAAmB,gEAAgE,UAAU,qBAAqB,UAAU,kBAAkB,4CAA4C,8EAA8E,qBAAqB,kBAAkB,MAAM,OAAO,QAAQ,cAAc,aAAa,mBAAmB,8BAA8B,UAAU,kBAAkB,yEAAyE,WAAW,WAAW,uHAAuH,6IAA6I,oOAAoO,UAAU,0BAA0B,aAAa,mBAAmB,0CAA0C,qBAAqB,iBAAiB,uBAAuB,WAAW,YAAY,2BAA2B,kBAAkB,gBAAgB,aAAa,mBAAmB,uBAAuB,kDAAkD,oIAAoI,oBAAoB,qBAAqB,sBAAsB,MAAM,OAAO,WAAW,YAAY,0BAA0B,cAAc,UAAU,kBAAkB,8CAA8C,2CAA2C,oBAAoB,oBAAoB,2BAA2B,mBAAmB,oBAAoB,qFAAqF,UAAU,mBAAmB,mIAAmI,4DAA4D,iDAAiD,mBAAmB,0CAA0C,yDAAyD,2BAA2B,UAAU,mEAAmE,WAAW,iDAAiD,uDAAuD,qBAAqB,qBAAqB,oEAAoE,UAAU,oCAAoC,oBAAoB,sDAAsD,yBAAyB,sBAAsB,qBAAqB,iBAAiB,qBAAqB,kBAAkB,MAAM,QAAQ,SAAS,OAAO,UAAU,4CAA4C,0CAA0C,mBAAmB,YAAY,2BAA2B,YAAY,gBAAgB,gBAAgB,gBAAgB,gCAAgC,mBAAmB,cAAc,UAAU,aAAa,mBAAmB,8BAA8B,kBAAkB,eAAe,SAAS,2BAA2B,UAAU,uCAAuC,wCAAwC,0BAA0B,WAAW,mCAAmC,oBAAoB,WAAW,+BAA+B,cAAc,cAAc,cAAc,aAAa,sCAAsC,UAAU,kFAAkF,UAAU,oBAAoB,2BAA2B,UAAU,iDAAiD,qBAAqB,oBAAoB,sEAAsE,qBAAqB,UAAU,MAAM,OAAO,WAAW,YAAY,0BAA0B,gCAAgC,UAAU,UAAU,kBAAkB,8EAA8E,gBAAgB,aAAa,sBAAsB,WAAW,2CAA2C,iDAAiD,gBAAgB,gCAAgC,gBAAgB,cAAc,gBAAgB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,iEAAiE,gBAAgB,6BAA6B,cAAc,gBAAgB,0BAA0B,gBAAgB,oBAAoB,+CAA+C,UAAU,mBAAmB,2FAA2F,yEAAyE,mBAAmB,UAAU,wBAAwB,uBAAuB,UAAU,mBAAmB,uCAAuC,iBAAiB,iCAAiC,WAAW,eAAe,gBAAgB,YAAY,4BAA4B,uBAAuB,YAAY,6BAA6B,yCAAyC,mCAAmC,kBAAkB,OAAO,2BAA2B,mCAAmC,kBAAkB,QAAQ,4BAA4B,gCAAgC,YAAY,gDAAgD,MAAM,eAAe,gBAAgB,oCAAoC,cAAc,kCAAkC,UAAU,yBAAyB,WAAW,sDAAsD,MAAM,WAAW,0CAA0C,gBAAgB,sBAAsB,YAAY,mDAAmD,OAAO,UAAU,kBAAkB,sBAAsB,sCAAsC,4CAA4C,eAAe,0CAA0C,qFAAqF,WAAW,UAAU,sDAAsD,8CAA8C,2DAA2D,WAAW,YAAY,oBAAoB,sDAAsD,0BAA0B,kDAAkD,UAAU,sEAAsE,uBAAuB,2GAA2G,UAAU,sBAAsB,sCAAsC,+JAA+J,SAAS,gCAAgC,kBAAkB,mBAAmB,kCAAkC,kBAAkB,kDAAkD,eAAe,kEAAkE,oBAAoB,kDAAkD,WAAW,aAAa,8CAA8C,iEAAiE,oBAAoB,8BAA8B,8CAA8C,kBAAkB,qCAAqC,WAAW,YAAY,+DAA+D,iBAAiB,cAAc,WAAW,YAAY,iBAAiB,aAAa,mBAAmB,cAAc,qDAAqD,UAAU,wFAAwF,YAAY,WAAW,UAAU,iBAAiB,gBAAgB,gDAAgD,UAAU,YAAY,eAAe,kBAAkB,4DAA4D,cAAc,sFAAsF,2CAA2C,mDAAmD,mIAAmI,YAAY,eAAe,gBAAgB,mEAAmE,WAAW,YAAY,iEAAiE,QAAQ,SAAS,UAAU,cAAc,uEAAuE,QAAQ,SAAS,4DAA4D,UAAU,mCAAmC,2BAA2B,6DAA6D,QAAQ,SAAS,aAAa,6DAA6D,6BAA6B,oDAAoD,gDAAgD,qDAAqD,uEAAuE,UAAU,6EAA6E,gBAAgB,mBAAmB,mBAAmB,mCAAmC,wCAAwC,kCAAkC,0BAA0B,UAAU,kEAAkE,aAAa,YAAY,WAAW,YAAY,kBAAkB,kBAAkB,gBAAgB,kBAAkB,QAAQ,SAAS,WAAW,UAAU,iCAAiC,yBAAyB,gBAAgB,qBAAqB,wBAAwB,yBAAyB,gBAAgB,mBAAmB,qBAAqB,4CAA4C,oCAAoC,wBAAwB,wBAAwB,oBAAoB,eAAe,YAAY,2BAA2B,GAAG,qBAAqB,GAAG,oBAAoB,mBAAmB,GAAG,qBAAqB,GAAG,oBAAoB,UAAU,WAAW,YAAY,aAAa,sBAAsB,mCAAmC,qBAAqB,2BAA2B,kBAAkB,UAAU,2BAA2B,cAAc,kBAAkB,iBAAiB,gBAAgB,uCAAuC,kBAAkB,mBAAmB,iBAAiB,eAAe,aAAa,eAAe,kBAAkB,uBAAuB,YAAY,aAAa,cAAc,wCAAwC,yBAAyB,eAAe,WAAW,gCAAgC,2CAA2C,mDAAmD,eAAe,uBAAuB,qBAAqB,oBAAoB,YAAY,iBAAiB,kBAAkB,qBAAqB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,cAAc,0DAA0D,mBAAmB,mBAAmB,uBAAuB,gBAAgB,sCAAsC,gBAAgB,uEAAuE,yCAAyC,2CAA2C,eAAe,+HAA+H,UAAU,oCAAoC,qDAAqD,6CAA6C,qCAAqC,sDAAsD,4CAA4C,oCAAoC,4BAA4B,sBAAsB,WAAW,iBAAiB,gBAAgB,kBAAkB,qCAAqC,2EAA2E,4BAA4B,kBAAkB,YAAY,OAAO,MAAM,yBAAyB,qCAAqC,YAAY,WAAW,UAAU,eAAe,4BAA4B,UAAU,qCAAqC,kCAAkC,mDAAmD,gBAAgB,8BAA8B,YAAY,cAAc,yBAAyB,mBAAmB,sBAAsB,0CAA0C,yBAAyB,YAAY,gBAAgB,oBAAoB,kCAAkC,oBAAoB,gBAAgB,sBAAsB,uBAAuB,2CAA2C,eAAe,aAAa,SAAS,UAAU,oBAAoB,gBAAgB,kBAAkB,0BAA0B,SAAS,UAAU,2BAA2B,QAAQ,UAAU,sCAAsC,uBAAuB,qBAAqB,gCAAgC,oBAAoB,kBAAkB,eAAe,gBAAgB,qDAAqD,cAAc,oDAAoD,cAAc,cAAc,aAAa,eAAe,mBAAmB,cAAc,eAAe,aAAa,aAAa,eAAe,kBAAkB,gDAAgD,oBAAoB,iBAAiB,WAAW,YAAY,uBAAuB,kBAAkB,OAAO,MAAM,mCAAmC,UAAU,oBAAoB,4CAA4C,oCAAoC,YAAY,+BAA+B,kBAAkB,MAAM,SAAS,OAAO,QAAQ,YAAY,gBAAgB,gCAAgC,oBAAoB,qBAAqB,YAAY,eAAe,qBAAqB,kBAAkB,MAAM,SAAS,OAAO,QAAQ,YAAY,WAAW,YAAY,aAAa,eAAe,gBAAgB,UAAU,mBAAmB,kDAAkD,6DAA6D,gDAAgD,UAAU,mBAAmB,qBAAqB,cAAc,wCAAwC,WAAW,YAAY,yCAAyC,uBAAuB,eAAe,gCAAgC,kBAAkB,WAAW,YAAY,yCAAyC,0BAA0B,oBAAoB,qBAAqB,oBAAoB,eAAe,2KAA2K,4CAA4C,oCAAoC,6KAA6K,yEAAyE,qCAAqC,eAAe,wDAAwD,uDAAuD,+CAA+C,yDAAyD,+BAA+B,8EAA8E,8BAA8B,+EAA+E,kBAAkB,MAAM,OAAO,SAAS,QAAQ,YAAY,mBAAmB,UAAU,WAAW,UAAU,6HAA6H,mCAAmC,yFAAyF,kBAAkB,gPAAgP,gBAAgB,mGAAmG,UAAU,gDAAgD,eAAe,yCAAyC,aAAa,cAAc,wFAAwF,0BAA0B,iDAAiD,4BAA4B,gDAAgD,WAAW,kBAAkB,eAAe,gBAAgB,sBAAsB,8BAA8B,SAAS,QAAQ,gCAAgC,+DAA+D,6BAA6B,wDAAwD,iBAAiB,0BAA0B,KAAK,0BAA0B,kBAAkB,KAAK,0BAA0B,wBAAwB,GAAG,uBAAuB,oBAAoB,IAAI,wBAAwB,wBAAwB,KAAK,wBAAwB,0BAA0B,gBAAgB,GAAG,uBAAuB,oBAAoB,IAAI,wBAAwB,wBAAwB,KAAK,wBAAwB,0BAA0B,2BAA2B,GAAG,0BAA0B,oBAAoB,IAAI,+BAA+B,sBAAsB,KAAK,+BAA+B,2BAA2B,mBAAmB,GAAG,0BAA0B,oBAAoB,IAAI,+BAA+B,sBAAsB,KAAK,+BAA+B,2BAA2B,qCAAqC,GAAG,uBAAuB,oBAAoB,IAAI,wBAAwB,wBAAwB,KAAK,wBAAwB,yBAAyB,6BAA6B,GAAG,uBAAuB,oBAAoB,IAAI,wBAAwB,wBAAwB,KAAK,wBAAwB,yBAAyB,IAAI,kBAAkB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,4JAA4J,WAAW,YAAY,gBAAgB,sBAAsB,oMAAoM,gBAAgB,UAAU,uBAAuB,kBAAkB,MAAM,OAAO,SAAS,QAAQ,qCAAqC,2EAA2E,sBAAsB,kBAAkB,oCAAoC,qCAAqC,cAAc,kBAAkB,mBAAmB,kBAAkB,6CAA6C,qCAAqC,8CAA8C,oBAAoB,kEAAkE,+CAA+C,uCAAuC,+BAA+B,uBAAuB,wBAAwB,wCAAwC,uBAAuB,kDAAkD,UAAU,0CAA0C,wCAAwC,uBAAuB,gDAAgD,+CAA+C,uCAAuC,+BAA+B,uBAAuB,yBAAyB,iCAAiC,GAAG,mBAAmB,GAAG,oBAAoB,yBAAyB,GAAG,mBAAmB,GAAG,oBAAoB,2CAA2C,GAAG,sBAAsB,GAAG,oBAAoB,mCAAmC,GAAG,sBAAsB,GAAG,oBAAoB,eAAe,aAAa,gBAAgB,qCAAqC,2CAA2C,WAAW,kBAAkB,mBAAmB,mCAAmC,kBAAkB,kEAAkE,kBAAkB,4CAA4C,yBAAyB,sBAAsB,qBAAqB,iBAAiB,yBAAyB,gBAAgB,oCAAoC,+BAA+B,wCAAwC,8CAA8C,kCAAkC,2CAA2C,iDAAiD,kCAAkC,2CAA2C,iDAAiD,iCAAiC,0CAA0C,gDAAgD,gCAAgC,yCAAyC,+CAA+C,gCAAgC,yCAAyC,+CAA+C,gCAAgC,yCAAyC,+CAA+C,4BAA4B,yCAAyC,2CAA2C,yCAAyC,kCAAkC,oDAAoD,yCAAyC,oDAAoD,2CAA2C,yCAAyC,sBAAsB,+BAA+B,+BAA+B,kBAAkB,mBAAmB,6BAA6B,8BAA8B,iCAAiC,cAAc,2BAA2B,oDAAoD,4CAA4C,yBAAyB,oDAAoD,qDAAqD,iCAAiC,oBAAoB,UAAU,yBAAyB,kBAAkB,+BAA+B,kBAAkB,YAAY,cAAc,kBAAkB,sBAAsB,sCAAsC,yBAAyB,4CAA4C,WAAW,YAAY,eAAe,cAAc,0BAA0B,eAAe,+BAA+B,kBAAkB,0BAA0B,cAAc,kBAAkB,0BAA0B,cAAc,kBAAkB,yBAAyB,aAAa,oBAAoB,yBAAyB,aAAa,uBAAuB,yBAAyB,aAAa,uBAAuB,yBAAyB,aAAa,uBAAuB,yBAAyB,aAAa,mBAAmB,yBAAyB,aAAa,uBAAuB,yBAAyB,aAAa,uBAAuB,yBAAyB,aAAa,qBAAqB,yBAAyB,aAAa,qBAAqB,yBAAyB,aAAa,uBAAuB,yBAAyB,aAAa,mBAAmB,yBAAyB,aAAa,gBAAgB,yBAAyB,aAAa,oBAAoB,+BAA+B,kBAAkB,MAAM,OAAO,aAAa,kBAAkB,WAAW,YAAY,sBAAsB,oBAAoB,mBAAmB,uBAAuB,2BAA2B,sBAAsB,uBAAuB,oBAAoB,iBAAiB,UAAU,yCAAyC,YAAY,uBAAuB,sBAAsB,iCAAiC,OAAO,cAAc,yBAAyB,yCAAyC,sBAAsB,cAAc,kBAAkB,kDAAkD,kCAAkC,0CAA0C,kDAAkD,2BAA2B,eAAe,wDAAwD,iBAAiB,oBAAoB,iBAAiB,WAAW,cAAc,kBAAkB,MAAM,QAAQ,kBAAkB,mBAAmB,iCAAiC,mBAAmB,mCAAmC,kCAAkC,oCAAoC,sBAAsB,iDAAiD,wBAAwB,mDAAmD,iCAAiC,mBAAmB,wBAAwB,6BAA6B,gBAAgB,uBAAuB,mBAAmB,mBAAmB,yBAAyB,yCAAyC,sBAAsB,kBAAkB,4BAA4B,kBAAkB,4BAA4B,kBAAkB,4BAA4B,8BAA8B,yBAAyB,kDAAkD,aAAa,iDAAiD,iCAAiC,kDAAkD,gCAAgC,oFAAoF,2CAA2C,gBAAgB,oBAAoB,iBAAiB,WAAW,YAAY,eAAe,mBAAmB,gBAAgB,oCAAoC,eAAe,8BAA8B,iBAAiB,kCAAkC,eAAe,mBAAmB,cAAc,kCAAkC,eAAe,8BAA8B,iBAAiB,kCAAkC,uBAAuB,gBAAgB,+BAA+B,aAAa,cAAc,0CAA0C,+BAA+B,eAAe,iBAAiB,8BAA8B,wCAAwC,8BAA8B,iBAAiB,iBAAiB,sBAAsB,uBAAuB,4DAA4D,iCAAiC,aAAa,sBAAsB,uBAAuB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,4DAA4D,kBAAkB,2CAA2C,uBAAuB,wBAAwB,WAAW,mCAAmC,UAAU,mBAAmB,iBAAiB,eAAe,aAAa,uBAAuB,mCAAmC,UAAU,yDAAyD,UAAU,yCAAyC,mBAAmB,uBAAuB,gBAAgB,6JAA6J,8BAA8B,6DAA6D,qBAAqB,uBAAuB,iGAAiG,oEAAoE,SAAS,UAAU,WAAW,aAAa,uBAAuB,kCAAkC,kBAAkB,2BAA2B,wCAAwC,uDAAuD,WAAW,YAAY,OAAO,4BAA4B,kBAAkB,wBAAwB,wBAAwB,8BAA8B,kBAAkB,yBAAyB,sCAAsC,mBAAmB,uCAAuC,eAAe,gBAAgB,oBAAoB,UAAU,WAAW,gBAAgB,wBAAwB,4CAA4C,sBAAsB,yBAAyB,sCAAsC,2CAA2C,oBAAoB,iBAAiB,kBAAkB,MAAM,QAAQ,SAAS,OAAO,0BAA0B,gBAAgB,eAAe,gBAAgB,sBAAsB,wCAAwC,sCAAsC,oBAAoB,kBAAkB,sBAAsB,QAAQ,SAAS,gCAAgC,2CAA2C,8CAA8C,sCAAsC,0EAA0E,0CAA0C,oBAAoB,aAAa,aAAa,0CAA0C,oBAAoB,YAAY,YAAY,wBAAwB,60CAA60C,q0CAAq0C,wBAAwB,q0CAAq0C,6zCAA6zC,uCAAuC,yBAAyB,0CAA0C,kCAAkC,aAAa,aAAa,0CAA0C,kCAAkC,YAAY,YAAY,sCAAsC,y0CAAy0C,i0CAAi0C,sCAAsC,s0CAAs0C,8zCAA8zC,gBAAgB,UAAU,gBAAgB,YAAY,gCAAgC,WAAW,yGAAyG,UAAU,qBAAqB,kBAAkB,MAAM,QAAQ,SAAS,OAAO,QAAQ,gBAAgB,oBAAoB,0BAA0B,kBAAkB,YAAY,eAAe,qBAAqB,aAAa,0BAA0B,sBAAsB,eAAe,gBAAgB,oBAAoB,mBAAmB,aAAa,wBAAwB,uBAAuB,0CAA0C,aAAa,uBAAuB,yBAAyB,aAAa,eAAe,WAAW,gCAAgC,sCAAsC,cAAc,4BAA4B,kBAAkB,cAAc,kCAAkC,aAAa,0CAA0C,4BAA4B,kBAAkB,yCAAyC,mBAAmB,uBAAuB,gBAAgB,gBAAgB,mBAAmB,4BAA4B,cAAc,oBAAoB,6BAA6B,iBAAiB,8DAA8D,eAAe,4BAA4B,cAAc,iBAAiB,eAAe,mBAAmB,0CAA0C,4BAA4B,oBAAoB,0CAA0C,YAAY,cAAc,4CAA4C,YAAY,YAAY,aAAa,yBAAyB,sCAAsC,kBAAkB,oBAAoB,6HAA6H,UAAU,sBAAsB,cAAc,qBAAqB,qBAAqB,cAAc,mBAAmB,mCAAmC,UAAU,6BAA6B,UAAU,0DAA0D,+FAA+F,yCAAyC,iCAAiC,oDAAoD,gCAAgC,+BAA+B,sBAAsB,oBAAoB,iBAAiB,cAAc,eAAe,wDAAwD,gCAAgC,qEAAqE,UAAU,WAAW,kBAAkB,OAAO,aAAa,WAAW,uBAAuB,QAAQ,mBAAmB,gDAAgD,8BAA8B,kCAAkC,gBAAgB,kBAAkB,+BAA+B,sBAAsB,0BAA0B,kBAAkB,WAAW,4BAA4B,gBAAgB,mBAAmB,gBAAgB,WAAW,eAAe,gBAAgB,gBAAgB,gBAAgB,kBAAkB,aAAa,mBAAmB,eAAe,0CAA0C,sBAAsB,4BAA4B,cAAc,gBAAgB,4BAA4B,sBAAsB,6BAA6B,YAAY,kBAAkB,UAAU,iBAAiB,SAAS,wBAAwB,WAAW,6BAA6B,aAAa,iBAAiB,uBAAuB,8BAA8B,mBAAmB,kBAAkB,aAAa,mBAAmB,uEAAuE,qBAAqB,sBAAsB,2BAA2B,sBAAsB,UAAU,WAAW,kBAAkB,8BAA8B,cAAc,qBAAqB,sBAAsB,+BAA+B,uBAAuB,2CAA2C,mCAAmC,yCAAyC,iCAAiC,iCAAiC,yBAAyB,kCAAkC,gCAAgC,wBAAwB,iCAAiC,+BAA+B,uBAAuB,oBAAoB,WAAW,WAAW,gBAAgB,kBAAkB,kBAAkB,qBAAqB,qDAAqD,cAAc,YAAY,kBAAkB,MAAM,QAAQ,SAAS,OAAO,8BAA8B,sBAAsB,2BAA2B,WAAW,0BAA0B,iDAAiD,yCAAyC,oBAAoB,qBAAqB,2BAA2B,YAAY,cAAc,UAAU,WAAW,kBAAkB,8BAA8B,6CAA6C,qCAAqC,8BAA8B,qBAAqB,cAAc,aAAa,mBAAmB,YAAY,kCAAkC,UAAU,YAAY,kBAAkB,qBAAqB,sBAAsB,8BAA8B,kBAAkB,kBAAkB,gDAAgD,wCAAwC,yCAAyC,YAAY,cAAc,aAAa,cAAc,8BAA8B,kBAAkB,kBAAkB,QAAQ,qDAAqD,6CAA6C,gCAAgC,4BAA4B,GAAG,8BAA8B,WAAW,IAAI,8BAA8B,WAAW,IAAI,mBAAmB,UAAU,KAAK,8BAA8B,YAAY,oBAAoB,GAAG,8BAA8B,WAAW,IAAI,8BAA8B,WAAW,IAAI,mBAAmB,UAAU,KAAK,8BAA8B,YAAY,6BAA6B,GAAG,8BAA8B,WAAW,MAAM,8BAA8B,WAAW,MAAM,8BAA8B,WAAW,MAAM,mBAAmB,UAAU,KAAK,8BAA8B,YAAY,qBAAqB,GAAG,8BAA8B,WAAW,MAAM,8BAA8B,WAAW,MAAM,8BAA8B,WAAW,MAAM,mBAAmB,UAAU,KAAK,8BAA8B,YAAY,2BAA2B,GAAG,mBAAmB,UAAU,IAAI,8BAA8B,WAAW,IAAI,8BAA8B,WAAW,KAAK,mBAAmB,WAAW,mBAAmB,GAAG,mBAAmB,UAAU,IAAI,8BAA8B,WAAW,IAAI,8BAA8B,WAAW,KAAK,mBAAmB,WAAW,0BAA0B,GAAG,4BAA4B,KAAK,2BAA2B,kBAAkB,GAAG,4BAA4B,KAAK,2BAA2B,uBAAuB,GAAG,yCAAyC,MAAM,mCAAmC,IAAI,yCAAyC,IAAI,wCAAwC,MAAM,mCAAmC,IAAI,0CAA0C,KAAK,0CAA0C,eAAe,GAAG,yCAAyC,MAAM,mCAAmC,IAAI,yCAAyC,IAAI,wCAAwC,MAAM,mCAAmC,IAAI,0CAA0C,KAAK,0CAA0C,4BAA4B,GAAG,gCAAgC,IAAI,+BAA+B,IAAI,+BAA+B,IAAI,gCAAgC,KAAK,iCAAiC,oBAAoB,GAAG,gCAAgC,IAAI,+BAA+B,IAAI,+BAA+B,IAAI,gCAAgC,KAAK,iCAAiC,aAAa,gBAAgB,cAAc,YAAY,yBAAyB,sBAAsB,qBAAqB,iBAAiB,WAAW,gCAAgC,0CAA0C,aAAa,YAAY,gBAAgB,yDAAyD,eAAe,yBAAyB,gBAAgB,oCAAoC,0CAA0C,yBAAyB,cAAc,oBAAoB,wBAAwB,eAAe,cAAc,kCAAkC,eAAe,kBAAkB,aAAa,mBAAmB,kBAAkB,wBAAwB,eAAe,wBAAwB,kBAAkB,iBAAiB,SAAS,UAAU,cAAc,2BAA2B,eAAe,mBAAmB,+CAA+C,8BAA8B,+BAA+B,mBAAmB,oBAAoB,6BAA6B,eAAe,2BAA2B,aAAa,iBAAiB,0BAA0B,yBAAyB,qCAAqC,eAAe,WAAW,YAAY,0BAA0B,aAAa,kBAAkB,oBAAoB,kBAAkB,eAAe,+BAA+B,eAAe,iBAAiB,mCAAmC,kBAAkB,OAAO,MAAM,UAAU,gBAAgB,oCAAoC,eAAe,eAAe,iBAAiB,iBAAiB,WAAW,mCAAmC,kBAAkB,WAAW,UAAU,WAAW,mBAAmB,gCAAgC,kBAAkB,YAAY,WAAW,gBAAgB,oCAAoC,iBAAiB,UAAU,aAAa,mBAAmB,uBAAuB,0CAA0C,YAAY,gBAAgB,oCAAoC,6HAA6H,mBAAmB,mBAAmB,2DAA2D,0BAA0B,wDAAwD,gDAAgD,iFAAiF,UAAU,yEAAyE,UAAU,kEAAkE,eAAe,+BAA+B,cAAc,kCAAkC,kBAAkB,mBAAmB,wBAAwB,YAAY,kBAAkB,UAAU,WAAW,oBAAoB,yBAAyB,4BAA4B,iBAAiB,qBAAqB,eAAe,4BAA4B,UAAU,0BAA0B,kBAAkB,6CAA6C,gBAAgB,iCAAiC,eAAe,WAAW,YAAY,cAAc,2BAA2B,gBAAgB,oCAAoC,oCAAoC,qCAAqC,eAAe,gBAAgB,2DAA2D,aAAa,mBAAmB,uBAAuB,8BAA8B,WAAW,YAAY,eAAe,yBAAyB,SAAS,UAAU,kBAAkB,WAAW,qBAAqB,wBAAwB,eAAe,gBAAgB,oCAAoC,kBAAkB,WAAW,cAAc,iEAAiE,eAAe,2BAA2B,mFAAmF,mBAAmB,+BAA+B,0FAA0F,YAAY,eAAe,2BAA2B,aAAa,uBAAuB,mBAAmB,WAAW,YAAY,kBAAkB,UAAU,SAAS,mBAAmB,iDAAiD,wBAAwB,UAAU,SAAS,QAAQ,gCAAgC,WAAW,YAAY,eAAe,iBAAiB,uBAAuB,eAAe,wEAAwE,4BAA4B,6BAA6B,cAAc,kBAAkB,YAAY,WAAW,2CAA2C,mDAAmD,qBAAqB,kBAAkB,oDAAoD,+BAA+B,4BAA4B,YAAY,WAAW,UAAU,WAAW,oCAAoC,wBAAwB,yBAAyB,iCAAiC,oBAAoB,iBAAiB,eAAe,eAAe,gCAAgC,iBAAiB,0EAA0E,mBAAmB,4CAA4C,UAAU,yCAAyC,sBAAsB,2CAA2C,sBAAsB,kCAAkC,sEAAsE,6CAA6C,sBAAsB,qCAAqC,2DAA2D,oBAAoB,6CAA6C,wBAAwB,8CAA8C,kCAAkC,qCAAqC,yBAAyB,oCAAoC,oBAAoB,+BAA+B,0CAA0C,4CAA4C,oCAAoC,GAAG,0BAA0B,4BAA4B,GAAG,0BAA0B,6BAA6B,kBAAkB,MAAM,OAAO,WAAW,YAAY,gDAAgD,wCAAwC,8DAA8D,wBAAwB,4BAA4B,wBAAwB,mBAAmB,UAAU,0BAA0B,wBAAwB,UAAU,sCAAsC,6CAA6C,qCAAqC,oCAAoC,wEAAwE,gEAAgE,sCAAsC,mBAAmB,oCAAoC,sBAAsB,gDAAgD,2FAA2F,mFAAmF,8CAA8C,8FAA8F,sFAAsF,uBAAuB,gDAAgD,+CAA+C,kBAAkB,6BAA6B,6BAA6B,wBAAwB,UAAU,2BAA2B,6BAA6B,6BAA6B,UAAU,uCAAuC,wEAAwE,gEAAgE,qCAAqC,+EAA+E,uEAAuE,uCAAuC,wBAAwB,UAAU,qCAAqC,8BAA8B,UAAU,iDAAiD,0FAA0F,kFAAkF,+CAA+C,sGAAsG,8FAA8F,qCAAqC,GAAG,qBAAqB,KAAK,oBAAoB,6BAA6B,GAAG,qBAAqB,KAAK,oBAAoB,+CAA+C,GAAG,mBAAmB,KAAK,sBAAsB,uCAAuC,GAAG,mBAAmB,KAAK,sBAAsB,gDAAgD,GAAG,sBAAsB,KAAK,oBAAoB,wCAAwC,GAAG,sBAAsB,KAAK,oBAAoB,sCAAsC,GAAG,6BAA6B,KAAK,yBAAyB,8BAA8B,GAAG,6BAA6B,KAAK,yBAAyB,uCAAuC,GAAG,wBAAwB,KAAK,+BAA+B,+BAA+B,GAAG,wBAAwB,KAAK,+BAA+B,gDAAgD,GAAG,wBAAwB,KAAK,8BAA8B,wCAAwC,GAAG,wBAAwB,KAAK,8BAA8B,iDAAiD,GAAG,8BAA8B,KAAK,yBAAyB,yCAAyC,GAAG,8BAA8B,KAAK,yBAAyB,KAAK,kBAAkB,kBAAkB,sBAAsB,aAAa,sBAAsB,uBAAuB,4BAA4B,mDAAmD,iDAAiD,iBAAiB,+BAA+B,WAAW,gCAAgC,OAAO,kBAAkB,UAAU,eAAe,aAAa,8BAA8B,mBAAmB,QAAQ,0BAA0B,mBAAmB,gBAAgB,uBAAuB,cAAc,WAAW,WAAW,gCAAgC,mBAAmB,+BAA+B,QAAQ,sBAAsB,uBAAuB,gBAAgB,iBAAiB,yBAAyB,iBAAiB,2BAA2B,cAAc,kCAAkC,cAAc,kBAAkB,QAAQ,kBAAkB,oBAAoB,0CAA0C,kBAAkB,UAAU,iBAAiB,cAAc,kCAAkC,oBAAoB,qBAAqB,oEAAoE,kBAAkB,eAAe,eAAe,gBAAgB,0CAA0C,eAAe,oBAAoB,4CAA4C,sBAAsB,sBAAsB,qBAAqB,eAAe,YAAY,uCAAuC,eAAe,4BAA4B,SAAS,qBAAqB,UAAU,cAAc,yBAAyB,6CAA6C,6BAA6B,iBAAiB,kCAAkC,mBAAmB,uBAAuB,QAAQ,oBAAoB,aAAa,WAAW,sBAAsB,uBAAuB,6BAA6B,oBAAoB,WAAW,iBAAiB,sBAAsB,uBAAuB,uBAAuB,eAAe,2CAA2C,mDAAmD,cAAc,YAAY,eAAe,6BAA6B,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,WAAW,aAAa,mEAAmE,4BAA4B,sBAAsB,uBAAuB,sBAAsB,oBAAoB,YAAY,qBAAqB,aAAa,kCAAkC,cAAc,oDAAoD,oBAAoB,gBAAgB,gBAAgB,gCAAgC,6BAA6B,QAAQ,4BAA4B,0BAA0B,eAAe,oBAAoB,+CAA+C,UAAU,mBAAmB,2FAA2F,yEAAyE,mBAAmB,UAAU,8BAA8B,2BAA2B,yBAAyB,8EAA8E,gBAAgB,2BAA2B,uBAAuB,UAAU,mBAAmB,uCAAuC,gBAAgB,oBAAoB,aAAa,wCAAwC,oBAAoB,uBAAuB,WAAW,sBAAsB,yBAAyB,sCAAsC,kBAAkB,cAAc,2BAA2B,6BAA6B,YAAY,gBAAgB,oCAAoC,mBAAmB,8CAA8C,4CAA4C,uFAAuF,yBAAyB,sCAAsC,WAAW,8CAA8C,qBAAqB,oDAAoD,gBAAgB,kBAAkB,WAAW,gCAAgC,8CAA8C,cAAc,qCAAqC,gBAAgB,kBAAkB,sDAAsD,iBAAiB,WAAW,aAAa,mBAAmB,uBAAuB,4EAA4E,aAAa,mBAAmB,sCAAsC,YAAY,aAAa,aAAa,mBAAmB,uBAAuB,kBAAkB,oFAAoF,eAAe,WAAW,gFAAgF,eAAe,8KAA8K,8CAA8C,sCAAsC,WAAW,YAAY,sBAAsB,kBAAkB,8DAA8D,sDAAsD,iBAAiB,8KAA8K,8CAA8C,sCAAsC,WAAW,YAAY,sBAAsB,kBAAkB,8DAA8D,sDAAsD,iBAAiB,eAAe,2BAA2B,mBAAmB,uFAAuF,6BAA6B,0BAA0B,uFAAuF,6BAA6B,0BAA0B,mCAAmC,KAAK,aAAa,IAAI,WAAW,GAAG,cAAc,2BAA2B,KAAK,aAAa,IAAI,WAAW,GAAG,cAAc,SAAS,iBAAiB,kBAAkB,yBAAyB,iDAAiD,cAAc,UAAU,iBAAiB,yBAAyB,uDAAuD,+BAA+B,mCAAmC,iBAAiB,+CAA+C,wCAAwC,oDAAoD,kDAAkD,qDAAqD,6BAA6B,0DAA0D,eAAe,UAAU,oDAAoD,iBAAiB,2CAA2C,eAAe,iBAAiB,kBAAkB,oBAAoB,gCAAgC,qBAAqB,2BAA2B,kBAAkB,MAAM,QAAQ,SAAS,OAAO,oBAAoB,gBAAgB,UAAU,iBAAiB,aAAa,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kCAAkC,cAAc,kBAAkB,oBAAoB,8BAA8B,qBAAqB,UAAU,aAAa,mBAAmB,kBAAkB,kBAAkB,2BAA2B,4BAA4B,aAAa,mBAAmB,uBAAuB,2BAA2B,kBAAkB,2BAA2B,6BAA6B,8BAA8B,4BAA4B,UAAU,+CAA+C,UAAU,iDAAiD,iEAAiE,6BAA6B,8BAA8B,sBAAsB,uBAAuB,SAAS,WAAW,YAAY,UAAU,iBAAiB,yBAAyB,6BAA6B,+BAA+B,gCAAgC,mCAAmC,6BAA6B,SAAS,iCAAiC,gBAAgB,2BAA2B,kBAAkB,0BAA0B,6BAA6B,uDAAuD,wDAAwD,sBAAsB,6EAA6E,kCAAkC,yCAAyC,gBAAgB,yBAAyB,yCAAyC,eAAe,kBAAkB,yBAAyB,2BAA2B,2BAA2B,2BAA2B,eAAe,uBAAuB,YAAY,kBAAkB,MAAM,QAAQ,SAAS,OAAO,gDAAgD,sBAAsB,2BAA2B,UAAU,iDAAiD,2BAA2B,UAAU,2DAA2D,+CAA+C,2CAA2C,6FAA6F,yFAAyF,sDAAsD,iDAAiD,+CAA+C,sEAAsE,wDAAwD,sDAAsD,iCAAiC,4BAA4B,uBAAuB,yBAAyB,qBAAqB,kCAAkC,8BAA8B,gBAAgB,oCAAoC,4BAA4B,qBAAqB,kBAAkB,iBAAiB,qCAAqC,mBAAmB,0BAA0B,oBAAoB,uEAAuE,aAAa,2BAA2B,wBAAwB,yBAAyB,0BAA0B,UAAU,kCAAkC,+BAA+B,gCAAgC,wCAAwC,oDAAoD,aAAa,mBAAmB,uBAAuB,kBAAkB,kBAAkB,oDAAoD,iCAAiC,OAAO,0BAA0B,MAAM,QAAQ,SAAS,OAAO,eAAe,UAAU,gCAAgC,SAAS,iBAAiB,gBAAgB,UAAU,kBAAkB,uCAAuC,4BAA4B,oDAAoD,yBAAyB,iDAAiD,sDAAsD,4DAA4D,cAAc,aAAa,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,UAAU,6BAA6B,iBAAiB,8BAA8B,gBAAgB,cAAc,UAAU,mBAAmB,uBAAuB,UAAU,+BAA+B,+CAA+C,+BAA+B,+CAA+C,iBAAiB,gBAAgB,kBAAkB,mBAAmB,sBAAsB,sCAAsC,aAAa,kDAAkD,mCAAmC,2BAA2B,qDAAqD,mFAAmF,aAAa,sBAAsB,gBAAgB,YAAY,wCAAwC,gBAAgB,+BAA+B,gBAAgB,oCAAoC,gBAAgB,YAAY,aAAa,UAAU,oBAAoB,cAAc,cAAc,aAAa,mBAAmB,mBAAmB,cAAc,YAAY,cAAc,aAAa,sBAAsB,gBAAgB,wBAAwB,kBAAkB,eAAe,aAAa,sBAAsB,yBAAyB,qBAAqB,mBAAmB,2BAA2B,2BAA2B,6BAA6B,wBAAwB,sBAAsB,oBAAoB,gBAAgB,oCAAoC,cAAc,yBAAyB,kBAAkB,kBAAkB,gBAAgB,eAAe,mBAAmB,uBAAuB,yBAAyB,iBAAiB,uBAAuB,mBAAmB,gBAAgB,+BAA+B,gBAAgB,4BAA4B,sCAAsC,kBAAkB,YAAY,WAAW,2BAA2B,iBAAiB,eAAe,4BAA4B,kBAAkB,iBAAiB,kBAAkB,gBAAgB,SAAS,iBAAiB,oBAAoB,eAAe,gBAAgB,4BAA4B,kBAAkB,wBAAwB,aAAa,wBAAwB,kBAAkB,kCAAkC,YAAY,gBAAgB,yBAAyB,gBAAgB,8EAA8E,sBAAsB,+BAA+B,cAAc,eAAe,8BAA8B,mBAAmB,kBAAkB,uBAAuB,kBAAkB,4CAA4C,WAAW,YAAY,eAAe,mBAAmB,mBAAmB,gBAAgB,mBAAmB,yBAAyB,8BAA8B,iBAAiB,qBAAqB,8BAA8B,OAAO,oBAAoB,SAAS,gBAAgB,kBAAkB,gBAAgB,oCAAoC,8BAA8B,gBAAgB,gBAAgB,WAAW,mBAAmB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,6BAA6B,kBAAkB,8BAA8B,WAAW,gBAAgB,cAAc,oCAAoC,eAAe,mBAAmB,8EAA8E,UAAU,oCAAoC,kBAAkB,mCAAmC,UAAU,4BAA4B,UAAU,wBAAwB,gDAAgD,UAAU,8CAA8C,kBAAkB,kDAAkD,gBAAgB,cAAc,oDAAoD,kBAAkB,gEAAgE,kBAAkB,kHAAkH,oBAAoB,iBAAiB,WAAW,YAAY,iEAAiE,aAAa,uBAAuB,cAAc,qEAAqE,sBAAsB,mBAAmB,2DAA2D,kBAAkB,sBAAsB,gBAAgB,uEAAuE,iBAAiB,wCAAwC,gBAAgB,4CAA4C,eAAe,gBAAgB,eAAe,cAAc,iDAAiD,mBAAmB,WAAW,eAAe,gBAAgB,uBAAuB,gBAAgB,gDAAgD,YAAY,WAAW,eAAe,mBAAmB,iBAAiB,iBAAiB,mCAAmC,aAAa,sBAAsB,kBAAkB,mBAAmB,gBAAgB,4DAA4D,aAAa,0CAA0C,kBAAkB,OAAO,QAAQ,2BAA2B,0BAA0B,aAAa,sBAAsB,mBAAmB,6BAA6B,6BAA6B,2BAA2B,0DAA0D,oBAAoB,yBAAyB,kBAAkB,gBAAgB,oCAAoC,sBAAsB,2CAA2C,sBAAsB,+BAA+B,aAAa,gBAAgB,gBAAgB,8BAA8B,2BAA2B,sBAAsB,uBAAuB,gBAAgB,sBAAsB,mBAAmB,+BAA+B,2BAA2B,oBAAoB,qBAAqB,gCAAgC,gBAAgB,oCAAoC,qCAAqC,mBAAmB,4BAA4B,aAAa,mBAAmB,cAAc,oBAAoB,oBAAoB,0CAA0C,UAAU,gBAAgB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,mBAAmB,wBAAwB,SAAS,kBAAkB,gBAAgB,oCAAoC,mBAAmB,+BAA+B,oCAAoC,6BAA6B,yCAAyC,kBAAkB,cAAc,2BAA2B,iDAAiD,yBAAyB,WAAW,oBAAoB,YAAY,iBAAiB,oCAAoC,cAAc,iCAAiC,gBAAgB,iBAAiB,YAAY,UAAU,6BAA6B,iBAAiB,iBAAiB,8BAA8B,mBAAmB,cAAc,gBAAgB,6BAA6B,kBAAkB,sCAAsC,cAAc,aAAa,qCAAqC,0CAA0C,sCAAsC,sCAAsC,iDAAiD,gBAAgB,kBAAkB,qCAAqC,WAAW,8BAA8B,YAAY,+BAA+B,kBAAkB,oBAAoB,eAAe,kBAAkB,0CAA0C,qCAAqC,mBAAmB,2CAA2C,mBAAmB,2CAA2C,mDAAmD,mBAAmB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,oCAAoC,kBAAkB,0BAA0B,oDAAoD,SAAS,oDAAoD,WAAW,iCAAiC,gBAAgB,eAAe,uBAAuB,gCAAgC,gBAAgB,oCAAoC,eAAe,kCAAkC,QAAQ,kBAAkB,gDAAgD,gBAAgB,aAAa,yCAAyC,aAAa,8BAA8B,mBAAmB,kEAAkE,eAAe,gBAAgB,oCAAoC,qCAAqC,wBAAwB,qCAAqC,yBAAyB,4FAA4F,kBAAkB,uCAAuC,eAAe,qBAAqB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,sCAAsC,aAAa,qCAAqC,WAAW,uBAAuB,gDAAgD,oBAAoB,WAAW,YAAY,eAAe,cAAc,kCAAkC,aAAa,uBAAuB,mBAAmB,yDAAyD,UAAU,oDAAoD,sBAAsB,+DAA+D,WAAW,gCAAgC,uDAAuD,WAAW,8BAA8B,kBAAkB,oCAAoC,iDAAiD,8BAA8B,8BAA8B,eAAe,mBAAmB,cAAc,0CAA0C,8BAA8B,iBAAiB,wCAAwC,eAAe,iCAAiC,gBAAgB,YAAY,2BAA2B,0CAA0C,iCAAiC,gBAAgB,YAAY,4BAA4B,iDAAiD,UAAU,iDAAiD,SAAS,mCAAmC,mBAAmB,gBAAgB,YAAY,0CAA0C,mCAAmC,cAAc,mBAAmB,yCAAyC,gBAAgB,oCAAoC,eAAe,kBAAkB,0CAA0C,yCAAyC,mBAAmB,6CAA6C,kBAAkB,gBAAgB,oCAAoC,eAAe,WAAW,YAAY,gBAAgB,iDAAiD,yBAAyB,uCAAuC,gBAAgB,oCAAoC,sBAAsB,2CAA2C,0BAA0B,oCAAoC,mBAAmB,0CAA0C,oCAAoC,oBAAoB,kCAAkC,aAAa,uBAAuB,qBAAqB,0CAA0C,kCAAkC,oBAAoB,+CAA+C,WAAW,qDAAqD,kBAAkB,4CAA4C,kBAAkB,yDAAyD,mBAAmB,6BAA6B,mBAAmB,0CAA0C,6BAA6B,YAAY,YAAY,iBAAiB,oCAAoC,4BAA4B,UAAU,gCAAgC,SAAS,0DAA0D,YAAY,yDAAyD,cAAc,6GAA6G,oBAAoB,qBAAqB,0CAA0C,kBAAkB,eAAe,aAAa,UAAU,UAAU,4BAA4B,0CAA0C,0CAA0C,eAAe,cAAc,4BAA4B,cAAc,kCAAkC,gBAAgB,oCAAoC,sBAAsB,0CAA0C,yBAAyB,8EAA8E,sBAAsB,yCAAyC,sBAAsB,6BAA6B,mBAAmB,kBAAkB,gBAAgB,gCAAgC,WAAW,8BAA8B,SAAS,WAAW,gCAAgC,YAAY,gBAAgB,kBAAkB,gCAAgC,iBAAiB,6BAA6B,cAAc,kBAAkB,eAAe,0CAA0C,6BAA6B,uBAAuB,4BAA4B,YAAY,4DAA4D,YAAY,gBAAgB,aAAa,WAAW,mBAAmB,cAAc,sCAAsC,kBAAkB,qBAAqB,WAAW,mBAAmB,+BAA+B,0CAA0C,sCAAsC,wBAAwB,mCAAmC,wBAAwB,wCAAwC,2BAA2B,6BAA6B,gCAAgC,mCAAmC,aAAa,qCAAqC,yBAAyB,2BAA2B,4BAA4B,gCAAgC,4DAA4D,YAAY,kBAAkB,oBAAoB,oCAAoC,eAAe,WAAW,sCAAsC,WAAW,WAAW,iBAAiB,mBAAmB,+BAA+B,wBAAwB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,yCAAyC,gBAAgB,oCAAoC,mBAAmB,wBAAwB,oCAAoC,gBAAgB,oCAAoC,uBAAuB,mBAAmB,+BAA+B,iDAAiD,cAAc,kCAAkC,kBAAkB,mBAAmB,+BAA+B,yCAAyC,gBAAgB,kBAAkB,+BAA+B,yBAAyB,sBAAsB,qBAAqB,iBAAiB,sDAAsD,YAAY,aAAa,kBAAkB,cAAc,2CAA2C,mCAAmC,eAAe,kDAAkD,kBAAkB,kBAAkB,8CAA8C,mBAAmB,4CAA4C,WAAW,0BAA0B,WAAW,yBAAyB,cAAc,MAAM,WAAW,YAAY,WAAW,mBAAmB,0CAA0C,gBAAgB,yCAAyC,YAAY,mcAAmc,UAAU,gCAAgC,WAAW,qCAAqC,YAAY,8BAA8B,WAAW,iCAAiC,wBAAwB,kBAAkB,aAAa,kBAAkB,MAAM,QAAQ,SAAS,OAAO,WAAW,WAAW,sBAAsB,0BAA0B,eAAe,YAAY,gBAAgB,oCAAoC,kBAAkB,eAAe,eAAe,4DAA4D,UAAU,wJAAwJ,mDAAmD,iDAAiD,cAAc,aAAa,mBAAmB,kBAAkB,eAAe,kBAAkB,UAAU,oBAAoB,2BAA2B,mBAAmB,qCAAqC,WAAW,6CAA6C,sBAAsB,8BAA8B,oEAAoE,qDAAqD,mDAAmD,yHAAyH,UAAU,yGAAyG,6FAA6F,yFAAyF,6EAA6E,wDAAwD,4FAA4F,wBAAwB,mBAAmB,+EAA+E,uEAAuE,2GAA2G,wCAAwC,yBAAyB,aAAa,sCAAsC,iBAAiB,oCAAoC,gDAAgD,mBAAmB,oCAAoC,uDAAuD,oBAAoB,iCAAiC,2BAA2B,cAAc,+BAA+B,UAAU,YAAY,WAAW,YAAY,sBAAsB,mBAAmB,kBAAkB,sBAAsB,UAAU,sBAAsB,kBAAkB,MAAM,QAAQ,SAAS,OAAO,aAAa,mBAAmB,sBAAsB,WAAW,4BAA4B,YAAY,WAAW,UAAU,SAAS,UAAU,mBAAmB,eAAe,iBAAiB,kBAAkB,WAAW,YAAY,WAAW,sBAAsB,2EAA2E,mDAAmD,iDAAiD,mBAAmB,uBAAuB,0BAA0B,iBAAiB,mBAAmB,aAAa,sBAAsB,kBAAkB,gDAAgD,+DAA+D,UAAU,WAAW,mBAAmB,eAAe,oBAAoB,kBAAkB,gBAAgB,uBAAuB,qBAAqB,sCAAsC,WAAW,kBAAkB,kBAAkB,aAAa,mBAAmB,gBAAgB,mCAAmC,2BAA2B,gBAAgB,oCAAoC,UAAU,iCAAiC,eAAe,yCAAyC,6FAA6F,yFAAyF,gCAAgC,0BAA0B,2BAA2B,oBAAoB,qBAAqB,cAAc,6CAA6C,iCAAiC,mCAAmC,eAAe,mBAAmB,uBAAuB,gBAAgB,yHAAyH,8DAA8D,kGAAkG,2HAA2H,wBAAwB,wCAAwC,SAAS,oDAAoD,6BAA6B,4BAA4B,8BAA8B,8BAA8B,mCAAmC,yBAAyB,4CAA4C,WAAW,mCAAmC,yBAAyB,UAAU,YAAY,8BAA8B,WAAW,YAAY,gBAAgB,kBAAkB,YAAY,kBAAkB,QAAQ,SAAS,OAAO,cAAc,wGAAwG,2HAA2H,mBAAmB,cAAc,sBAAsB,gBAAgB,6BAA6B,cAAc,cAAc,wBAAwB,cAAc,mBAAmB,gBAAgB,yBAAyB,gBAAgB,oCAAoC,qDAAqD,mBAAmB,+BAA+B,mBAAmB,uBAAuB,gBAAgB,4BAA4B,kBAAkB,cAAc,qCAAqC,oBAAoB,aAAa,mBAAmB,8BAA8B,kBAAkB,eAAe,kBAAkB,UAAU,mBAAmB,UAAU,WAAW,mCAAmC,sCAAsC,gDAAgD,qDAAqD,wCAAwC,8CAA8C,oDAAoD,wCAAwC,6CAA6C,2EAA2E,yBAAyB,qDAAqD,uBAAuB,kDAAkD,yDAAyD,kEAAkE,sEAAsE,gEAAgE,mEAAmE,+DAA+D,mEAAmE,6BAA6B,UAAU,wBAAwB,mBAAmB,oBAAoB,oCAAoC,sBAAsB,iBAAiB,cAAc,qBAAqB,mBAAmB,eAAe,gBAAgB,yCAAyC,mBAAmB,uBAAuB,gBAAgB,6CAA6C,cAAc,wCAAwC,kBAAkB,aAAa,WAAW,aAAa,mBAAmB,mBAAmB,sBAAsB,gBAAgB,cAAc,UAAU,cAAc,eAAe,8CAA8C,YAAY,kBAAkB,MAAM,QAAQ,SAAS,OAAO,uFAAuF,4EAA4E,kBAAkB,cAAc,eAAe,sHAAsH,UAAU,2LAA2L,mDAAmD,iDAAiD,wEAAwE,aAAa,mBAAmB,8BAA8B,yBAAyB,kBAAkB,QAAQ,cAAc,OAAO,UAAU,qCAAqC,MAAM,YAAY,yBAAyB,qBAAqB,oBAAoB,0DAA0D,aAAa,cAAc,iBAAiB,+CAA+C,gBAAgB,oCAAoC,uFAAuF,mBAAmB,uBAAuB,gBAAgB,4EAA4E,WAAW,gBAAgB,wCAAwC,cAAc,yCAAyC,cAAc,mBAAmB,qCAAqC,cAAc,iCAAiC,oCAAoC,cAAc,gCAAgC,yBAAyB,mBAAmB,gBAAgB,cAAc,oCAAoC,kBAAkB,sBAAsB,YAAY,oBAAoB,yCAAyC,aAAa,eAAe,2BAA2B,kKAAkK,YAAY,+CAA+C,aAAa,8GAA8G,WAAW,mNAAmN,YAAY,cAAc,iOAAiO,YAAY,cAAc,iBAAiB,2RAA2R,UAAU,mCAAmC,gBAAgB,UAAU,gBAAgB,cAAc,qCAAqC,WAAW,mCAAmC,4CAA4C,cAAc,qCAAqC,0CAA0C,oBAAoB,gCAAgC,kBAAkB,yEAAyE,gBAAgB,qBAAqB,wEAAwE,YAAY,+EAA+E,8BAA8B,gBAAgB,aAAa,+DAA+D,aAAa,gEAAgE,aAAa,sGAAsG,aAAa,2BAA2B,gBAAgB,2FAA2F,eAAe,+CAA+C,iCAAiC,+DAA+D,aAAa,0BAA0B,sBAAsB,gCAAgC,aAAa,uJAAuJ,sCAAsC,wCAAwC,aAAa,4DAA4D,QAAQ,gFAAgF,4BAA4B,gDAAgD,oEAAoE,0CAA0C,8DAA8D,iEAAiE,sDAAsD,mDAAmD,kBAAkB,sCAAsC,kBAAkB,MAAM,0BAA0B,8CAA8C,SAAS,eAAe,mCAAmC,yBAAyB,4CAA4C,gBAAgB,8CAA8C,eAAe,cAAc,qEAAqE,mDAAmD,iDAAiD,qDAAqD,kBAAkB,YAAY,MAAM,QAAQ,SAAS,OAAO,oCAAoC,4BAA4B,0BAA0B,sBAAsB,sHAAsH,UAAU,kJAAkJ,UAAU,4EAA4E,mDAAmD,iDAAiD,wFAAwF,oGAAoG,gGAAgG,8DAA8D,qBAAqB,sDAAsD,aAAa,+BAA+B,kBAAkB,iBAAiB,iBAAiB,wBAAwB,qBAAqB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,iCAAiC,oCAAoC,kDAAkD,6BAA6B,yCAAyC,qDAAqD,gCAAgC,4CAA4C,6BAA6B,YAAY,wBAAwB,mBAAmB,kCAAkC,2BAA2B,qBAAqB,0CAA0C,oBAAoB,qCAAqC,YAAY,aAAa,iBAAiB,UAAU,kCAAkC,qBAAqB,SAAS,6BAA6B,gCAAgC,4CAA4C,iCAAiC,mBAAmB,mBAAmB,YAAY,SAAS,8BAA8B,4BAA4B,wBAAwB,gBAAgB,sDAAsD,sCAAsC,cAAc,6BAA6B,wDAAwD,sBAAsB,2CAA2C,6BAA6B,SAAS,aAAa,mBAAmB,0CAA0C,2BAA2B,oCAAoC,cAAc,gBAAgB,8BAA8B,sBAAsB,sCAAsC,gDAAgD,aAAa,cAAc,SAAS,QAAQ,2BAA2B,YAAY,eAAe,gBAAgB,gBAAgB,gCAAgC,yBAAyB,yBAAyB,0CAA0C,yBAAyB,aAAa,sBAAsB,SAAS,0CAA0C,sBAAsB,gBAAgB,2BAA2B,gBAAgB,0CAA0C,2BAA2B,gBAAgB,WAAW,gBAAgB,yEAAyE,cAAc,wBAAwB,aAAa,sBAAsB,kBAAkB,gBAAgB,cAAc,0CAA0C,OAAO,gBAAgB,WAAW,sCAAsC,qDAAqD,cAAc,4BAA4B,gBAAgB,eAAe,cAAc,kBAAkB,sCAAsC,sBAAsB,sCAAsC,iDAAiD,aAAa,UAAU,cAAc,aAAa,sBAAsB,WAAW,sCAAsC,iDAAiD,cAAc,0CAA0C,0CAA0C,iBAAiB,uDAAuD,gBAAgB,2BAA2B,iBAAiB,oBAAoB,gDAAgD,aAAa,cAAc,qBAAqB,0CAA0C,gDAAgD,YAAY,aAAa,sBAAsB,8BAA8B,cAAc,WAAW,eAAe,gBAAgB,aAAa,0BAA0B,sDAAsD,mBAAmB,gCAAgC,kBAAkB,aAAa,0BAA0B,yBAAyB,uBAAuB,wBAAwB,aAAa,uBAAuB,mBAAmB,oCAAoC,eAAe,WAAW,UAAU,oCAAoC,WAAW,YAAY,+CAA+C,aAAa,4BAA4B,2BAA2B,gBAAgB,cAAc,6BAA6B,gBAAgB,iBAAiB,mBAAmB,+BAA+B,gBAAgB,gCAAgC,iBAAiB,yBAAyB,gBAAgB,mBAAmB,0CAA0C,yBAAyB,oBAAoB,uBAAuB,cAAc,0CAA0C,qBAAqB,kBAAkB,0BAA0B,gBAAgB,mBAAmB,wBAAwB,qBAAqB,sCAAsC,UAAU,mDAAmD,iDAAiD,2BAA2B,2BAA2B,8BAA8B,aAAa,mBAAmB,uBAAuB,kDAAkD,eAAe,YAAY,aAAa,eAAe,gCAAgC,6CAA6C,2CAA2C,gCAAgC,4CAA4C,yBAAyB,aAAa,YAAY,aAAa,wCAAwC,0CAA0C,QAAQ,0BAA0B,WAAW,gBAAgB,kBAAkB,gBAAgB,YAAY,gBAAgB,0CAA0C,yBAAyB,WAAW,wBAAwB,WAAW,0CAA0C,2BAA2B,wBAAwB,yBAAyB,WAAW,0BAA0B,wBAAwB,yBAAyB,YAAY,kBAAkB,gBAAgB,gBAAgB,0BAA0B,cAAc,0DAA0D,sBAAsB,WAAW,gBAAgB,YAAY,gBAAgB,kBAAkB,OAAO,MAAM,UAAU,2CAA2C,YAAY,mBAAmB,uBAAuB,sBAAsB,sBAAsB,mBAAmB,qBAAqB,kCAAkC,yBAAyB,YAAY,aAAa,sBAAsB,cAAc,gDAAgD,8DAA8D,0EAA0E,UAAU,YAAY,WAAW,SAAS,UAAU,0CAA0C,UAAU,gBAAgB,uBAAuB,mCAAmC,YAAY,eAAe,yBAAyB,2BAA2B,iBAAiB,8CAA8C,6BAA6B,6BAA6B,KAAK,wFAAwF,KAAK,eAAe,mCAAmC,8BAA8B,0CAA0C,KAAK,sBAAsB,8CAA8C,WAAW,gCAAgC,iBAAiB,wEAAwE,gEAAgE,sEAAsE,8DAA8D,2BAA2B,0EAA0E,kEAAkE,wEAAwE,gEAAgE,gCAAgC,GAAG,oBAAoB,KAAK,qBAAqB,wBAAwB,GAAG,oBAAoB,KAAK,qBAAqB,iCAAiC,GAAG,oBAAoB,KAAK,qBAAqB,yBAAyB,GAAG,oBAAoB,KAAK,qBAAqB,EAAE,cAAc,wBAAwB,2CAA2C,mJAAmJ,mCAAmC,0CAA0C,kBAAkB,qCAAqC,kCAAkC,OAAO,gBAAgB,WAAW,cAAc,iBAAiB,YAAY,0CAA0C,gBAAgB,yBAAyB,WAAW,cAAc,kBAAkB,gBAAgB,oCAAoC,GAAG,eAAe,mBAAmB,iBAAiB,0CAA0C,GAAG,eAAe,kBAAkB,6BAA6B,oBAAoB,iCAAiC,WAAW,gCAAgC,6BAA6B,gCAAgC,2BAA2B,+CAA+C,eAAe,wBAAwB,qFAAqF,kBAAkB,kBAAkB,QAAQ,UAAU,cAAc,kCAAkC,iBAAiB,QAAQ,yBAAyB,qCAAqC,0BAA0B,yCAAyC,2CAA2C,eAAe,yBAAyB,sCAAsC,mDAAmD,0CAA0C,4CAA4C,4CAA4C,yBAAyB,YAAY,8BAA8B,aAAa,0BAA0B,sBAAsB,uBAAuB,sBAAsB,qBAAqB,WAAW,WAAW,YAAY,kBAAkB,QAAQ,SAAS,gCAAgC,2BAA2B,eAAe,4BAA4B,6CAA6C,GAAG,UAAU,GAAG,YAAY,qCAAqC,GAAG,UAAU,GAAG,YAAY,mCAAmC,GAAG,UAAU,GAAG,WAAW,2BAA2B,GAAG,UAAU,GAAG,WAAW,oCAAoC,GAAG,UAAU,GAAG,WAAW,4BAA4B,GAAG,UAAU,GAAG,WAAW,6CAA6C,GAAG,UAAU,KAAK,WAAW,qCAAqC,GAAG,UAAU,KAAK,WAAW,8CAA8C,GAAG,UAAU,KAAK,WAAW,sCAAsC,GAAG,UAAU,KAAK,WAAW,oDAAoD,GAAG,UAAU,IAAI,UAAU,IAAI,UAAU,GAAG,WAAW,4CAA4C,GAAG,UAAU,IAAI,UAAU,IAAI,UAAU,GAAG,WAAW,OAAO,eAAe,SAAS,QAAQ,gCAAgC,mBAAmB,iCAAiC,WAAW,eAAe,mBAAmB,sEAAsE,8DAA8D,UAAU,kBAAkB,SAAS,cAAc,GAAG,WAAW,YAAY,6BAA6B,yCAAyC,SAAS,qBAAqB,cAAc,WAAW,gCAAgC,gBAAgB,oCAAoC,qBAAqB,gBAAgB,aAAa,kBAAkB,kBAAkB,eAAe,gBAAgB,oBAAoB,eAAe,gBAAgB,WAAW,YAAY,6CAA6C,gFAAgF,mEAAmE,qDAAqD,qCAAqC,yEAAyE,uDAAuD,8BAA8B,kBAAkB,eAAe,iBAAiB,QAAQ,SAAS,4CAA4C,UAAU,WAAW,iCAAiC,kBAAkB,OAAO,MAAM,WAAW,YAAY,uBAAuB,cAAc,aAAa,cAAc,mBAAmB,kBAAkB,gBAAgB,mBAAmB,kBAAkB,WAAW,uBAAuB,OAAO,gBAAgB,sBAAsB,sCAAsC,UAAU,mBAAmB,aAAa,sBAAsB,eAAe,uDAAuD,sBAAsB,4BAA4B,UAAU,uBAAuB,mBAAmB,UAAU,mBAAmB,eAAe,mBAAmB,mBAAmB,eAAe,8BAA8B,cAAc,eAAe,gBAAgB,aAAa,iDAAiD,+EAA+E,2CAA2C,mDAAmD,uBAAuB,YAAY,WAAW,eAAe,cAAc,4BAA4B,kBAAkB,YAAY,cAAc,iBAAiB,YAAY,YAAY,aAAa,mBAAmB,kBAAkB,0CAA0C,YAAY,YAAY,cAAc,YAAY,qBAAqB,WAAW,YAAY,kBAAkB,WAAW,uBAAuB,eAAe,iBAAiB,0CAA0C,YAAY,kBAAkB,iEAAiE,UAAU,WAAW,0BAA0B,gCAAgC,0IAA0I,yBAAyB,oLAAoL,gCAAgC,4BAA4B,+CAA+C,2BAA2B,UAAU,WAAW,YAAY,qBAAqB,eAAe,gBAAgB,sBAAsB,uBAAuB,yBAAyB,sBAAsB,qBAAqB,iBAAiB,aAAa,YAAY,qBAAqB,iDAAiD,+BAA+B,cAAc,cAAc,oBAAoB,iBAAiB,kBAAkB,OAAO,QAAQ,kBAAkB,oBAAoB,gBAAgB,WAAW,aAAa,8CAA8C,iEAAiE,oBAAoB,8BAA8B,uEAAuE,2CAA2C,mDAAmD,mBAAmB,oBAAoB,UAAU,2CAA2C,mCAAmC,WAAW,iBAAiB,oBAAoB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,kBAAkB,0CAA0C,WAAW,kBAAkB,uBAAuB,WAAW,mBAAmB,kBAAkB,eAAe,cAAc,kCAAkC,eAAe,cAAc,kCAAkC,6BAA6B,GAAG,qBAAqB,WAAW,IAAI,qBAAqB,UAAU,KAAK,oBAAoB,qBAAqB,GAAG,qBAAqB,WAAW,IAAI,qBAAqB,UAAU,KAAK,oBAAoB,6BAA6B,KAAK,mBAAmB,WAAW,GAAG,qBAAqB,WAAW,qBAAqB,KAAK,mBAAmB,WAAW,GAAG,qBAAqB,WAAW,gFAAgF,gBAAgB,MAAM,WAAW,aAAa,qCAAqC,mBAAmB,gBAAgB,WAAW,SAAS,oBAAoB,kBAAkB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,iBAAiB,kBAAkB,OAAO,MAAM,WAAW,YAAY,oBAAoB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,OAAO,MAAM,QAAQ,SAAS,6DAA6D,uEAAuE,2CAA2C,gBAAgB,8BAA8B,UAAU,uCAAuC,0DAA0D,0CAA0C,+CAA+C,kBAAkB,oBAAoB,0BAA0B,kBAAkB,sCAAsC,kBAAkB,kCAAkC,kBAAkB,OAAO,MAAM,SAAS,QAAQ,wBAAwB,WAAW,gBAAgB,cAAc,kBAAkB,WAAW,YAAY,qEAAqE,2CAA2C,mDAAmD,eAAe,kBAAkB,MAAM,OAAO,oBAAoB,uBAAuB,6BAA6B,qBAAqB,yBAAyB,OAAO,MAAM,SAAS,QAAQ,kBAAkB,eAAe,gBAAgB,WAAW,YAAY,cAAc,kBAAkB,oBAAoB,wCAAwC,2DAA2D,mDAAmD,gBAAgB,qBAAqB,kBAAkB,kBAAkB,WAAW,YAAY,oEAAoE,kBAAkB,MAAM,QAAQ,SAAS,OAAO,+NAA+N,2DAA2D,mDAAmD,oOAAoO,4DAA4D,oDAAoD,aAAa,UAAU,eAAe,YAAY,sBAAsB,mBAAmB,WAAW,YAAY,eAAe,gBAAgB,aAAa,gBAAgB,kCAAkC,iBAAiB,mCAAmC,UAAU,oBAAoB,WAAW,YAAY,kBAAkB,kBAAkB,yBAAyB,kBAAkB,iEAAiE,+DAA+D,+DAA+D,mBAAmB,0CAA0C,QAAQ,YAAY,aAAa,sBAAsB,kBAAkB,YAAY,yCAAyC,YAAY,aAAa,mBAAmB,mBAAmB,QAAQ,oBAAoB,WAAW,cAAc,yBAAyB,8CAA8C,kBAAkB,2BAA2B,YAAY,kBAAkB,OAAO,MAAM,QAAQ,SAAS,iIAAiI,4BAA4B,qBAAqB,gCAAgC,4CAA4C,sBAAsB,sBAAsB,sCAAsC,2BAA2B,qBAAqB,8CAA8C,2DAA2D,gCAAgC,2BAA2B,2BAA2B,mBAAmB,8BAA8B,yBAAyB,kBAAkB,iBAAiB,0CAA0C,oBAAoB,uBAAuB,gCAAgC,yBAAyB,sBAAsB,qBAAqB,iBAAiB,GAAG,wBAAwB,2CAA2C,0BAA0B,YAAY,0CAA0C,0BAA0B,UAAU,OAAO,SAAS,eAAe,cAAc,UAAU,aAAa,gBAAgB,oBAAoB,kBAAkB,MAAM,WAAW,gBAAgB,UAAU,qBAAqB,aAAa,wBAAwB,2CAA2C,mDAAmD,sBAAsB,cAAc,aAAa,uBAAuB,kDAAkD,8BAA8B,mBAAmB,qBAAqB,2BAA2B,qBAAqB,kBAAkB,eAAe,oBAAoB,kBAAkB,eAAe,yBAAyB,sBAAsB,qBAAqB,iBAAiB,sBAAsB,eAAe,gBAAgB,kBAAkB,8CAA8C,kBAAkB,SAAS,QAAQ,cAAc,eAAe,kBAAkB,2CAA2C,mDAAmD,oBAAoB,qEAAqE,UAAU,mCAAmC,sDAAsD,UAAU,mCAAmC,kCAAkC,WAAW,YAAY,qBAAqB,SAAS,+FAA+F,2CAA2C,mDAAmD,mBAAmB,gCAAgC,gBAAgB,oCAAoC,aAAa,kBAAkB,qBAAqB,YAAY,qBAAqB,YAAY,sBAAsB,aAAa,qBAAqB,kBAAkB,yBAAyB,sBAAsB,aAAa,mBAAmB,wBAAwB,sBAAsB,uBAAuB,6BAA6B,8BAA8B,eAAe,cAAc,cAAc,eAAe,oBAAoB,YAAY,cAAc,cAAc,0BAA0B,yBAAyB,qCAAqC,uBAAuB,sBAAsB,kBAAkB,gBAAgB,oCAAoC,yBAAyB,gBAAgB,iBAAiB,cAAc,kBAAkB,gCAAgC,kBAAkB,8EAA8E,OAAO,QAAQ,mBAAmB,kBAAkB,8EAA8E,MAAM,SAAS,kBAAkB,kBAAkB,uCAAuC,MAAM,uCAAuC,QAAQ,uCAAuC,SAAS,uCAAuC,OAAO,gKAAgK,kBAAkB,mBAAmB,UAAU,gFAAgF,mBAAmB,gFAAgF,mBAAmB,wCAAwC,MAAM,QAAQ,wCAAwC,QAAQ,SAAS,wCAAwC,SAAS,OAAO,wCAAwC,MAAM,O","file":"main.18d052b0bbd55d76b776.css","sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:before,.no-transition:after{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}",":root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--messages-secondary-line-height: calc(var(--messages-secondary-text-size) + 4px);--line-height: 1.3125;--line-height-16: 21px;--line-height-14: 18px;--line-height-12: 16px;--font-size-16: 16px;--font-size-14: 14px;--font-size-12: 12px;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--menu-box-shadow: 0px 0px 10px var(--menu-box-shadow-color);--menu-background-color: rgba(var(--surface-color-rgb), .75);--menu-backdrop-filter: blur(50px);--font-monospace: \"Roboto Mono\", monospace;--font-weight-bold: 500;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color-rgb: 255, 255, 255;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--menu-box-shadow-color: rgba(0, 0, 0, .15);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--light-filled-primary-color: #eff6fd;--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--monospace-text-color: var(--danger-color);--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-primary-color: var(--primary-color);--light-filled-message-primary-color: var(--light-filled-primary-color);--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--light-filled-message-out-primary-color: #e1f9d2;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color-rgb: 33, 33, 33;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--light-filled-primary-color: #292830;--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--monospace-text-color: var(--primary-text-color);--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--light-filled-message-out-primary-color: #917fe3;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}@font-face{font-family:\"tgico\";src:url(\"assets/fonts/tgico.ttf?5o4186\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?5o4186\") format(\"woff\"),url(\"assets/fonts/tgico.svg?5o4186#tgico\") format(\"svg\");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=\" tgico-\"]:before,[class*=\" tgico-\"]:after{font-family:\"tgico\" !important;speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-flip:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-microphone_crossed:before{content:\"\"}.tgico-microphone_crossed_filled:before{content:\"\"}.tgico-microphone_filled:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-pip:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-rotate_left:before{content:\"\"}.tgico-rotate_right:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03FF}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:400;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03FF}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:\"Roboto Mono\";font-style:italic;font-weight:500;font-display:swap;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03FF}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:400;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03FF}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:\"Roboto Mono\";font-style:normal;font-weight:500;font-display:swap;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:\" \";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:rgba(255, 255, 255, .75);background-color:var(--menu-background-color);z-index:3;top:100%;padding:.3125rem 0;border-radius:10px;opacity:0;transform:scale(0.8) !important;transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:1rem;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);min-width:11.25rem;-webkit-user-select:none;-webkit-touch-callout:none}.btn-menu-old{padding:.5rem 0;background-color:#fff;background-color:var(--surface-color);-webkit-backdrop-filter:none;backdrop-filter:none;min-width:auto}.btn-menu-old .btn-menu-item{--padding-left: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;height:3rem;line-height:21px;line-height:var(--line-height-16);font-size:16px;font-size:var(--font-size-16);border-radius:0;margin:0;font-weight:400;transform:none !important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0px 0px 10px rgba(0, 0, 0, .15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1) !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left: .75rem;--padding-right: .75rem;--icon-margin: 1.25rem;--icon-size: 1.25rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:2rem;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;align-items:center;text-align:left;font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);border-radius:.3125rem;margin:0 .3125rem;font-weight:500;transform:scale(1)}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(0.96)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width: 600px){.btn-menu-item{--padding-right: 1.875rem}}.btn-menu-item-text{position:relative;flex:1 1 auto}.btn-menu-item-text,.btn-menu-item-text-fake{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left: calc(var(--icon-size) + var(--icon-margin));position:absolute;margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.btn-menu-item-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);height:2rem;font-weight:500;font-weight:var(--font-weight-bold);pointer-events:none !important}.btn-menu-item .stacked-avatars{--margin-right: -.6875rem;flex:0 0 auto;right:1rem;position:absolute;pointer-events:none}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0;display:block !important}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:rgba(255, 255, 255, .75);background-color:var(--menu-background-color);position:absolute;opacity:0;transform:scale(0.8);-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, 0.24));transform-origin:bottom left}.btn-menu-reactions-container{--height: 2.25rem;--bubble-side-offset: 0rem;--other-side-offset: 0rem;--menu-offset: calc((var(--height) + .5rem) * -1);--width: calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);margin-top:var(--menu-offset);width:var(--width);max-width:var(--width);margin-left:var(--other-side-offset);display:flex;justify-content:flex-start;height:var(--height);position:fixed;z-index:4}.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right !important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center !important}.btn-menu-reactions-container-vertical{width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column;margin-top:0;margin-left:var(--menu-offset)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column;transform-origin:top right}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical: var(--padding-base);--padding-horizontal: 0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{right:calc(var(--size) / -2);bottom:var(--offset)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{position:absolute;background-color:inherit;border-radius:50%;z-index:-1}.btn-menu-reactions-bubble-big{--size: 1rem;--offset: calc(var(--height) / 2);width:var(--size);height:var(--size);right:var(--offset);bottom:calc(var(--size) / -2)}.btn-menu-reactions:after{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";pointer-events:none;border-radius:inherit;background:linear-gradient(var(--inner-shadow-degree), #fff 0%, rgba(255, 255, 255, 0) 1rem, rgba(255, 255, 255, 0) calc(100% - 1rem), #fff 100%);background:linear-gradient(var(--inner-shadow-degree), var(--surface-color) 0%, rgba(var(--surface-color-rgb), 0) 1rem, rgba(var(--surface-color-rgb), 0) calc(100% - 1rem), var(--surface-color) 100%)}.btn-menu-reactions .scrollable{position:relative;display:flex;border-radius:inherit}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 0.25rem}.btn-menu-reactions .scrollable-y{align-items:center;padding:0.25rem 0;flex-direction:column}.btn-menu-reactions-reaction{--size: 1.625rem;--padding-base: .25rem;--padding-vertical: 0rem;--padding-horizontal: var(--padding-base);width:calc(var(--size) + var(--padding-horizontal) * 2);height:calc(var(--size) + var(--padding-vertical) * 2);flex:0 0 auto;padding:var(--padding-vertical) var(--padding-horizontal);cursor:pointer}.btn-menu-reactions-reaction-scale{width:100%;height:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{position:relative;width:100%;height:100%}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;font-weight:var(--font-weight-bold);cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:hover,html.no-touch .btn-transparent.primary:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{width:auto;padding:0 2rem !important;border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);right:auto}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:\"\"}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{--color: var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:var(--color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:\"\"}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-menu-close-icon{margin-top:-0.625rem}.animated-menu-close-icon:before{top:.3125rem;opacity:1}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translate(0, 0.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{transform:rotate(45deg);opacity:0}.animated-menu-close-icon.state-back:after{transform:translate(0rem, -0.625rem) rotate(90deg)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;font-weight:var(--font-weight-bold);flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;font-weight:var(--font-weight-bold);color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;position:absolute;opacity:1;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem}@media only screen and (min-width: 601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size: 2.25rem;--icon-margin-right: .5rem;--selector-size: 50px;--selector-thumb-size: .75rem;--hide-width: var(--icon-size);--show-width: calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size) * .75);display:flex;align-items:center;width:var(--hide-width);overflow:hidden}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4, .0, .2, 1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:hover,html.no-touch .default .player-volume:active{width:var(--show-width)}.default .player-volume__icon{color:#fff;width:var(--icon-size);height:var(--icon-size);margin-right:var(--icon-margin-right);cursor:pointer;padding:.375rem;font-size:1.5rem;display:flex}.default .player-volume .progress-line{--color: #fff;--thumb-size: var(--selector-thumb-size);--height: 4px;margin:0;width:var(--selector-size);min-width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:\" \";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:\" \";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:calc((var(--thumb-size) - var(--height)) / -2);transform:translateX(calc(var(--thumb-size) / 2)) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size) / 2)) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;line-height:var(--line-height);cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:\"\";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:\" \";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;font-weight:var(--font-weight-bold);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:\"\";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active .badge-fake{color:#fff;border-color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.125rem;margin-top:-0.125rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:1rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;background-color:#df3f40 !important;background-color:var(--danger-color) !important;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:\"\";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec !important;background-color:var(--primary-color) !important;z-index:3}.chat-input .btn-send .tgico-check{height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;color:#fff !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:\" \";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item.is-image{background-image:url(\"assets/img/bg.jpeg\");background-position:center center;background-color:inherit;background-size:cover}.chat-background-item.is-pattern{margin:0 !important;background-image:none !important;background-size:contain;background-repeat:repeat-x;background-color:#000 !important;display:flex;align-items:center;justify-content:center}@media only screen and (min-width: 1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat-background-item-canvas{--opacity-max: 1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-size:cover;mask-size:cover;-webkit-mask-position:center;mask-position:center}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);--button-size: 2.125rem;--button-horizontal-margin: .125rem;display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold);flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:100%;padding:.5625rem var(--padding-horizontal) 0;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{padding-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:45px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + .5rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.25rem;order:0;margin:0 var(--icon-margin) 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{--send-as-size: 1.875rem;--send-as-margin-left: .25rem;--send-as-margin-right: .375rem;--send-as-total-size: calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size: 2.375rem;--commands-margin-left: .25rem;--commands-margin-right: .375rem;--commands-total-size: calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX: 0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{position:absolute;flex:0 0 auto;bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;transform:scale(0);z-index:2;opacity:0}.rows-wrapper .new-message-wrapper .new-message-bot-commands{width:var(--commands-size);height:1.875rem;border-radius:1.875rem;background-color:#3390ec;background-color:var(--primary-color);display:flex;align-items:center;justify-content:center;margin-left:var(--commands-margin-left);cursor:pointer}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{transform:scale(0.875);display:flex;align-items:center;justify-content:center}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color: #fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{width:var(--send-as-size);height:var(--send-as-size);margin-left:var(--send-as-margin-left);background:none !important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{max-height:20rem;max-width:20rem;top:auto;right:auto;left:calc(var(--padding-horizontal) * -1 - .25rem) !important;width:auto;height:auto;transform:scale3d(1, 1, 1)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset: -.125rem;content:\" \";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:50%}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1 !important;display:flex;flex-direction:column;justify-content:center}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{position:absolute;transform:scale(0);opacity:0;pointer-events:none}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){transform:scale(1);opacity:1}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{width:inherit;height:inherit;background-color:#3390ec;background-color:var(--primary-color);font-size:1.375rem;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX: var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX: 48px}.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset .input-message-container{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX: calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands{transform:scale(1);opacity:1}.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons,.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal) * -1 - .125rem)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size);height:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:\" \";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto;max-width:100%}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0;flex:0 0 auto}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}}@media only screen and (max-width: 480px){.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}@media only screen and (min-width: 1276px){.topbar-call-center{padding:0 calc(var(--right-column-width) / 2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:\" \";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:\"Unread messages\";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-weight:var(--font-weight-bold);font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size: 1.875rem;--offset: calc(var(--size) * -.75);position:absolute;right:var(--offset);bottom:-0.125rem;width:var(--size);height:1.625rem;border-radius:var(--size);z-index:2;background-color:#fff;background-color:var(--surface-color);cursor:pointer;opacity:0;transform:scale(0.8);display:flex;align-items:center;justify-content:center;box-shadow:0px 0px 10px rgba(0, 0, 0, .15);box-shadow:var(--menu-box-shadow)}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34, 1.56, .64, 1),transform .2s cubic-bezier(.34, 1.56, .64, 1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){transform:scale(1);opacity:1}.bubble-hover-reaction-sticker{width:1.125rem;height:1.125rem;position:relative}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{position:absolute;top:0;left:50%;transform:translateX(-50%);opacity:1 !important;transition:none !important;visibility:visible !important}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .bubble-content,.bubble.emoji-big:not(.sticker) .bubble-content{align-self:flex-start}.bubble.sticker .message,.bubble.emoji-big:not(.sticker) .message{position:relative !important;margin-left:auto;right:0 !important}.bubble.sticker .attachment{position:absolute;border-radius:0;z-index:1}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;transform:translateY(-50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 0;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web+.time{display:block}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name,.bubble .web .text,.bubble .web .title{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:\" \"}.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:hover,html.no-touch .bubble:not(.just-media) .reply:active{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document,.bubble .audio{--icon-size: 2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;--icon-margin: .6875rem}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{--icon-margin: .75rem;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{--icon-margin: .5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem;line-height:calc(calc(16px - 2px) + 4px);line-height:var(--messages-secondary-line-height)}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.document .time,.bubble .document-message+.audio .time{display:none !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top: .25rem;--margin-left: .125rem;left:auto;top:auto;background:#fff;border-radius:50%;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top))}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:\" \";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message .audio .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color: var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:\"\";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:.3125rem .625rem 0 .625rem;font-weight:500 !important;font-weight:var(--font-weight-bold) !important;color:#3390ec;color:var(--primary-color);font-size:.875rem;line-height:1.25rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;vertical-align:middle;margin-top:-2px}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:.375rem 0 .5rem}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{height:3.1875rem;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{font-weight:500;font-weight:var(--font-weight-bold);font-size:.9375rem;margin-left:.5rem;display:flex;align-items:center;color:#3390ec;color:var(--primary-color);line-height:1.125rem}.bubble .replies-footer-avatars{--margin-right: -.875rem;--border-size: 2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{content:\" \";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color: var(--light-filled-message-primary-color)}.bubble .message .reaction:not(.is-chosen),.bubble .message .reaction.is-chosen.backwards{--counter-color: var(--message-primary-color)}.bubble .message .reaction:not(.is-chosen) .stacked-avatars,.bubble .message .reaction.is-chosen.backwards .stacked-avatars{--border-color: var(--background-color)}.bubble .message .reactions-block .time{position:unset !important;right:auto !important;bottom:auto !important;order:100}.bubble code{cursor:pointer}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1;display:flex;flex-direction:column}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-in pre,.bubble.is-in code{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color);--message-primary-color: var(--message-out-primary-color);--light-filled-message-primary-color: var(--light-filled-message-out-primary-color)}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:\"\"}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:\"\"}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:\"\"}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color: var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color: var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{right:auto;left:var(--offset)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:\" \";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:\" \";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:\" \";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:\" \"}.pinned-audio-volume .player-volume__icon{display:flex;cursor:pointer}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:252px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:672px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:\" \";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-weight:var(--font-weight-bold);font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding: 24px;--offset: .5rem;position:absolute !important;bottom:calc(100% - var(--border-radius-padding));right:calc(var(--offset) * -1);left:calc(var(--offset) * -1);width:auto !important;max-height:20rem;max-width:none;border-radius:12px 12px 0 0 !important;background-color:transparent !important;pointer-events:none;overflow:hidden;padding:var(--offset) var(--offset) 0 !important;box-shadow:none;-webkit-animation:none !important;animation:none !important;visibility:visible !important;transition:none !important}body.animation-level-2 .bot-commands{display:flex !important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);border-radius:inherit;height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{transform:translateY(0);opacity:1}.bot-commands-list{border-radius:inherit;width:100%;height:var(--height);padding-bottom:0}.bot-commands-list-element{border-radius:0 !important;flex-direction:column;align-items:flex-start;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{position:absolute;left:.75rem}.bot-commands-list-element-name,.bot-commands-list-element-description{margin-left:0;font-size:.875rem;line-height:18px;line-height:var(--line-height-14)}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:\" \";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width: 600px){.profile-button{border-radius:0}}.profile-change-avatar{--size: 3.375rem;position:absolute !important;top:calc(var(--size) / -2);right:1.25rem;transform:none;transition:none !important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:\" \";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:\" \";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible;pointer-events:none}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:\" \";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible;justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{padding-bottom:0;height:15rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:1.875rem;padding:0 .75rem;font-size:.9375rem;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:.9375rem;line-height:1.875rem}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important;font-weight:var(--font-weight-bold) !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0 !important}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-content.full-width{margin:0 !important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{font-size:12px;font-size:var(--font-size-12);color:#707579;color:var(--secondary-text-color);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{position:absolute;width:100%;height:100%;-webkit-mask-position:center;-webkit-mask-size:contain}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;font-weight:var(--font-weight-bold);color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:\" \";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size: 3rem;--icon-margin: .75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;font-weight:var(--font-weight-bold);margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0 !important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0, 0, 0, .2) rgba(0,0,0,0);scrollbar-color:var(--scrollbar-color) rgba(0,0,0,0)}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,0) rgba(0,0,0,0);transition:scrollbar-color .3s ease;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:\"\";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:\"\";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:500;font-weight:var(--font-weight-bold)}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(25px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:\" \";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.6875}avatar-element.avatar-26{--size: 26px;--multiplier: 2.076923}avatar-element.avatar-24{--size: 24px;--multiplier: 2.25}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.avatar-full{position:absolute;width:100%;height:100%;border-radius:inherit;display:inline-flex;align-items:center;justify-content:center}.avatar-full .avatar-photo{width:100% !important;height:100% !important;-o-object-fit:cover;object-fit:cover}.document{--background-color: var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:\"\";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-weight:var(--font-weight-bold);font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16)}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);text-overflow:ellipsis;overflow:hidden}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{--icon-size: 3.375rem;--icon-margin: .875rem;--padding-left: calc(var(--icon-size) + var(--icon-margin));padding-left:var(--padding-left);display:flex;flex-direction:column;justify-content:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;margin-left:calc(var(--padding-left) * -1);width:var(--icon-size);height:var(--icon-size);color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.document .checkbox-field-round,.audio .checkbox-field-round{--margin-top: .25rem;--margin-left: .125rem;margin-left:calc(var(--padding-left) * -1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto;left:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{overflow:visible !important;--icon-size: 3rem;--icon-margin: .5625rem;height:var(--icon-size)}.audio-toggle,.audio-download{border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:0 !important;top:57.5%;left:57.5%;background:none;display:flex !important}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:hover,html.no-touch .audio-waveform-background rect:active{opacity:1}.audio-waveform-fake{position:absolute;top:0;right:0;bottom:0;left:0;width:0;overflow:hidden;pointer-events:none}.audio-waveform-container{position:relative;height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:\" • \"}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:\" \";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:\" \";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:\" \";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;font-weight:var(--font-weight-bold);margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:500;font-weight:var(--font-weight-bold);font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold);border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:18px;line-height:var(--line-height-14);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:3rem !important;height:3rem !important;position:absolute !important;margin:0 !important;left:.5rem}.row-media-small{width:2rem !important;height:2rem !important;left:.75rem !important}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-weight:var(--font-weight-bold);font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:unset}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction{display:flex;align-items:center}.reaction-sticker{position:relative;width:var(--reaction-size);height:var(--reaction-size);display:flex;align-items:center;justify-content:center}.reaction-sticker-activate{position:absolute;top:var(--reaction-offset);right:var(--reaction-offset);bottom:var(--reaction-offset);left:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size: calc(var(--reaction-size) + var(--reaction-offset) * -2);width:var(--size) !important;height:var(--size) !important;max-width:var(--size);max-height:var(--size);top:auto;right:auto;bottom:auto;left:auto}.reaction-inline{--reaction-size: .875rem;--reaction-offset: -.4375rem;min-width:var(--reaction-size);min-height:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit !important;order:-1;margin-right:.0625rem !important}.reaction-block{--additional-height: .5rem;--margin: .375rem;--reaction-size: 1.375rem;--reaction-offset: -.5625rem;--background-color: var(--message-highlightning-color);--chosen-background-color: var(--message-primary-color);--counter-color: #fff;--reaction-total-size: calc(var(--reaction-size) + var(--additional-height));height:var(--reaction-total-size);border-radius:var(--reaction-total-size);padding:0 .5rem;background-color:#f4f4f5;background-color:var(--background-color);cursor:pointer;position:relative;margin-top:var(--margin);margin-right:var(--margin);color:var(--counter-color)}.reaction-block:last-child{margin-right:0}.reaction-block:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--chosen-background-color);border-radius:inherit;transform:scale3d(0, 0, 0);opacity:0}.reaction-block.is-chosen:not(.backwards):before{transform:scale3d(1, 1, 1);opacity:1}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color: var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4, .0, .2, 1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4, .0, .2, 1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color: transparent;--border-size: .125rem;--margin-right: -.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem !important;font-weight:500;font-weight:var(--font-weight-bold);margin:0 .0625rem 0 .375rem;line-height:1.125rem;position:relative}.stacked-avatars{--border-color: var(--surface-color);--border-size: 1px;--margin-right: -.3125rem;--avatar-size: 1rem;--avatar-total-size: calc(var(--avatar-size) + var(--border-size) * 2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{width:var(--avatar-size);height:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{width:var(--avatar-total-size);height:var(--avatar-total-size);border:var(--border-size) solid #dfe1e5;border:var(--border-size) solid var(--border-color);display:flex;align-items:center;justify-content:center;border-radius:50%;position:relative}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;font-weight:var(--font-weight-bold);padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-weight:var(--font-weight-bold);font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold);color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.show-controls .call-title,.call.show-controls .call-subtitle,.call.show-controls .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.no-video .call-title,.call.no-video .call-subtitle,.call.no-video .popup-header,.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{transform:scale(1.3125);margin-right:1rem}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7;border-radius:inherit}.call-avatar .avatar-full{font-size:6rem}.call-title{font-weight:500;font-weight:var(--font-weight-bold);font-size:1.25rem}.call-subtitle{font-size:1rem}.call-title,.call-subtitle,.call-emojis,.call .popup-header{opacity:0}body.animation-level-2 .call-title,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-emojis,body.animation-level-2 .call .popup-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second{--margin-length: 2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * var(--margin-length)));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length: .656875}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit;opacity:1}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px;cursor:pointer}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{display:flex;flex-direction:column;position:absolute;bottom:calc(1.75rem + 3.375rem + 1.5rem + 1rem);bottom:calc(1.75rem + var(--call-button-size) + 1.5rem + 1rem);z-index:2;width:100%;align-items:center;padding:0 1rem;pointer-events:none}.call-party-state{height:1.625rem;border-radius:1.625rem;line-height:1.625rem;background-color:rgba(255,255,255,.2);color:#fff;padding:0 .625rem;font-size:.875rem;display:flex;align-items:center;margin-top:1rem;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);font-weight:500;font-weight:var(--font-weight-bold);opacity:0;transform:scale(0) translateY(0);max-width:100%}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{width:1.875rem !important;height:1.875rem !important;margin-right:.25rem;margin-left:-0.25rem;flex:0 0 auto}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:\" \";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{opacity:1;color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:\" \";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -0.625rem}.popup-mute .sidebar-left-section{margin-bottom:0 !important;padding:0 !important}.popup-mute .sidebar-left-section-content{margin:0 !important}.popup-reacted-list .popup-container{width:25rem;height:600px;max-height:600px;padding:0}.popup-reacted-list .popup-header{min-height:3.5625rem;margin:0;padding:.25rem .75rem .75rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-reacted-list .popup-close{margin-top:.375rem;margin-right:.5rem;height:40px;order:-1}.popup-reacted-list .reaction{--additional-height: .75rem;--reaction-size: 1.5rem;--margin: .5rem;--background-color: var(--light-filled-primary-color);--counter-color: var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color: #fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem !important;margin:0;display:flex;align-items:center}.popup-reacted-list .sidebar-left-section{margin-bottom:0 !important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{width:1.5rem;height:1.5rem;margin:0;top:50%;transform:translateY(-50%)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;line-height:var(--line-height);text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}html.no-backdrop{--menu-background-color: var(--surface-color);--menu-backdrop-filter: none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}pre,code,kbd,samp{font-family:\"Roboto Mono\", monospace;font-family:var(--font-monospace)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}[contenteditable] [style*=bold]{font-weight:500 !important;font-weight:var(--font-weight-bold) !important}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{position:absolute;width:100%;height:100%}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:\" \"}.media-round.is-paused .video-time:after{content:\"\";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:\" \";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-top:.8125rem;margin-bottom:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px !important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px !important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem;position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:\"Roboto\" !important;font-weight:500;font-weight:var(--font-weight-bold);width:1.5rem;text-align:center}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.quick-reaction-title{display:flex;align-items:center}.quick-reaction-sticker{width:32px !important;height:32px !important;position:relative !important;margin:0 .5rem 0 0 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.badge-fake{flex:0 0 auto;color:#df3f40;color:var(--danger-color);border:1px solid #df3f40;border:1px solid var(--danger-color);padding:.125rem .25rem;border-radius:.185rem;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1 !important;margin:0 .25rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.51e480f741f5f1620853.bundle.js b/public/main.51e480f741f5f1620853.bundle.js new file mode 100644 index 000000000..7c21ff7f2 --- /dev/null +++ b/public/main.51e480f741f5f1620853.bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,s,i,o,a,r,c,l={236:(e,t,n)=>{n.d(t,{h:()=>c});var s=n(4762),i=n(144),o=n(4159);const a=o.Z.version,r=o.Z.build,c={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filters:{},maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],topPeersCache:{},recentSearch:[],version:a,build:r,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),a=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>s});const s="undefined"!=typeof SharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>a,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>r,IS_FIREFOX:()=>u,IS_MOBILE:()=>h,IS_MOBILE_SAFARI:()=>d,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),a=-1!==navigator.userAgent.toLowerCase().indexOf("android"),r=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),u=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=l&&c,h=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{function s(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let a,r,c=(i+o)/2;if(i===o)a=r=0;else{let s=i-o;switch(r=c>.5?s/(2-i-o):s/(i+o),i){case e:a=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},r=n<.5?n*(1+t):n+t-n*t,c=2*n-r;i=s(c,r,e+1/3),o=s(c,r,e),a=s(c,r,e-1/3)}return[Math.round(255*i),Math.round(255*o),Math.round(255*a),Math.round(255*s)]}function o(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function l(e){return function(e){return c(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return i(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}n.d(t,{K5:()=>l,Pi:()=>o,Y6:()=>i,cw:()=>r,dI:()=>s,oo:()=>a,t1:()=>c})},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){return!(!document.activeElement||!document.activeElement.blur||(document.activeElement.blur(),0))}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e=e||window.event){e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>r,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),a=n(5494);const r=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(r){let e="clientY",t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],a=t-o,r=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,u=r?Math.round(r+i.clientHeight+a):r+a;(c===l||u>=c||u<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,a.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,a.Z)(document.activeElement)}),{passive:!0})}function c(e){r&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5418);const i=["b","б"],o={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function r(e={text:i,icons:void 0,monospace:i}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=i);const r=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,i,a;const c=[e,"1rem",r].join(" ");return null!==(s=(i=null!==(n=o[c])&&void 0!==n?n:o[c]={})[a=t||""])&&void 0!==s?s:i[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t),(0,s.Z)(1e3)])}},2586:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class a extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const r=new a},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>u});let o,a,r=!1;function c(e){o?r?e():o.push(e):(o=[e],requestAnimationFrame((()=>{r=!0;for(let e=0;ei((()=>e())))),a.then((()=>{a=void 0})),a)}function u(){return new Promise((e=>{i((()=>{i(e)}))}))}},6714:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5432),i=n(3512),o=n(2064);const a=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){let e;const t=a.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&e&&(a.themeColor=(0,o.K5)(e))}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor(),this.applyHighlightningColor()}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}},r=a},6873:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),a=n(8090),r=n(4541),c=n(9976),l=n(4762),u=n(5418);!function(){const e=new Proxy(Worker,{construct:(e,t)=>new e(t[0]+location.search)});Worker=e}();var d=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3789)),f=n(2554),p=n(6714),v=n(3815),b=n(490);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,S=function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)}),d.Z.managers=(0,f.Z)(),b.Z.start();const e=window.visualViewport||window;let t,y=!1;const S=()=>{const n=.01*(y&&!v.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(h.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",S),S(),a.T){const t=()=>{y=1===n&&a.T&&!v.Z.isOverlayActive,S(),e!==window&&(y?(window.removeEventListener("resize",S),e.addEventListener("resize",S)):(e.removeEventListener("resize",S),window.addEventListener("resize",S)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},v.Z.addEventListener("change",(()=>{t()}))}l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE?(l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):l.IS_ANDROID&&document.documentElement.classList.add("is-android"),h.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");let w=performance.now();const k=g.ZP.getCacheLangPack(),[P,A]=yield Promise.all([m.Z.sendState().then((([e])=>e)),k]);function E(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(P.state.settings.timeFormat),p.Z.setThemeListener(),A.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(A.lang_code),console.log("got state, time:",performance.now()-w);const _=P.state.authState;if("authStateSignedIn"!==_._){console.log("Will mount auth page:",_._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),h.Z&&!l.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.resolve().then(n.bind(n,5228)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(_._){case"authStateSignIn":s=(yield Promise.all([n.e(458),n.e(216),n.e(591),n.e(445),n.e(709),n.e(810)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(216),n.e(591),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(458),n.e(216),n.e(591),n.e(445),n.e(709),n.e(106)]).then(n.bind(n,6392))).default.mount(_.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(458),n.e(216),n.e(591),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(458),n.e(216),n.e(591),n.e(765),n.e(139)]).then(n.bind(n,8339))).default.mount(_.authCode)}t&&(s&&(yield s),E(t,"fonts"in document?Promise.race([(0,u.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),E(document.getElementById("main-columns"),(0,r.Z)()),(yield Promise.all([n.e(216),n.e(591),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((y=void 0)||(y=Promise))((function(n,s){function i(e){try{a(S.next(e))}catch(e){s(e)}}function o(e){try{a(S.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof y?t:new y((function(e){e(t)}))).then(i,o)}a((S=S.apply(e,t||[])).next())}));var e,t,y,S}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3789);function i(){let e;function t(e,t){return new Proxy(e,{get:(e,n,i)=>{var o;return null!==(o=e[n])&&void 0!==o?o:e[n]=function(e,t){return new Proxy({},{get:(n,i,o)=>(...n)=>s.Z.invoke("manager",{name:e,method:i,args:n},t)})}(n,t)}})}return e=t({},!1),e.acknowledged=t({},!0),e}},1962:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1267),i=n(5953),o=n(5003);class a{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,o.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let a=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!a&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(a=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class r{constructor(e,t){this.storeName=t,this.log=(0,o.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,s)=>n.put(t[s],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((a,r)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),r(c.error)},u=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=f.map((e=>e.result));a(m?e:e[0])};c.onerror=l;const d="readwrite"===e;d&&(c.oncomplete=()=>u());const h=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),f=m?g:[].concat(g);if(d)return;const p=f.length;let v=p;const b=()=>{c.error||--v||u()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>y,A1:()=>S,Hz:()=>g,XZ:()=>b,ZP:()=>p,ag:()=>v,nK:()=>m,v_:()=>w});var s=n(410),i=n(7922),o=n(4159),a=n(3512),r=n(4762),c=n(6848),l=n(5953),u=n(9005),d=n(6637),h=n(3591);const g={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},m=r.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,r;function g(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(" ")[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function m(){const t=o.Z.langPackCode;return e.lastRequestedLangCode=t,Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([e,n,s])=>{const i=[];return p(e.default,i),p(n.default,i),v({_:"langPackDifference",from_version:0,lang_code:t,strings:i,version:0,local:!0,countries:s.default})}))}function f(t){e.requestedServerLanguage=!0;const s=a.Z.managers;return Promise.all([s.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:o.Z.langPack}),s.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"android"}),n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),s.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function v(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(b(e),e)))}function b(n){if(n.lang_code===e.lastRequestedLangCode){try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==n.lang_code&&(a.Z.dispatchEvent("language_change",n.lang_code),e.lastAppliedLangCode=n.lang_code,P.clear(),g()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function y(e,t,n={i:0}){let s=[],i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,a,r,c,l,u)=>{if(s.push(u.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...y(a,t,n)),s.push(e)}else if(r)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let a;if(o&&(0,d.Z)(o)){a=document.createElement("a");const e=(0,h.Z)(o);a.href=e.url,e.onclick&&a.setAttribute("onclick",e.onclick),a.target="_blank"}else a=t[n.i++],a.textContent="";a.append(...y(i,t,n)),s.push(a)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function S(n,s=!1,i){const o=e.strings.get(n);let a;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),a=o[t.select(e)+"_value"]||o.other_value}else a="langPackString"===o._?o.value:n;else a=n;const r=y(a,i);return s?r.map((e=>e instanceof Node?e.textContent:e)).join(""):r}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return r||(r=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||(e.lastRequestedLangCode=t.lang_code),b(t),t):m())).finally((()=>{r=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,g(),n&&(P.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof E&&n.update()})))},e.loadLocalLangPack=m,e.loadLangPack=f,e.getStrings=function(e,t){return a.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(t){return e.lastRequestedLangCode=t,f(t).then((([e,t,n,s,i,o])=>{let a=[];[n,s].forEach((e=>{p(e.default,a)})),a=a.concat(e.strings);for(const e of t.strings)a.push(e);return e.strings=a,e.countries=i,v(e)}))},e.saveLangPack=v,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=b,e.superFormatter=y,e.format=S,e.weakMap=new WeakMap;class w{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class k extends w{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...S(this.key,!1,this.args));else{const e=this.element[this.property],t=S(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=k;const P=new Map;function A(t={}){let n=JSON.stringify(t),s=P.get(n);return s||P.set(n,s=new Intl.DateTimeFormat(e.lastRequestedLangCode+"-u-hc-"+e.timeFormat,t)),s}e.amPmCache={am:"AM",pm:"PM"};class E extends w{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){let t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,u.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=E,e.i18n=function(e,t){return new k({key:e,args:t}).element},e.i18n_=function(e){return new k(e).element},e._i18n=function(e,t,n,s){return new k({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const p=f,v=f.i18n,b=f.i18n_,y=f._i18n;function S(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):v(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{IA:()=>o,NM:()=>s,gZ:()=>c,hj:()=>i,rU:()=>r,yF:()=>a});const s=0,i=1271266957,o=777,a=777e3,r=2147483647,c=""},3789:(e,t,n)=>{n.d(t,{Z:()=>te});var s=n(3512),i=n(7730),o=n(410),a=n(7487),r=n(6702),c=n(1722),l=n(5228),u=n(5418),d=n(5880),h=n(993),g=n(7328),m=n(6663),f=n(9976),p=n(3731),v=n(6818),b=n(1174),y=n(2341),S=n(9030),w=n(2365),k=n(2820),P=n(5432),A=n(2131),E=n(554),_=n(4762);const Z=!!document.createElement("video").canPlayType("video/webm")&&!_.IS_SAFARI&&!_.IS_APPLE_MOBILE;var I=n(5269),C=n(4089),L=n(5783),T=n(2045);const O=Object.assign({CAN_USE_TRANSFERABLES:g.Z,IS_CALL_SUPPORTED:h.Z,IS_CANVAS_FILTER_SUPPORTED:m.Z,IS_EMOJI_SUPPORTED:f.Z,IS_GEOLOCATION_SUPPORTED:p.Z,IS_GROUP_CALL_SUPPORTED:v.Z,IS_MOV_SUPPORTED:S.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:k.Z,IS_TOUCH_SUPPORTED:P.Z,IS_VIBRATE_SUPPORTED:A.Z,IS_OPUS_SUPPORTED:L.Z,IS_SHARED_WORKER_SUPPORTED:T.Z,IS_WEBM_SUPPORTED:Z,IS_WEBP_SUPPORTED:I.Z,IS_WEBRTC_SUPPORTED:C.Z,IMAGE_MIME_TYPES_SUPPORTED:b.Z,MEDIA_MIME_TYPES_SUPPORTED:y.Z,VIDEO_MIME_TYPES_SUPPORTED:E.Z},_);var M=n(4159),D=n(236),R=n(6009),W=n(8479),x=n(946),N=n(7922),U=n(5466),F=n(5003);const j=D.h.version,B=D.h.build,V=Object.keys(D.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filters"];function q(){return e=this,t=void 0,i=function*(){const e=(0,F.kg)("STATE-LOADER"),t=performance.now(),n=(0,U.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(a.Z.get("user_auth"),"auth"),n(a.Z.get("state_id"),"auth"),n(a.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),r=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{u[e]=t,c.push(e)};let u={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof d||"string"==typeof d?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:d.toPeerId(!1)}:d);let n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield a.Z.set(n)}d&&(u.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof d||"string"==typeof d?{dcID:0,date:Date.now()/1e3|0,id:d.toPeerId(!1)}:d));const f=new Set;if(u.stateId!==h){if(void 0!==h){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,W.Z)(u[n]))})),u=(0,W.Z)(D.h),e.forEach(((e,t)=>{u[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)f.add(e);p=u,c.length=0,u=p,c.push(...Object.keys(u))}yield a.Z.set({state_id:u.stateId})}var p;const v=Date.now();if(u.stateCreatedTime+864e5{l(e,(0,W.Z)(D.h[e]))}))),!u.settings.hasOwnProperty("theme")&&u.settings.hasOwnProperty("nightTheme")&&(u.settings.theme=u.settings.nightTheme?"night":"day",l("settings",u.settings)),!u.settings.hasOwnProperty("themes")&&u.settings.background){u.settings.themes=(0,W.Z)(D.h.settings.themes);const e=u.settings.themes.find((e=>e.name===u.settings.theme));e&&(e.background=u.settings.background,l("settings",u.settings))}const b=u.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",u.settings)}let y,S;if((0,x.Z)(D.h,u,(e=>{l(e,u[e])})),u.version!==j||u.build!==B){if(-1===(0,R.Z)(u.version,"0.8.7")&&(u.allDialogsLoaded=(0,W.Z)(D.h.allDialogsLoaded),u.filters=(0,W.Z)(D.h.filters),f.add("dialogs")),-1===(0,R.Z)(u.version,"1.3.0")){let e=!1;u.settings.themes.forEach(((t,n,s)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=D.h.settings.themes.find((e=>e.name===t.name));i&&(s[n]=(0,W.Z)(i),e=!0)}})),e&&l("settings",u.settings)}0!==(0,R.Z)(u.version,j)&&(y=j,S=u.version),l("version",j),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const a=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete a[i]:a[i]=o},this.isSWRegistered=!0,this.taskListenersSW={},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>H.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return a.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,J.Z)(!1,!0),a.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,u.Z)(3e3)]),r.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),X.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(X.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const e=navigator.serviceWorker;navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{this.log("SW registered",e),this.isSWRegistered=!0,(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}))}),(e=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)})),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange"),e.controller.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),e.addEventListener("message",(e=>{const t=e.data;if(!(0,d.Z)(t))return;const n=this.taskListenersSW[t.type];n&&n(t)})),this.addServiceWorkerTaskListener("requestFilePart",(e=>{const t={type:e.type,id:e.id},{docId:n,dcId:i,offset:o,limit:a}=e.payload;s.Z.managers.appDocsManager.requestDocPart(n,i,o,a).then((e=>{t.payload=e,this.postSWMessage(t)}),(n=>{t.originalPayload=e.payload,t.error=n,this.postSWMessage(t)}))})),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){let e;e=T.Z?new SharedWorker(new URL(n.p+n.u(589),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(589),n.b),{type:void 0}),$.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),this.attachWorkerToPort(e,$.Z,"crypto")}registerWorker(){let e;e=T.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}postSWMessage(e){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(e)}onWorkerFirstMessage(e){this.log("set webWorker"),this.worker=e,this.attachWorkerToPort(e,this,"mtproto")}addServiceWorkerTaskListener(e,t){this.taskListenersSW[e]=t}loadState(){return Promise.all([(null!=z?z:z=q()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return $.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return K(this,void 0,void 0,(function*(){yield(0,J.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t});const n={type:"toggleStorages",payload:{enabled:e,clearWrite:t}};this.postSWMessage(n)}))}getMirror(e){return K(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ee=new Q;o.GO.apiManagerProxy=ee;const te=ee},490:(e,t,n)=>{n.d(t,{Z:()=>p});var s=n(4159),i=n(410),o=n(2219),a=n(2045),r=n(3241),c=n(2586),l=n(5003),u=n(3512),d=n(7487),h=n(3789);const g=a.Z;class m extends r.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),d.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([d.Z.get("xt_instance",!1),d.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,u.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void h.Z.toggleStorages(!1,!1);g?d.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function a(e){try{c(o.next(e))}catch(e){s(e)}}function r(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(a,r)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const f=new m;i.GO&&(i.GO.singleInstance=f);const p=f},5228:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>u});var s=n(4159),i=n(410),o=n(1267),a=n(7298),r=n(7487);class c{constructor(){this.disabled=o.Z.test||-1===s.Z.domains.indexOf(location.hostname)}setAuthorized(e){if(!this.disabled)return r.Z.get("tgme_sync").then((t=>{const n=(0,a.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;r.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>{const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{t.remove(),e()}}));return t.src=e,document.body.appendChild(t),n}));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const u=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3789),a=n(2325),r=n(4762),c=n(1722),l=n(8479),u=n(490),d=n(3241);class h extends d.Z{constructor(){super(!1),this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||u.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:r.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:r.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=a.ZP.format(t[n],!0);const n={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}};o.Z.postSWMessage(n),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.addServiceWorkerTaskListener("push_click",(e=>{u.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e.payload)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}}const g=new h;s.GO&&(s.GO.webPushApiManager=g);const m=g},9043:(e,t,n)=>{n.d(t,{Z:()=>u});var s=n(410),i=n(5783),o=n(4762),a=n(5003),r=n(3789),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function a(e){try{c(s.next(e))}catch(e){o(e)}}function r(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,a.kg)("OPUS",a.v9.Error)}isPlaySupported(){return i.Z}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},o.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},o.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield r.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const u=l},2423:(e,t,n)=>{n.d(t,{$2:()=>l,E:()=>u,Hk:()=>h,QB:()=>d,SC:()=>g,bu:()=>c,it:()=>r,kO:()=>f,tY:()=>m});var s=n(1229);const i="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-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",o="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",r=a+"(?:"+o+"{1,64}(?::"+o+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+o+"["+i+"·0-9-]{0,64}(?:\\."+o+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",c=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),l=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+r+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_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-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),u=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,d=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},g={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},m=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let e in g)m.add(g[e]);const f=/^\+\d+$/},3512:(e,t,n)=>{n.d(t,{Z:()=>u});var s=n(1507),i=n(3241),o=n(410),a=n(3206),r=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),a.Z.getInstance().invokeVoid("event",{name:e,args:t})},r.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const u=l},7730:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const a=o}},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e].call(n.exports,n,n.exports,d),n.exports}d.m=l,e=[],d.O=(t,n,s,i)=>{if(!n){var o=1/0;for(l=0;l=i)&&Object.keys(d.O).every((e=>d.O[e](n[r])))?n.splice(r--,1):(a=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[n,s,i]},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);d.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var a=2&s&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,d.d(i,o),i},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce(((t,n)=>(d.f[n](e,t),t)),[])),d.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"15a67f69d99bd6da42da",53:"71a42ea94f0ddd5cd1f3",61:"6db21d20aefa6b93eca2",77:"808c5b447b007ee7aa9d",104:"19c787168bced8f0f781",106:"074bf17aad93c3a097a5",139:"f4fd38bb6b1d4da6c306",216:"4397eec2983565f6f071",301:"eb31c208f76e9dc623ec",339:"702eead422c6af883b39",392:"a0ad16f0908b02621678",436:"10206c22b0e2f40d8f22",437:"3a0fbb3b8364085ec2f3",442:"7c20450a077c518900a1",445:"8b680d12416f728f8b70",458:"b69e387d025f91cf03db",589:"9c324dbbd162911309c3",591:"8250ea4e75a163191f15",630:"5c8af6e9c411419a66e1",641:"682761bd5f38717396f1",642:"f2d4e67ea15d5329cd0b",670:"ed0dbbea2d9f6f96af2b",678:"e72cffdf2b7d9b2b317f",709:"dec2bf42c5cce33bde28",765:"d96ae842524025af79ef",774:"04c4656f821730d3e97b",781:"f96ab4e55bded41d4d3c",810:"fa9733cf38d84f48fd4e",813:"30b0b1677b13ee5fdef9",853:"5062ae3867f3575462eb"}[e]+".chunk.js"),d.miniCssF=e=>{},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",d.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var a,r;if(void 0!==n)for(var c=document.getElementsByTagName("script"),l=0;l{a.onerror=a.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],a.parentNode&&a.parentNode.removeChild(a),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=h.bind(null,a.onerror),a.onload=h.bind(null,a.onload),r&&document.head.appendChild(a)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;d.g.importScripts&&(e=d.g.location+"");var t=d.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),d.p=e})(),o=d.u,a=d.e,r=new Map,c=new Map,d.u=function(e){return o(e)+(r.has(e)?"?"+r.get(e):"")},d.e=function(e){return a(e).catch((function(t){var n=c.has(e)?c.get(e):999999;if(n<1){var s=o(e);throw t.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",t.request=s,t}return new Promise((function(t){setTimeout((function(){var s=Date.now();r.set(e,s),c.set(e,n-1),t(d.e(e))}),3e3)}))}))},(()=>{d.b=document.baseURI||self.location.href;var e={179:0};d.f.j=(t,n)=>{var s=d.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=d.p+d.u(t),a=new Error;d.l(o,(n=>{if(d.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",a.name="ChunkLoadError",a.type=i,a.request=o,s[1](a)}}),"chunk-"+t,t)}},d.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,a,r]=n,c=0;if(o.some((t=>0!==e[t]))){for(s in a)d.o(a,s)&&(d.m[s]=a[s]);if(r)var l=r(d)}for(t&&t(n);cd(6873)));h=d.O(h)})(); +//# sourceMappingURL=main.51e480f741f5f1620853.bundle.js.map \ No newline at end of file diff --git a/public/main.51e480f741f5f1620853.bundle.js.map b/public/main.51e480f741f5f1620853.bundle.js.map new file mode 100644 index 000000000..4ee52680e --- /dev/null +++ b/public/main.51e480f741f5f1620853.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.51e480f741f5f1620853.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AppMediaPlaybackController } from \"../components/appMediaPlaybackController\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport getTimeFormat from \"../helpers/getTimeFormat\";\nimport { nextRandomUint } from \"../helpers/random\";\nimport { AutoDownloadSettings, NotifyPeer, PeerNotifySettings } from \"../layer\";\nimport { TopPeerType, MyTopPeer } from \"../lib/appManagers/appUsersManager\";\nimport DialogsStorage from \"../lib/storages/dialogs\";\nimport FiltersStorage from \"../lib/storages/filters\";\nimport { AuthState } from \"../types\";\nimport App from \"./app\";\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string, \n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","const IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined'/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\nexport default IS_TOUCH_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n \r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = hexa[0] === '#' ? 1 : 0;\r\n if(hexa.length === (5 + offset)) {\r\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\r\n }\r\n\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className)) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n \r\n // setTimeout(() => {\r\n doubleRaf().then(() => {\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n \r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n });\r\n // }, 0);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"../schedulers/pause\";\r\n\r\nconst texts = ['b', 'б'];\r\ntype FontType = 'text' | 'icons' | 'monospace';\r\n\r\nconst cache: {\r\n [key: string]: {\r\n [text: string]: Promise\r\n }\r\n} = {};\r\n\r\nconst fonts: {[type in FontType]: string} = {\r\n text: 'Roboto',\r\n icons: 'tgico',\r\n monospace: 'Roboto Mono'\r\n};\r\n\r\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\r\n text: texts,\r\n icons: undefined,\r\n monospace: texts\r\n}): Promise {\r\n if(!('fonts' in document)) {\r\n return Promise.resolve();\r\n }\r\n \r\n const promises: Promise[] = [];\r\n for(const type in types) {\r\n let _texts = types[type as FontType];\r\n if(_texts === 'all') {\r\n _texts = texts;\r\n }\r\n\r\n const font = fonts[type as FontType];\r\n const weights = type === 'icons' ? [500] : [400, 500];\r\n for(const weight of weights) {\r\n const _promises = (_texts || [undefined]).map((text) => {\r\n const key = [weight, '1rem', font].join(' ');\r\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\r\n return promise;\r\n });\r\n promises.push(..._promises);\r\n }\r\n }\r\n\r\n return Promise.race([\r\n Promise.all(promises),\r\n pause(1000)\r\n ]);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport EventListenerBase from \"./eventListenerBase\";\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n \n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from \"./eventListenerBase\";\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Theme } from \"../config/state\";\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\nimport rootScope from \"../lib/rootScope\";\nimport { hslaStringToHex } from \"./color\";\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: Theme['name'];\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = themeController.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n themeController.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n\n this.applyHighlightningColor();\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n}\n\nconst themeController = new ThemeController();\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n\n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n}\n\nsetWorkerProxy();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport { IS_STICKY_INPUT_BUGGED } from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport { IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n rootScope.managers = getProxiedManagers();\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n //const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n //console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n \n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n let perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n \n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = stateResult.state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n pause(1000), \n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n \n if(this.hasAttribute(name)) {\n if(force) return true;\n \n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n \n this.setAttribute(name, \"\");\n return true;\n };\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from \"./createManagers\";\nimport { ModifyFunctionsToAsync } from \"../../types\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport { AckedResult } from \"../mtproto/superMessagePort\";\nimport noop from \"../../helpers/noop\";\nimport dT from \"../../helpers/dT\";\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\nexport default function getProxiedManagers() {\n let proxied: {\n [name in keyof T]?: ModifyFunctionsToAsync;\n } & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n };\n\n function createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n }\n\n proxied = createProxyProxy({}, false);\n\n proxied.acknowledged = createProxyProxy({}, true);\n\n return proxied;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode, \r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], \r\n log?: string, \r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"../config/state\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport deepEqual from \"../helpers/object/deepEqual\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport capitalizeFirstLetter from \"../helpers/string/capitalizeFirstLetter\";\nimport matchUrlProtocol from \"./richTextProcessor/matchUrlProtocol\";\nimport wrapUrl from \"./richTextProcessor/wrapUrl\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n const managers = rootScope.managers;\n\t\treturn Promise.all([\n\t\t\tmanagers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tmanagers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tmanagers.apiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach((l) => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach((country) => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n cachedDateTimeFormats.clear();\n updateAmPm();\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach((element) => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'];\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n let json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n cachedDateTimeFormats.set(json, dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, options));\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n let hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","import IS_CALL_SUPPORTED from \"./callSupport\";\nimport CAN_USE_TRANSFERABLES from \"./canUseTransferables\";\nimport IS_CANVAS_FILTER_SUPPORTED from \"./canvasFilterSupport\";\nimport IS_EMOJI_SUPPORTED from \"./emojiSupport\";\nimport IS_GEOLOCATION_SUPPORTED from \"./geolocationSupport\";\nimport IS_GROUP_CALL_SUPPORTED from \"./groupCallSupport\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport MEDIA_MIME_TYPES_SUPPORTED from \"./mediaMimeTypesSupport\";\nimport IS_MOV_SUPPORTED from \"./movSupport\";\nimport IS_PARALLAX_SUPPORTED from \"./parallaxSupport\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"./screenSharingSupport\";\nimport IS_TOUCH_SUPPORTED from \"./touchSupport\";\nimport IS_VIBRATE_SUPPORTED from \"./vibrateSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\nimport IS_WEBM_SUPPORTED from \"./webmSupport\";\nimport IS_WEBP_SUPPORTED from \"./webpSupport\";\nimport IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\nimport * as userAgent from \"./userAgent\";\nimport IS_OPUS_SUPPORTED from \"./opusSupport\";\nimport IS_SHARED_WORKER_SUPPORTED from \"./sharedWorkerSupport\";\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../../config/app\";\nimport DEBUG from \"../../../../config/debug\";\nimport { AutoDownloadPeerTypeSettings, State, STATE_INIT } from \"../../../../config/state\";\nimport compareVersion from \"../../../../helpers/compareVersion\";\nimport copy from \"../../../../helpers/object/copy\";\nimport validateInitObject from \"../../../../helpers/object/validateInitObject\";\nimport { UserAuth } from \"../../../mtproto/mtproto_config\";\nimport rootScope from \"../../../rootScope\";\nimport stateStorage from \"../../../stateStorage\";\nimport sessionStorage from \"../../../sessionStorage\";\nimport { recordPromiseBound } from \"../../../../helpers/recordPromise\";\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport { StoragesResults } from \"../storages/loadStorages\";\nimport { logger } from \"../../../logger\";\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime', \n 'stateCreatedTime',\n 'maxSeenMsgId', \n 'filters'\n];\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'), \n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const, \n 'private' as const, \n 'groups' as const, \n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n });\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.filters = copy(STATE_INIT.filters);\n\n resetStorages.add('dialogs');\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n \n //return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport type { Awaited, WorkerTaskVoidTemplate } from '../../types';\nimport type { CacheStorageDbName } from '../cacheStorage';\nimport type { State } from '../../config/state';\nimport type { Message, MessagePeerReaction, PeerNotifySettings } from '../../layer';\nimport { CryptoMethods } from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport isObject from '../../helpers/object/isObject';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorages',\n payload: {enabled: boolean, clearWrite: boolean}\n};\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T, \n key?: K, \n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n private worker: /* Window */Worker;\n private isSWRegistered: boolean;\n // private sockets: Map = new Map();\n private taskListenersSW: {[taskType: string]: (task: any) => void};\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n constructor() {\n super();\n\n this.isSWRegistered = true;\n this.taskListenersSW = {};\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n \n mirror: this.onMirrorTask\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n \n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy', \n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy', \n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy', \n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true), \n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWork will do it.\n const worker = navigator.serviceWorker;\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url), \n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n\n const {docId, dcId, offset, limit} = task.payload;\n rootScope.managers.appDocsManager.requestDocPart(docId, dcId, offset, limit)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private registerCryptoWorker() {\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url), \n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url), \n {type: 'module'}\n );\n }\n\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n });\n\n this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url), \n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url), \n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n \n this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n }),\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n const task: ToggleStorageTask = {type: 'toggleStorages', payload: {enabled, clearWrite}};\n this.postSWMessage(task);\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n \n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport tabId from \"../../config/tabId\";\nimport IS_SHARED_WORKER_SUPPORTED from \"../../environment/sharedWorkerSupport\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport idleController from \"../../helpers/idleController\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManagerProxy from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId, \n idle, \n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n \n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { logger } from \"../logger\";\r\nimport apiManagerProxy from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\nimport copy from \"../../helpers/object/copy\";\r\nimport type { NotificationSettings } from \"../appManagers/uiNotificationsManager\";\r\nimport singleInstance from \"./singleInstance\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport type { PushNotificationObject } from \"../serviceWorker/push\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager extends EventListenerBase<{\r\n push_notification_click: (n: PushNotificationObject) => void,\r\n push_init: (n: PushSubscriptionNotify) => void,\r\n push_subscribe: (n: PushSubscriptionNotify) => void,\r\n push_unsubscribe: (n: PushSubscriptionNotify) => void\r\n}> {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n super(false);\r\n\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManagerProxy.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManagerProxy.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManagerProxy.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(singleInstance.deactivatedReason) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n this.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport IS_OPUS_SUPPORTED from \"../environment/opusSupport\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { Modify } from \"../types\";\r\nimport { logger, LogTypes } from \"./logger\";\r\nimport apiManagerProxy from \"./mtproto/mtprotoworker\";\r\nimport type { ConvertWebPTask } from \"./webp/webpWorkerController\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport interface ConvertOpusTask extends Modify {\r\n type: 'convertOpus'\r\n}\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker: Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n return IS_OPUS_SUPPORTED;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport { MessageEntity } from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall } from \"../layer\";\nimport type { AppMessagesManager, Dialog, MessagesStorageKey, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type { AppManagers } from \"./appManagers/managers\";\nimport type { State } from \"../config/state\";\nimport type { Progress } from \"./appManagers/appDownloadManager\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport MTProtoMessagePort from \"./mtproto/mtprotoMessagePort\";\nimport { IS_WORKER } from \"../helpers/context\";\nimport { CallId } from \"./appManagers/appCallsManager\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number},\n 'history_update': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n //'history_request': void,\n \n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n \n 'language_change': string,\n \n 'theme_change': void,\n\n 'media_play': void,\n \n 'emoji_recent': string,\n \n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': string,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId = NULL_PEER_ID;\n private connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n \n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport { WorkerTaskVoidTemplate } from '../../types';\r\n\r\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n \r\n private init() {\r\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\r\n this.worker.addEventListener('message', (e) => {\r\n const task = e.data as ConvertWebPTask;\r\n const payload = task.payload;\r\n\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n });\r\n }\r\n\r\n private postMessage(data: ConvertWebPTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"15a67f69d99bd6da42da\",\"53\":\"71a42ea94f0ddd5cd1f3\",\"61\":\"6db21d20aefa6b93eca2\",\"77\":\"808c5b447b007ee7aa9d\",\"104\":\"19c787168bced8f0f781\",\"106\":\"074bf17aad93c3a097a5\",\"139\":\"f4fd38bb6b1d4da6c306\",\"216\":\"4397eec2983565f6f071\",\"301\":\"eb31c208f76e9dc623ec\",\"339\":\"702eead422c6af883b39\",\"392\":\"a0ad16f0908b02621678\",\"436\":\"10206c22b0e2f40d8f22\",\"437\":\"3a0fbb3b8364085ec2f3\",\"442\":\"7c20450a077c518900a1\",\"445\":\"8b680d12416f728f8b70\",\"458\":\"b69e387d025f91cf03db\",\"589\":\"9c324dbbd162911309c3\",\"591\":\"8250ea4e75a163191f15\",\"630\":\"5c8af6e9c411419a66e1\",\"641\":\"682761bd5f38717396f1\",\"642\":\"f2d4e67ea15d5329cd0b\",\"670\":\"ed0dbbea2d9f6f96af2b\",\"678\":\"e72cffdf2b7d9b2b317f\",\"709\":\"dec2bf42c5cce33bde28\",\"765\":\"d96ae842524025af79ef\",\"774\":\"04c4656f821730d3e97b\",\"781\":\"f96ab4e55bded41d4d3c\",\"810\":\"fa9733cf38d84f48fd4e\",\"813\":\"30b0b1677b13ee5fdef9\",\"853\":\"5062ae3867f3575462eb\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [960,434], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","oldGetScript","oldLoadScript","queryMap","countMap","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","err","document","createElement","getContext","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","window","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","indexOf","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbaToHsla","r","g","b","a","max","Math","min","h","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerProxy","Proxy","Worker","construct","args","location","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","rootScope","getProxiedManagers","singleInstance","w","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","elem","promise","opacity","state","appVersion","lang_code","console","log","getElementById","pagePromise","placeholder","prepend","append","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","proxied","createProxyProxy","ack","get","receiver","method","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lastRequestedLangCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","langCode","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","hash","polyfillPromise","pushTo","applyLangPack","Intl","PluralRules","string","set","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","url","wrappedUrl","href","onclick","textContent","arg","pushNextArgument","plain","str","select","item","Node","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","mirrors","mirror","isSWRegistered","taskListenersSW","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","worker","serviceWorker","register","URL","scope","registration","installing","waiting","active","invokeVoid","controller","task","data","isObject","addServiceWorkerTaskListener","responseTask","docId","dcId","limit","uploadFile","postSWMessage","originalPayload","SharedWorker","cryptoMessagePort","source","ports","attachWorkerToPort","onWorkerFirstMessage","messagePort","port","attachPort","postMessage","loadState","sendState","userId","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tgme_sync","path","encodeURIComponent","script","onload","remove","src","body","appendChild","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","catch","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","Blob","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","Telegram","Twitter","Instagram","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","RootScope","myId","connectionStatus","premium","status","getConnectionStatus","dispatchEventSingle","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","reduce","u","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","has","retries","realSrc","cacheBust","baseURI","self","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.8fe17e02354fa08e65e4.bundle.js b/public/main.8fe17e02354fa08e65e4.bundle.js deleted file mode 100644 index 777fd383a..000000000 --- a/public/main.8fe17e02354fa08e65e4.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(f){function e(e){for(var d,s,n=e[0],a=e[1],c=0,i=[];c{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",f=>{this.peerId=f,document.body.classList.toggle("has-chat",!!f)}),this.addEventListener("user_auth",({id:f})=>{this.myId="number"==typeof t.c?+f:""+f}),this.addEventListener("connection_status_change",f=>{this.connectionStatus[f.name]=f}),this.addEventListener("idle",f=>{f?this.idle.focusPromise=new Promise(f=>{this.idle.focusResolve=f}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(f=this.themeColor){f||(f=this.isNight()?"#212121":"#ffffff");const e=this.themeColorElem;e&&e.setAttribute("content",f)}setThemeListener(){try{const f=window.matchMedia("(prefers-color-scheme: dark)"),e=()=>{this.systemTheme=f.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in f?f.addEventListener("change",e):"addListener"in f&&f.addListener(e),e()}catch(f){}}setTheme(){const f=this.isNight(),e=document.head.querySelector('[name="color-scheme"]');e&&e.setAttribute("content",f?"dark":"light"),document.documentElement.classList.toggle("night",f),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(f){this.overlaysActive+=f?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(f=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(e=>e.name===f)}}const c=new a;n.a.rootScope=c,e.a=c},function(f,e,d){"use strict";d.d(e,"a",(function(){return s}));const t=d(9).a.debug,s="undefined"!=typeof window?window:self;e.b=t},function(f,e,d){"use strict";d.d(e,"b",(function(){return n})),d.d(e,"a",(function(){return a})),d.d(e,"c",(function(){return c})),d.d(e,"g",(function(){return i})),d.d(e,"d",(function(){return r})),d.d(e,"f",(function(){return o})),d.d(e,"e",(function(){return u}));var t=d(30);const s=navigator?navigator.userAgent:null,n=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),a=-1!==navigator.userAgent.toLowerCase().indexOf("android"),c=(/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!t.a.MSStream),i=!!("safari"in t.a)||!(!s||!(/\b(iPad|iPhone|iPod)\b/.test(s)||s.match("Safari")&&!s.match("Chrome"))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,o=i&&c,u=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},function(f,e,d){"use strict";function t(f){if(null===f||"object"!=typeof f)return f;if(f instanceof Date)return new Date(f.getTime());if(Array.isArray(f)){return f.map(f=>t(f))}let e=new f.constructor;for(var d in f)f.hasOwnProperty(d)&&(e[d]=t(f[d]));return e}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";d.d(e,"a",(function(){return t})),d.d(e,"b",(function(){return p}));var t,s=d(1),n=d(2),a=d(13);!function(f){f[f.None=0]="None",f[f.Error=1]="Error",f[f.Warn=2]="Warn",f[f.Log=4]="Log",f[f.Debug=8]="Debug"}(t||(t={}));const c=[t.None,t.Error,t.Warn,t.Log,t.Debug],i=Date.now();function r(){return"["+((Date.now()-i)/1e3).toFixed(3)+"]"}let o;const u=n.g||n.d;o=u?f=>f.split("@")[0]:f=>{const e=f.trim().split(" ");if(3===e.length)return e[1].slice(e[1].lastIndexOf(".")+1)};const l=!u,b=u?2:3;function h(){const f=(new Error).stack.split("\n"),e=f[b]||f[f.length-1];return"["+(o(e)||"")+"]"}const g={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},m=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log]];function p(f,e=t.Log|t.Warn|t.Error,d=!1,n=""){let i;s.b||d||(e=t.Error),l?n||(a.a?n=g.yellow:a.b&&(n=g.cyan)):n="";let o=n;n=n?`%s ${n}%s`:"%s";const u=function(...d){return e&t.Log&&console.log(n,r(),f,h(),...d)};return m.forEach(([d,t])=>{u[d]=function(...s){return e&t&&console[d](n,r(),f,h(),...s)}}),u.setPrefix=function(e){i=e,f="["+e+"]"},u.setPrefix(f),u.setLevel=function(f){e=c.slice(0,f+1).reduce((f,e)=>f|e,0)},u.bindPrefix=function(f){return p(`${i}] [${f}`,e,d,o)},u}},function(f,e,d){"use strict";const t={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.3",versionFull:"1.4.3 (177)",build:177,langPackVersion:"0.4.0",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};t.isMainDomain&&(t.id=2496,t.hash="8da85b0d5bfe62527e5b244c209159c3"),e.a=t},function(f,e,d){"use strict";var t=d(1),s=d(9),n=d(13);class a{constructor(){this.prefix="",this.cache={},this.useStorage=!0,s.a.test&&(this.prefix="t_")}get(f,e=!0){if(this.cache.hasOwnProperty(f)&&e)return this.cache[f];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+f)}catch(f){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(f){}else e=void 0;return e}}set(f,e=!1){for(const d in f)if(f.hasOwnProperty(d)){const t=f[d];if(this.cache[d]=t,this.useStorage&&!e)try{const f=JSON.stringify(t);localStorage.setItem(this.prefix+d,f)}catch(f){this.useStorage=!1}}}delete(f,e=!1){f=""+f,e||delete this.cache[f];try{localStorage.removeItem(this.prefix+f)}catch(f){}}clear(){const f=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let e=1;e<=5;++e)f.push(`dc${e}_server_salt`),f.push(`dc${e}_auth_key`);for(let e of f)this.delete(e,!0)}toggleStorage(f){if(this.useStorage=f,f)return this.set(this.cache);this.clear()}}class c{constructor(){this.taskId=0,this.tasks={},c.STORAGES.push(this),n.c||(this.storage=new a)}finishTask(f,e){this.tasks.hasOwnProperty(f)&&(this.tasks[f](e),delete this.tasks[f])}proxy(f,...e){return new Promise((d,t)=>{if(n.c){const t=this.taskId++;this.tasks[t]=d;const s={type:"localStorageProxy",id:t,payload:{type:f,args:e}};Object(n.d)(s)}else{e=Array.prototype.slice.call(e);d(this.storage[f].apply(this.storage,e))}})}get(f,e){return this.proxy("get",f,e)}set(f,e){return this.proxy("set",f,e)}delete(f,e){return this.proxy("delete",f,e)}clear(){return this.proxy("clear")}toggleStorage(f){return this.proxy("toggleStorage",f)}}c.STORAGES=[];const i=new c;t.a.appStorage=i;e.a=i},function(f,e,d){"use strict";d.d(e,"h",(function(){return l})),d.d(e,"a",(function(){return b})),d.d(e,"d",(function(){return g})),d.d(e,"e",(function(){return m})),d.d(e,"b",(function(){return p})),d.d(e,"g",(function(){return v})),d.d(e,"f",(function(){return y}));var t=d(1),s=d(8),n=d(11),a=d(5),c=d(0),i=d(28),r=d(2),o=d(41),u=d(18);const l={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},b=r.e?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var h;!function(f){let e,r;function l(){if("h12"===f.timeFormat)try{const e=P({hour:"numeric",minute:"numeric",hour12:!0}),d=new Date;d.setHours(0);const t=e.format(d);f.amPmCache.am=t.split(" ")[1],d.setHours(12);const s=e.format(d);f.amPmCache.pm=s.split(" ")[1]}catch(e){console.error("cannot get am/pm",e),f.amPmCache={am:"AM",pm:"PM"}}}function b(){const e=a.a.langPackCode;return f.lastRequestedLangCode=e,Promise.all([d.e(7).then(d.bind(null,195)),d.e(8).then(d.bind(null,196)),d.e(21).then(d.bind(null,197))]).then(([f,d,t])=>{const s=[];g(f.default,s),g(d.default,s);return p({_:"langPackDifference",from_version:0,lang_code:e,strings:s,version:0,local:!0,countries:t.default})})}function h(e){return f.requestedServerLanguage=!0,Promise.all([s.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:a.a.langPack}),s.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:"android"}),d.e(7).then(d.bind(null,195)),d.e(8).then(d.bind(null,196)),s.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function g(f,e=[]){for(const d in f){const t=f[d];"string"==typeof t?e.push({_:"langPackString",key:d,value:t}):e.push(Object.assign({_:"langPackStringPluralized",key:d},t))}return e}function m(e){return f.lastRequestedLangCode=e,h(e).then(([f,e,d,t,s,n])=>{let a=[];[d,t].forEach(f=>{g(f.default,a)}),a=a.concat(f.strings);for(const f of e.strings)a.push(f);return f.strings=a,f.countries=s,p(f)})}function p(f){return f.appVersion=a.a.langPackVersion,n.a.set({langPack:f}).then(()=>(v(f),f))}function v(d){if(d.lang_code!==f.lastRequestedLangCode)return;try{e=new Intl.PluralRules(d.lang_code)}catch(f){console.error("pluralRules error",f),e=new Intl.PluralRules(d.lang_code.split("-",1)[0])}f.strings.clear();for(const e of d.strings)f.strings.set(e.key,e);d.countries&&(f.countriesList.length=0,f.countriesList.push(...d.countries.countries),d.countries.countries.forEach(e=>{if(e.name){const d=e.default_name;f.strings.set(d,{_:"langPackString",key:d,value:e.name})}})),f.lastAppliedLangCode!==d.lang_code&&(c.a.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code,S.clear(),l());Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function y(f,e,d={i:0}){let t=[];let s=0;return f.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,n,a,c,r,o,u)=>{if(t.push(u.slice(s,o)),n){let f;switch(n){case"**":f=document.createElement("b");break;case"__":f=document.createElement("i")}f.append(...y(a,e,d)),t.push(f)}else if(c)t.push(document.createElement("br"));else if(r){const f=r.lastIndexOf("]"),s=r.slice(1,f),n=r.slice(f+2,r.length-1);let a;if(n&&i.b.matchUrlProtocol(n)){a=document.createElement("a");const f=i.b.wrapUrl(n);a.href=f.url,f.onclick&&a.setAttribute("onclick",f.onclick),a.target="_blank"}else a=e[d.i++],a.textContent="";a.append(...y(s,e,d)),t.push(a)}else e&&function(f,e,d){const t=e[d.i++];Array.isArray(t)?f.push(...t):f.push(t)}(t,e,d);return s=o+f.length,""}),s!==f.length&&t.push(f.slice(s)),t}function k(d,t=!1,s){const n=f.strings.get(d);let a;if(n)if("langPackStringPluralized"===n._&&(null==s?void 0:s.length)){let f=s[0];"string"==typeof f&&(f=+f.replace(/\D/g,""));a=n[e.select(f)+"_value"]||n.other_value}else a="langPackString"===n._?n.value:d;else a=d;const c=y(a,s);return t?c.map(f=>f instanceof Node?f.textContent:f).join(""):c}f.strings=new Map,f.countriesList=[],f.requestedServerLanguage=!1,f.getCacheLangPack=function(){return r||(r=Promise.all([n.a.get("langPack"),f.polyfillPromise]).then(([e])=>e?(t.b,f.lastRequestedLangCode||(f.lastRequestedLangCode=e.lang_code),v(e),e):b()).finally(()=>{r=void 0}))},f.setTimeFormat=function(e,d=!!f.timeFormat&&f.timeFormat!==e){if(f.timeFormat=e,l(),d){S.clear();Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof A&&d.update()})}},f.loadLocalLangPack=b,f.loadLangPack=h,f.getStrings=function(f,e){return s.a.invokeApi("langpack.getStrings",{lang_pack:a.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=g,f.getLangPack=m,f.saveLangPack=p,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(22).then(d.bind(null,198)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=v,f.superFormatter=y,f.format=k,f.weakMap=new WeakMap;class w{constructor(e){this.element=(null==e?void 0:e.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==e?void 0:e.property,e&&(e.key||e.date)&&this.update(e),f.weakMap.set(this.element,this)}}class E extends w{constructor(f={}){var e;super(Object.assign(Object.assign({},f),{property:null!==(e=f.property)&&void 0!==e?e:"innerHTML"}))}update(f){if(Object(u.a)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...k(this.key,!1,this.args));else{const f=this.element[this.property],e=k(this.key,!0,this.args);void 0===f?this.element.dataset[this.property]=e:this.element[this.property]=e}}compareAndUpdate(f){if(this.key!==f.key||!Object(o.a)(this.args,f.args))return this.update(f)}}f.IntlElement=E;const S=new Map;function P(e={}){let d=JSON.stringify(e),t=S.get(d);return t||S.set(d,t=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,e)),t}f.amPmCache={am:"AM",pm:"PM"};class A extends w{constructor(f){var e;super(Object.assign(Object.assign({},f),{property:null!==(e=f.property)&&void 0!==e?e:"textContent"}))}update(e){let d;if(Object(u.a)(this,e),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){let e=this.date.getHours();d=("0"+("h12"===f.timeFormat?e%12||12:e)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===f.timeFormat&&(d+=" "+(e<12?f.amPmCache.am:f.amPmCache.pm))}else{const f=P(this.options);d=(t=f.format(this.date)).charAt(0).toUpperCase()+t.slice(1)}var t;this.element[this.property]=d}}f.IntlDateElement=A,f.i18n=function(f,e){return new E({key:f,args:e}).element},f.i18n_=function(f){return new E(f).element},f._i18n=function(f,e,d,t){return new E({element:f,key:e,args:d,property:t}).element}}(h||(h={}));e.c=h;const g=h.i18n,m=h.i18n_,p=h._i18n;function v(f,e){const d=f.slice(0,1);for(let t=1;t{const t=f&&e?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return d?h.format(t,!0):g(t)});return d?t.join(""):t}t.a.I18n=h},function(f,e,d){"use strict";function t(){return new Worker(d.p+"mtproto.worker.02f307d76034f3156ff7.bundle.worker.js")}var s=d(4),n=d(0),a=d(53),c=d(1),i=d(9),r=d(15);class o extends r.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=i.a.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=f=>{this.log.error("handleError",f),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=f=>{this.debug&&this.log.debug("<-","handleMessage",f.data.byteLength),this.dispatchEvent("message",f.data)},this.send=f=>{this.debug&&this.log.debug("-> body length to send:",f.length),this.ws.send(f)};let t=s.a.Error|s.a.Log;return this.debug&&(t|=s.a.Debug),this.log=Object(s.b)("WS-"+f+d,t),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(f){}this.handleClose()}}}var u=d(50),l=d(6),b=d(51),h=d(12),g=d(25),m=d(48),p=d(16),v=d(46),y=d(44),k=d(19);const w=new class extends class{invokeCrypto(f,...e){return this.performTaskWorker(f,...e)}}{constructor(){super(),this.afterMessageIdTemp=0,this.taskId=0,this.awaiting={},this.pending=[],this.updatesProcessor=null,this.log=Object(s.b)("API-PROXY"),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.isSWRegistered=!0,this.debug=c.b,this.sockets=new Map,this.taskListeners={},this.taskListenersSW={},this.postMessagesWaiting=[],this.onWorkerMessage=f=>{const e=f.data;if(!Object(k.a)(e))return;const d=this.taskListeners[e.type];d?d(e):e.update?this.updatesProcessor&&this.updatesProcessor(e.update):e.progress?n.a.dispatchEvent("download_progress",e.progress):(e.hasOwnProperty("result")||e.hasOwnProperty("error"))&&this.finalizeTask(e.taskId,e.result,e.error)},this.log("constructor"),u.a.start(),this.registerServiceWorker(),this.addTaskListener("clear",()=>{Promise.all([h.a.toggleStorage(!1),l.a.clear(),Promise.race([m.default.setAuthorized(!1),Object(p.a)(3e3)]),b.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map(f=>caches.delete(f)))]).finally(()=>{g.a.reload()})}),this.addTaskListener("connectionStatusChange",f=>{n.a.dispatchEvent("connection_status_change",f.payload)}),this.addTaskListener("convertWebp",f=>{a.a.postMessage(f)}),this.addTaskListener("socketProxy",f=>{const e=f.payload,d=e.id;if("send"===e.type){this.sockets.get(d).send(e.payload)}else if("close"===e.type){this.sockets.get(d).close()}else if("setup"===e.type){const f=new o(e.payload.dcId,e.payload.url,e.payload.logSuffix),t=()=>{this.postMessage({type:"socketProxy",payload:{type:"open",id:d}})},s=()=>{this.postMessage({type:"socketProxy",payload:{type:"close",id:d}}),f.removeEventListener("open",t),f.removeEventListener("close",s),f.removeEventListener("message",n),this.sockets.delete(d)},n=f=>{this.postMessage({type:"socketProxy",payload:{type:"message",id:d,payload:f}})};f.addEventListener("open",t),f.addEventListener("close",s),f.addEventListener("message",n),this.sockets.set(d,f)}}),this.addTaskListener("localStorageProxy",f=>{const e=f.payload;l.a[e.type](...e.args).then(e=>{this.postMessage({type:"localStorageProxy",id:f.id,payload:e})})}),n.a.addEventListener("language_change",f=>{this.performTaskWorkerVoid("setLanguage",f)}),window.addEventListener("online",f=>{this.forceReconnectTimeout()}),this.registerWorker(),setTimeout(()=>{this.getConfig()},5e3)}isServiceWorkerOnline(){return this.isSWRegistered}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const f=navigator.serviceWorker;f.register("./sw.js",{scope:"./"}).then(f=>{this.log("SW registered",f),this.isSWRegistered=!0;(f.installing||f.waiting||f.active).addEventListener("statechange",f=>{this.log("SW statechange",f)})},f=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",f),this.onServiceWorkerFail&&this.onServiceWorkerFail()}),f.addEventListener("controllerchange",()=>{this.log.warn("controllerchange"),this.releasePending(),f.controller.addEventListener("error",f=>{this.log.error("controller error:",f)})}),f.addEventListener("message",f=>{const e=f.data;if(!Object(k.a)(e))return;const d=this.taskListenersSW[e.type];d&&d(e)}),this.addServiceWorkerTaskListener("requestFilePart",f=>{const e={type:f.type,id:f.id};this.performTaskWorker("requestFilePart",...f.payload).then(f=>{e.payload=f,this.postSWMessage(e)},d=>{e.originalPayload=f.payload,e.error=d,this.postSWMessage(e)})}),f.addEventListener("messageerror",f=>{this.log.error("SW messageerror:",f)})}postMessage(...f){this.postMessagesWaiting.push(f)}postSWMessage(f){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(f)}onWorkerFirstMessage(f){if(!this.worker){this.worker=f,this.log("set webWorker"),this.postMessage=this.worker.postMessage.bind(this.worker),this.postMessagesWaiting.forEach(f=>this.postMessage(...f)),this.postMessagesWaiting.length=0;const e=v.a;this.log("WebP supported:",e),this.postMessage({type:"webpSupport",payload:e}),this.postMessage({type:"userAgent",payload:navigator.userAgent}),this.releasePending()}}addTaskListener(f,e){this.taskListeners[f]=e}addServiceWorkerTaskListener(f,e){this.taskListenersSW[f]=e}registerWorker(){const f=new t;f.addEventListener("message",this.onWorkerFirstMessage.bind(this,f),{once:!0}),f.addEventListener("message",this.onWorkerMessage),f.addEventListener("error",f=>{this.log.error("WORKER ERROR",f)})}finalizeTask(f,e,d){const t=this.awaiting[f];void 0!==t&&(this.debug&&this.log.debug("done",t.taskName,e,d),d?t.reject(d):t.resolve(e),delete this.awaiting[f])}createTask(f,e,d){return{task:f,taskId:this.taskId++,type:e,args:d}}performTaskWorkerVoid(f,...e){const d=this.createTask(f,void 0,e);this.pending.push(d),this.releasePending()}performTaskWorkerNew(f,e,...d){return this.debug&&this.log.debug("start",f,d),new Promise((t,s)=>{const n=this.createTask(f,e,d);this.pending.push(n),this.awaiting[n.taskId]={resolve:t,reject:s,taskName:f},this.releasePending()})}performTaskWorker(f,...e){return this.performTaskWorkerNew(f,void 0,...e)}releasePending(){this.postMessage&&(this.debug&&this.log.debug("releasing tasks, length:",this.pending.length),this.pending.forEach(f=>{this.postMessage(f)}),this.debug&&this.log.debug("released tasks"),this.pending.length=0)}setUpdatesProcessor(f){this.updatesProcessor=f}invokeCrypto(f,...e){return this.performTaskWorkerNew(f,"crypto",...e)}invokeApi(f,e={},d={}){return this.performTaskWorker("invokeApi",f,e,d)}invokeApiAfter(f,e={},d={}){let t=d;return t.prepareTempMessageId=""+ ++this.afterMessageIdTemp,t=Object.assign({},d),d.messageId=t.prepareTempMessageId,this.invokeApi(f,e,t)}invokeApiHashable(f){var e,d;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{params:t,options:s,method:n}=f,a=JSON.stringify(t);let c;return this.hashes[n]&&(c=this.hashes[n][a],c&&(t.hash=c.hash)),this.invokeApiSingleProcess({method:n,processResult:e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",n,a),c.result;if(e.hash){const f=e.hash;this.hashes[n]||(this.hashes[n]={}),this.hashes[n][a]={hash:f,result:e}}return f.processResult?f.processResult(e):e},params:t,options:s})}invokeApiSingle(f,e={},d={}){const t=f+"-"+JSON.stringify(e),s=this.apiPromisesSingle;return s[t]?s[t]:s[t]=this.invokeApi(f,e,d).finally(()=>{delete s[t]})}invokeApiSingleProcess(f){var e,d,t;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{method:s,processResult:n,processError:a,params:c,options:i}=f,r=this.apiPromisesSingleProcess,o=i.cacheKey||JSON.stringify(c),u=null!==(t=r[s])&&void 0!==t?t:r[s]=new Map,l=u.get(o);if(l)return l;const b=this.invokeApi(s,c,i).then(n,a).finally(()=>{u.delete(o),u.size||delete r[s]});return u.set(o,b),b}invokeApiCacheable(f,e={},d={}){var t;const s=null!==(t=this.apiPromisesCacheable[f])&&void 0!==t?t:this.apiPromisesCacheable[f]={},n=JSON.stringify(e),a=s[n];if(a&&(!d.override||!a.fulfilled))return a.promise;let c;d.override&&(a&&a.timeout&&(clearTimeout(a.timeout),delete a.timeout),delete d.override),d.cacheSeconds&&(c=window.setTimeout(()=>{delete s[n]},1e3*d.cacheSeconds),delete d.cacheSeconds);const i=this.invokeApi(f,e,d);return s[n]={timestamp:Date.now(),fulfilled:!1,timeout:c,promise:i,params:e},i}clearCache(f,e){const d=this.apiPromisesCacheable[f];if(d)for(const f in d){const t=d[f];try{e(t.params)&&(t.timeout&&clearTimeout(t.timeout),delete d[f])}catch(e){this.log.error("clearCache error:",e,f,t)}}}setBaseDcId(f){return this.performTaskWorker("setBaseDcId",f)}setQueueId(f){return this.performTaskWorker("setQueueId",f)}setUserAuth(f){return"string"!=typeof f&&"number"!=typeof f||(f={dcID:0,date:Date.now()/1e3|0,id:f.toPeerId(!1)}),n.a.dispatchEvent("user_auth",f),this.performTaskWorker("setUserAuth",f)}setUser(f){return this.setUserAuth(f.id)}getNetworker(f,e){return this.performTaskWorker("getNetworker",f,e)}logOut(){return this.performTaskWorker("logOut")}cancelDownload(f){return this.performTaskWorker("cancelDownload",f)}downloadFile(f){return this.performTaskWorker("downloadFile",f)}uploadFile(f){return this.performTaskWorker("uploadFile",f)}toggleStorage(f){const e={type:"toggleStorage",payload:f};this.postMessage(e),this.postSWMessage(e)}stopAll(){return this.performTaskWorkerVoid("stopAll")}startAll(){return this.performTaskWorkerVoid("startAll")}forceReconnectTimeout(){this.postMessage({type:"online"})}forceReconnect(){this.postMessage({type:"forceReconnect"})}getConfig(){return this.getConfigPromise?this.getConfigPromise:this.getConfigPromise=this.invokeApi("help.getConfig").then(f=>(n.a.config=f,f))}getAppConfig(f){if(n.a.appConfig&&!f)return n.a.appConfig;if(this.getAppConfigPromise&&!f)return this.getAppConfigPromise;const e=this.getAppConfigPromise=this.invokeApi("help.getAppConfig").then(f=>{var d;return this.getAppConfigPromise!==e?this.getAppConfigPromise:(n.a.appConfig=f,Object(y.b)(null!==(d=f.ignore_restriction_reasons)&&void 0!==d?d:[]),f)});return e}};c.a.apiManagerProxy=w;e.a=w},function(f,e,d){"use strict";const t={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};t.http=location.search.indexOf("http=1")>0,t.http&&(t.transport="https"),e.a=t},function(f,e,d){"use strict";d.d(e,"a",(function(){return s}));var t=d(40);function s(){let f={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{f.lastNotify=e,f.listeners.forEach(f=>f(...e))},listeners:[],addNotifyListener:e=>{f.lastNotify&&e(...f.lastNotify),f.listeners.push(e)}},e=new Promise((d,t)=>{f.resolve=f=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,d(f))},f.reject=(...f)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...f))}});return e.catch(t.a).finally(()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=()=>{})}),Object.assign(e,f),e}},function(f,e,d){"use strict";var t=d(1),s=d(12),n=d(17);const a=new s.a(n.a,"session");t.a.stateStorage=a,e.a=a},function(f,e,d){"use strict";d.d(e,"a",(function(){return l}));var t=d(10),s=d(22),n=d(9),a=d(47),c=d(18),i=d(4);class r{constructor(f,e){this.storageIsAvailable=!0,Object(c.a)(this,f),n.a.test&&(this.name+="_test"),this.storeName=e,this.log=Object(i.b)("IDB-"+this.storeName),this.openDatabase(!0),r.STORAGES.push(this)}static closeDatabases(f){this.STORAGES.forEach(e=>{if(f&&f===e)return;const d=e.db;d&&(d.onclose=()=>{},d.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(f=!1){if(this.openDbPromise&&!f)return this.openDbPromise;try{var e=indexedDB.open(this.name,this.version);if(!e)return Promise.reject()}catch(f){return this.log.error("error opening db",f.message),this.storageIsAvailable=!1,Promise.reject(f)}let d=!1;return setTimeout(()=>{d||e.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((f,t)=>{e.onsuccess=s=>{d=!0;const n=e.result;let a=!1;this.log("Opened"),n.onerror=f=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",f),t(f)},n.onclose=f=>{this.log.error("closed:",f),!a&&this.openDatabase()},n.onabort=f=>{this.log.error("abort:",f);const e=f.target;this.openDatabase(a=!0),e.onerror&&e.onerror(f),n.close()},n.onversionchange=f=>{this.log.error("onversionchange, lol?")},f(this.db=n)},e.onerror=f=>{d=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",f),t(f)},e.onupgradeneeded=f=>{d=!0,this.log.warn("performing idb upgrade from",f.oldVersion,"to",f.newVersion);var e=f.target.result;this.stores.forEach(f=>{e.objectStoreNames.contains(f.name)||((f,e)=>{var d;const t=f.createObjectStore(e.name);if(null===(d=e.indexes)||void 0===d?void 0:d.length)for(const f of e.indexes)t.createIndex(f.indexName,f.keyPath,f.objectParameters)})(e,f)})}})}delete(f){return Array.isArray(f)||(f=[].concat(f)),this.getObjectStore("readwrite",e=>f.map(f=>e.delete(f)),"")}clear(f){return this.getObjectStore("readwrite",f=>f.clear(),"",f)}save(f,e){return Array.isArray(f)||(f=[].concat(f),e=[].concat(e)),this.getObjectStore("readwrite",d=>f.map((f,t)=>d.put(e[t],f)),"")}saveFile(f,e){return e instanceof Blob||(e=Object(a.a)(e)),this.save(f,e)}get(f){return Array.isArray(f)||(f=[].concat(f)),this.getObjectStore("readonly",e=>f.map(f=>e.get(f)),"")}getObjectStore(f,e,d,t=this.storeName){let s;return d&&(s=performance.now(),this.log(d+": start")),this.openDatabase().then(n=>new Promise((a,c)=>{const i=n.transaction([t],f);i.onerror=f=>{clearTimeout(r),c(i.error)},i.oncomplete=f=>{clearTimeout(r),d&&this.log(d+": end",performance.now()-s);const e=l.map(f=>f.result);a(u?e:e[0])};const r=setTimeout(()=>{this.log.error("transaction not finished",i)},1e4),o=e(i.objectStore(t)),u=Array.isArray(o),l=u?o:[].concat(o)}))}getAll(){return this.getObjectStore("readonly",f=>f.getAll(),"")}}r.STORAGES=[];var o=function(f,e,d,t){return new(d||(d=Promise))((function(s,n){function a(f){try{i(t.next(f))}catch(f){n(f)}}function c(f){try{i(t.throw(f))}catch(f){n(f)}}function i(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,c)}i((t=t.apply(f,e||[])).next())}))};function u(){}class l{constructor(f,e){this.db=f,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=Object(t.a)(),this.keysToDelete=new Set,this.deleteDeferred=Object(t.a)(),this.storage=new r(f,e),l.STORAGES.length?this.useStorage=l.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,l.STORAGES.push(this),this.saveThrottled=Object(s.a)(()=>o(this,void 0,void 0,(function*(){const f=this.saveDeferred;this.saveDeferred=Object(t.a)();const e=this.keysToSet;if(e.size){const f=Array.from(e.values());e.clear();try{const e=f.map(f=>this.cache[f]);yield this.storage.save(f,e)}catch(e){console.error("[AS]: set error:",e,f)}}f.resolve(),e.size&&this.saveThrottled()})),16,!1),this.deleteThrottled=Object(s.a)(()=>o(this,void 0,void 0,(function*(){const f=this.deleteDeferred;this.deleteDeferred=Object(t.a)();const e=this.keysToDelete;if(e.size){const f=Array.from(e.values());e.clear();try{yield this.storage.delete(f)}catch(e){console.error("[AS]: delete error:",e,f)}}f.resolve(),e.size&&this.deleteThrottled()})),16,!1),this.getThrottled=Object(s.a)(()=>o(this,void 0,void 0,(function*(){const f=Array.from(this.getPromises.keys());this.storage.get(f).then(e=>{for(let d=0,t=f.length;d{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(d)||(this.useStorage=!1,console.error("[AS]: get error:",d,f,e));for(let e=0,d=f.length;e{this.getPromises.size&&this.getThrottled()})})),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(f){return this.cache[f]}setToCache(f,e){return this.cache[f]=e}get(f,e=!0){return o(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(f)&&e)return this.getFromCache(f);if(this.useStorage){const e=this.getPromises.get(f);if(e)return e;const d=Object(t.a)();return this.getPromises.set(f,d),this.getThrottled(),d}}))}getAll(){return this.storage.getAll().catch(()=>[])}set(f,e=!1){const d=this.useStorage&&!e&&!this.savingFreezed;for(const e in f)if(f.hasOwnProperty(e)){const t=f[e];this.setToCache(e,t),d&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return d?this.saveDeferred:Promise.resolve()}delete(f,e=!1){return f=""+f,e||delete this.cache[f],this.useStorage&&(this.keysToSet.delete(f),this.keysToDelete.add(f),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(f=!1){if(!f)for(const f in this.cache)delete this.cache[f];return this.storage.clear().catch(u)}static toggleStorage(f){return Promise.all(this.STORAGES.map(e=>(e.useStorage=f,f?e.set(e.cache):(e.keysToSet.clear(),e.keysToDelete.clear(),e.getPromises.forEach(f=>f.resolve(void 0)),e.getPromises.clear(),e.clear(!0))))).catch(u)}static freezeSaving(f,e){this.STORAGES.forEach(f=>f.savingFreezed=!0);try{f()}catch(f){}this.STORAGES.forEach(f=>f.savingFreezed=!1)}}l.STORAGES=[]},function(f,e,d){"use strict";d.d(e,"a",(function(){return t})),d.d(e,"b",(function(){return s})),d.d(e,"c",(function(){return n})),d.d(e,"d",(function(){return r}));const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,s="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,n=s||t,a=(f,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(d=>{d.length&&d.slice(f?0:-1).forEach(f=>{f.postMessage(...e)})})},c=(...f)=>{self.postMessage(...f)},i=()=>{},r=t?a.bind(null,!1):s?c:i;t&&a.bind(null,!0)},function(f,e,d){"use strict";d.d(e,"a",(function(){return t}));const t="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch;e.b=t},function(f,e,d){"use strict";d.d(e,"a",(function(){return s}));var t=d(39);class s{constructor(f){this._constructor(f)}_constructor(f=!1){this.reuseResults=f,this.listeners={},this.listenerResults={}}addEventListener(f,e,d){var t,s;(null!==(t=this.listeners[f])&&void 0!==t?t:this.listeners[f]=[]).push({callback:e,options:d}),this.listenerResults.hasOwnProperty(f)&&(e(...this.listenerResults[f]),null===(s=d)||void 0===s?void 0:s.once)&&this.listeners[f].pop()}addMultipleEventsListeners(f){for(const e in f)this.addEventListener(e,f[e])}removeEventListener(f,e,d){this.listeners[f]&&Object(t.a)(this.listeners[f],f=>f.callback===e)}_dispatchEvent(f,e,...d){this.reuseResults&&(this.listenerResults[f]=d);const t=e&&[],s=this.listeners[f];if(s){s.slice().forEach(e=>{var n;if(-1===s.findIndex(f=>f.callback===e.callback))return;let a;try{a=e.callback(...d)}catch(f){console.error(f)}t&&t.push(a),(null===(n=e.options)||void 0===n?void 0:n.once)&&this.removeEventListener(f,e.callback)})}return t}dispatchResultableEvent(f,...e){return this._dispatchEvent(f,!0,...e)}dispatchEvent(f,...e){this._dispatchEvent(f,!1,...e)}cleanup(){this.listeners={},this.listenerResults={}}}},function(f,e,d){"use strict";function t(f){return new Promise(e=>{setTimeout(e,f)})}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";e.a={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},function(f,e,d){"use strict";function t(f,e){if(e)for(let d in e)void 0!==e[d]&&(f[d]=e[d]);return f}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";function t(f){return"object"==typeof f&&null!==f}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";d.d(e,"c",(function(){return t})),d.d(e,"e",(function(){return s})),d.d(e,"d",(function(){return n})),d.d(e,"f",(function(){return a})),d.d(e,"b",(function(){return c})),d.d(e,"a",(function(){return i}));const t=0,s=1271266957,n=777,a=777e3,c=2147483647,i=""},function(f,e,d){"use strict";d.d(e,"a",(function(){return s})),d.d(e,"b",(function(){return n}));const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function s(f){const e=t[f];return crypto.getRandomValues(e),e[0]}function n(){return""+s(32)+s(32)%16777215}},function(f,e,d){"use strict";function t(f,e,d=!0){let t,s,n=null;return(...a)=>{t=!0,s=a,n||(d&&(t=!1,f(...s)),n=setInterval(()=>{if(!t)return clearInterval(n),void(n=null);t=!1,f(...s)},e))}}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";const t=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i);e.a=t},function(f,e,d){"use strict";function t(f,e){f=f.split(" ",1)[0],e=e.split(" ",1)[0];const d=f.split("."),t=e.split(".");for(let f=0;fs)return 1;if(e\"'])?)?",h=(new RegExp("^"+"((?:https?|ftp)://|mailto:)?".slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),g=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+b+")|(\\n)|(((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️))|(^|[\\s\\(\\]])(#[0-9_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-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),m=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,p=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,v={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},y={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},k=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let f in y)k.add(y[f]);var w;!function(f){function e(f){let e=Object(t.b)(f).replace(/-?fe0f/g,"");if(r.b.hasOwnProperty(e))return e}function d(f){let d,t=f;const s=[];let n,a=0;for(g.lastIndex=0;d=t.match(g);){if(n=a+d.index,d[3])s.push({_:"messageEntityMention",offset:n+d[1].length,length:d[2].length+d[3].length});else if(d[4])if(m.test(d[4]))s.push({_:"messageEntityEmail",offset:n,length:d[4].length});else{let f,e=d[5];const t=d[6];if(t){if(e||"xn--"!==t.substr(0,4)&&-1===o.indexOf(t.toLowerCase())||(e="http://"),e){const t=A(d[4]);t.length!==d[4].length&&(d[4]=t),f=(d[5]?"":e)+d[4]}}else f=(d[5]?"":"http://")+d[4];f&&s.push({_:"messageEntityUrl",offset:n,length:d[4].length})}else if(d[7])s.push({_:"messageEntityLinebreak",offset:n,length:1});else if(d[8]){const f=e(d[8]);f&&s.push({_:"messageEntityEmoji",offset:n,length:d[8].length,unicode:f})}else d[11]?s.push({_:"messageEntityHashtag",offset:n+(d[10]?d[10].length:0),length:d[11].length}):d[13]&&s.push({_:"messageEntityBotCommand",offset:n+(d[11]?d[11].length:0)+(d[12]?d[12].length:0),length:1+d[13].length+(d[14]?1+d[14].length:0),unsafe:!0});t=t.substr(d.index+d[0].length),a+=d.index+d[0].length}return s}function n(f,e){return f.find(f=>{if(!(e._===f._||!k.has(e._)&&!k.has(f._)))return!1;return e.offset>=f.offset&&e.length+e.offset<=f.length+f.offset})}function u(f,e){const d=e.filter(e=>!n(f,e));f.push(...d),E(f);for(let e=0;en(e,f)?s=!1:(t.push(f),s=!0),c=[];let i,r=0;for(;i=f.match(p);){const e=r+i.index;c.push(f.substr(0,i.index));const d=i[3]||i[8]||i[11]||i[13];let t;if(r-=d.length,r+=d.length,s=!1,d.match(/^`*$/))c.push(i[0]);else if(i[3])t={_:"messageEntityPre",language:"",offset:e+i[1].length,length:d.length},a(t)&&("\n"===i[5]&&(i[5]="",r-=1),c.push(i[1]+d+i[5]),r-=i[2].length+i[4].length);else if(i[7]){const f=""===i[6];t={_:y[i[7]],offset:e+(f?0:i[6].length),length:d.length},a(t)&&(f?c.push(d):c.push(i[6]+d+i[9]),r-=2*i[7].length+(f?2:0))}else i[11]?(t={_:"messageEntityMentionName",user_id:i[10].toUserId(),offset:e,length:d.length},a(t)&&(c.push(d),r-=i[0].length-d.length)):i[12]&&(t={_:"messageEntityTextUrl",url:i[14],offset:e,length:d.length},a(t)&&(c.push(d),r-=i[12].length-d.length));s||c.push(i[0]),f=f.substr(i.index+i[0].length),r+=i.index+i[0].length}c.push(f);let o=c.join("");o.replace(/\s+/g,"").length||(o=f,t.splice(0,t.length)),u(e,t),w(e);let l=o.length;if(!d){o=o.replace(/^\s*/,"");let f=l-o.length;f&&e.forEach(e=>{e.offset=Math.max(0,e.offset-f)}),o=o.replace(/\s*$/,""),f=l-o.length,l=o.length,f&&e.forEach(f=>{f.offset+f.length>l&&(f.length=l-f.offset)})}return o},f.findConflictingEntity=n,f.mergeEntities=u;const l=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function w(f){for(let e=0;el.has(f._)&&t!==e&&f._===d._&&f.offset-d.length===d.offset),-1!==t){const e=f[t];d.length+=e.length,f.splice(t,1)}}while(-1!==t)}}function E(f){f.sort((f,e)=>f.offset-e.offset||e.length-f.length)}function S(f){return f.target="_blank",f.rel="noopener noreferrer",f}function P(f,e={}){var t,n,o,u,l;const b=document.createDocumentFragment();if(!f)return b;const h=null!==(t=e.nasty)&&void 0!==t?t:e.nasty={i:0,usedLength:0,text:f},g=null!==(n=e.entities)&&void 0!==n?n:e.entities=d(h.text),m=null!==(o=e.passEntities)&&void 0!==o?o:e.passEntities={},p=null!==(u=e.contextSite)&&void 0!==u?u:e.contextSite="Telegram",y="Telegram"!==p,k=h.text.length,w=g.length;let E;for(;h.i=k){if("messageEntityCaret"!==f._)continue}else f.offset+f.length>k&&(f=Object(c.a)(f),f.length=f.offset+f.length-k);f.length&&(h.lastEntity=f);let d=g[h.i+1];const t=f.offset,n=t+f.length,o=Math.min(n,null!==(l=null==d?void 0:d.offset)&&void 0!==l?l:65535),u=h.text.slice(t,n);let w=h.text.slice(t,o);h.usedLengthw.length&&A?A:b,e.voodoo)return b}return h.lastEntity&&(h.usedLength=h.lastEntity.offset+h.lastEntity.length),h.usedLengthd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function C(f){const e="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",d=e.length,t=[];for(let s=0;s"messageEntityEmoji"===f._),wrappingDraft:e})}function _(e,d){let t,s,n,a;if(x(e)||(e="https://"+e),t=e.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const d=t[1];if(/^\W/.test(d)&&!f.PHONE_NUMBER_REG_EXP.test(d))return a="joinchat",{url:e,onclick:a};const s=d.split("/");switch(s[0]){case"joinchat":case"addstickers":case"voicechat":a=s[0];break;default:if(s[1]&&s[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===s.length){a="im";break}}}else(s=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?a="im":(n=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(a="tg_"+n[1]);return window[a]||(a=void 0),{url:e,onclick:a}}function x(f){return f?f.match(h):null}function D(f){return{_:"messageEntityEmoji",offset:0,length:f.length,unicode:Object(t.e)(f).join("-").replace(/-?fe0f/g,"")}}f.combineSameEntities=w,f.sortEntities=E,f.wrapRichText=P,f.fixEmoji=function(f,e){return f=f.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,(f,d,t)=>{if(e){const t=f.length;d+=t,e.forEach(f=>{const e=f.offset+f.length;e===d?f.length+=t:e>d&&(f.offset+=t)})}return f+"️"})},f.wrapDraftText=function(f,e={}){return f?P(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):P("")},f.checkBrackets=A,f.spoiler=C,f.wrapPlainText=function(f,e=[]){return(null==e?void 0:e.length)&&(e=e.filter(f=>"messageEntitySpoiler"===f._)),P(f,{entities:e,noEncoding:!0,noTextFormat:!0,noLinebreaks:!0,noLinks:!0}).textContent},f.wrapEmojiText=T,f.wrapUrl=_,f.matchUrlProtocol=x,f.matchUrl=function(f){return f?f.match(b):null},f.matchEmail=function(f){return f?f.match(m):null},f.getAbbreviation=function(f,e=!1){if(!f)return"";const d=f.trim().split(" ");if(!d[0])return"";const t=[...d[0]][0];return e||1===d.length?T(t):T(t+[...d[d.length-1]][0])},f.isUsernameValid=function(f){return(f.length>=5&&f.length<=32||!f.length)&&/^[a-zA-Z0-9_]*$/.test(f)},f.getEmojiEntityFromEmoji=D,f.wrapSingleEmoji=function(f){return P(f,{entities:[D(f)]})}}(w||(w={})),n.a.RichTextProcessor=w;e.b=w},function(f,e,d){"use strict";function t(f){return c(a(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return c})),d.d(e,"d",(function(){return i})),d.d(e,"c",(function(){return r})),d.d(e,"a",(function(){return o}));const s=/\uFE0F/g,n=String.fromCharCode(8205),a=f=>f.indexOf(n)<0?f.replace(s,""):f;function c(f){const e=[];let d=0,t=0,s=0;for(;s55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function i(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function r(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function o(f){return f.split("-").reduce((f,e)=>f+String.fromCodePoint(parseInt(e,16)),"")}},function(f,e,d){"use strict";const t="undefined"!=typeof window?window:self;e.a=t},function(f,e,d){"use strict";function t(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";d.d(e,"a",(function(){return c})),d.d(e,"b",(function(){return i}));var t=d(14),s=d(2),n=d(34),a=d(33);const c=s.g&&s.e&&t.a;if(c){let f="clientY",e=0;const d={capture:!0,passive:!1},t=d=>{const t=d.touches[0],s=Object(n.a)(t.target,"scrollable-y");if(s){const n=t[f],a=e-n,c=s.scrollTop,i=s.scrollHeight,r=s.clientHeight,o=c?Math.round(c+s.clientHeight+a):c+a;(i===r||o>=i||o<=0)&&d.preventDefault()}else d.preventDefault()};let s=0;document.addEventListener("focusin",n=>{!n.target.classList.contains("is-sticky-input-bugged")||n.timeStamp-s<50||(Object(a.a)(n.target),document.addEventListener("touchmove",t,d),document.addEventListener("touchstart",d=>{if(d.touches.length>1)return;const t=d.touches[0];e=t[f]}))},{passive:!0}),document.addEventListener("focusout",f=>{document.removeEventListener("touchmove",t,d),s=f.timeStamp},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&Object(a.a)(document.activeElement)},{passive:!0})}function i(f){c&&f.classList.add("is-sticky-input-bugged")}},function(f,e,d){"use strict";d.d(e,"a",(function(){return s}));var t=d(36);function s(f){f.style.transform="translateY(-99999px)",f.focus(),Object(t.a)().then(()=>{f.style.transform=""})}},function(f,e,d){"use strict";function t(f,e){return f.closest("."+e)}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";d.d(e,"b",(function(){return E})),d.d(e,"a",(function(){return A}));var t=d(20),s=d(15),n=d(0),a=d(11),c=d(4),i=d(5),r=d(1),o=d(12),u=d(2),l=d(17),b=d(6),h=d(21),g=d(24);var m=d(3),p=d(45);var v=d(49),y=function(f,e,d,t){return new(d||(d=Promise))((function(s,n){function a(f){try{i(t.next(f))}catch(f){n(f)}}function c(f){try{i(t.throw(f))}catch(f){n(f)}}function i(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,c)}i((t=t.apply(f,e||[])).next())}))};const k=i.a.version,w=i.a.build,E={allDialogsLoaded:{},pinnedOrders:{},contactsList:[],updates:{},filters:{},maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],topPeersCache:{},recentSearch:[],version:k,build:w,authState:{_:u.e?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:u.e?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:u.e?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:Object(h.a)(32),notifySettings:{}},S=Object.keys(E),P=["contactsList","stateCreatedTime","maxSeenMsgId","filters","topPeers"];class A extends s.a{constructor(){super(),this.log=Object(c.b)("STATE"),this.neededPeers=new Map,this.singlePeerMap=new Map,this.storages={users:new o.a(l.a,"users"),chats:new o.a(l.a,"chats"),dialogs:new o.a(l.a,"dialogs")},this.storagesResults={},this.storage=a.a,this.loadSavedState(),n.a.addEventListener("user_auth",()=>{this.requestPeerSingle(n.a.myId,"self")})}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(f=>{const e=Object.keys(this.storages),d=e.map(f=>this.storages[f].getAll()),t=S.map(f=>a.a.get(f)).concat(b.a.get("user_auth"),b.a.get("state_id")).concat(a.a.get("user_auth")).concat(d);Promise.all(t).then(d=>y(this,void 0,void 0,(function*(){let t=this.state={};for(let f=0,e=S.length;fa.a.get(f)));f.push("user_auth"),e.push("number"==typeof s||"string"==typeof s?{dcID:e[0]||i.a.baseDcId,date:Date.now()/1e3|0,id:s.toPeerId(!1)}:s);let d={};f.forEach((f,t)=>{d[f]=e[t]}),yield b.a.set(d)}s&&(t.authState={_:"authStateSignedIn"},n.a.dispatchEvent("user_auth","number"==typeof s||"string"==typeof s?{dcID:0,date:Date.now()/1e3|0,id:s.toPeerId(!1)}:s));for(let f=0,t=e.length;f{f.set(d,Object(m.a)(t[d]))}),t=this.state=Object(m.a)(E),f.forEach((f,e)=>{t[e]=f});for(const f in this.storagesResults)this.storagesResults[f].length=0;this.storage.set(t)}yield b.a.set({state_id:t.stateId})}const u=Date.now();if(t.stateCreatedTime+864e5{f.forEach(f=>{this.pushToState(f,Object(m.a)(E[f]));const e=this.storagesResults[f];e&&e.length&&(e.length=0)})})(P)}if(!t.settings.hasOwnProperty("theme")&&t.settings.hasOwnProperty("nightTheme")&&(t.settings.theme=t.settings.nightTheme?"night":"day",this.pushToState("settings",t.settings)),!t.settings.hasOwnProperty("themes")&&t.settings.background){t.settings.themes=Object(m.a)(E.settings.themes);const f=t.settings.themes.find(f=>f.name===t.settings.theme);f&&(f.background=t.settings.background,this.pushToState("settings",t.settings))}const l=t.settings.autoDownload;if(void 0!==(null==l?void 0:l.private)){const f=["contacts","private","groups","channels"];["photo","video","file"].forEach(e=>{const d=l[e]={};f.forEach(f=>{d[f]=l[f]})}),f.forEach(f=>{delete l[f]}),this.pushToState("settings",t.settings)}if(Object(v.a)(E,t,f=>{this.pushToState(f,t[f])}),t.version!==k||t.build!==w){if(-1===Object(g.a)(t.version,"0.8.7")){this.state.allDialogsLoaded=Object(m.a)(E.allDialogsLoaded),this.state.filters=Object(m.a)(E.filters);const f=this.storagesResults.dialogs;(null==f?void 0:f.length)&&(f.length=0)}if(-1===Object(g.a)(t.version,"1.3.0")){let f=!1;t.settings.themes.forEach((e,d,t)=>{if("day"===e.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===e.background.slug&&"image"===e.background.type||"night"===e.name&&"#0f0f0f"===e.background.color&&"color"===e.background.type){const s=E.settings.themes.find(f=>f.name===e.name);s&&(t[d]=Object(m.a)(s),f=!0)}}),f&&this.pushToState("settings",t.settings)}0!==Object(g.a)(t.version,k)&&(this.newVersion=k,this.oldVersion=t.version),this.pushToState("version",k),this.pushToState("build",w)}n.a.settings=t.settings,r.b&&this.log("state res",t,Object(m.a)(t)),console.timeEnd("load state"),f(t)}))).catch(f)})),this.loaded}getState(){return void 0===this.state?this.loadSavedState():Promise.resolve(this.state)}setByKey(f,e){!function(f,e,d){const t=e.split(".");Object(p.a)(f,t.slice(0,-1).join("."))[t.pop()]=d}(this.state,f,e),n.a.dispatchEvent("settings_updated",{key:f,value:e});const d=f.split(".")[0];this.pushToState(d,this.state[d])}pushToState(f,e,d=!0){d&&(this.state[f]=e),this.setKeyValueToStorage(f,e)}setKeyValueToStorage(f,e=this.state[f]){this.storage.set({[f]:e})}requestPeer(f,e,d){let t=this.neededPeers.get(f);t&&t.has(e)||(t||(t=new Set,this.neededPeers.set(f,t)),t.add(e),this.dispatchEvent("peerNeeded",f),void 0!==d&&this.keepPeerSingle(f,e))}requestPeerSingle(f,e,d=f){return this.requestPeer(f,e+"_"+d,1)}releaseSinglePeer(f,e){return this.keepPeerSingle(t.c,e+"_"+f)}isPeerNeeded(f){return this.neededPeers.has(f)}keepPeerSingle(f,e){const d=this.singlePeerMap.get(e);if(d&&d!==f&&this.neededPeers.has(d)){const f=this.neededPeers.get(d);f.delete(e),f.size||(this.neededPeers.delete(d),this.dispatchEvent("peerUnneeded",d))}f?this.singlePeerMap.set(e,f):this.singlePeerMap.delete(e)}}A.STATE_INIT=E;const C=new A;r.a.appStateManager=C;e.c=C},function(f,e,d){"use strict";let t;function s(f){t?t.push(f):(t=[f],requestAnimationFrame(()=>{const f=t;t=void 0,f.forEach(f=>f())}))}d.d(e,"b",(function(){return s})),d.d(e,"c",(function(){return i})),d.d(e,"d",(function(){return r})),d.d(e,"a",(function(){return o}));let n,a,c=!1;function i(f){n?c?f():n.push(f):(n=[f],requestAnimationFrame(()=>{c=!0;for(let f=0;fs(()=>f())),a.then(()=>{a=void 0}),a)}function o(){return new Promise(f=>{s(()=>{s(f)})})}},function(f,e,d){"use strict";d.d(e,"a",(function(){return i})),d.d(e,"c",(function(){return o})),d.d(e,"e",(function(){return u})),d.d(e,"d",(function(){return l})),d.d(e,"f",(function(){return b})),d.d(e,"g",(function(){return h})),d.d(e,"b",(function(){return w}));var t=d(1),s=d(7),n=d(43);d.d(e,"h",(function(){return n.a}));const a=["January","February","March","April","May","June","July","August","September","October","November","December"],c=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],i=86400,r=f=>{const e=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate())),d=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-d);const t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/i+1)/7)};function o(f){const e=new Date,d=e.getTime()/1e3|0,t=f.getTime()/1e3|0,n={};return d-t{const d=e.monthAsNumber?".":" ",t=("0"+f.getHours()).slice(-2)+":"+("0"+f.getMinutes()).slice(-2)+(e.noSeconds?"":":"+("0"+f.getSeconds()).slice(-2));return(e.leadingZero?("0"+f.getDate()).slice(-2):f.getDate())+d+(e.monthAsNumber?("0"+(f.getMonth()+1)).slice(-2):a[f.getMonth()])+d+f.getFullYear()+(e.noTime?"":", "+t)},g=new RegExp("20[0-9]{1,2}"),m=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),p=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),v=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),k=[31,29,31,30,31,30,31,31,30,31,30,31];function w(f,e){const d=f.trim().toLowerCase();if(d.length<3)return;if(0==="today".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),s=f.getDate();f.setFullYear(d,t,s),f.setHours(0,0,0);const n=f.getTime();f.setFullYear(d,t,s+1),f.setHours(0,0,0);const a=f.getTime()-1;return void e.push({title:"Today",minDate:n,maxDate:a})}if(0==="yesterday".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),s=f.getDate();f.setFullYear(d,t,s),f.setHours(0,0,0);const n=f.getTime()-864e5;f.setFullYear(d,t,s+1),f.setHours(0,0,0);const a=f.getTime()-86400001;return void e.push({title:"Yesterday",minDate:n,maxDate:a})}const t=function(f){const e=new Date;if(f.length<=3)return-1;for(let d=0;d<7;d++)if(e.setDate(e.getDate()+1),0===T(e.getTime()).toLowerCase().indexOf(f))return e.getDay();return-1}(d);if(t>=0){const f=new Date,d=f.getTime(),s=t-f.getDay();f.setDate(f.getDate()+s),f.getTime()>d&&f.setTime(f.getTime()-6048e5);const n=f.getFullYear(),a=f.getMonth(),c=f.getDate();f.setFullYear(n,a,c),f.setHours(0,0,0);const i=f.getTime();f.setFullYear(n,a,c+1),f.setHours(0,0,0);const r=f.getTime()-1;return void e.push({title:T(i),minDate:i,maxDate:r})}let s;if(null===(s=v.exec(d)))if(null===(s=y.exec(d)))if(null===(s=g.exec(d))){if(null!==(s=m.exec(d))){const f=s[1],d=s[2],t=x(f);if(t>=0){const f=+d;if(f>0&&f<=31){return void S(e,f-1,t)}if(f>=2013){return void E(e,t,f)}}}if(null!==(s=p.exec(d))){const f=s[1],d=x(s[2]);if(d>=0){const t=+f;if(t>0&&t<=31){return void S(e,t-1,d)}if(t>=2013){E(e,d,t)}}}}else{let f=+d;const t=(new Date).getFullYear();if(f<2013){f=2013;for(let d=t;d>=f;d--){const f=new Date;f.setFullYear(d,0,1),f.setHours(0,0,0);const t=f.getTime();f.setFullYear(d+1,0,1),f.setHours(0,0,0);const s=f.getTime()-1;e.push({title:""+d,minDate:t,maxDate:s})}}else if(f<=t){const d=new Date;d.setFullYear(f,0,1),d.setHours(0,0,0);const t=d.getTime();d.setFullYear(f+1,0,1),d.setHours(0,0,0);const s=d.getTime()-1;e.push({title:""+f,minDate:t,maxDate:s})}}else{const f=s[1],d=s[3],t=s[5];if(!s[2]===s[4])return;const n=parseInt(f),a=parseInt(d)-1;let c=parseInt(t);c>=10&&c<=99&&(c+=2e3);const i=(new Date).getFullYear();if(_(n-1,a)&&c>=2013&&c<=i){const f=new Date;f.setFullYear(c,a,n),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(c,a,n+1),f.setHours(0,0,0);const t=f.getTime()-1;return void e.push({title:C(d),minDate:d,maxDate:t})}}else{const f=s[1],d=s[3],t=parseInt(f),n=parseInt(d);if(t>0&&t<=31){if(n>=2013&&t<=12){return void E(e,t-1,n)}if(n<=12){S(e,t-1,n-1)}}else if(t>=2013&&n<=12){E(e,n-1,t)}}}function E(f,e,d){const t=(new Date).getFullYear(),s=Date.now();if(d>=2013&&d<=t){const t=new Date;t.setFullYear(d,e,1),t.setHours(0,0,0);const n=t.getTime();if(n>s)return;t.setMonth(t.getMonth()+1);const a=t.getTime()-1;f.push({title:P(n),minDate:n,maxDate:a})}}function S(f,e,d){if(_(e,d)){const s=(new Date).getFullYear(),n=Date.now();for(let a=s;a>=2013;a--){if(1===d&&28===e&&(((t=a)%4!=0||t%100==0)&&t%400!=0))continue;const c=new Date;c.setFullYear(a,d,e+1),c.setHours(0,0,0);const i=c.getTime();if(i>n)continue;c.setFullYear(a,d,e+2),c.setHours(0,0,0);const r=c.getTime()-1;a===s?f.push({title:A(i),minDate:i,maxDate:r}):f.push({title:C(i),minDate:i,maxDate:r})}}var t}function P(f){const e=new Date(f);return a[e.getMonth()].slice(0,3)+" "+e.getFullYear()}function A(f){const e=new Date(f);return a[e.getMonth()].slice(0,3)+" "+e.getDate()}function C(f){const e=new Date(f);return("0"+e.getDate()).slice(-2)+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+e.getFullYear()}function T(f){const e=new Date(f);return c[e.getDay()]}function _(f,e){return e>=0&&e<12&&f>=0&&ft(f[d],e[d])):f===e}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";d.d(e,"a",(function(){return c}));var t=d(16);const s=["b","б"],n={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(f={text:s,icons:void 0,monospace:s}){if(!("fonts"in document))return Promise.resolve();const e=[];for(const d in f){let t=f[d];"all"===t&&(t=s);const c=a[d],i="icons"===d?[500]:[400,500];for(const f of i){const d=(t||[void 0]).map(e=>{var d,t,s,a;const i=[f,"1rem",c].join(" ");return null!==(t=(s=null!==(d=n[i])&&void 0!==d?d:n[i]={})[a=e||""])&&void 0!==t?t:s[a]=document.fonts.load(i,e)});e.push(...d)}}return Promise.race([Promise.all(e),Object(t.a)(1e3)])}},function(f,e,d){"use strict";function t(f){const e=Date.now();return f?e/1e3|0:e}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";d.d(e,"a",(function(){return n})),d.d(e,"c",(function(){return a})),d.d(e,"b",(function(){return c}));const t=new Set(["all","web","webk"]),s=new Set;function n(f){return f.find(f=>t.has(f.platform)&&!s.has(f.reason))}function a(f){return!!n(f)}function c(f){s.clear(),f.forEach(f=>{s.add(f)})}},function(f,e,d){"use strict";function t(f,e){const d=e.split(".");let t=f;return d.forEach(f=>{f&&(t=t[f])}),t}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";const t=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp");e.a=t},function(f,e,d){"use strict";function t(f,e=""){let d;Array.isArray(f)||(f=[f]);const t=function(f){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(f)?"application/octet-stream":f}(e);try{d=new Blob(f,{type:t})}catch(e){let s=new BlobBuilder;f.forEach(f=>{s.append(f)}),d=s.getBlob(t)}return d}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";d.r(e),d.d(e,"TelegramMeWebManager",(function(){return i}));var t=d(5),s=d(1),n=d(9),a=d(37),c=d(6);class i{constructor(){this.disabled=n.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return c.a.get("tgme_sync").then(e=>{const d=Object(a.h)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;c.a.set({tgme_sync:{canRedirect:f,ts:d}});const s=`_websync_?authed=${f?"1":"0"}&version=${encodeURIComponent(t.a.version+" "+t.a.suffix)}`,n=["//telegram.me/"+s,"//t.me/"+s].map(f=>{const e=document.createElement("script"),d=new Promise(f=>{e.onload=e.onerror=()=>{e.remove(),f()}});return e.src=f,document.body.appendChild(e),d});return Promise.all(n)})}}const r=new i;s.a&&(s.a.telegramMeWebManager=r),e.default=r},function(f,e,d){"use strict";d.d(e,"a",(function(){return n}));var t=d(3),s=d(19);function n(f,e,d,a){for(const c in f)typeof e[c]!=typeof f[c]?(e[c]=Object(t.a)(f[c]),d&&d(a||c)):Object(s.a)(f[c])&&n(f[c],e[c],d,a||c)}},function(f,e,d){"use strict";var t=d(1),s=d(21),n=d(4),a=d(0),c=d(6),i=d(8);const r=new class{constructor(){this.log=Object(n.b)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),c.a.delete("xt_instance"))},this.deactivateInstance=()=>{if(this.masterInstance||this.deactivated)return!1;this.log("deactivate"),this.deactivateTimeout=0,this.deactivated=!0,this.clearInstance(),a.a.idle.deactivated=!0,a.a.dispatchEvent("instance_deactivated")},this.checkInstance=(f=a.a.idle&&a.a.idle.isIDLE)=>{if(this.deactivated)return!1;const e=Date.now(),d={id:this.instanceID,idle:f,time:e};c.a.get("xt_instance",!1).then(t=>{!f||!t||t.id===this.instanceID||t.time-1,this.userVisibleOnly=!this.isFirefox,this.log=Object(s.b)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then(f=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",f)}).catch(f=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",f),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))})})},this.isAliveNotify=()=>{if(!this.isAvailable||n.a.idle&&n.a.idle.deactivated)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"")+"#/im";const f={},e={push_action_mute1d:i.e?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:i.e?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=c.c.format(e[d],!0);const d={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:f,settings:this.settings}};a.a.postSWMessage(d),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!!f,this.pushSubscriptionNotify("init",f)}).catch(f=>{this.log.error("Error during getSubscription()",f)})})}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!1,f&&(this.pushSubscriptionNotify("unsubscribe",f),setTimeout(()=>{f.unsubscribe().then(f=>{this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})},3e3))}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.log.warn("force unsubscribe",f),f&&f.unsubscribe().then(f=>{this.log.warn("force unsubscribe successful",f),this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}setSettings(f){this.settings=Object(o.a)(f),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){if(!this.isAvailable)return;a.a.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(a.a.addServiceWorkerTaskListener("push_click",f=>{n.a.idle&&n.a.idle.deactivated?r.a.reload():n.a.dispatchEvent("push_notification_click",f.payload)}),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(f,e){if(e){const d=e.toJSON();if(!(d&&d.endpoint&&d.keys&&d.keys.p256dh&&d.keys.auth))return this.log.warn("Invalid push subscription",d),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(f);this.log.warn("Push",f,d),n.a.dispatchEvent("push_"+f,{tokenType:10,tokenValue:JSON.stringify(d)})}else this.log.warn("Push",f,!1),n.a.dispatchEvent("push_"+f,!1)}}const l=new u;t.a&&(t.a.webPushApiManager=l),e.default=l},function(f,e,d){"use strict";function t(...f){const e=f.reduce((f,e)=>f+(e.byteLength||e.length),0),d=new Uint8Array(e);let t=0;return f.forEach(f=>{d.set(f instanceof ArrayBuffer?new Uint8Array(f):f,t),t+=f.byteLength||f.length}),d}d.d(e,"a",(function(){return t}))},function(f,e,d){"use strict";function t(){return new Worker(d.p+"webp.worker.c0cc94110cda650246b2.bundle.worker.js")}var s=d(1),n=d(10),a=d(8);const c=new class{constructor(){this.convertPromises={}}init(){this.worker=new t,this.worker.addEventListener("message",f=>{const e=f.data.payload;if(0===e.fileName.indexOf("main-")){const f=this.convertPromises[e.fileName];f&&(e.bytes?f.resolve(e.bytes):f.reject(),delete this.convertPromises[e.fileName])}else a.a.postMessage(f.data)})}postMessage(f){this.init&&(this.init(),this.init=null),this.worker.postMessage(f)}convert(f,e){if(f="main-"+f,this.convertPromises.hasOwnProperty(f))return this.convertPromises[f];const d=Object(n.a)();return this.postMessage({type:"convertWebp",payload:{fileName:f,bytes:e}}),this.convertPromises[f]=d}};s.a.webpWorkerController=c;e.a=c},function(f,e,d){},function(f,e,d){},function(f,e,d){"use strict";d.r(e);var t=d(5),s=d(38),n=d(27),a=d(32),c=d(42),i=d(23),r=d(2),o=(d(54),d(55),d(16));function u(){const f=new Proxy(Worker,{construct:(f,e)=>new f(e[0]+location.search)});Worker=f}u();var l=d(0),b=d(14),h=d(35),g=d(7);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(f){return(+this).toPeerId(f)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(f){return void 0===f?this:f?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0};var m=d(52);Uint8Array.prototype.concat=function(...f){return Object(m.a)(this,...f)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(f){const e=e=>Promise.resolve(f()).then(e);return this.then(f=>e(()=>f),f=>e(()=>Promise.reject(f)))};var p=function(f,e,d,t){return new(d||(d=Promise))((function(s,n){function a(f){try{i(t.next(f))}catch(f){n(f)}}function c(f){try{i(t.throw(f))}catch(f){n(f)}}function i(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,c)}i((t=t.apply(f,e||[])).next())}))};document.addEventListener("DOMContentLoaded",()=>p(void 0,void 0,void 0,(function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(f,e){return void 0!==e&&(e=!!e),this.hasAttribute(f)?!!e||(this.removeAttribute(f),!1):!1!==e&&(this.setAttribute(f,""),!0)});const f=window.visualViewport||window;let e,u=!1;const m=()=>{const d=.01*(u&&!l.a.isOverlayActive?f.height||f.innerHeight:window.innerHeight);e!==d&&(b.b&&e1&&Object(s.a)(),e=d,document.documentElement.style.setProperty("--vh",d+"px"))};if(window.addEventListener("resize",m),m(),a.a){const e=()=>{u=1===d&&a.a&&!l.a.isOverlayActive,m(),f!==window&&(u?(window.removeEventListener("resize",m),f.addEventListener("resize",m)):(f.removeEventListener("resize",m),window.addEventListener("resize",m)))};let d;l.a.addEventListener("im_tab_change",f=>{const t=void 0!==d;d=f,(t||1===d)&&e()}),l.a.addEventListener("overlay_toggle",()=>{e()})}r.d&&!i.a&&document.addEventListener("dragstart",f=>{const e=f.target;if("IMG"===e.tagName&&e.classList.contains("emoji"))return Object(n.a)(f),!1}),document.addEventListener("dragstart",f=>{var e;if("IMG"===(null===(e=f.target)||void 0===e?void 0:e.tagName))return f.preventDefault(),!1}),document.addEventListener("contextmenu",f=>{"IMG"!==f.target.tagName||window.appMediaViewer||Object(n.a)(f)}),r.d&&document.documentElement.classList.add("is-firefox","no-backdrop"),r.e&&document.documentElement.classList.add("is-mobile"),r.b?(r.g&&document.documentElement.classList.add("is-safari"),r.c?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):r.a&&document.documentElement.classList.add("is-android"),b.b?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");let p=performance.now();const v=g.c.getCacheLangPack(),[y,k]=yield Promise.all([h.c.getState(),v]);function w(f,e){f.style.opacity="0",e.then(()=>{window.requestAnimationFrame(()=>{f.style.opacity=""})})}g.c.setTimeFormat(y.settings.timeFormat),l.a.setThemeListener(),k.appVersion!==t.a.langPackVersion&&g.c.getLangPack(k.lang_code),console.log("got state, time:",performance.now()-p);const E=y.authState;if("authStateSignedIn"!==E._){console.log("Will mount auth page:",E._,Date.now()/1e3);const f=document.getElementById("auth-pages");let e,t;if(f){e=f.querySelector(".scrollable"),b.b&&!r.f||e.classList.add("no-scrollbar"),e.style.opacity="0";const d=document.createElement("div");d.classList.add("auth-placeholder"),e.prepend(d),e.append(d.cloneNode())}try{yield Promise.all([Promise.resolve().then(d.bind(null,48)),Promise.resolve().then(d.bind(null,51))]).then(([f,e])=>{f.default.setAuthorized(!1),e.default.forceUnsubscribe()})}catch(f){}switch(E._){case"authStateSignIn":t=(yield Promise.all([d.e(0),d.e(1),d.e(2),d.e(4),d.e(16)]).then(d.bind(null,168))).default.mount();break;case"authStateSignQr":t=(yield Promise.all([d.e(0),d.e(1),d.e(17)]).then(d.bind(null,165))).default.mount();break;case"authStateAuthCode":t=(yield Promise.all([d.e(0),d.e(1),d.e(2),d.e(4),d.e(14)]).then(d.bind(null,170))).default.mount(E.sentCode);break;case"authStatePassword":t=(yield Promise.all([d.e(0),d.e(1),d.e(11)]).then(d.bind(null,142))).default.mount();break;case"authStateSignUp":t=(yield Promise.all([d.e(0),d.e(1),d.e(2),d.e(5),d.e(19)]).then(d.bind(null,155))).default.mount(E.authCode)}if(e){t&&(yield t);w(e,"fonts"in document?Promise.race([Object(o.a)(1e3),document.fonts.ready]):Promise.resolve())}}else console.log("Will mount IM page:",Date.now()/1e3),w(document.getElementById("main-columns"),Object(c.a)()),(yield Promise.all([d.e(0),d.e(23)]).then(d.bind(null,110))).default.mount()})))}]); -//# sourceMappingURL=main.8fe17e02354fa08e65e4.bundle.js.map \ No newline at end of file diff --git a/public/main.8fe17e02354fa08e65e4.bundle.js.map b/public/main.8fe17e02354fa08e65e4.bundle.js.map deleted file mode 100644 index e4bce05aa..000000000 --- a/public/main.8fe17e02354fa08e65e4.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/rootScope.ts","webpack:///./src/config/debug.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/helpers/object/copy.ts","webpack:///./src/lib/logger.ts","webpack:///./src/config/app.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/lib/langPack.ts","webpack:///./src/helpers/string/capitalizeFirstLetter.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/lib/stateStorage.ts","webpack:///./src/lib/idb.ts","webpack:///./src/lib/storage.ts","webpack:///./src/helpers/context.ts","webpack:///./src/environment/touchSupport.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/helpers/object/safeAssign.ts","webpack:///./src/helpers/object/isObject.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/random.ts","webpack:///./src/helpers/schedulers/throttle.ts","webpack:///./src/environment/emojiSupport.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/lib/appManagers/appRuntimeManager.ts","webpack:///./src/config/emoji.ts","webpack:///./src/helpers/dom/cancelEvent.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/config/tld.ts","webpack:///./src/lib/richtextprocessor.ts","webpack:///./src/vendor/emoji/index.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/helpers/string/encodeEntities.ts","webpack:///./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/findUpClassName.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/getTimeFormat.ts","webpack:///./src/helpers/object/setDeepProperty.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/date.ts","webpack:///./src/helpers/dom/blurActiveElement.ts","webpack:///./src/helpers/array/findAndSplice.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/object/deepEqual.ts","webpack:///./src/helpers/dom/loadFonts.ts","webpack:///./src/helpers/tsNow.ts","webpack:///./src/helpers/restrictions.ts","webpack:///./src/helpers/object/getDeepProperty.ts","webpack:///./src/environment/webpSupport.ts","webpack:///./src/helpers/blob/blobConstruct.ts","webpack:///./src/helpers/blob/blobSafeMimeType.ts","webpack:///./src/lib/mtproto/telegramMeWebManager.ts","webpack:///./src/helpers/object/validateInitObject.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/mtproto/webPushApiManager.ts","webpack:///./src/helpers/bytes/bufferConcats.ts","webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/helpers/setWorkerProxy.ts","webpack:///./src/helpers/peerIdPolyfill.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/index.ts","webpack:///./src/helpers/dom/toggleAttributePolyfill.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","9","jsonpScriptSrc","__webpack_require__","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","Date","now","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","s","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","addEventListener","peerId","body","classList","toggle","id","myId","status","_themeColorElem","querySelector","color","themeColor","isNight","themeColorElem","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","colorScheme","documentElement","setThemeColor","isOverlayActive","getTheme","settings","theme","themes","find","rootScope","DEBUG","debug","MOUNT_CLASS_TO","self","USER_AGENT","navigator","userAgent","IS_APPLE","search","IS_ANDROID","toLowerCase","indexOf","IS_APPLE_MOBILE","test","vendor","platform","maxTouchPoints","MSStream","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","copy","obj","getTime","Array","isArray","map","el","clonedObj","constructor","prop","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","args","forEach","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","App","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","keys","delete","enabled","set","clear","taskId","tasks","STORAGES","storage","result","task","payload","apply","proxy","sessionStorage","appStorage","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lastRequestedLangCode","then","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","concat","string","appVersion","stateStorage","applyLangPack","Intl","PluralRules","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","from","querySelectorAll","element","instance","weakMap","update","superFormatter","input","indexHolder","out","lastIndex","replace","p1","p2","p3","p4","offset","append","idx","text","url","a","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","textContent","arg","pushNextArgument","plain","str","select","item","Node","join","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","invokeApi","_Intl","assign","WeakMap","IntlElementBase","options","add","IntlElement","safeAssign","formatted","dataset","deepEqual","json","DateTimeFormat","hours","getHours","getMinutes","charAt","toUpperCase","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","arr","isLast","useLast","joined","Worker_fn","Worker","dcId","logSuffix","handleOpen","handleError","close","handleClose","removeListeners","handleMessage","byteLength","send","ws","logTypes","connect","removeEventListener","WebSocket","binaryType","apiManagerProxy","performTaskWorker","afterMessageIdTemp","awaiting","pending","updatesProcessor","hashes","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","isObject","callback","progress","finalizeTask","singleInstance","start","registerServiceWorker","addTaskListener","toggleStorage","race","telegramMeWebManager","setAuthorized","pause","webPushApiManager","forceUnsubscribe","cacheName","caches","appRuntimeManager","reload","webpWorkerController","postMessage","socketTask","socket","onOpen","onClose","onMessage","buffer","storageTask","res","language","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","worker","serviceWorker","register","scope","registration","installing","waiting","active","onServiceWorkerFail","warn","releasePending","controller","addServiceWorkerTaskListener","responseTask","uploadFile","postSWMessage","originalPayload","isWebpSupported","onWorkerFirstMessage","once","deferred","taskName","createTask","performTaskWorkerNew","params","prepareTempMessageId","messageId","queryJSON","cached","invokeApiSingleProcess","processResult","includes","q","processError","cacheKey","oldPromise","size","override","fulfilled","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","toPeerId","user","setUserAuth","dc_id","fileName","getConfigPromise","overwrite","appConfig","getAppConfigPromise","ignore_restriction_reasons","Modes","http","ssl","multipleConnections","asServiceWorker","transport","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","addNotifyListener","catch","cancel","db","storeName","storageIsAvailable","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onsuccess","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","blob","Blob","blobConstruct","save","perf","performance","oncomplete","results","requests","getAll","noop","getPromises","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","throttle","values","deleteThrottled","getThrottled","getFromCache","canUseStorage","setToCache","names","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","clients","matchAll","includeUncontrolled","listener","notifyWorker","notifySomeone","IS_TOUCH_SUPPORTED","DocumentTouch","EventListenerBase","reuseResults","_constructor","listenerResults","pop","collectResults","findIndex","_dispatchEvent","ms","fromObject","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","arrays","8","Uint8Array","16","Uint16Array","32","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","IS_EMOJI_SUPPORTED","compareVersion","v1","v2","s1","s2","focus","EmojiVersions","Emoji","cancelEvent","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","alphaCharsRegExp","urlAlphanumericRegExpPart","urlRegExp","urlProtocolRegExpPart","urlAnyProtocolRegExp","RegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","RichTextProcessor","getEmojiUnified","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","protocol","tld","substr","balanced","checkBrackets","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","currentEntity","has","mergeEntities","newEntities","filtered","filter","sortEntities","entity","nextEntity","PHONE_NUMBER_REG_EXP","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","isSOH","user_id","toUserId","newText","splice","combineSameEntities","diff","Math","max","CAN_COMBINE_ENTITIES","nextEntityIdx","_i","sort","b","setBlankToAnchor","anchor","rel","wrapRichText","fragment","createDocumentFragment","nasty","usedLength","passEntities","contextSite","contextExternal","textLength","lastElement","lastEntity","startOffset","endOffset","endPartOffset","min","fullEntityText","partText","usedText","noTextFormat","wrappingDraft","fontWeight","fontStyle","styleName","cssText","fontFamily","className","noLinks","bot","atPos","command","fromBot","encodeEntities","encodeURIComponent","isSupported","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","follow","username","before","spoilerAfter","spoiler","after","container","parentElement","voodoo","urlLength","urlOpenBrackets","urlCloseBrackets","chars","charsLength","char","charCodeAt","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","path","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","noEncoding","noLinebreaks","matchUrl","matchEmail","getAbbreviation","onlyFirst","first","isUsernameValid","wrapSingleEmoji","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","prev","curr","fromCodePoint","parseInt","ctx","IS_STICKY_INPUT_BUGGED","startY","capture","passive","onTouchMove","touch","touches","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","round","lastFocusOutTimeStamp","timeStamp","touchStart","activeElement","blur","fixSafariStickyInputFocusing","fixSafariStickyInput","transform","findUpClassName","closest","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","recentEmoji","topPeersCache","recentSearch","authState","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","big","background","slug","highlightningColor","intensity","notifications","sound","toLocaleString","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","ALL_KEYS","REFRESH_KEYS","neededPeers","singlePeerMap","storages","users","chats","dialogs","storagesResults","loadSavedState","requestPeerSingle","loaded","time","storagesKeys","storagesPromises","state","pushToState","auth","shiftedWebKAuth","state_id","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","timeEnd","getDeepProperty","setDeepProperty","direct","setKeyValueToStorage","limit","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","appStateManager","fastRafCallbacks","fastRaf","requestAnimationFrame","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","months","days","ONE_DAY","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","formatDateAccordingToTodayNew","today","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","textTransform","formatFullSentTime","getFullDate","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","minDate","maxDate","title","dayOfWeek","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","blurActiveElement","findAndSplice","x","ok","tx","every","texts","fonts","icons","monospace","loadFonts","types","_texts","font","weights","weight","_promises","load","tsNow","seconds","platforms","ignore","getRestrictionReason","reasons","reason","isRestricted","ignoreRestrictionReasons","IS_WEBP_SUPPORTED","toDataURL","startsWith","blobParts","mimeType","safeMimeType","blobSafeMimeType","bb","BlobBuilder","blobPart","getBlob","TelegramMeWebManager","disabled","canRedirect","curValue","ts","tgme_sync","remove","initObject","currentObject","onReplace","previousKey","clearInstance","masterInstance","deactivateInstance","deactivateTimeout","checkInstance","newInstance","instanceID","curInstance","xt_instance","startAll","initial","stopAll","started","reset","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","ready","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","unsubscribe","successful","newSettings","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","bufferConcats","tmp","lastLength","ArrayBuffer","convertPromises","bytes","init","convertPromise","setWorkerProxy","workerProxy","Proxy","construct","toChatId","isChat","isPeerId","Number","abs","onFinally","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","height","innerHeight","setProperty","toggleResizeMode","tabId","wasTabId","tagName","appMediaViewer","langPromise","getState","fadeInWhenFontsReady","elem","opacity","setThemeListener","getElementById","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","mount","sentCode","authCode"],"mappings":"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c,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,IAEl0yEC,EAAmCD,EAAc,IACvD,IAAI,MAAM/a,KAAW+a,EAChB/a,GACD/N,OAAOgX,OAAO+R,EAAOD,EAAc/a,IAIxB,O,6BCJA,SAASib,EAAY3mB,GAElC,GADAA,EAAQA,GAASmF,OAAOnF,MACd,CAERA,EAAQA,EAAM4mB,eAAiB5mB,EAE/B,IACKA,EAAM6mB,iBAAiB7mB,EAAM6mB,kBAC7B7mB,EAAM8mB,gBAAgB9mB,EAAM8mB,iBAC/B9mB,EAAM+mB,aAAc,EACpB/mB,EAAMgnB,cAAe,EACrB,MAAMpkB,KAGV,OAAO,EAzBT,mC,+DCIe,I,qDCUA,MAFH,CAAC,UAAW,KAAM,UAAW,cAAe,SAAU,QAAS,KAAM,QAAS,KAAM,OAAQ,KAAM,KAAM,SAAU,KAAM,WAAY,KAAM,YAAa,SAAU,KAAM,YAAa,KAAM,UAAW,KAAM,aAAc,KAAM,YAAa,KAAM,QAAS,OAAQ,OAAQ,KAAM,OAAQ,aAAc,KAAM,WAAY,KAAM,UAAW,QAAS,QAAS,KAAM,KAAM,MAAO,KAAM,KAAM,OAAQ,OAAQ,MAAO,cAAe,WAAY,WAAY,SAAU,KAAM,KAAM,KAAM,OAAQ,SAAU,OAAQ,KAAM,KAAM,KAAM,KAAM,MAAO,OAAQ,QAAS,MAAO,MAAO,KAAM,QAAS,cAAe,YAAa,OAAQ,KAAM,MAAO,KAAM,aAAc,KAAM,MAAO,WAAY,KAAM,WAAY,KAAM,KAAM,WAAY,QAAS,WAAY,WAAY,OAAQ,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,SAAU,OAAQ,iBAAkB,QAAS,WAAY,UAAW,UAAW,QAAS,OAAQ,SAAU,UAAW,UAAW,OAAQ,OAAQ,MAAO,WAAY,KAAM,KAAM,SAAU,MAAO,OAAQ,KAAM,KAAM,KAAM,UAAW,OAAQ,QAAS,YAAa,SAAU,SAAU,KAAM,QAAS,OAAQ,KAAM,KAAM,SAAU,WAAY,QAAS,SAAU,WAAY,OAAQ,KAAM,KAAM,KAAM,QAAS,QAAS,SAAU,UAAW,UAAW,MAAO,YAAa,UAAW,WAAY,SAAU,eAAgB,aAAc,cAAe,UAAW,OAAQ,OAAQ,UAAW,KAAM,SAAU,aAAc,UAAW,MAAO,UAAW,KAAM,aAAc,KAAM,KAAM,KAAM,KAAM,QAAS,KAAM,QAAS,MAAO,QAAS,SAAU,MAAO,OAAQ,KAAM,QAAS,SAAU,WAAY,WAAY,SAAU,UAAW,OAAQ,SAAU,MAAO,WAAY,OAAQ,UAAW,SAAU,YAAa,WAAY,KAAM,KAAM,KAAM,MAAO,KAAM,OAAQ,UAAW,SAAU,SAAU,OAAQ,KAAM,MAAO,KAAM,MAAO,YAAa,KAAM,KAAM,QAAS,SAAU,SAAU,WAAY,cAAe,cAAe,YAAa,KAAM,KAAM,MAAO,SAAU,KAAM,KAAM,aAAc,MAAO,SAAU,WAAY,WAAY,SAAU,UAAW,OAAQ,OAAQ,UAAW,WAAY,KAAM,UAAW,YAAa,WAAY,OAAQ,UAAW,MAAO,UAAW,KAAM,KAAM,UAAW,UAAW,UAAW,WAAY,MAAO,KAAM,KAAM,MAAO,UAAW,aAAc,KAAM,MAAO,UAAW,OAAQ,YAAa,SAAU,KAAM,MAAO,UAAW,SAAU,KAAM,OAAQ,KAAM,KAAM,OAAQ,KAAM,KAAM,OAAQ,KAAM,KAAM,OAAQ,QAAS,QAAS,KAAM,QAAS,MAAO,SAAU,QAAS,KAAM,QAAS,MAAO,MAAO,KAAM,OAAQ,SAAU,MAAO,MAAO,KAAM,KAAM,KAAM,WAAY,SAAU,QAAS,QAAS,KAAM,KAAM,KAAM,QAAS,UAAW,OAAQ,KAAM,KAAM,UAAW,UAAW,OAAQ,aAAc,OAAQ,OAAQ,SAAU,SAAU,MAAO,KAAM,KAAM,KAAM,WAAY,UAAW,QAAS,QAAS,OAAQ,UAAW,QAAS,MAAO,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,MAAO,KAAM,KAAM,OAAQ,aAAc,KAAM,aAAc,OAAQ,MAAO,MAAO,YAAa,SAAU,MAAO,gBAAiB,cAAe,KAAM,KAAM,KAAM,QAAS,KAAM,KAAM,MAAO,MAAO,KAAM,QAAS,KAAM,KAAM,OAAQ,SAAU,KAAM,SAAU,SAAU,OAAQ,KAAM,KAAM,KAAM,KAAM,MAAO,UAAW,OAAQ,KAAM,KAAM,QAAS,KAAM,KAAM,MAAO,OAAQ,KAAM,KAAM,QAAS,KAAM,KAAM,UAAW,OAAQ,MAAO,UAAW,SAAU,KAAM,KAAM,MAAO,QAAS,QAAS,OAAQ,KAAM,OAAQ,OAAQ,WAAY,UAAW,OAAQ,OAAQ,KAAM,QAAS,SAAU,QAAS,QAAS,KAAM,KAAM,KAAM,OAAQ,KAAM,OAAQ,SAAU,KAAM,KAAM,KAAM,SAAU,SAAU,aAAc,QAAS,SAAU,YAAa,WAAY,KAAM,KAAM,KAAM,QAAS,OAAQ,YAAa,OAAQ,WAAY,OAAQ,KAAM,KAAM,QAAS,MAAO,OAAQ,KAAM,KAAM,KAAM,KAAM,KAAM,OAAQ,OAAQ,MAAO,SAAU,QAAS,SAAU,WAAY,SAAU,cAAe,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,SAAU,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,SAAU,OAAQ,OAAQ,KAAM,KAAM,MAAO,UAAW,UAAW,MAAO,QAAS,KAAM,KAAM,MAAO,MAAO,KAAM,OAAQ,QAAS,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,MAAO,KAAM,MAAO,KAAM,UAAW,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,UAAW,QAAS,SAAU,MAAO,KAAM,QAAS,WAAY,QAAS,QAAS,KAAM,KAAM,KAAM,KAAM,WAAY,QAAS,cAAe,SAAU,SAAU,OAAQ,WAAY,OAAQ,QAAS,KAAM,KAAM,QAAS,WAAY,KAAM,KAAM,OAAQ,QAAS,OAAQ,OAAQ,KAAM,QAAS,QAAS,MAAO,OAAQ,cAAe,OAAQ,aAAc,WAAY,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,OAAQ,SAAU,KAAM,UAAW,UAAW,MAAO,QAAS,QAAS,SAAU,OAAQ,MAAO,UAAW,SAAU,SAAU,aAAc,OAAQ,aAAc,UAAW,OAAQ,MAAO,MAAO,KAAM,QAAS,QAAS,KAAM,OAAQ,KAAM,OAAQ,KAAM,SAAU,KAAM,WAAY,OAAQ,UAAW,OAAQ,OAAQ,KAAM,KAAM,MAAO,MAAO,UAAW,SAAU,UAAW,UAAW,OAAQ,KAAM,KAAM,WAAY,MAAO,OAAQ,KAAM,KAAM,UAAW,QAAS,UAAW,KAAM,UAAW,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,SAAU,WAAY,OAAQ,QAAS,YAAa,MAAO,QAAS,UAAW,KAAM,KAAM,QAAS,KAAM,WAAY,SAAU,UAAW,OAAQ,UAAW,SAAU,KAAM,KAAM,KAAM,SAAU,UAAW,KAAM,SAAU,QAAS,SAAU,MAAO,KAAM,KAAM,aAAc,MAAO,UAAW,SAAU,KAAM,KAAM,KAAM,SAAU,OAAQ,QAAS,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,QAAS,QAAS,QAAS,MAAO,UAAW,OAAQ,OAAQ,KAAM,KAAM,QAAS,WAAY,SAAU,QAAS,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,aAAc,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,YAAa,KAAM,KAAM,QAAS,WAAY,eAAgB,MAAO,KAAM,KAAM,SAAU,QAAS,SAAU,SAAU,aAAc,KAAM,QAAS,OAAQ,SAAU,OAAQ,SAAU,KAAM,QAAS,OAAQ,QAAS,SAAU,UAAW,MAAO,UAAW,KAAM,UAAW,OAAQ,OAAQ,cAAe,MAAO,OAAQ,QAAS,QAAS,KAAM,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,OAAQ,KAAM,OAAQ,KAAM,KAAM,KAAM,MAAO,SAAU,MAAO,SAAU,OAAQ,MAAO,MAAO,MAAO,KAAM,cAAe,KAAM,KAAM,KAAM,OAAQ,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,QAAS,OAAQ,OAAQ,OAAQ,KAAM,QAAS,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,MAAO,UAAW,OAAQ,QAAS,SAAU,QAAS,SAAU,QAAS,SAAU,WAAY,SAAU,OAAQ,KAAM,KAAM,OAAQ,MAAO,QAAS,MAAO,KAAM,OAAQ,MAAO,OAAQ,KAAM,OAAQ,KAAM,KAAM,mBAAoB,oBAAqB,KAAM,MAAO,MAAO,KAAM,SAAU,UAAW,MAAO,SAAU,KAAM,MAAO,MAAO,SAAU,SAAU,KAAM,OAAQ,WAAY,UAAW,KAAM,KAAM,MAAO,KAAM,OAAQ,UAAW,MCUrsN,MAMMqkB,EAAmB,w3BA4BnBC,EAA4B,IAAMD,EAAmB,OAErDE,EAAYC,kCAERF,EAA4B,aAAeA,EAFnCE,oIAQhBF,EAA4B,IAAMD,EARlBG,qBAULF,EAA4B,IAAMD,EAV7BG,iDAYgBH,EAZhBG,uEAmBZC,GADoB,IAAIC,OAAO,IAnBP,+BAmBmCrkB,MAAM,GAAI,GAAI,KAClD,+BAGvBskB,EAAa,IAAID,OAAO,iCAAuCH,EAAvC,+tPAAoK,KAC5LK,EAAc,4JAEdC,EAAiB,+JACjBC,EAA6C,CACjDC,SAAU,kCACVC,QAAS,kCACTC,UAAW,0CACX,cAAe,uCASXC,EAA6D,CACjE,IAAK,oBACL,KAAM,mBACN,KAAM,oBACN,GAAM,sBACN,KAAM,sBACN,MAAO,yBACP,KAAM,wBAGFC,EAAmD,IAAI7F,IAAI,CAC/D,qBACA,yBACA,uBAEF,IAAI,IAAI1kB,KAAKsqB,EACXC,EAAwBhT,IAAI+S,EAAiBtqB,IAG/C,IAAU,GAAV,SAAUwqB,GAGR,SAAgBC,EAAgBC,GAC9B,IAAIC,EAAU,YAAYD,GAAWzV,QAAQ,UAAW,IAOxD,GAAI,IAAM5U,eAAesqB,GAOzB,OAAOA,EAGT,SAAgBC,EAAcnV,GAC5B,IAAIzL,EACA6gB,EAAMpV,EACV,MAAMqV,EAA4B,GAClC,IAAIC,EACAC,EAAY,EAGhB,IADAjB,EAAW/U,UAAY,EAChBhL,EAAQ6gB,EAAI7gB,MAAM+f,IAAc,CAKrC,GAJAgB,EAAaC,EAAYhhB,EAAMoZ,MAI5BpZ,EAAM,GACP8gB,EAAStqB,KAAK,CACZiS,EAAG,uBACH6C,OAAQyV,EAAa/gB,EAAM,GAAG9J,OAC9BA,OAAQ8J,EAAM,GAAG9J,OAAS8J,EAAM,GAAG9J,cAEhC,GAAG8J,EAAM,GACd,GAAGggB,EAAYtgB,KAAKM,EAAM,IACxB8gB,EAAStqB,KAAK,CACZiS,EAAG,qBACH6C,OAAQyV,EACR7qB,OAAQ8J,EAAM,GAAG9J,aAEd,CACL,IAAIwV,EACAuV,EAAWjhB,EAAM,GACrB,MAAMkhB,EAAMlhB,EAAM,GAElB,GAAGkhB,GAKD,GAJID,GAAkC,SAArBC,EAAIC,OAAO,EAAG,KAAqD,IAApC,EAAI3hB,QAAQ0hB,EAAI3hB,iBAC9D0hB,EAAW,WAGVA,EAAU,CACX,MAAMG,EAAWC,EAAcrhB,EAAM,IAClCohB,EAASlrB,SAAW8J,EAAM,GAAG9J,SAE9B8J,EAAM,GAAKohB,GAGb1V,GAAO1L,EAAM,GAAK,GAAKihB,GAAYjhB,EAAM,SAG3C0L,GAAO1L,EAAM,GAAK,GAAK,WAAaA,EAAM,GAGzC0L,GACDoV,EAAStqB,KAAK,CACZiS,EAAG,mBACH6C,OAAQyV,EACR7qB,OAAQ8J,EAAM,GAAG9J,cAIlB,GAAG8J,EAAM,GACd8gB,EAAStqB,KAAK,CACZiS,EAAG,yBACH6C,OAAQyV,EACR7qB,OAAQ,SAEL,GAAG8J,EAAM,GAAI,CAElB,MAAM2gB,EAAUF,EAAgBzgB,EAAM,IACnC2gB,GACDG,EAAStqB,KAAK,CACZiS,EAAG,qBACH6C,OAAQyV,EACR7qB,OAAQ8J,EAAM,GAAG9J,OACjBorB,QAASX,SAGL3gB,EAAM,IACd8gB,EAAStqB,KAAK,CACZiS,EAAG,uBACH6C,OAAQyV,GAAc/gB,EAAM,IAAMA,EAAM,IAAI9J,OAAS,GACrDA,OAAQ8J,EAAM,IAAI9J,SAEZ8J,EAAM,KACd8gB,EAAStqB,KAAK,CACZiS,EAAG,0BACH6C,OAAQyV,GAAc/gB,EAAM,IAAMA,EAAM,IAAI9J,OAAS,IAAM8J,EAAM,IAAMA,EAAM,IAAI9J,OAAS,GAC1FA,OAAQ,EAAI8J,EAAM,IAAI9J,QAAU8J,EAAM,IAAM,EAAIA,EAAM,IAAI9J,OAAS,GACnEqrB,QAAQ,IAIZV,EAAMA,EAAIM,OAAOnhB,EAAMoZ,MAAQpZ,EAAM,GAAG9J,QACxC8qB,GAAahhB,EAAMoZ,MAAQpZ,EAAM,GAAG9J,OAMtC,OAAO4qB,EAwJT,SAAgBU,EAAsBC,EAAkCC,GACtE,OAAOD,EAAgB9iB,KAAKgjB,IAI1B,KAH2BD,EAAUjZ,IAAMkZ,EAAclZ,IACrD8X,EAAwBqB,IAAIF,EAAUjZ,KAAO8X,EAAwBqB,IAAID,EAAclZ,IAGzF,OAAO,EAMT,OAH4BiZ,EAAUpW,QAAUqW,EAAcrW,QAC3DoW,EAAUxrB,OAASwrB,EAAUpW,QAAYqW,EAAczrB,OAASyrB,EAAcrW,SAMrF,SAAgBuW,EAAcJ,EAAkCK,GAC9D,MAAMC,EAAWD,EAAYE,OAAO5qB,IAC1BoqB,EAAsBC,EAAiBrqB,IAGjDqqB,EAAgBjrB,QAAQurB,GACxBE,EAAaR,GAOX,IAAI,IAAIzrB,EAAI,EAAGA,EAAIyrB,EAAgBvrB,SAAUF,EAAG,CAC9C,MAAMksB,EAAST,EAAgBzrB,GAC/B,GAAgB,uBAAbksB,EAAOzZ,EAA4B,CACpC,MAAM0Z,EAAaV,EAAgBzrB,EAAI,GACpCmsB,GAA6DA,EAAW7W,OAAU4W,EAAO5W,OAAS4W,EAAOhsB,SAC1GgsB,EAAOhsB,OAASisB,EAAW7W,OAAS4W,EAAO5W,SAMnD,OAAOmW,EApTI,EAAAW,qBAAuB,UAEpB,EAAA3B,gBAAe,EAkBf,EAAAG,cAAa,EA6Gb,EAAAyB,cAAhB,SAA8BxB,EAAaY,EAAkCa,GAK3E,MAAMxB,EAA4B,GAClC,IAAIyB,GAAe,EACnB,MAAMC,EAAcN,GAA2BV,EAAsBC,EAAiBS,GAAyDK,GAAe,GAA7DzB,EAAStqB,KAAK0rB,GAASK,GAAe,GAEjIE,EAAyB,GAC/B,IAAmBziB,EAAfghB,EAAY,EAChB,KAAMhhB,EAAQ6gB,EAAI7gB,MAAMigB,IAAiB,CACvC,MAAMc,EAAaC,EAAYhhB,EAAMoZ,MACrCqJ,EAAajsB,KAAKqqB,EAAIM,OAAO,EAAGnhB,EAAMoZ,QACtC,MAAM3N,EAAQzL,EAAM,IAAMA,EAAM,IAAMA,EAAM,KAAOA,EAAM,IAKzD,IAAIkiB,EAEJ,GANAlB,GAAavV,EAAKvV,OAElB8qB,GAAavV,EAAKvV,OAGlBqsB,GAAe,EACZ9W,EAAKzL,MAAM,QACZyiB,EAAajsB,KAAKwJ,EAAM,SACnB,GAAGA,EAAM,GACdkiB,EAAS,CACPzZ,EAAG,mBACHoK,SAAU,GACVvH,OAAQyV,EAAa/gB,EAAM,GAAG9J,OAC9BA,OAAQuV,EAAKvV,QAGZssB,EAAWN,KACI,OAAbliB,EAAM,KACPA,EAAM,GAAK,GACXghB,GAAa,GAGfyB,EAAajsB,KAAKwJ,EAAM,GAAKyL,EAAOzL,EAAM,IAE1CghB,GAAahhB,EAAM,GAAG9J,OAAS8J,EAAM,GAAG9J,aAErC,GAAG8J,EAAM,GAAI,CAClB,MAAM0iB,EAAqB,MAAb1iB,EAAM,GAEpBkiB,EAAS,CACPzZ,EAAG6X,EAAiBtgB,EAAM,IAE1BsL,OAAQyV,GAAc2B,EAAQ,EAAI1iB,EAAM,GAAG9J,QAC3CA,OAAQuV,EAAKvV,QAGZssB,EAAWN,KACRQ,EAGFD,EAAajsB,KAAKiV,GAFlBgX,EAAajsB,KAAKwJ,EAAM,GAAKyL,EAAOzL,EAAM,IAK5CghB,GAA+B,EAAlBhhB,EAAM,GAAG9J,QAAcwsB,EAAQ,EAAI,SAE1C1iB,EAAM,KACdkiB,EAAS,CACPzZ,EAAG,2BACHka,QAAS3iB,EAAM,IAAI4iB,WACnBtX,OAAQyV,EACR7qB,OAAQuV,EAAKvV,QAGZssB,EAAWN,KACZO,EAAajsB,KAAKiV,GAElBuV,GAAahhB,EAAM,GAAG9J,OAASuV,EAAKvV,SAE9B8J,EAAM,MACdkiB,EAAS,CACPzZ,EAAG,uBACHiD,IAAK1L,EAAM,IACXsL,OAAQyV,EACR7qB,OAAQuV,EAAKvV,QAGZssB,EAAWN,KACZO,EAAajsB,KAAKiV,GAElBuV,GAAahhB,EAAM,IAAI9J,OAASuV,EAAKvV,SAIrCqsB,GACFE,EAAajsB,KAAKwJ,EAAM,IAG1B6gB,EAAMA,EAAIM,OAAOnhB,EAAMoZ,MAAQpZ,EAAM,GAAG9J,QACxC8qB,GAAahhB,EAAMoZ,MAAQpZ,EAAM,GAAG9J,OAGtCusB,EAAajsB,KAAKqqB,GAClB,IAAIgC,EAAUJ,EAAahW,KAAK,IAC5BoW,EAAQ5X,QAAQ,OAAQ,IAAI/U,SAC9B2sB,EAAUhC,EACVC,EAASgC,OAAO,EAAGhC,EAAS5qB,SAQ9B2rB,EAAcJ,EAAiBX,GAC/BiC,EAAoBtB,GAEpB,IAAIvrB,EAAS2sB,EAAQ3sB,OACrB,IAAIosB,EAAQ,CAEVO,EAAUA,EAAQ5X,QAAQ,OAAQ,IAElC,IAAI+X,EAAO9sB,EAAS2sB,EAAQ3sB,OACzB8sB,GACDvB,EAAgBpe,QAAQ6e,IACtBA,EAAO5W,OAAS2X,KAAKC,IAAI,EAAGhB,EAAO5W,OAAS0X,KAKhDH,EAAUA,EAAQ5X,QAAQ,OAAQ,IAClC+X,EAAO9sB,EAAS2sB,EAAQ3sB,OACxBA,EAAS2sB,EAAQ3sB,OACd8sB,GACDvB,EAAgBpe,QAAQ6e,IAClBA,EAAO5W,OAAS4W,EAAOhsB,OAAUA,IACnCgsB,EAAOhsB,OAASA,EAASgsB,EAAO5W,UAMxC,OAAOuX,GAGO,EAAArB,sBAAqB,EAgBrB,EAAAK,cAAa,EA2B7B,MAAMsB,EAAgD,IAAIzI,IAAI,CAC5D,oBACA,sBACA,oBACA,mBACA,yBACA,sBACA,0BACA,yBAEF,SAAgBqI,EAAoBjC,GAElC,IAAI,IAAI9qB,EAAI,EAAGA,EAAI8qB,EAAS5qB,SAAUF,EAAG,CACvC,MAAMksB,EAASpB,EAAS9qB,GAExB,IAAIotB,GAAiB,EACrB,GAKE,GAJAA,EAAgBtC,EAASlE,UAAU,CAACxlB,EAAGisB,IAC9BF,EAAqBvB,IAAIxqB,EAAEqR,IAAM4a,IAAOrtB,GAAKoB,EAAEqR,IAAMyZ,EAAOzZ,GAAMrR,EAAEkU,OAAS4W,EAAOhsB,SAAYgsB,EAAO5W,SAG1F,IAAnB8X,EAAsB,CACvB,MAAMjB,EAAarB,EAASsC,GAC5BlB,EAAOhsB,QAAUisB,EAAWjsB,OAC5B4qB,EAASgC,OAAOM,EAAe,WAER,IAAnBA,IAKZ,SAAgBnB,EAAanB,GAC3BA,EAASwC,KAAK,CAAC3X,EAAG4X,IACR5X,EAAEL,OAASiY,EAAEjY,QAAYiY,EAAErtB,OAASyV,EAAEzV,QAIlD,SAASstB,EAAiBC,GAGxB,OAFAA,EAAOzqB,OAAS,SAChByqB,EAAOC,IAAM,sBACND,EAMR,SAAgBE,EAAalY,EAAc6B,EAwBvC,I,cACH,MAAMsW,EAAW1rB,SAAS2rB,yBAC1B,IAAIpY,EACF,OAAOmY,EAGT,MAAME,EAAqB,QAAhB,EAAGxW,EAAQwW,aAAK,QAAbxW,EAAQwW,MAAU,CAC9B9tB,EAAG,EACH+tB,WAAY,EACZtY,QAGIqV,EAA2B,QAAnB,EAAGxT,EAAQwT,gBAAQ,QAAhBxT,EAAQwT,SAAaF,EAAckD,EAAMrY,MAEpDuY,EAAmC,QAAvB,EAAG1W,EAAQ0W,oBAAY,QAApB1W,EAAQ0W,aAAiB,GACxCC,EAAiC,QAAtB,EAAG3W,EAAQ2W,mBAAW,QAAnB3W,EAAQ2W,YAAgB,WACtCC,EAAkC,aAAhBD,EAElBE,EAAaL,EAAMrY,KAAKvV,OACxBA,EAAS4qB,EAAS5qB,OACxB,IAAIkuB,EACJ,KAAMN,EAAM9tB,EAAIE,IAAU4tB,EAAM9tB,EAAG,CACjC,IAAIksB,EAASpB,EAASgD,EAAM9tB,GAI5B,GAAGksB,EAAO5W,QAAU6Y,GAClB,GAAgB,uBAAbjC,EAAOzZ,EACR,cAEOyZ,EAAO5W,OAAS4W,EAAOhsB,OAAUiuB,IAC1CjC,EAAS,OAAA9hB,EAAA,GAAK8hB,GACdA,EAAOhsB,OAASgsB,EAAO5W,OAAS4W,EAAOhsB,OAASiuB,GAG/CjC,EAAOhsB,SACR4tB,EAAMO,WAAanC,GAGrB,IAAIC,EAAarB,EAASgD,EAAM9tB,EAAI,GAEpC,MAAMsuB,EAAcpC,EAAO5W,OACrBiZ,EAAYD,EAAcpC,EAAOhsB,OACjCsuB,EAAgBvB,KAAKwB,IAAIF,EAA6B,QAAlB,EAAApC,aAAU,EAAVA,EAAY7W,cAAM,QAAI,OAC1DoZ,EAAiBZ,EAAMrY,KAAKhQ,MAAM6oB,EAAaC,GAErD,IAAII,EADWb,EAAMrY,KAAKhQ,MAAM6oB,EAAaE,GAG1CV,EAAMC,WAAaO,IACnBF,GAAeR,GAAUrY,OAAOuY,EAAMrY,KAAKhQ,MAAMqoB,EAAMC,WAAYO,IAGnEF,IACDA,EAAcR,GAGhBE,EAAMC,WAAaS,EAEnB,IAAIha,EACFtP,EAAkC,cAClC0pB,GAAW,EACb,OAAO1C,EAAOzZ,GACZ,IAAK,oBACC6E,EAAQuX,eACPvX,EAAQwX,eACTta,EAAUtS,SAASC,cAAc,QACjCqS,EAAQxH,MAAM+hB,WAAa,QAE3Bva,EAAUtS,SAASC,cAAc,WAIrC,MAGF,IAAK,sBACCmV,EAAQuX,eACPvX,EAAQwX,eACTta,EAAUtS,SAASC,cAAc,QACjCqS,EAAQxH,MAAMgiB,UAAY,UAE1Bxa,EAAUtS,SAASC,cAAc,OAIrC,MAGF,IAAK,sBACH,GAAGmV,EAAQwX,cAAe,CACxB,MAAMG,EAAY,IAAY,kBAAoB,uBAClDza,EAAUtS,SAASC,cAAc,QACjCqS,EAAQxH,MAAMkiB,QAAaD,EAAH,uBACf3X,EAAQuX,eACjBra,EAAUtS,SAASC,cAAc,QAGnC,MAGF,IAAK,yBACH,GAAGmV,EAAQwX,cAAe,CACxB,MAAMG,EAAY,IAAY,kBAAoB,uBAClDza,EAAUtS,SAASC,cAAc,QACjCqS,EAAQxH,MAAMkiB,QAAaD,EAAH,oBACf3X,EAAQuX,eACjBra,EAAUtS,SAASC,cAAc,MAGnC,MAGF,IAAK,mBACL,IAAK,oBACAmV,EAAQwX,eACTta,EAAUtS,SAASC,cAAc,QACjCqS,EAAQxH,MAAMmiB,WAAa,yBAClB7X,EAAQuX,eACjBra,EAAUtS,SAASC,cAAc,SAGnC,MAoBF,IAAK,yBACHqS,EAAUtS,SAASC,cAAc,KACjCqS,EAAQ4a,UAAY,iBACpB,MAGF,IAAK,0BAEH,IAAI9X,EAAQ+X,SAAWrB,EAAa9B,EAAOzZ,GAAI,CAC7C,IACI6c,EACAC,EAFAC,EAAUd,EAAejpB,MAAM,IAGI,KAAnC8pB,EAAQC,EAAQhmB,QAAQ,OAC1B8lB,EAAME,EAAQ/pB,MAAM8pB,EAAQ,GAC5BC,EAAUA,EAAQ/pB,MAAM,EAAG8pB,IAE3BD,EAAMhY,EAAQmY,QAGhBjb,EAAUtS,SAASC,cAAc,KAChCqS,EAA8BuB,KAAO,OAAA2Z,EAAA,GAAe,4BAA8BC,mBAAmBH,IAAYF,EAAM,QAAUK,mBAAmBL,GAAO,KACxJpB,GACF1Z,EAAQjS,aAAa,UAAW,wBAIpC,MAGF,IAAK,qBAAsB,CACzB,IAAIqtB,EAAc,IAClB,GAAGA,EACD,IAAI,MAAM1hB,KAAW,IACnB,GAAGA,EAAS,CAEV,GADkB,IAAcA,GACnB7N,eAAe6rB,EAAOZ,SAAU,CAC3CsE,GAAc,EACd,OAOJA,EAUOtY,EAAQwX,gBACjBta,EAAUtS,SAASC,cAAc,QACjCqS,EAAQ4a,UAAY,UARlB5a,EAAUtS,SAASC,cAAc,OAChCqS,EAA6BzS,IAAM,oBAAoBmqB,EAAOZ,cAC/DpmB,EAAW,MACXsP,EAAQ4a,UAAY,SAaxB,MAGF,IAAK,qBACH5a,EAAUtS,SAASC,cAAc,QACjCqS,EAAQ4a,UAAY,eACpB,MAaF,IAAK,mBACL,IAAK,uBACH,IAAK9X,EAAQ+X,SAAYrB,EAAa9B,EAAOzZ,GAAK,CAEhD,IAEIuD,EAFAN,EAAewW,EAA8CxW,KAAOgZ,EACpEmB,GAAS,EAGb,MAAMC,EAAUha,EAAQJ,GAAK,GAC7BA,EAAMoa,EAAQpa,IACdM,EAAU8Z,EAAQ9Z,QAEF,yBAAbkW,EAAOzZ,IACa,sBAAlB0Z,aAAU,EAAVA,EAAY1Z,IACb0Z,EAAWjsB,SAAWgsB,EAAOhsB,QAC7BisB,EAAW7W,SAAW4W,EAAO5W,QAC7BwY,EAAM9tB,IAGL0V,IAAQgZ,IACTmB,GAAS,IAMb,MAAME,IAAmB/Z,EACrBA,IAAW6Z,GAAWE,IACxB/Z,EAAU,mBAGTsB,EAAQwX,gBACT9Y,OAAU5S,GAGZ,MAAM2S,EAAQga,GAA6C,oBAApBC,gBACnCta,EACA,4CAA4CA,OAEhDlB,EAAUtS,SAASC,cAAc,KACjCqS,EAAQ4a,UAAY,aACnB5a,EAA8BuB,KAAOA,EAEjCga,GAA6C,oBAApBC,iBAC5BxC,EAAiBhZ,GAGhBwB,GACDxB,EAAQjS,aAAa,UAAWyT,EAAU,UAI9C,MAGF,IAAK,qBACCsB,EAAQ+X,UACV7a,EAAUtS,SAASC,cAAc,KAChCqS,EAA8BuB,KAAO,OAAA2Z,EAAA,GAAe,UAAYhB,GACjElB,EAAiBhZ,IAGnB,MAGF,IAAK,uBAAwB,CAC3B,MAAMyb,GAAc3Y,EAAQ+X,SAAWnF,EAAa+D,GACpD,GAAGgC,EAAY,CACb,MAAMC,EAAUxB,EAAejpB,MAAM,GACrC+O,EAAUtS,SAASC,cAAc,KACjCqS,EAAQ4a,UAAY,iBACnB5a,EAA8BuB,KAAOka,EAAWhb,QAAQ,MAAO0a,mBAAmBO,IAChFhC,EACDV,EAAiBhZ,GAEjBA,EAAQjS,aAAa,UAAW,yBAIpC,MAGF,IAAK,2BACE+U,EAAQ+X,UAAYrB,EAAa9B,EAAOzZ,KAC3C+B,EAAUtS,SAASC,cAAc,KAChCqS,EAA8BuB,KAAO,UAAU4Z,mBAAmBzD,EAAOS,SAC1EnY,EAAQ4a,UAAY,SACpB5a,EAAQmD,QAAQwY,OAAS,GAAKjE,EAAOS,SAGvC,MAGF,IAAK,uBAEH,IAAIrV,EAAQ+X,QAAS,CACnB,MAAMe,EAAW1B,EAAejpB,MAAM,IAEhC,IAACiQ,EAAG,QAAEM,GAAWF,EAAQ,QAAUsa,GAEzC5b,EAAUtS,SAASC,cAAc,KACjCqS,EAAQ4a,UAAY,UACnB5a,EAA8BuB,KAAOL,EACnCM,GACDxB,EAAQjS,aAAa,UAAcyT,EAAH,UAMpC,MAGF,IAAK,uBACH,GAAGsB,EAAQuX,aAAc,CACvB,MAAMwB,EAASvC,EAAMrY,KAAKhQ,MAAM,EAAGymB,EAAO5W,QAEpCgb,EAAe3B,EAAW4B,EADVzC,EAAMrY,KAAKhQ,MAAMymB,EAAO5W,OAAQ4W,EAAO5W,OAAS4W,EAAOhsB,SAEvEswB,EAAQ1C,EAAMrY,KAAKhQ,MAAMymB,EAAO5W,OAAS4W,EAAOhsB,QACtD4tB,EAAMrY,KAAO4a,EAASC,EAAeE,OAChC,GAAGlZ,EAAQwX,cAChBta,EAAUtS,SAASC,cAAc,QACjCqS,EAAQxH,MAAMmiB,WAAa,cACtB,CACL,MAAMsB,EAAYvuB,SAASC,cAAc,QACzCsuB,EAAUrB,UAAY,UACtB5a,EAAUtS,SAASC,cAAc,QACjCqS,EAAQ4a,UAAY,eACpB5a,EAAQyB,YAAc0Y,EACtBC,GAAW,EACX6B,EAAUlb,OAAOf,GACjBoZ,EAASrY,OAAOkb,IAoBtB,IAbI7B,IACCpa,EAEDA,EAAQtP,GAAYypB,GAEnBna,GAAWoZ,GAAUrY,OAAOoZ,IAI9Bna,IAAYA,EAAQkc,gBACpBtC,GAAeR,GAAUrY,OAAOf,GAG7B2X,GAAcA,EAAW7W,OAAUiZ,EAAY,KACjDT,EAAM9tB,GAEPwU,GAAWoZ,GAAUrY,OAAOoY,EAAaG,EAAMrY,KAAM,OAAF,wBAC/C6B,GAAO,CACVqZ,QAAQ,MAGVxE,EAAarB,EAASgD,EAAM9tB,EAAI,GAalC,GALEouB,EADClC,EAAOhsB,OAASyuB,EAASzuB,QAAUsU,EACtBA,EAEAoZ,EAGbtW,EAAQqZ,OACT,OAAO/C,EAYX,OARGE,EAAMO,aACPP,EAAMC,WAAaD,EAAMO,WAAW/Y,OAASwY,EAAMO,WAAWnuB,QAG7D4tB,EAAMC,WAAaI,IACnBC,GAAeR,GAAUrY,OAAOuY,EAAMrY,KAAKhQ,MAAMqoB,EAAMC,aAGnDH,EAiDT,SAAgBvC,EAAc3V,GAI5B,IAHA,IAAIkb,EAAYlb,EAAIxV,OAChB2wB,EAAkBnb,EAAIhK,MAAM,KAAKxL,OAAS,EAC1C4wB,EAAmBpb,EAAIhK,MAAM,KAAKxL,OAAS,EACzC4wB,EAAmBD,GACO,MAA9Bnb,EAAIwC,OAAO0Y,EAAY,IACvBlb,EAAMA,EAAIyV,OAAO,EAAGyF,EAAY,GAChCE,IACAF,IAKF,OAHGC,EAAkBC,IACnBpb,EAAMA,EAAIT,QAAQ,OAAQ,KAErBS,EAGT,SAAgB6a,EAAQ9a,GACtB,MAAMsb,EAAQ,kQACRC,EAAcD,EAAM7wB,OAEpB6U,EAAgB,GACtB,IAAI,IAAI/U,EAAI,EAAGA,EAAIyV,EAAKvV,SAAUF,EAAG,CACnC,IAAIixB,EAAOxb,EAAKyb,WAAWlxB,GAC3B+U,EAAIvU,KAAKuwB,EAAME,EAAOD,IAGxB,OAAOjc,EAAI0B,KAAK,IA8BlB,SAAgB0a,EAAc1b,EAAc2b,GAAU,GACpD,IAAI3b,EAAM,OAAOkY,EAAa,IAG9B,OAAOA,EAAalY,EAAM,CAACqV,SADZF,EAAcnV,GAAMuW,OAAO5qB,GAAa,uBAARA,EAAEqR,GACZqc,cAAesC,IAGtD,SAAgBtb,EAAQJ,EAAa6V,GAKnC,IAAI8F,EAAWC,EAAgBC,EAC3Bvb,EAGM,GARNJ,EAAiBF,KACnBA,EAAM,WAAaA,GAOP2b,EAAY3b,EAAI1L,MAAM,4CAA8C,CAChF,MAAMwnB,EAAWH,EAAU,GAG3B,GAAG,MAAM3nB,KAAK8nB,KAAc,EAAApF,qBAAqB1iB,KAAK8nB,GAEpD,OADAxb,EAAU,WACH,CAACN,MAAKM,WAGf,MAAMyb,EAAOD,EAAS9lB,MAAM,KAC5B,OAAO+lB,EAAK,IACV,IAAK,WACL,IAAK,cACL,IAAK,YACHzb,EAAUyb,EAAK,GACf,MAEF,QACE,GAAIA,EAAK,IAAMA,EAAK,GAAGznB,MAAM,uCAA0D,IAAhBynB,EAAKvxB,OAAc,CACxF8V,EAAU,KACV,aAKGsb,EAAiB5b,EAAI1L,MAAM,kDACpCgM,EAAU,MACDub,EAAU7b,EAAI1L,MAAM,gCAC7BgM,EAAU,MAAQub,EAAQ,IAS5B,OAJK5pB,OAAeqO,KAClBA,OAAU5S,GAGL,CAACsS,MAAKM,WAGf,SAAgBJ,EAAiBH,GAC/B,OAAQA,EAAcA,EAAKzL,MAAM6f,GAAlB,KA6BjB,SAAgB6H,EAAwBC,GACtC,MAAO,CACLlf,EAAG,qBACH6C,OAAQ,EACRpV,OAAQyxB,EAAMzxB,OACdorB,QAAS,YAAaqG,GAAOlb,KAAK,KAAKxB,QAAQ,UAAW,KAzpB9C,EAAA8X,oBAAmB,EAqBnB,EAAAd,aAAY,EAeX,EAAA0B,aAAY,EAobb,EAAAiE,SAAhB,SAAyBnc,EAAcqV,GAyBrC,OAnBArV,EAAOA,EAAKR,QAAQ,kCAAmC,CAACjL,EAAOsL,EAAQ5B,KACrE,GAAGoX,EAAU,CACX,MAAM5qB,EAAS8J,EAAM9J,OAErBoV,GAAUpV,EACV4qB,EAASzd,QAAQ6e,IACf,MAAM2F,EAAM3F,EAAO5W,OAAS4W,EAAOhsB,OAChC2xB,IAAQvc,EACT4W,EAAOhsB,QAAUA,EACT2xB,EAAMvc,IACd4W,EAAO5W,QAAUpV,KAMvB,OAAO8J,EAAQ,OAMH,EAAA8nB,cAAhB,SAA8Brc,EAAc6B,EAEvC,IACH,OAAI7B,EAIGkY,EAAalY,EAAM,CACxBqV,SAAUxT,EAAQwT,SAClBuE,SAAS,EACTP,eAAe,EACfd,aAAc,CACZ+D,sBAAsB,EACtBC,0BAA0B,KATrBrE,EAAa,KAcR,EAAAtC,cAAa,EAgBb,EAAAkF,QAAO,EA0BP,EAAA0B,cAAhB,SAA8Bxc,EAAcqV,EAA4B,IAKtE,OAJGA,aAAQ,EAARA,EAAU5qB,UACX4qB,EAAWA,EAASkB,OAAOE,GAAuB,yBAAbA,EAAOzZ,IAGvCkb,EAAalY,EAAM,CACxBqV,WACAoH,YAAY,EACZrD,cAAc,EACdsD,cAAc,EACd9C,SAAS,IACRpZ,aAGW,EAAAkb,cAAa,EAOb,EAAArb,QAAO,EAiDP,EAAAF,iBAAgB,EAIhB,EAAAwc,SAAhB,SAAyB3c,GACvB,OAAQA,EAAcA,EAAKzL,MAAM2f,GAAlB,MAGD,EAAA0I,WAAhB,SAA2B5c,GACzB,OAAQA,EAAcA,EAAKzL,MAAMggB,GAAlB,MAGD,EAAAsI,gBAAhB,SAAgCjc,EAAakc,GAAY,GACvD,IAAIlc,EAAK,MAAO,GAChB,MAAM1K,EAAW0K,EAAIzK,OAAOF,MAAM,KAClC,IAAIC,EAAS,GAAI,MAAO,GAExB,MAAM6mB,EAAQ,IAAI7mB,EAAS,IAAI,GAE/B,OAAG4mB,GAAiC,IAApB5mB,EAASzL,OAAqBixB,EAAcqB,GAIrDrB,EAAcqB,EAFR,IAAI7mB,EAASA,EAASzL,OAAS,IAAI,KAKlC,EAAAuyB,gBAAhB,SAAgCrC,GAC9B,OAASA,EAASlwB,QAAU,GAAKkwB,EAASlwB,QAAU,KAAQkwB,EAASlwB,SAAW,kBAAkBwJ,KAAK0mB,IAGzF,EAAAsB,wBAAuB,EASvB,EAAAgB,gBAAhB,SAAgCf,GAC9B,OAAOhE,EAAagE,EAAO,CACzB7G,SAAU,CAAC4G,EAAwBC,OAj+BzC,CAAU,MAAiB,KAs+B3B,IAAenH,kBAAoB,EAGpB,O,6BC3lCR,SAASmI,EAAYC,GAE1B,OADmBC,EAAaC,EAAYF,IAAYnc,KAAK,KAH/D,0KAOA,MAAMsc,EAAa,UAEbC,EAAkBC,OAAOC,aAAa,MAEtCJ,EAAeK,GAAsBA,EAAS3pB,QAAQwpB,GAAmB,EAAIG,EAASle,QAAQ8d,EAAY,IAAMI,EAE/G,SAASN,EAAaO,GAC3B,MAAMC,EAAS,GACf,IAAIpC,EAAO,EACPqC,EAAW,EACXtzB,EAAI,EACR,KAAMA,EAAIozB,EAAkBlzB,QAC1B+wB,EAAOmC,EAAkBlC,WAAWlxB,KACjCszB,GACDD,EAAO7yB,MAAM,OAAY8yB,EAAW,OAAW,KAAOrC,EAAO,QAASsC,SAAS,KAC/ED,EAAW,GACFrC,EAAO,OAAUA,GAAQ,MAClCqC,EAAWrC,EAEXoC,EAAO7yB,KAAKywB,EAAKsC,SAAS,KAQ9B,OAJGF,EAAOnzB,QAA+B,IAArBmzB,EAAO,GAAGnzB,SAC5BmzB,EAAO,GAAK,KAAOA,EAAO,IAGrBA,EAGF,SAASG,EAAkB3e,GAChC,IAAI7K,EAAQ6K,EAAM7K,MAAM,mBACxB,OAAOA,EAAQ,GAAK,MAAQA,EAAM,GAAGknB,WAAW,IAAM,EAGjD,SAASuC,EAAgBC,GAC9B,OAAOT,OAAOC,aAAa,MAAO,MAAQQ,EAAKxC,WAAW,GAAI,MAAO,MAAQwC,EAAKxC,WAAW,IAGxF,SAASyC,EAAoBC,GAClC,OAAOA,EAAWloB,MAAM,KAAKkC,OAAO,CAACimB,EAAMC,IAASD,EAAOZ,OAAOc,cAAcC,SAASF,EAAM,KAAM,M,6BC/CvG,MAAMG,EAAyB,oBAAb,OAA2BtsB,OAASqB,KAEvC,O,6BCFA,SAAS0mB,EAAelrB,GACrC,OAAOA,EAAMyQ,QAAQ,KAAM,SAASA,QAAQ,kCAAoCzQ,GAGvE,MAAyB,MAFrBA,EAAM0sB,WAAW,GAEN,QADV1sB,EAAM0sB,WAAW,GACmB,OAAU,OAAW,KACpEjc,QAAQ,iBAAmBzQ,GACrB,KAAOA,EAAM0sB,WAAW,GAAK,KACnCjc,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAPzC,mC,6BCAA,uGAWO,MAAMif,EAAyB,KAAa,KAAa,IAEhE,GAAGA,EAAwB,CACzB,IAAIpvB,EAA2B,UAC3BqvB,EAAS,EACb,MAAMlwB,EAAI,CAACmwB,SAAS,EAAMC,SAAS,GAC7BC,EAAelzB,IACnB,MAAMmzB,EAAQnzB,EAAEozB,QAAQ,GAIlBC,EAAa,YAAgBF,EAAMvxB,OAAQ,gBACjD,GAAGyxB,EAAY,CACb,MAAMC,EAAIH,EAAMzvB,GACV6vB,EAAWR,EAASO,EAMpBE,EAAYH,EAAWG,UACvBC,EAAeJ,EAAWI,aAC1BC,EAAeL,EAAWK,aAC1BC,EAAgBH,EAAY3H,KAAK+H,MAAMJ,EAAYH,EAAWK,aAAeH,GAAYC,EAAYD,GAExFE,IAAiBC,GAAgBC,GAAiBF,GAAgBE,GAAiB,IAEpG3zB,EAAEkoB,sBAKJloB,EAAEkoB,kBAaN,IAAI2L,EAAwB,EAC5B/yB,SAAS0E,iBAAiB,UAAYxF,KAC/BA,EAAE4B,OAAuB+D,UAAUic,SAAS,2BAA8B5hB,EAAE8zB,UAAYD,EAAyB,KAWvG,YAAqB7zB,EAAE4B,QAEtCd,SAAS0E,iBAAiB,YAAa0tB,EAAarwB,GACpD/B,SAAS0E,iBAAiB,aAAexF,IACvC,GAAGA,EAAEozB,QAAQt0B,OAAS,EAAG,OACzB,MAAMi1B,EAAa/zB,EAAEozB,QAAQ,GAE7BL,EAASgB,EAAWrwB,OAErB,CAACuvB,SAAS,IAEbnyB,SAAS0E,iBAAiB,WAAaxF,IAErCc,SAAS2X,oBAAoB,YAAaya,EAAarwB,GAEvDgxB,EAAwB7zB,EAAE8zB,WAQzB,CAACb,SAAS,IAEbnyB,SAAS0E,iBAAiB,mBAAoB,KAEzC1E,SAASkzB,eACVlzB,SAASkzB,cAAcruB,UAAUic,SAAS,2BACzC9gB,SAASkzB,cAA8BC,MACxC,YAAqBnzB,SAASkzB,gBAM/B,CAACf,SAAS,IAGA,SAASiB,EAA6BzgB,GAC/Cqf,GACJrf,EAAM9N,UAAUwQ,IAAI,4B,6BC9GtB,8CAQe,SAASge,EAAqB1gB,GAC3CA,EAAM7H,MAAMwoB,UAAY,uBAIxB3gB,EAAMmU,QAGJ,cAAY/W,KAAK,KAIjB4C,EAAM7H,MAAMwoB,UAAY,O,6BCbb,SAASC,EAAgB/qB,EAAwD0kB,GAC9F,OAAQ1kB,EAAWgrB,QAAQ,IAAMtG,GARnC,mC,4gBC+BA,MAGMuG,EAAgB,IAAIznB,QACpB0nB,EAAQ,IAAIxnB,MAgILynB,EAAoB,CAC/BC,iBAAkB,GAClBC,aAAc,GACdC,aAAc,GACdC,QAAS,GACTC,QAAS,GACTC,aAAc,EACdC,iBAAkB7yB,KAAKC,MACvB6yB,YAAa,GACbC,cAAe,GACfC,aAAc,GACdroB,QAASynB,EACTvnB,MAAOwnB,EACPY,UAAW,CACT/jB,EAAG,IAAY,kBAAoB,mBAErCgkB,qBAAsB,GACtBjuB,SAAU,CACRkuB,iBAAkB,GAClBC,aAAc,aACdC,aAAc,QACdC,mBAAmB,EACnBC,aAAc,CACZC,MAAO,CACLC,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZC,MAAO,CACLJ,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZE,KAAM,CACJL,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,IAGdG,gBAAiB,CACf7kB,EAAG,uBACH8kB,cAAe,QACfC,OAAQ,CACNC,qBAAqB,EACrBC,oBAAoB,GAEtBC,eAAgB,QAChBC,eAAgB,SAChBC,wBAAyB,KAE3BC,SAAU,CACRC,MAAM,EACNC,QAAQ,GAEVC,SAAU,CACRC,SAAS,EACTC,MAAM,GAERxG,MAAO,CACLuG,SAAS,EACTE,KAAK,GAEP1vB,OAAQ,CAAC,CACPxF,KAAM,MACNm1B,WAAY,IA/FwB,CACxChD,MAAM,EACNiD,KAAM,GACNhxB,MAAO,kCACPixB,mBAAoB,yCACpBC,UAAW,EACXvxB,GAAI,KAfqC,CACzCouB,MAAM,EACNiD,KAAM,UACNhxB,MAAO,kCACPixB,mBAAoB,yCACpBC,UAAW,GACXvxB,GAAI,MAmGC,CACD/D,KAAM,QACNm1B,WAAY,IA/E0B,CAC1ChD,MAAM,EACNiD,KAAM,GACNhxB,MAAO,UACPixB,mBAAoB,6BACpBC,UAAW,EACXvxB,GAAI,MAhBuC,CAC3CouB,MAAM,EACNiD,KAAM,UAENhxB,MAAO,kCACPixB,mBAAoB,+CACpBC,WAAY,GACZvxB,GAAI,QAoFFwB,MAAO,SACPgwB,cAAe,CACbC,OAAO,GAET1nB,YCtOO,IAAIzN,MAAOo1B,iBAAiB3uB,MAAM,aAAe,MAAQ,ODwOlE4uB,eAAgB,CACdC,OAAQ,EACRC,OAAO,EACPC,aAAc,EACdC,cAAe,CACbC,MAAO,EACP7B,MAAO,EACP8B,MAAO,GAETf,MAAM,EACNnD,OAAO,GAETmE,YAAY,EACZC,6BAA6B,EAC7BC,QAAS,YAAe,IACxBC,eAAgB,IAGZC,EAAWp5B,OAAOwP,KAAKkmB,GAEvB2D,EAAe,CAAC,eAAgB,mBACpC,eAAgB,UAAW,YAMtB,MAAM,UAAwB,IA+BnC,cACE5zB,QAzBM,KAAAuH,IAAM,OAAAN,EAAA,GAAO,SAIb,KAAA4sB,YAAwC,IAAI/iB,IAC5C,KAAAgjB,cAAqC,IAAIhjB,IAE1C,KAAAijB,SAAW,CAChBC,MAAO,IAAI,IAAwD,IAAgB,SACnFC,MAAO,IAAI,IAAwD,IAAgB,SACnFC,QAAS,IAAI,IAA0D,IAAgB,YAGlF,KAAAC,gBAIH,GAEG,KAAA5pB,QAAUyD,EAAA,EAOfrO,KAAKy0B,iBAELpxB,EAAA,EAAUhC,iBAAiB,YAAa,KACtCrB,KAAK00B,kBAAkBrxB,EAAA,EAAU1B,KAAM,UAIpC,iBACL,OAAG3B,KAAK20B,SACR70B,QAAQ80B,KAAK,cACb50B,KAAK20B,OAAS,IAAI14B,QAASC,IACzB,MAAM24B,EAAej6B,OAAOwP,KAAKpK,KAAKo0B,UAChCU,EAAmCD,EAAa3vB,IAAI3F,GAAOS,KAAKo0B,SAAS70B,GAAKwf,UAE9EjjB,EAAiCk4B,EAAS9uB,IAAI3F,GAAO8O,EAAA,EAAaxP,IAAIU,IAC3E2O,OAAOhD,EAAA,EAAerM,IAAI,aAAcqM,EAAA,EAAerM,IAAI,aAC3DqP,OAAOG,EAAA,EAAaxP,IAAI,cACxBqP,OAAO4mB,GAER74B,QAAQoC,IAAIvC,GAAU4Q,KAAWyG,GAAQ,EAAD,gCAiCtC,IAAI4hB,EAAe/0B,KAAK+0B,MAAQ,GAGhC,IAAI,IAAIt6B,EAAI,EAAGE,EAASq5B,EAASr5B,OAAQF,EAAIE,IAAUF,EAAG,CACxD,MAAM8E,EAAMy0B,EAASv5B,GACfwE,EAAQkU,EAAI1Y,QACLoD,IAAVoB,EAED81B,EAAMx1B,GAAON,EAEbe,KAAKg1B,YAAYz1B,EAAK,OAAAsF,EAAA,GAAKyrB,EAAW/wB,KAI1C4T,EAAIoU,OAAO,EAAGyM,EAASr5B,QAGvB,IAAIs6B,EAAO9hB,EAAI/X,QACf,MAAM04B,EAAU3gB,EAAI/X,QACd85B,EAAkB/hB,EAAI/X,QAC5B,IAAI65B,GAAQC,EAAiB,CAC3BD,EAAOC,EACP,MAAM9qB,EAAiB,CAAC,KAAM,qBAAsB,eACpD,IAAI,IAAI3P,EAAI,EAAGA,GAAK,IAAKA,EACvB2P,EAAKnP,KAAK,KAAKR,iBACf2P,EAAKnP,KAAK,KAAKR,cAGjB,MAAMilB,QAAezjB,QAAQoC,IAAI+L,EAAKlF,IAAI3F,GAAO8O,EAAA,EAAaxP,IAAIU,KAClE6K,EAAKnP,KAAK,aACVykB,EAAOzkB,KAAsB,iBAAX,GAAwC,iBAAX,EAAsB,CAACsf,KAAMmF,EAAO,IAAM,IAAIxW,SAAU6C,KAAM/N,KAAKC,MAAQ,IAAO,EAAGyD,GAAIuzB,EAAKza,UAAS,IAAsBya,GAE5K,IAAInwB,EAAW,GACfsF,EAAKtC,QAAQ,CAACvI,EAAK0Q,KACjBnL,EAAIvF,GAAOmgB,EAAOzP,WAGd/E,EAAA,EAAeX,IAAIzF,GA2BxBmwB,IAEDF,EAAM9D,UAAY,CAAC/jB,EAAG,qBACtB7J,EAAA,EAAUZ,cAAc,YAA8B,iBAAX,GAAwC,iBAAX,EACtE,CAAC8X,KAAM,EAAGxO,KAAM/N,KAAKC,MAAQ,IAAO,EAAGyD,GAAIuzB,EAAKza,UAAS,IACzDya,IAIJ,IAAI,IAAIx6B,EAAI,EAAGE,EAASk6B,EAAal6B,OAAQF,EAAIE,IAAUF,EACzDuF,KAAKw0B,gBAAgBK,EAAap6B,IAAM0Y,EAAI1Y,GAK9C,GAFA0Y,EAAIoU,OAAO,EAAGsN,EAAal6B,QAExBo6B,EAAMjB,UAAYA,EAAS,CAC5B,QAAej2B,IAAZi2B,EAAuB,CACxB,MAAMvX,EAAiD,IAAIpL,IAAI,CAC7D,CAAC,iBAAatT,GACd,CAAC,eAAWA,KAGd0e,EAASzU,QAAQ,CAACoF,EAAG3N,KACnBgd,EAAShS,IAAIhL,EAAK,OAAAsF,EAAA,GAAKkwB,EAAMx1B,OAG/Bw1B,EAAQ/0B,KAAK+0B,MAAQ,OAAAlwB,EAAA,GAAKyrB,GAE1B/T,EAASzU,QAAQ,CAAC7I,EAAOM,KAEvBw1B,EAAMx1B,GAAON,IAGf,IAAI,MAAMM,KAAOS,KAAKw0B,gBACpBx0B,KAAKw0B,gBAAgBj1B,GAAiD5E,OAAS,EAGjFqF,KAAK4K,QAAQL,IAAIwqB,SAGb7pB,EAAA,EAAeX,IAAI,CACvB4qB,SAAUJ,EAAMjB,UAIpB,MAAMc,EAAO52B,KAAKC,MAClB,GAAI82B,EAAMlE,iBAhbI,MAgbgC+D,EAAM,CAC/C,KACD50B,KAAK4H,IAAI,qBAAsBmtB,EAAMlE,iBAAkB+D,GAG/C,CAACxqB,IACTA,EAAKtC,QAAQvI,IACXS,KAAKg1B,YAAYz1B,EAAK,OAAAsF,EAAA,GAAKyrB,EAAW/wB,KAGtC,MAAMY,EAAIH,KAAKw0B,gBAAgBj1B,GAC5BY,GAAKA,EAAExF,SACRwF,EAAExF,OAAS,MAKjBmE,CAAEm1B,GAoBJ,IANIc,EAAM9xB,SAASnI,eAAe,UAAYi6B,EAAM9xB,SAASnI,eAAe,gBAC1Ei6B,EAAM9xB,SAASC,MAAQ6xB,EAAM9xB,SAASmyB,WAAa,QAAU,MAC7Dp1B,KAAKg1B,YAAY,WAAYD,EAAM9xB,YAIjC8xB,EAAM9xB,SAASnI,eAAe,WAAai6B,EAAM9xB,SAAS6vB,WAAY,CACxEiC,EAAM9xB,SAASE,OAAS,OAAA0B,EAAA,GAAKyrB,EAAWrtB,SAASE,QACjD,MAAMD,EAAQ6xB,EAAM9xB,SAASE,OAAOC,KAAKlE,GAAKA,EAAEvB,OAASo3B,EAAM9xB,SAASC,OACrEA,IACDA,EAAM4vB,WAAaiC,EAAM9xB,SAAS6vB,WAClC9yB,KAAKg1B,YAAY,WAAYD,EAAM9xB,WAKvC,MAAMoyB,EAAuBN,EAAM9xB,SAASsuB,aAC5C,QAAqC1zB,KAAlCw3B,aAAoB,EAApBA,EAAsB3D,SAAuB,CAC9C,MAAM4D,EAAW,CACf,WACA,UACA,SACA,YAGiB,CACjB,QACA,QACA,QAGSxtB,QAAQytB,IACjB,MAAMC,EAAiDH,EAAqBE,GAAa,GACzFD,EAASxtB,QAAQ2tB,IACfD,EAAiBC,GAAYJ,EAAqBI,OAItDH,EAASxtB,QAAQ2tB,WACRJ,EAAqBI,KAG9Bz1B,KAAKg1B,YAAY,WAAYD,EAAM9xB,UAQrC,GALA,OAAAyyB,EAAA,GAAmBpF,EAAYyE,EAAQY,IAErC31B,KAAKg1B,YAAYW,EAAYZ,EAAMY,MAGlCZ,EAAMpsB,UAAYynB,GAAiB2E,EAAMlsB,QAAUwnB,EAAqB,CAEzE,IAA+C,IAA5C,OAAAjN,EAAA,GAAe2R,EAAMpsB,QAAS,SAAiB,CAChD3I,KAAK+0B,MAAMxE,iBAAmB,OAAA1rB,EAAA,GAAKyrB,EAAWC,kBAC9CvwB,KAAK+0B,MAAMpE,QAAU,OAAA9rB,EAAA,GAAKyrB,EAAWK,SACrC,MAAM9lB,EAAS7K,KAAKw0B,gBAAgBD,SACjC1pB,aAAM,EAANA,EAAQlQ,UACTkQ,EAAOlQ,OAAS,GAKpB,IAA+C,IAA5C,OAAAyoB,EAAA,GAAe2R,EAAMpsB,QAAS,SAAiB,CAChD,IAAIitB,GAAW,EACfb,EAAM9xB,SAASE,OAAO2E,QAAQ,CAAC5E,EAAO+M,EAAKkD,KACzC,GACiB,QAAfjQ,EAAMvF,MACoB,gCAA1BuF,EAAM4vB,WAAWC,MACS,UAA1B7vB,EAAM4vB,WAAWv1B,MAEF,UAAf2F,EAAMvF,MACqB,YAA3BuF,EAAM4vB,WAAW/wB,OACS,UAA1BmB,EAAM4vB,WAAWv1B,KAChB,CACD,MAAMs4B,EAAWvF,EAAWrtB,SAASE,OAAOC,KAAKyyB,GAAYA,EAASl4B,OAASuF,EAAMvF,MAClFk4B,IACD1iB,EAAIlD,GAAO,OAAApL,EAAA,GAAKgxB,GAChBD,GAAW,MAKdA,GACD51B,KAAKg1B,YAAY,WAAYD,EAAM9xB,UAIa,IAAjD,OAAAmgB,EAAA,GAAe2R,EAAMpsB,QAASynB,KAC/BpwB,KAAKqd,WAAa+S,EAClBpwB,KAAKod,WAAa2X,EAAMpsB,SAG1B3I,KAAKg1B,YAAY,UAAW5E,GAC5BpwB,KAAKg1B,YAAY,QAAS3E,GAI5BhtB,EAAA,EAAUJ,SAAW8xB,EAAM9xB,SAExB,KACDjD,KAAK4H,IAAI,YAAamtB,EAAO,OAAAlwB,EAAA,GAAKkwB,IAKpCj1B,QAAQg2B,QAAQ,cAChB55B,EAAQ64B,OACP9Y,MAAM/f,MApSY8D,KAAK20B,OA0SvB,WACL,YAAsB92B,IAAfmC,KAAK+0B,MAAsB/0B,KAAKy0B,iBAAmBx4B,QAAQC,QAAQ8D,KAAK+0B,OAG1E,SAASx1B,EAAaN,IEjmBhB,SAAyBS,EAAaH,EAAaN,GAChE,MAAMmH,EAAW7G,EAAI4G,MAAM,KAC3B,OAAA4vB,EAAA,GAAgBr2B,EAAQ0G,EAASlG,MAAM,GAAI,GAAGgR,KAAK,MAAM9K,EAAS+a,OAASliB,EFgmBzE+2B,CAAgBh2B,KAAK+0B,MAAOx1B,EAAKN,GACjCoE,EAAA,EAAUZ,cAAc,mBAAoB,CAAClD,MAAKN,UAElD,MAAMguB,EAAQ1tB,EAAI4G,MAAM,KAAK,GAE7BnG,KAAKg1B,YAAY/H,EAAOjtB,KAAK+0B,MAAM9H,IAG9B,YAAmC1tB,EAAQN,EAAiBg3B,GAAS,GACvEA,IACDj2B,KAAK+0B,MAAMx1B,GAAON,GAGpBe,KAAKk2B,qBAAqB32B,EAAKN,GAG1B,qBAA4CM,EAAQN,EAAkBe,KAAK+0B,MAAMx1B,IACtFS,KAAK4K,QAAQL,IAAI,CACf,CAAChL,GAAMN,IAIJ,YAAYqC,EAAgB/D,EAAqB44B,GACtD,IAAI5rB,EAAMvK,KAAKk0B,YAAYr1B,IAAIyC,GAC5BiJ,GAAOA,EAAI8b,IAAI9oB,KAIdgN,IACFA,EAAM,IAAI4U,IACVnf,KAAKk0B,YAAY3pB,IAAIjJ,EAAQiJ,IAG/BA,EAAIyH,IAAIzU,GAERyC,KAAKyC,cAAc,aAAcnB,QAEpBzD,IAAVs4B,GACDn2B,KAAKo2B,eAAe90B,EAAQ/D,IAIzB,kBAAkB+D,EAAgB/D,EAAqB84B,EAA2B/0B,GACvF,OAAOtB,KAAKs2B,YAAYh1B,EAAQ/D,EAAO,IAAM84B,EAAyB,GAGjE,kBAAkB/0B,EAAgB/D,GACvC,OAAOyC,KAAKo2B,eAAe,IAAc74B,EAAO,IAAM+D,GAGjD,aAAaA,GAClB,OAAOtB,KAAKk0B,YAAY7N,IAAI/kB,GAGvB,eAAeA,EAAgB/D,GACpC,MAAMg5B,EAAev2B,KAAKm0B,cAAct1B,IAAItB,GAC5C,GAAGg5B,GAAgBA,IAAiBj1B,GAAUtB,KAAKk0B,YAAY7N,IAAIkQ,GAAe,CAChF,MAAMhsB,EAAMvK,KAAKk0B,YAAYr1B,IAAI03B,GACjChsB,EAAIF,OAAO9M,GAEPgN,EAAIwP,OACN/Z,KAAKk0B,YAAY7pB,OAAOksB,GACxBv2B,KAAKyC,cAAc,eAAgB8zB,IAIpCj1B,EACDtB,KAAKm0B,cAAc5pB,IAAIhN,EAAM+D,GAE7BtB,KAAKm0B,cAAc9pB,OAAO9M,IAxZhB,EAAA+yB,WAAaA,EAya7B,MAAMkG,EAAkB,IAAI,EAC5B,IAAeA,gBAAkBA,EAClB,O,6BGlqBf,IAAIC,EACG,SAASC,EAAQhhB,GAClB+gB,EASFA,EAAiBx7B,KAAKya,IARtB+gB,EAAmB,CAAC/gB,GAEpBihB,sBAAsB,KACpB,MAAMC,EAAmBH,EACzBA,OAAmB54B,EACnB+4B,EAAiB9uB,QAAS+uB,GAAOA,QAlCvC,wIAyCA,IAAIC,EAqBAC,EArBgEC,GAAa,EAC1E,SAASC,EAAoBvhB,GAC9BohB,EAYME,EACRthB,IAEAohB,EAA6B77B,KAAKya,IAdlCohB,EAA+B,CAACphB,GAEhCihB,sBAAsB,KACpBK,GAAa,EACb,IAAI,IAAIv8B,EAAI,EAAGA,EAAIq8B,EAA6Bn8B,SAAUF,EACxDq8B,EAA6Br8B,KAG/Bq8B,OAA+Bj5B,EAC/Bm5B,GAAa,KAUZ,SAASE,IACd,OAAGH,IAEHA,EAAa,IAAI96B,QAAeC,GAAYw6B,EAAQ,IAAMx6B,MAC1D66B,EAAWrqB,KAAK,KACdqqB,OAAal5B,IAGRk5B,GAGF,SAASI,IACd,OAAO,IAAIl7B,QAAeC,IACxBw6B,EAAQ,KACNA,EAAQx6B,S,6BC7Ed,4SAUO,MAAMk7B,EAAS,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACxHC,EAAO,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAE1EC,EAAU,MAGVC,EAAiBxrB,IAC5B,MAAMvN,EAAI,IAAIR,KAAKA,KAAKw5B,IAAIzrB,EAAK0rB,cAAe1rB,EAAK2rB,WAAY3rB,EAAK4rB,YAChEC,EAASp5B,EAAEq5B,aAAe,EAChCr5B,EAAEs5B,WAAWt5B,EAAEu5B,aAAe,EAAIH,GAClC,MAAMI,EAAY,IAAIh6B,KAAKA,KAAKw5B,IAAIh5B,EAAEy5B,iBAAkB,EAAG,IAC3D,OAAOvQ,KAAKwQ,OAAQ15B,EAAEuG,UAAYizB,EAAUjzB,WAAauyB,EAAW,GAAK,IAGpE,SAASa,EAA8BvD,GAC5C,MAAMwD,EAAQ,IAAIp6B,KACZC,EAAMm6B,EAAMrzB,UAAY,IAAO,EAC/BoV,EAAYya,EAAK7vB,UAAY,IAAO,EAEpCgN,EAAsC,GAa5C,OAZI9T,EAAMkc,EAAamd,GAAWc,EAAMT,YAAc/C,EAAK+C,UACzD5lB,EAAQnG,KAAOmG,EAAQlG,OAAS,UACxBusB,EAAMX,gBAAkB7C,EAAK6C,eACrC1lB,EAAQsmB,KAAOtmB,EAAQumB,IAAM,UAC7BvmB,EAAQwmB,MAAQ,WACPt6B,EAAMkc,EAAwB,EAAVmd,GAAgBC,EAAca,KAAWb,EAAc3C,GACpF7iB,EAAQymB,QAAU,SAElBzmB,EAAQwmB,MAAQ,QAChBxmB,EAAQumB,IAAM,WAGT,IAAI,IAAK9mB,gBAAgB,CAC9BzF,KAAM6oB,EACN7iB,YACC9C,QAGE,SAASwpB,EAAsBte,EAAmBpI,EAErD,IACF,MAAMhG,EAAO,IAAI/N,KACX42B,EAAO,IAAI52B,KAAiB,IAAZmc,GAChBlc,EAAM8N,EAAKhH,UAAY,IAEvB2zB,EAASC,EAAW/D,GAE1B,IAAIgE,EA8BJ,OA7BI36B,EAAMkc,EAAamd,GAAWvrB,EAAK4rB,YAAc/C,EAAK+C,UACxDiB,EAAS,YAAK7mB,EAAQ8mB,WAAa,aAAe,qBACzC56B,EAAMkc,EAAwB,EAAVmd,GAAiBvrB,EAAK4rB,UAAY,IAAO/C,EAAK+C,WAC3EiB,EAAS,YAAK7mB,EAAQ8mB,WAAa,YAAc,yBAE9C9mB,EAAQ8mB,aACRD,EAAuBnxB,MAAMqxB,cAAgB,eAGhDF,EADQ7sB,EAAK0rB,gBAAkB7C,EAAK6C,cAC3B,IAAI,IAAKjmB,gBAAgB,CAChCzF,KAAM6oB,EACN7iB,QAAS,CACPwmB,MAAO,QACPD,IAAK,UACLD,KAAM,aAEPppB,QAGM,IAAI,IAAKuC,gBAAgB,CAChCzF,KAAM6oB,EACN7iB,QAAS,CACPwmB,MAAO,QACPD,IAAK,aAENrpB,QAIE,CAAC2pB,SAAQF,UAGX,SAASK,EAAmB5e,GACjC,MAAM,OAACye,EAAM,OAAEF,GAAUD,EAAsBte,EAAW,CACxD0e,YAAY,IAGRxQ,EAAW1rB,SAAS2rB,yBAE1B,OADAD,EAASrY,OAAO4oB,EAAQ,IAAK,YAAK,yBAA0B,IAAKF,GAC1DrQ,EAGF,SAASsQ,EAAW5sB,GACzB,OAAO,IAAI,IAAKyF,gBAAgB,CAC9BzF,OACAgG,QAAS,CACPnG,KAAM,UACNC,OAAQ,aAEToD,QAGL,MAAmB,IAAekpB,8BAAgCA,GAE3D,MAAMa,EAAc,CAACjtB,EAAYgG,EAKnC,MACH,MAAMmB,EAASnB,EAAQknB,cAAgB,IAAM,IACvCrE,GAAQ,IAAM7oB,EAAK0G,YAAYvS,OAAO,GAAK,KAAO,IAAM6L,EAAK2G,cAAcxS,OAAO,IAAM6R,EAAQmnB,UAAY,GAAK,KAAO,IAAMntB,EAAKotB,cAAcj5B,OAAO,IAE9J,OAAQ6R,EAAQqnB,aAAe,IAAMrtB,EAAK4rB,WAAWz3B,OAAO,GAAK6L,EAAK4rB,WACpEzkB,GAAUnB,EAAQknB,eAAiB,KAAOltB,EAAK2rB,WAAa,IAAIx3B,OAAO,GAAKk3B,EAAOrrB,EAAK2rB,aACxFxkB,EAASnH,EAAK0rB,eACb1lB,EAAQsnB,OAAS,GAAK,KAAOzE,IAO5B0E,EAAc,IAAI/U,OAAO,gBACzBgV,EAAwB,IAAIhV,OAAO,yBAA0B,KAC7DiV,EAA2B,IAAIjV,OAAO,yBAA0B,KAChEkV,EAAY,IAAIlV,OAAO,0CAA2C,KAClEmV,EAAW,IAAInV,OAAO,mEAAoE,KAC1FoV,EAAwB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAMpE,SAASC,EAAaC,EAAeC,GAC1C,MAAMngB,EAAIkgB,EAAMxzB,OAAOrC,cAEvB,GAAG2V,EAAEhf,OAAS,EACZ,OAGF,GAA0B,IAAvB,QAAQsJ,QAAQ0V,GAAU,CAC3B,MAAM5N,EAAO,IAAI/N,KACXq6B,EAAOtsB,EAAK0rB,cACZc,EAAQxsB,EAAK2rB,WACbY,EAAMvsB,EAAK4rB,UACjB5rB,EAAKguB,YAAY1B,EAAME,EAAOD,GAC9BvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMguB,EAAUjuB,EAAKhH,UACrBgH,EAAKguB,YAAY1B,EAAME,EAAOD,EAAM,GACpCvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMiuB,EAAUluB,EAAKhH,UAAY,EAMjC,YALA+0B,EAAM7+B,KAAK,CACTi/B,MAAO,QACPF,UACAC,YAKJ,GAA8B,IAA3B,YAAYh2B,QAAQ0V,GAAU,CAC/B,MAAM5N,EAAO,IAAI/N,KACXq6B,EAAOtsB,EAAK0rB,cACZc,EAAQxsB,EAAK2rB,WACbY,EAAMvsB,EAAK4rB,UACjB5rB,EAAKguB,YAAY1B,EAAME,EAAOD,GAC9BvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMguB,EAAUjuB,EAAKhH,UAAY,MACjCgH,EAAKguB,YAAY1B,EAAME,EAAOD,EAAM,GACpCvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMiuB,EAAUluB,EAAKhH,UAAY,SAMjC,YALA+0B,EAAM7+B,KAAK,CACTi/B,MAAO,YACPF,UACAC,YAKJ,MAAME,EAySR,SAAsBxgB,GACpB,MAAMpb,EAAI,IAAIP,KACd,GAAG2b,EAAEhf,QAAU,EACb,OAAQ,EAGV,IAAI,IAAIF,EAAI,EAAGA,EAAI,EAAGA,IAGpB,GAFA8D,EAAE67B,QAAQ77B,EAAEo5B,UAAY,GAEoC,IAAzD0C,EAAe97B,EAAEwG,WAAWf,cAAcC,QAAQ0V,GACnD,OAAOpb,EAAE+7B,SAGb,OAAQ,EAtTUC,CAAa5gB,GAC/B,GAAGwgB,GAAa,EAAG,CACjB,MAAMpuB,EAAO,IAAI/N,KACXC,EAAM8N,EAAKhH,UAEXy1B,EAAWL,EADEpuB,EAAKuuB,SAExBvuB,EAAKquB,QAAQruB,EAAK4rB,UAAY6C,GAC3BzuB,EAAKhH,UAAY9G,GAClB8N,EAAK0uB,QAAQ1uB,EAAKhH,UAAY,QAEhC,MAAMszB,EAAOtsB,EAAK0rB,cACZc,EAAQxsB,EAAK2rB,WACbY,EAAMvsB,EAAK4rB,UACjB5rB,EAAKguB,YAAY1B,EAAME,EAAOD,GAC9BvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMguB,EAAUjuB,EAAKhH,UACrBgH,EAAKguB,YAAY1B,EAAME,EAAOD,EAAM,GACpCvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMiuB,EAAUluB,EAAKhH,UAAY,EAMjC,YALA+0B,EAAM7+B,KAAK,CACTi/B,MAAOG,EAAeL,GACtBA,UACAC,YAKJ,IAAIz3B,EACJ,GAAqC,QAAjCA,EAAUi3B,EAAUiB,KAAK/gB,IAyB7B,GAAoC,QAAhCnX,EAAUk3B,EAASgB,KAAK/gB,IAqC5B,GAAuC,QAAnCnX,EAAU82B,EAAYoB,KAAK/gB,IAA/B,CAyCA,GAAiD,QAA7CnX,EAAU+2B,EAAsBmB,KAAK/gB,IAAc,CACrD,MAAMghB,EAAKn4B,EAAQ,GACbo4B,EAAKp4B,EAAQ,GACb+1B,EAAQb,EAASiD,GACvB,GAAGpC,GAAS,EAAG,CACb,MAAMsC,GAAKD,EACX,GAAGC,EAAI,GAAKA,GAAK,GAAI,CAGnB,YADAC,EAAkBhB,EADNe,EAAI,EACctC,GAEzB,GAAGsC,GA5MA,KA4Mc,CAGtB,YADAE,EAAmBjB,EAAOvB,EADLsC,KAO3B,GAAoD,QAAhDr4B,EAAUg3B,EAAyBkB,KAAK/gB,IAAc,CACxD,MAAMghB,EAAKn4B,EAAQ,GAEb+1B,EAAQb,EADHl1B,EAAQ,IAEnB,GAAG+1B,GAAS,EAAG,CACb,MAAMsC,GAAKF,EACX,GAAGE,EAAI,GAAKA,GAAK,GAAI,CAGnB,YADAC,EAAkBhB,EADNe,EAAI,EACctC,GAEzB,GAAIsC,GA9ND,KA8Ne,CAEvBE,EAAmBjB,EAAOvB,EADLsC,UAtE3B,CACE,IAAIG,GAAgBrhB,EACpB,MAAMshB,GAAc,IAAIj9B,MAAOy5B,cAC/B,GAAGuD,EA5JS,KA4Je,CACzBA,EA7JU,KA8JV,IAAI,IAAIvgC,EAAIwgC,EAAaxgC,GAAKugC,EAAcvgC,IAAK,CAC/C,MAAMsR,EAAO,IAAI/N,KACjB+N,EAAKguB,YAAYt/B,EAAG,EAAG,GACvBsR,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMguB,EAAUjuB,EAAKhH,UACrBgH,EAAKguB,YAAYt/B,EAAI,EAAG,EAAG,GAC3BsR,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMiuB,EAAUluB,EAAKhH,UAAY,EACjC+0B,EAAM7+B,KAAK,CACTi/B,MAAO,GAAKz/B,EACZu/B,UACAC,kBAGC,GAAGe,GAAgBC,EAAa,CACrC,MAAMlvB,EAAO,IAAI/N,KACjB+N,EAAKguB,YAAYiB,EAAc,EAAG,GAClCjvB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMguB,EAAUjuB,EAAKhH,UACrBgH,EAAKguB,YAAYiB,EAAe,EAAG,EAAG,GACtCjvB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMiuB,EAAUluB,EAAKhH,UAAY,EACjC+0B,EAAM7+B,KAAK,CACTi/B,MAAO,GAAKc,EACZhB,UACAC,iBAvEN,CACE,MAAMU,EAAKn4B,EAAQ,GACbo4B,EAAKp4B,EAAQ,GACb04B,EAAK14B,EAAQ,GACnB,IAAIA,EAAQ,KAAOA,EAAQ,GACzB,OAGF,MAAM81B,EAAM7J,SAASkM,GACfpC,EAAQ9J,SAASmM,GAAM,EAC7B,IAAIvC,EAAO5J,SAASyM,GACjB7C,GAAQ,IAAMA,GAAQ,KACvBA,GAAQ,KAGV,MAAM4C,GAAc,IAAIj9B,MAAOy5B,cAC/B,GAAG0D,EAAkB7C,EAAM,EAAGC,IAAUF,GApI5B,MAoI+CA,GAAQ4C,EAAa,CAC9E,MAAMlvB,EAAO,IAAI/N,KACjB+N,EAAKguB,YAAY1B,EAAME,EAAOD,GAC9BvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMguB,EAAUjuB,EAAKhH,UACrBgH,EAAKguB,YAAY1B,EAAME,EAAOD,EAAM,GACpCvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMiuB,EAAUluB,EAAKhH,UAAY,EAMjC,YALA+0B,EAAM7+B,KAAK,CACTi/B,MAAOkB,EAAiBpB,GACxBA,UACAC,iBAtDN,CACE,MAAMU,EAAKn4B,EAAQ,GACbo4B,EAAKp4B,EAAQ,GACbq4B,EAAIpM,SAASkM,GACbU,EAAK5M,SAASmM,GACpB,GAAGC,EAAI,GAAKA,GAAK,GAAI,CACnB,GAAGQ,GAjGO,MAiGUR,GAAK,GAAI,CAI3B,YADAE,EAAmBjB,EADLe,EAAI,EADGQ,GAIhB,GAAIA,GAAM,GAAI,CAGnBP,EAAkBhB,EAFNe,EAAI,EACFQ,EAAK,SAGhB,GAAIR,GA3GC,MA2GeQ,GAAM,GAAI,CAGnCN,EAAmBjB,EADLuB,EAAK,EADER,KA0H3B,SAASE,EAAmBjB,EAAmBvB,EAAeyC,GAC5D,MAAMC,GAAc,IAAIj9B,MAAOy5B,cACzBW,EAAQp6B,KAAKC,MACnB,GAAG+8B,GAzOW,MAyOgBA,GAAgBC,EAAa,CACzD,MAAMlvB,EAAO,IAAI/N,KACjB+N,EAAKguB,YAAYiB,EAAczC,EAAO,GACtCxsB,EAAKC,SAAS,EAAG,EAAG,GACpB,MAAMguB,EAAUjuB,EAAKhH,UACrB,GAAGi1B,EAAU5B,EACX,OAEFrsB,EAAKuvB,SAASvvB,EAAK2rB,WAAa,GAChC,MAAMuC,EAAUluB,EAAKhH,UAAY,EAEjC+0B,EAAM7+B,KAAK,CACTi/B,MAAOqB,EAAmBvB,GAC1BA,UACAC,aAKN,SAASa,EAAkBhB,EAAmBxB,EAAaC,GACzD,GAAG4C,EAAkB7C,EAAKC,GAAQ,CAChC,MAAM0C,GAAc,IAAIj9B,MAAOy5B,cACzBW,EAAQp6B,KAAKC,MAEnB,IAAI,IAAIxD,EAAIwgC,EAAaxgC,GAjQb,KAiQ2BA,IAAK,CAC1C,GAAa,IAAV89B,GAAuB,KAARD,MA8DJD,EA9D8B59B,GA+DhC,GAAM,GAAO49B,EAAO,KAAQ,IAAQA,EAAO,KAAQ,GA9D7D,SAGF,MAAMtsB,EAAO,IAAI/N,KACjB+N,EAAKguB,YAAYt/B,EAAG89B,EAAOD,EAAM,GACjCvsB,EAAKC,SAAS,EAAG,EAAG,GAEpB,MAAMguB,EAAUjuB,EAAKhH,UACrB,GAAGi1B,EAAU5B,EACX,SAGFrsB,EAAKguB,YAAYt/B,EAAG89B,EAAOD,EAAM,GACjCvsB,EAAKC,SAAS,EAAG,EAAG,GACpB,MAAMiuB,EAAUluB,EAAKhH,UAAY,EAC9BtK,IAAMwgC,EACPnB,EAAM7+B,KAAK,CACTi/B,MAAOsB,EAAkBxB,GACzBA,UACAC,YAGFH,EAAM7+B,KAAK,CACTi/B,MAAOkB,EAAiBpB,GACxBA,UACAC,aAoCV,IAAoB5B,EA7BpB,SAASkD,EAAmBphB,GAC1B,MAAMpO,EAAO,IAAI/N,KAAKmc,GACtB,OAAOid,EAAOrrB,EAAK2rB,YAAYx3B,MAAM,EAAG,GAAK,IAAM6L,EAAK0rB,cAG1D,SAAS+D,EAAkBrhB,GACzB,MAAMpO,EAAO,IAAI/N,KAAKmc,GACtB,OAAOid,EAAOrrB,EAAK2rB,YAAYx3B,MAAM,EAAG,GAAK,IAAM6L,EAAK4rB,UAG1D,SAASyD,EAAiBjhB,GACxB,MAAMpO,EAAO,IAAI/N,KAAKmc,GACtB,OAAQ,IAAMpO,EAAK4rB,WAAWz3B,OAAO,GAAK,KAAO,KAAO6L,EAAK2rB,WAAa,IAAIx3B,OAAO,GAAK,IAAM6L,EAAK0rB,cAGvG,SAAS4C,EAAelgB,GACtB,MAAMpO,EAAO,IAAI/N,KAAKmc,GACtB,OAAOkd,EAAKtrB,EAAKuuB,UAGnB,SAASa,EAAkB7C,EAAaC,GACtC,OAAGA,GAAS,GAAKA,EAAQ,IACpBD,GAAO,GAAKA,EAAMqB,EAAsBpB,GAW/C,SAASb,EAAS/d,GAwBhBA,EAAIA,EAAE3V,cACN,IAAI,IAAIvJ,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAE1B,GAAwB,IADV28B,EAAO38B,GAAGuJ,cACfC,QAAQ0V,GACf,OAAOlf,EAGX,OAAQ,EAmBV,IAAem/B,aAAeA,G,6BClff,SAAS6B,IACtB,SAAG9+B,SAASkzB,gBAAkBlzB,SAASkzB,cAAmCC,QACvEnzB,SAASkzB,cAAmCC,QACtC,GATX,mC,6BCAe,SAAS4L,EAAiBlZ,EAAiBpI,GACxD,MAAMyD,EAAQ2E,EAAMnB,UAAUjH,GAC9B,OAAkB,IAAXyD,EAAe2E,EAAM+E,OAAO1J,EAAO,GAAG,QAAKhgB,EAFpD,mC,6BCAe,SAASmhB,KAAxB,mC,6BCAe,SAAS3M,EAAUspB,EAAQxM,GACxC,MAAMyM,EAAKhhC,OAAOwP,KAAMyxB,SAAYF,EACpC,OAAOA,GAAKxM,GAAY,WAAP0M,GAAmBA,WADe1M,EAEjDyM,EAAGD,GAAGhhC,SAAWihC,EAAGzM,GAAGx0B,QACrBihC,EAAGD,GAAGG,MAAMv8B,GAAO8S,EAAUspB,EAAEp8B,GAAM4vB,EAAE5vB,KACtCo8B,IAAMxM,EALb,mC,6BCAA,8CAQA,MAAM4M,EAAQ,CAAC,IAAK,KAGdxyB,EAIF,GAEEyyB,EAAsC,CAC1C9rB,KAAM,SACN+rB,MAAO,QACPC,UAAW,eAGE,SAASC,EAAUC,EAAiD,CACjFlsB,KAAM6rB,EACNE,WAAOp+B,EACPq+B,UAAWH,IAEX,KAAK,UAAWp/B,UACd,OAAOV,QAAQC,UAGjB,MAAMJ,EAA2B,GACjC,IAAI,MAAMyB,KAAQ6+B,EAAO,CACvB,IAAIC,EAASD,EAAM7+B,GACL,QAAX8+B,IACDA,EAASN,GAGX,MAAMO,EAAON,EAAMz+B,GACbg/B,EAAmB,UAATh/B,EAAmB,CAAC,KAAO,CAAC,IAAK,KACjD,IAAI,MAAMi/B,KAAUD,EAAS,CAC3B,MAAME,GAAaJ,GAAU,MAACx+B,IAAYqH,IAAIgL,I,YAC5C,MAAM3Q,EAAM,CAACi9B,EAAQ,OAAQF,GAAMprB,KAAK,KAExC,OAD8C,QAA7B,GAAJ,EAAa,QAAV,EAAC3H,EAAMhK,UAAG,QAATgK,EAAMhK,GAAS,IAAG,EAAC2Q,GAAQ,WAAE,aAAMvT,SAASq/B,MAAMU,KAAKn9B,EAAK2Q,KAG/EpU,EAASb,QAAQwhC,IAIrB,OAAOxgC,QAAQia,KAAK,CAClBja,QAAQoC,IAAIvC,GACZ,YAAM,S,6BCrDK,SAAS6gC,EAAMC,GAC5B,MAAM19B,EAAIlB,KAAKC,MACf,OAAO2+B,EAAU19B,EAAI,IAAO,EAAIA,EAFlC,mC,6BCEA,4GAAM29B,EAAY,IAAI1d,IAAI,CACxB,MACA,MACA,SAGI2d,EAAS,IAAI3d,IAEZ,SAAS4d,EAAqBC,GAEnC,OAAOA,EAAQ55B,KAAK65B,GAAUJ,EAAUxW,IAAI4W,EAAO54B,YAAcy4B,EAAOzW,IAAI4W,EAAOA,SAG9E,SAASC,EAAaF,GAC3B,QAASD,EAAqBC,GAGzB,SAASG,EAAyBH,GACvCF,EAAOtyB,QACPwyB,EAAQl1B,QAAQm1B,IACdH,EAAO9qB,IAAIirB,O,6BCtBA,SAASlH,EAAgBr2B,EAAaH,GACnD,MAAM6G,EAAW7G,EAAI4G,MAAM,KAC3B,IAAIzH,EAASgB,EAUb,OATA0G,EAAS0B,QAAQvI,IACXA,IAKJb,EAAIA,EAAEa,MAGDb,EAZT,mC,6BCAA,MAAM0+B,EAAoBzgC,SAASC,cAAc,UAAUygC,UAAU,cAAcC,WAAW,mBAE/E,O,6BCWA,SAAS9e,EAA6C+e,EAAyBC,EAAmB,IAK/G,IAAIlf,EAJAtZ,MAAMC,QAAQs4B,KAChBA,EAAY,CAACA,IAIf,MAAME,ECPO,SAA0BD,GACvC,OAeyB,IAftB,CACD,aACA,YACA,YACA,gBACA,aACA,YACA,YACA,aACA,kBACA,YACA,aACA,YACA,mBACA,mBACAv5B,QAAQu5B,GACD,2BAGFA,EDbcE,CAAiBF,GACtC,IACElf,EAAO,IAAIC,KAAKgf,EAAW,CAAChgC,KAAMkgC,IAClC,MAAM5hC,GAEN,IAAI8hC,EAAK,IAAIC,YACbL,EAAUz1B,QAAS+1B,IACjBF,EAAG3tB,OAAO6tB,KAEZvf,EAAOqf,EAAGG,QAAQL,GAEpB,OAAOnf,E,gEE9BT,oGAiBO,MAAMyf,EAAb,cACU,KAAAC,SAA2B,IAAM75B,OAAoD,IAA5C,IAAI8E,QAAQhF,QAAQmF,SAASC,UAEvE,cAAc40B,GACnB,IAAGj+B,KAAKg+B,SAIR,OAAO,IAAen/B,IAAI,aAAa6N,KAAMwxB,IAC3C,MAAMC,EAAK,aAAM,GACjB,GAAGF,GACDC,GACAA,EAASD,cAAgBA,GACxBC,EAASC,GAAK,MAASA,EACxB,OAGF,IAAe5zB,IAAI,CACjB6zB,UAAW,CACTH,cACAE,QAIJ,MAAMjS,EAAO,oBAAoB+R,EAAc,IAAM,eAAe7T,mBAAmB,IAAIzhB,QAAU,IAAM,IAAIW,UAMzGxN,EALO,CACX,iBAAmBowB,EACnB,UAAYA,GAGQhnB,IAAIiL,IACxB,MAAM7T,EAASK,SAASC,cAAc,UAChCZ,EAAU,IAAIC,QAAeC,IACjCI,EAAOa,OAASb,EAAOY,QAAU,KAC/BZ,EAAO+hC,SACPniC,OAKJ,OAFAI,EAAOE,IAAM2T,EACbxT,SAAS4E,KAAKnD,YAAY9B,GACnBN,IAGT,OAAOC,QAAQoC,IAAIvC,MAKzB,MAAMqa,EAAuB,IAAI4nB,EACjC,MAAmB,IAAe5nB,qBAAuBA,GAC1C,a,6BCnEf,qDAGe,SAASuf,EAAmB4I,EAAiBC,EAAoBC,EAAmCC,GACjH,IAAI,MAAMl/B,KAAO++B,SACLC,EAAch/B,WAAiB++B,EAAW/+B,IAClDg/B,EAAch/B,GAAO,YAAK++B,EAAW/+B,IACrCi/B,GAAaA,EAAUC,GAAel/B,IAC9B,YAAS++B,EAAW/+B,KAC5Bm2B,EAAmB4I,EAAW/+B,GAAMg/B,EAAch/B,GAAMi/B,EAAWC,GAAel/B,K,6BCTxF,+CAiJA,MAAMsW,EAAiB,IArHhB,MAAP,cAOU,KAAAjO,IAAM,YAAO,YA4Bd,KAAA82B,cAAgB,KAClB1+B,KAAK2+B,iBAAmB3+B,KAAKS,cAC9BT,KAAK4H,IAAIwQ,KAAK,yBACd,IAAe/N,OAAO,iBAYnB,KAAAu0B,mBAAqB,KAC1B,GAAG5+B,KAAK2+B,gBAAkB3+B,KAAKS,YAC7B,OAAO,EAGTT,KAAK4H,IAAI,cACT5H,KAAK6+B,kBAAoB,EACzB7+B,KAAKS,aAAc,EACnBT,KAAK0+B,gBAKL,IAAUn+B,KAAKE,aAAc,EAC7B,IAAUgC,cAAc,yBAGnB,KAAAq8B,cAAgB,CAACv+B,EAAO,IAAUA,MAAQ,IAAUA,KAAKC,UAC9D,GAAGR,KAAKS,YACN,OAAO,EAGT,MAAMm0B,EAAO52B,KAAKC,MACZ8gC,EAA2B,CAC/Br9B,GAAI1B,KAAKg/B,WACTz+B,OACAq0B,QAGF,IAAe/1B,IAAI,eAAe,GAAO6N,KAAMuyB,KAEzC1+B,IACC0+B,GACDA,EAAYv9B,KAAO1B,KAAKg/B,YACxBC,EAAYrK,KAAQA,EAtFE,KAuFxB,IAAerqB,IAAI,CAAC20B,YAAaH,IAE7B/+B,KAAK2+B,iBACP,IAAWQ,WACPn/B,KAAKo/B,QAGPp/B,KAAK4H,IAAIwQ,KAAK,sBAAuB2mB,GAFrC/+B,KAAKo/B,SAAU,EAKjBp/B,KAAK2+B,gBAAiB,GAGrB3+B,KAAK6+B,oBACNzhC,aAAa4C,KAAK6+B,mBAClB7+B,KAAK6+B,kBAAoB,IAGxB7+B,KAAK2+B,iBACN,IAAWU,UACXr/B,KAAK4H,IAAIwQ,KAAK,oBAAqB2mB,GAC/B/+B,KAAK6+B,oBACP7+B,KAAK6+B,kBAAoBz8B,OAAOtE,WAAWkC,KAAK4+B,mBA9GjC,MAiHjB5+B,KAAK2+B,gBAAiB,MArGvB,QACL,IAAI3+B,KAAKs/B,QAAmE,CAC1Et/B,KAAKs/B,SAAU,EAEft/B,KAAKu/B,QAGL,IAAUl+B,iBAAiB,OAAQrB,KAAK8+B,eACxC7b,YAAYjjB,KAAK8+B,cArBS,KAsB1B9+B,KAAK8+B,gBAEL,IACEniC,SAASkG,gBAAgBxB,iBAAiB,eAAgBrB,KAAK0+B,eAC/D,MAAM7iC,MAIL,QACLmE,KAAKg/B,WAAa,YAAe,IACjCh/B,KAAK2+B,gBAAiB,EACnB3+B,KAAK6+B,mBAAmBzhC,aAAa4C,KAAK6+B,mBAC7C7+B,KAAK6+B,kBAAoB,EACzB7+B,KAAKS,aAAc,EACnBT,KAAKo/B,SAAU,EAUV,mBACFp/B,KAAKS,cACNT,KAAKu/B,QACLv/B,KAAK8+B,eAAc,GACnB,IAAUr8B,cAAc,yBAwE9B,MAAmB,IAAeoT,eAAiBA,GACpC,O,6BCnJf,sHA8BO,MAAM2pB,EAWX,cAVO,KAAAC,aAAc,EACb,KAAAC,eAAgB,EAChB,KAAAC,6BAA8B,EAC9B,KAAAL,SAAU,EACV,KAAAr8B,SAAsD,GAEtD,KAAA28B,UAAYj8B,UAAUC,UAAUI,cAAcC,QAAQ,YAAc,EACpE,KAAA47B,iBAAkB7/B,KAAK4/B,UACvB,KAAAh4B,IAAM,YAAO,MA2Cd,KAAAk4B,UAAY,KACb9/B,KAAKy/B,aAIT97B,UAAUiU,cAAcmoB,MAAMrzB,KAAMszB,IAClCA,EAAIC,YAAYH,UAAU,CAACD,gBAAiB7/B,KAAK6/B,kBAAkBnzB,KAAMwzB,IAEvElgC,KAAK0/B,eAAgB,EACrB1/B,KAAKmgC,uBAAuB,YAAaD,KACxCjkB,MAAOpgB,IACuB,WAA5BukC,aAAaC,WACdrgC,KAAK4H,IAAI,4CAET5H,KAAK4H,IAAI,+BAAgC/L,GACrCmE,KAAK6/B,kBACP7/B,KAAK6/B,iBAAkB,EACvB/hC,WAAWkC,KAAK8/B,UAAW,UAyD9B,KAAAQ,cAAgB,KACrB,IAAItgC,KAAKy/B,aAAe,IAAUl/B,MAAQ,IAAUA,KAAKE,YACvD,OAGFT,KAAKiD,SAASs9B,SAAWn3B,SAASoH,MAAQ,IAAId,QAAQ,OAAQ,IAAM,OAEpE,MAAM/C,EAAiD,GACjD6zB,EAAwF,CAC5FC,mBAAoB,IAAY,wCAA0C,iCAC1EC,qBAAsB,IAAY,0CAA4C,mCAC9EC,uBAAwB,sCAG1B,IAAI,MAAMC,KAAUJ,EAClB7zB,EAAKi0B,GAA2C,IAAK10B,OAAOs0B,EAAiBI,IAA0C,GAGzH,MAAM91B,EAA8B,CAClCvN,KAAM,OACNwN,QAAS,CACP81B,mBAAoB7gC,KAAK2/B,4BACzBhzB,KAAMA,EACN1J,SAAUjD,KAAKiD,WAInB,IAAWyV,cAAc5N,GAEzB9K,KAAK8gC,UAAYhjC,WAAWkC,KAAKsgC,cAAe,MA/I3C,gBAAiBl+B,QAClB,iBAAkBA,QAClB,kBAAmBuB,YACrB3D,KAAK4H,IAAIwQ,KAAK,oCACdpY,KAAKy/B,aAAc,EACnBz/B,KAAK2/B,6BAA8B,GAGlC3/B,KAAKy/B,aAA2C,WAA5BW,aAAaC,YAClCrgC,KAAK4H,IAAIwQ,KAAK,uCAIX,QACDpY,KAAKs/B,UACPt/B,KAAKs/B,SAAU,EACft/B,KAAK+gC,kBACL/gC,KAAKghC,6BAIF,gCACLhhC,KAAK2/B,6BAA8B,EAG9B,kBACD3/B,KAAKy/B,aAIT97B,UAAUiU,cAAcmoB,MAAMrzB,KAAMszB,IAClCA,EAAIC,YAAYc,kBAAkBr0B,KAAMwzB,IACtClgC,KAAK0/B,gBAAkBQ,EACvBlgC,KAAKmgC,uBAAuB,OAAQD,KACnCjkB,MAAOpc,IACRG,KAAK4H,IAAIxL,MAAM,iCAAkCyD,OA6BhD,cACDG,KAAKy/B,aAIT97B,UAAUiU,cAAcmoB,MAAMrzB,KAAMszB,IAClCA,EAAIC,YAAYc,kBAAkBr0B,KAAMwzB,IACtClgC,KAAK0/B,eAAgB,EAElBQ,IACDlgC,KAAKmgC,uBAAuB,cAAeD,GAE3CpiC,WAAW,KACToiC,EAAae,cAAcv0B,KAAMw0B,IAC/BlhC,KAAK0/B,eAAgB,IACpBzjB,MAAOpgB,IACRmE,KAAK4H,IAAIxL,MAAM,yBAA0BP,MAE1C,QAEJogB,MAAOpgB,IACRmE,KAAK4H,IAAIxL,MAAM,wDACMP,OAKpB,mBACDmE,KAAKy/B,aAIT97B,UAAUiU,cAAcmoB,MAAMrzB,KAAMszB,IAClCA,EAAIC,YAAYc,kBAAkBr0B,KAAMwzB,IACtClgC,KAAK4H,IAAIwQ,KAAK,oBAAqB8nB,GAChCA,GACDA,EAAae,cAAcv0B,KAAMw0B,IAC/BlhC,KAAK4H,IAAIwQ,KAAK,+BAAgC8oB,GAC9ClhC,KAAK0/B,eAAgB,IACpBzjB,MAAOpgB,IACRmE,KAAK4H,IAAIxL,MAAM,yBAA0BP,OAG5CogB,MAAOpgB,IACRmE,KAAK4H,IAAIxL,MAAM,wDACMP,OAqCpB,YAAYslC,GACjBnhC,KAAKiD,SAAW,YAAKk+B,GACrB/jC,aAAa4C,KAAK8gC,WAClB9gC,KAAKsgC,gBAGA,wBACL,IAAItgC,KAAKy/B,YACP,OAIF,IAAW/mB,cADuC,CAACnb,KAAM,wBAIpD,4BACDyC,KAAKy/B,cAIT,IAAWlnB,6BAA6B,aAAezN,IAClD,IAAUvK,MAAQ,IAAUA,KAAKE,YAClC,IAAkBkW,SAIpB,IAAUlU,cAAc,0BAA2BqI,EAAKC,WAG1DpH,UAAUiU,cAAcmoB,MAAMrzB,KAAK1M,KAAKsgC,gBAGnC,uBAAuBrjC,EAAmCijC,GAC/D,GAAGA,EAAc,CACf,MAAMkB,EAAwClB,EAAamB,SAC3D,KAAID,GACDA,EAAgBE,UAChBF,EAAgBh3B,MAChBg3B,EAAgBh3B,KAAKm3B,QACrBH,EAAgBh3B,KAAK6qB,MAKtB,OAJAj1B,KAAK4H,IAAIwQ,KAAK,4BAA6BgpB,GAC3CphC,KAAKihC,cACLjhC,KAAKy/B,aAAc,OACnBz/B,KAAKmgC,uBAAuBljC,GAI9B+C,KAAK4H,IAAIwQ,KAAK,OAAQnb,EAAOmkC,GAC7B,IAAU3+B,cAAe,QAAUxF,EAAuC,CACxEukC,UAAW,GACXC,WAAY73B,KAAKI,UAAUo3B,UAG7BphC,KAAK4H,IAAIwQ,KAAK,OAAQnb,GAAO,GAC7B,IAAUwF,cAAe,QAAUxF,GAAuC,IAKhF,MAAMqZ,EAAoB,IAAIkpB,EAC9B,MAAmB,IAAelpB,kBAAoBA,GACvC,a,6BCzPA,SAASorB,KAAiB75B,GACvC,MAAMlN,EAASkN,EAAKQ,OAAO,CAACC,EAAKC,IAAMD,GAAQC,EAAkB0L,YAAe1L,EAAiB5N,QAAS,GAEpGgnC,EAAM,IAAI1f,WAAWtnB,GAE3B,IAAIinC,EAAa,EAMjB,OALA/5B,EAAKC,QAAQkgB,IACX2Z,EAAIp3B,IAAIyd,aAAa6Z,YAAc,IAAI5f,WAAW+F,GAAKA,EAAG4Z,GAC1DA,GAAe5Z,EAAkB/T,YAAe+T,EAAiBrtB,SAG5DgnC,EAXT,mC,6BCAe,SAASpuB,IACtB,OAAO,IAAIC,OAAO,IAA0B,qD,0BC+D9C,MAAMoD,EAAuB,IA7CtB,MAAP,cAEU,KAAAkrB,gBAAwE,GAExE,OACN9hC,KAAK2X,OAAS,IAAI,EAClB3X,KAAK2X,OAAOtW,iBAAiB,UAAYxF,IACvC,MAAMkP,EAAWlP,EAAEzB,KAAyB2Q,QAE5C,GAAyC,IAAtCA,EAAQ6P,SAAS3W,QAAQ,SAAgB,CAC1C,MAAMjI,EAAUgE,KAAK8hC,gBAAgB/2B,EAAQ6P,UAC1C5e,IACD+O,EAAQg3B,MAAQ/lC,EAAQE,QAAQ6O,EAAQg3B,OAAS/lC,EAAQG,gBAClD6D,KAAK8hC,gBAAgB/2B,EAAQ6P,gBAGtC,IAAgB/D,YAAYhb,EAAEzB,QAK7B,YAAYA,GACd4F,KAAKgiC,OACNhiC,KAAKgiC,OACLhiC,KAAKgiC,KAAO,MAGdhiC,KAAK2X,OAAOd,YAAYzc,GAGnB,QAAQwgB,EAAkBmnB,GAG/B,GAFAnnB,EAAW,QAAUA,EAElB5a,KAAK8hC,gBAAgBhnC,eAAe8f,GACrC,OAAO5a,KAAK8hC,gBAAgBlnB,GAG9B,MAAMqnB,EAAiB,cAIvB,OAFAjiC,KAAK6W,YAAY,CAACtZ,KAAM,cAAewN,QAAS,CAAC6P,WAAUmnB,WAEpD/hC,KAAK8hC,gBAAgBlnB,GAAYqnB,IAK5C,IAAerrB,qBAAuBA,EACvB,O,wJC5DA,SAASsrB,IAEtB,MASMC,EAAc,IAAIC,MAAM5uB,OATR,CACpB6uB,UAAS,CAAC5kC,EAAaoK,IAId,IAAIpK,EAFCoK,EAAK,GAAKuB,SAAStF,UAOnC0P,OAAS2uB,EAGXD,I,kCCfAxU,OAAO7yB,UAAUwsB,SAAW,WAC1B,QAASrnB,MAAMqnB,YAGjBqG,OAAO7yB,UAAUynC,SAAW,WAC1B,QAAStiC,MAAMsiC,YAGjB5U,OAAO7yB,UAAU2f,SAAW,SAAS+nB,GACnC,QAASviC,MAAMwa,SAAS+nB,IAG1B7U,OAAO7yB,UAAU2nC,SAAW,WAC1B,MAAO,SAASr+B,KAAKnE,KAAKguB,aAG5ByU,OAAO5nC,UAAUwsB,SAAW,WAC1B,OAAOrnB,MAGTyiC,OAAO5nC,UAAUynC,SAAW,WAC1B,OAAO5a,KAAKgb,IAAI1iC,OAGlByiC,OAAO5nC,UAAU2f,SAAW,SAAS+nB,GACnC,YAAkB1kC,IAAX0kC,EAAuBviC,KAAkBuiC,GAAU7a,KAAKgb,IAAI1iC,MAAkBA,MAGvFyiC,OAAO5nC,UAAU2nC,SAAW,WAC1B,OAAO,G,YC3BTvgB,WAAWpnB,UAAUqT,OAAS,YAAYrG,GACxC,OAAO,OAAA65B,EAAA,GAAc1hC,QAAS6H,IAOhCoa,WAAWpnB,UAAUwmC,OAAS,WAC5B,MAAO,IAAIrhC,OAIb/D,QAAQpB,UAAUwW,QAAUpV,QAAQpB,UAAUwW,SAAW,SAA8BuR,GACrF,MAAM+f,EAAajtB,GAAwBzZ,QAAQC,QAAQ0mB,KAAMlW,KAAKgJ,GACtE,OAAO1V,KAAK0M,KACV7B,GAAU83B,EAAU,IAAM93B,GAC1BoyB,GAAU0F,EAAU,IAAM1mC,QAAQE,OAAO8gC,M,0SCA7CtgC,SAAS0E,iBAAiB,mBAAoB,IAAW,OAAD,6BCxBlDuhC,QAAQ/nC,UAAUgoC,kBACpBD,QAAQ/nC,UAAUgoC,gBAAkB,SAASllC,EAAMmlC,GAGjD,YAFa,IAAVA,IAAkBA,IAAUA,GAE5B9iC,KAAK+iC,aAAaplC,KAChBmlC,IAEH9iC,KAAKgjC,gBAAgBrlC,IACd,IAEI,IAAVmlC,IAEH9iC,KAAKhD,aAAaW,EAAM,KACjB,KDeX,MAAMslC,EAAI7gC,OAAO8gC,gBAAkB9gC,OACnC,IACI+gC,EADAC,GAAgB,EAEpB,MAAMC,EAAQ,KACZ,MAAMC,EAAsI,KAAhIF,IAAkB//B,EAAA,EAAUN,gBAAmBkgC,EAAqBM,QAAWN,EAAaO,YAAcphC,OAAOohC,aAC1HL,IAAWG,IAEJ,KAAsBH,EAASG,GAAOA,EAAKH,EAAU,GAC7D,OAAA1H,EAAA,KAGF0H,EAASG,EAGT3mC,SAASkG,gBAAgB4E,MAAMg8B,YAAY,OAAWH,EAAH,QAkCrD,GAHAlhC,OAAOf,iBAAiB,SAAUgiC,GAClCA,IAEG,IAAwB,CACzB,MAAMK,EAAmB,KACvBN,EAA0B,IAAVO,GAAe,MAA2BtgC,EAAA,EAAUN,gBACpEsgC,IAEGJ,IAAM7gC,SACJghC,GACDhhC,OAAOkS,oBAAoB,SAAU+uB,GACrCJ,EAAE5hC,iBAAiB,SAAUgiC,KAE7BJ,EAAE3uB,oBAAoB,SAAU+uB,GAChCjhC,OAAOf,iBAAiB,SAAUgiC,MAKxC,IAAIM,EACJtgC,EAAA,EAAUhC,iBAAiB,gBAAkBK,IAC3C,MAAMkiC,OAAqB/lC,IAAV8lC,EACjBA,EAAQjiC,GAELkiC,GAAsB,IAAVD,IACbD,MAIJrgC,EAAA,EAAUhC,iBAAiB,iBAAkB,KAC3CqiC,MAID,MAAe,KAChB/mC,SAAS0E,iBAAiB,YAAcxF,IACtC,MAAM4B,EAAS5B,EAAE4B,OACjB,GAAsB,QAAnBA,EAAOomC,SAAqBpmC,EAAO+D,UAAUic,SAAS,SAEvD,OADA,OAAAmG,EAAA,GAAY/nB,IACL,IAMbc,SAAS0E,iBAAiB,YAAcxF,I,MACtC,GAA0C,SAAd,QAAzB,EAACA,EAAE4B,cAAsB,eAAEomC,SAE5B,OADAhoC,EAAEkoB,kBACK,IAKXpnB,SAAS0E,iBAAiB,cAAgBxF,IACC,QAArCA,EAAE4B,OAAuBomC,SAAuBzhC,OAAe0hC,gBACjE,OAAAlgB,EAAA,GAAY/nB,KAIb,KACDc,SAASkG,gBAAgBrB,UAAUwQ,IAAI,aAAc,eAGpD,KACDrV,SAASkG,gBAAgBrB,UAAUwQ,IAAI,aAGtC,KACE,KACDrV,SAASkG,gBAAgBrB,UAAUwQ,IAAI,aAKtC,IACDrV,SAASkG,gBAAgBrB,UAAUwQ,IAAI,UAEvCrV,SAASkG,gBAAgBrB,UAAUwQ,IAAI,WAEjC,KACRrV,SAASkG,gBAAgBrB,UAAUwQ,IAAI,cAYrC,IAGFrV,SAASkG,gBAAgBrB,UAAUwQ,IAAI,YAFvCrV,SAASkG,gBAAgBrB,UAAUwQ,IAAI,YAWzC,IAAI0M,EAAOC,YAAY1gB,MAEvB,MAAM8lC,EAAc,IAAK3yB,oBAElB2jB,EAAOhsB,SAAkB9M,QAAQoC,IAAI,CAC1Cm4B,EAAA,EAAgBwN,WAChBD,IAaF,SAASE,EAAqBC,EAAmBloC,GAC/CkoC,EAAKz8B,MAAM08B,QAAU,IAErBnoC,EAAQ0Q,KAAK,KACXtK,OAAOu0B,sBAAsB,KAC3BuN,EAAKz8B,MAAM08B,QAAU,OAhB3B,IAAK7yB,cAAcyjB,EAAM9xB,SAASwI,YAElCpI,EAAA,EAAU+gC,mBAEPr7B,EAASqF,aAAe,IAAItF,iBAC7B,IAAK+E,YAAY9E,EAASqE,WAgB5BtN,QAAQ8H,IAAI,mBAAoB+W,YAAY1gB,MAAQygB,GAEpD,MAAMuS,EAAY8D,EAAM9D,UACxB,GAAmB,sBAAhBA,EAAU/jB,EAA4C,CACvDpN,QAAQ8H,IAAI,wBAAyBqpB,EAAU/jB,EAAGlP,KAAKC,MAAQ,KAE/D,MAAMkH,EAAKxI,SAAS0nC,eAAe,cACnC,IAAInV,EA6BAoV,EA5BJ,GAAGn/B,EAAI,CACL+pB,EAAa/pB,EAAGrD,cAAc,eACzB,MAAsB,KACzBotB,EAAW1tB,UAAUwQ,IAAI,gBAI3Bkd,EAAWznB,MAAM08B,QAAU,IAE3B,MAAMI,EAAc5nC,SAASC,cAAc,OAC3C2nC,EAAY/iC,UAAUwQ,IAAI,oBAE1Bkd,EAAWsV,QAAQD,GACnBrV,EAAWlf,OAAOu0B,EAAYE,aAGhC,UACQxoC,QAAQoC,IAAI,CAChB,wCACA,0CACCqO,KAAK,EAAEg4B,EAAUC,MAClBD,EAAS13B,QAAQoJ,eAAc,GAC/BuuB,EAAW33B,QAAQuJ,qBAErB,MAAM1W,IAMN,OAAOoxB,EAAU/jB,GACf,IAAK,kBACHo3B,SAAqB,2EAA8Bt3B,QAAQ43B,QAC3D,MACF,IAAK,kBACHN,SAAqB,6DAA8Bt3B,QAAQ43B,QAC3D,MACF,IAAK,oBACHN,SAAqB,2EAAgCt3B,QAAQ43B,MAAM3T,EAAU4T,UAC7E,MACF,IAAK,oBACHP,SAAqB,6DAAgCt3B,QAAQ43B,QAC7D,MACF,IAAK,kBACHN,SAAqB,2EAA8Bt3B,QAAQ43B,MAAM3T,EAAU6T,UAKjF,GAAG5V,EAAY,CAEVoV,UACKA,GASRL,EAAqB/U,EANL,UAAWvyB,SACzBV,QAAQia,KAAK,CACX,OAAAG,EAAA,GAAM,KACN1Z,SAASq/B,MAAM+D,QAEjB9jC,QAAQC,iBA+BZ4D,QAAQ8H,IAAI,sBAAuB5J,KAAKC,MAAQ,KAChDgmC,EAAqBtnC,SAAS0nC,eAAe,gBAAiB,OAAAlI,EAAA,aACvD,sDAA0BnvB,QAAQ43B","file":"main.8fe17e02354fa08e65e4.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t9: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"10\":\"npm.qr-code-styling\"}[chunkId]||chunkId) + \".\" + {\"0\":\"61ba1feb637ecd90f834\",\"1\":\"7e25e358e50296502415\",\"2\":\"68e2ce68d7ded3346526\",\"3\":\"fd4a457d3edbe045f3c5\",\"4\":\"f9a995960e4699c2de34\",\"5\":\"eeac423212e8b7acbb73\",\"6\":\"3fcd156db2ca66c7e6d0\",\"7\":\"5f548bb1b833747ed1cb\",\"8\":\"f44261a125fd436f2604\",\"10\":\"8a5c1af00a34aad13da9\",\"11\":\"b9f918fab02af4357c63\",\"12\":\"b4eb3274ce5b3c321958\",\"13\":\"f5538912196e125de757\",\"14\":\"45fb90c7c021f37182ff\",\"15\":\"198a32297d624a4ee6ed\",\"16\":\"f1dde01b3fecd34c349b\",\"17\":\"72126c110cfedf3298a9\",\"18\":\"19abbab9479978924d76\",\"19\":\"1037e823e8c755fdccf9\",\"20\":\"96e8eeb627066b5094ac\",\"21\":\"01da4c39b75c80344eb7\",\"22\":\"0a628e2d4248ba9d2bc6\",\"23\":\"6be0d0c4a28ca0d0952b\",\"24\":\"3dbb6c36f540f3e15be0\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 999999 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 999999 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = (function() {\n \t\t\t\t return Date.now();\n \t\t\t\t })();\n \t\t\t\t +retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 999999);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 56);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap, MessageReactions, ReactionCount } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type { AppMediaPlaybackController } from \"../components/appMediaPlaybackController\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\nimport type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': ReturnType,\n 'media_pause': void,\n 'media_playback_params': ReturnType,\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: CallInstance},\n 'call_accepting': CallInstance, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n 'call_incompatible': UserId,\n\n 'quick_reaction': string,\n\n 'missed_reactions_element': {message: Message.message, changedResults: ReactionCount[]},\n\n 'service_notification': Update.updateServiceNotification\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","export default function copy(obj: T): T {\n //in case of premitives\n if(obj === null || typeof(obj) !== \"object\") {\n return obj;\n }\n \n //date objects should be \n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n \n //handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\n return clonedArr;\n }\n \n //lastly, handle objects\n // @ts-ignore\n let clonedObj = new obj.constructor();\n for(var prop in obj){\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.0',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport deepEqual from \"../helpers/object/deepEqual\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport capitalizeFirstLetter from \"../helpers/string/capitalizeFirstLetter\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach(element => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n cachedDateTimeFormats.clear();\n updateAmPm();\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && RichTextProcessor.matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = RichTextProcessor.wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map(item => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'];\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n let json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n cachedDateTimeFormats.set(json, dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, options));\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n let hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.02f307d76034f3156ff7.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, JSONValue, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport CryptoWorkerMethods, { CryptoMethods } from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport pause from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport type { ApiError } from './apiManager';\nimport { MTAppConfig } from './appConfig';\nimport { ignoreRestrictionReasons } from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise;\n private getAppConfigPromise: Promise;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map(cacheName => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n //console.log('socketProxy', socketTask, id);\n\n if(socketTask.type === 'send') {\n const socket = this.sockets.get(id);\n socket.send(socketTask.payload);\n } else if(socketTask.type === 'close') { // will remove from map in onClose\n const socket = this.sockets.get(id);\n socket.close();\n } else if(socketTask.type === 'setup') {\n const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n \n const onOpen = () => {\n //console.log('socketProxy onOpen');\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'open',\n id\n }\n });\n };\n const onClose = () => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'close',\n id\n }\n });\n\n socket.removeEventListener('open', onOpen);\n socket.removeEventListener('close', onClose);\n socket.removeEventListener('message', onMessage);\n this.sockets.delete(id);\n };\n const onMessage = (buffer: ArrayBuffer) => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'message',\n id,\n payload: buffer\n }\n });\n };\n\n socket.addEventListener('open', onOpen);\n socket.addEventListener('close', onClose);\n socket.addEventListener('message', onMessage);\n this.sockets.set(id, socket);\n }\n });\n\n this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n // const worker = new Worker(new URL('./mtproto.worker.ts', import.meta.url));\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n private createTask(task: string, type: string, args: any[]): any {\n return {\n task,\n taskId: this.taskId++,\n type,\n args,\n };\n }\n\n public performTaskWorkerVoid(taskName: string, ...args: any[]) {\n const task = this.createTask(taskName, undefined, args);\n this.pending.push(task);\n this.releasePending();\n }\n\n public performTaskWorkerNew(taskName: string, type: string, ...args: any[]) {\n this.debug && this.log.debug('start', taskName, args);\n\n return new Promise((resolve, reject) => {\n const task = this.createTask(taskName, type, args);\n this.pending.push(task);\n this.awaiting[task.taskId] = {resolve, reject, taskName: taskName};\n this.releasePending();\n });\n }\n\n public performTaskWorker(task: string, ...args: any[]) {\n return this.performTaskWorkerNew(task, undefined, ...args);\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return this.performTaskWorkerNew(method, 'crypto', ...args);\n }\n \n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T, \n processResult?: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: Omit, \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(rootScope.appConfig && !overwrite) return rootScope.appConfig;\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n const promise: Promise = this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then((config: MTAppConfig) => {\n if(this.getAppConfigPromise !== promise) {\n return this.getAppConfigPromise;\n }\n \n rootScope.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n return config;\n });\n\n return promise;\n }\n}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport type gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport type { Awaited } from \"../../types\";\r\nimport type getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport type computeDhKey from \"./computeDhKey\";\r\nimport type generateDh from \"./generateDh\";\r\nimport type computeSRP from \"./srp\";\r\nimport type { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport type factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\n// import type factorizeTdlibPQ from \"./utils/factorize/tdlib\";\r\nimport type pbkdf2 from \"./utils/pbkdf2\";\r\nimport type rsaEncrypt from \"./utils/rsa\";\r\nimport type sha1 from \"./utils/sha1\";\r\nimport type sha256 from \"./utils/sha256\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1': typeof sha1,\r\n 'sha256': typeof sha256,\r\n 'pbkdf2': typeof pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': typeof factorizeTdlibPQ,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP,\r\n 'generate-dh': typeof generateDh,\r\n 'compute-dh-key': typeof computeDhKey,\r\n 'get-emojis-fingerprint': typeof getEmojisFingerprint\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(\r\n method: Method, \r\n ...args: Parameters\r\n ): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../config/databases\";\r\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nexport default class AppStorage, T extends Database/* Storage extends {[name: string]: any} *//* Storage extends Record */> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then(values => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach(storage => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {}\r\n this.STORAGES.forEach(storage => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\nexport default IS_TOUCH_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\nimport findAndSplice from \"./array/findAndSplice\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n findAndSplice(this.listeners[name], l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function pause(ms: number) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport const EmojiVersions: {[version: string]: {[emoji: string]: number}} = {\"14\":{\"1f6dd\":4867,\"1f6de\":4916,\"1f6df\":4923,\"1f7f0\":62832,\"1f979\":183,\"1f9cc\":1557,\"1fa7b\":61332,\"1fa7c\":61330,\"1faa9\":51093,\"1faaa\":61364,\"1faab\":61189,\"1faac\":51085,\"1fab7\":2651,\"1fab8\":2631,\"1fab9\":2672,\"1faba\":2673,\"1fac3\":1520,\"1fac4\":1521,\"1fac5\":1505,\"1fad7\":3793,\"1fad8\":3707,\"1fad9\":3804,\"1fae0\":111,\"1fae1\":136,\"1fae2\":132,\"1fae3\":133,\"1fae4\":174,\"1fae5\":142,\"1fae6\":1385,\"1fae7\":61353,\"1faf0\":1341,\"1faf1\":1332,\"1faf2\":1333,\"1faf3\":1334,\"1faf4\":1335,\"1faf5\":1351,\"1faf6\":1360,\"1faf1-1f3fb-200d-1faf2-1f3fc\":0,\"1faf1-1f3fb-200d-1faf2-1f3fd\":0,\"1faf1-1f3fb-200d-1faf2-1f3fe\":0,\"1faf1-1f3fb-200d-1faf2-1f3ff\":0,\"1faf1-1f3fc-200d-1faf2-1f3fb\":0,\"1faf1-1f3fc-200d-1faf2-1f3fd\":0,\"1faf1-1f3fc-200d-1faf2-1f3fe\":0,\"1faf1-1f3fc-200d-1faf2-1f3ff\":0,\"1faf1-1f3fd-200d-1faf2-1f3fb\":0,\"1faf1-1f3fd-200d-1faf2-1f3fc\":0,\"1faf1-1f3fd-200d-1faf2-1f3fe\":0,\"1faf1-1f3fd-200d-1faf2-1f3ff\":0,\"1faf1-1f3fe-200d-1faf2-1f3fb\":0,\"1faf1-1f3fe-200d-1faf2-1f3fc\":0,\"1faf1-1f3fe-200d-1faf2-1f3fd\":0,\"1faf1-1f3fe-200d-1faf2-1f3ff\":0,\"1faf1-1f3ff-200d-1faf2-1f3fb\":0,\"1faf1-1f3ff-200d-1faf2-1f3fc\":0,\"1faf1-1f3ff-200d-1faf2-1f3fd\":0,\"1faf1-1f3ff-200d-1faf2-1f3fe\":0,\"1fac3-1f3fb\":0,\"1fac3-1f3fc\":0,\"1fac3-1f3fd\":0,\"1fac3-1f3fe\":0,\"1fac3-1f3ff\":0,\"1fac4-1f3fb\":0,\"1fac4-1f3fc\":0,\"1fac4-1f3fd\":0,\"1fac4-1f3fe\":0,\"1fac4-1f3ff\":0,\"1fac5-1f3fb\":0,\"1fac5-1f3fc\":0,\"1fac5-1f3fd\":0,\"1fac5-1f3fe\":0,\"1fac5-1f3ff\":0,\"1faf0-1f3fb\":0,\"1faf0-1f3fc\":0,\"1faf0-1f3fd\":0,\"1faf0-1f3fe\":0,\"1faf0-1f3ff\":0,\"1faf1-1f3fb\":0,\"1faf1-1f3fc\":0,\"1faf1-1f3fd\":0,\"1faf1-1f3fe\":0,\"1faf1-1f3ff\":0,\"1faf2-1f3fb\":0,\"1faf2-1f3fc\":0,\"1faf2-1f3fd\":0,\"1faf2-1f3fe\":0,\"1faf2-1f3ff\":0,\"1faf3-1f3fb\":0,\"1faf3-1f3fc\":0,\"1faf3-1f3fd\":0,\"1faf3-1f3fe\":0,\"1faf3-1f3ff\":0,\"1faf4-1f3fb\":0,\"1faf4-1f3fc\":0,\"1faf4-1f3fd\":0,\"1faf4-1f3fe\":0,\"1faf4-1f3ff\":0,\"1faf5-1f3fb\":0,\"1faf5-1f3fc\":0,\"1faf5-1f3fd\":0,\"1faf5-1f3fe\":0,\"1faf5-1f3ff\":0,\"1faf6-1f3fb\":0,\"1faf6-1f3fc\":0,\"1faf6-1f3fd\":0,\"1faf6-1f3fe\":0,\"1faf6-1f3ff\":0},\"\":{\"2049\":62835,\"2122\":62863,\"2139\":62888,\"2194\":62764,\"2195\":62763,\"2196\":62762,\"2197\":62756,\"2198\":62758,\"2199\":62760,\"2328\":61194,\"2600\":4990,\"2601\":4998,\"2602\":41013,\"2603\":41018,\"2604\":41020,\"2611\":62851,\"2614\":41014,\"2615\":3781,\"2618\":2667,\"2620\":1106,\"2622\":62753,\"2623\":62754,\"2626\":62783,\"2638\":62780,\"2639\":177,\"2648\":62788,\"2649\":62789,\"2650\":62796,\"2651\":62797,\"2652\":62798,\"2653\":62799,\"2660\":51095,\"2663\":51098,\"2665\":51096,\"2666\":51097,\"2668\":4865,\"2692\":61297,\"2693\":4922,\"2694\":61300,\"2696\":61311,\"2697\":61319,\"2699\":61309,\"2702\":61284,\"2705\":62850,\"2708\":4931,\"2709\":61245,\"2712\":61259,\"2714\":62852,\"2716\":62828,\"2721\":62779,\"2728\":51029,\"2733\":62858,\"2734\":62859,\"2744\":41017,\"2747\":62860,\"2753\":62836,\"2754\":62837,\"2755\":62838,\"2757\":62839,\"2763\":1137,\"2764\":1141,\"2795\":62829,\"2796\":62830,\"2797\":62831,\"2934\":62767,\"2935\":62768,\"3030\":62840,\"3297\":62912,\"3299\":62913,\"0023-20e3\":62864,\"002a-20e3\":62865,\"0030-20e3\":62866,\"0031-20e3\":62867,\"0032-20e3\":62868,\"0033-20e3\":62869,\"0034-20e3\":62870,\"0035-20e3\":62871,\"0036-20e3\":62872,\"0037-20e3\":62873,\"0038-20e3\":62874,\"0039-20e3\":62875,\"00a9\":62861,\"00ae\":62862,\"1f004\":51101,\"1f0cf\":51100,\"1f170\":62882,\"1f171\":62884,\"1f17e\":62893,\"1f17f\":62895,\"1f18e\":62883,\"1f191\":62885,\"1f192\":62886,\"1f193\":62887,\"1f194\":62889,\"1f195\":62891,\"1f196\":62892,\"1f197\":62894,\"1f198\":62896,\"1f199\":62897,\"1f19a\":62898,\"1f1e6-1f1e8\":71594,\"1f1e6-1f1e9\":71595,\"1f1e6-1f1ea\":71596,\"1f1e6-1f1eb\":71597,\"1f1e6-1f1ec\":71598,\"1f1e6-1f1ee\":71599,\"1f1e6-1f1f1\":71600,\"1f1e6-1f1f2\":71601,\"1f1e6-1f1f4\":71602,\"1f1e6-1f1f6\":71603,\"1f1e6-1f1f7\":71604,\"1f1e6-1f1f8\":71605,\"1f1e6-1f1f9\":71606,\"1f1e6-1f1fa\":71607,\"1f1e6-1f1fc\":71608,\"1f1e6-1f1fd\":71609,\"1f1e6-1f1ff\":71610,\"1f1e7-1f1e6\":71611,\"1f1e7-1f1e7\":71612,\"1f1e7-1f1e9\":71613,\"1f1e7-1f1ea\":71614,\"1f1e7-1f1eb\":71615,\"1f1e7-1f1ec\":71616,\"1f1e7-1f1ed\":71617,\"1f1e7-1f1ee\":71618,\"1f1e7-1f1ef\":71619,\"1f1e7-1f1f1\":71620,\"1f1e7-1f1f2\":71621,\"1f1e7-1f1f3\":71622,\"1f1e7-1f1f4\":71623,\"1f1e7-1f1f6\":71624,\"1f1e7-1f1f7\":71625,\"1f1e7-1f1f8\":71626,\"1f1e7-1f1f9\":71627,\"1f1e7-1f1fb\":71628,\"1f1e7-1f1fc\":71629,\"1f1e7-1f1fe\":71630,\"1f1e7-1f1ff\":71631,\"1f1e8-1f1e6\":71632,\"1f1e8-1f1e8\":71633,\"1f1e8-1f1e9\":71634,\"1f1e8-1f1eb\":71635,\"1f1e8-1f1ec\":71636,\"1f1e8-1f1ed\":71637,\"1f1e8-1f1ee\":71638,\"1f1e8-1f1f0\":71639,\"1f1e8-1f1f1\":71640,\"1f1e8-1f1f2\":71641,\"1f1e8-1f1f3\":71642,\"1f1e8-1f1f4\":71643,\"1f1e8-1f1f5\":71644,\"1f1e8-1f1f7\":71645,\"1f1e8-1f1fa\":71646,\"1f1e8-1f1fb\":71647,\"1f1e8-1f1fc\":71648,\"1f1e8-1f1fd\":71649,\"1f1e8-1f1fe\":71650,\"1f1e8-1f1ff\":71651,\"1f1e9-1f1ea\":71652,\"1f1e9-1f1ec\":71653,\"1f1e9-1f1ef\":71654,\"1f1e9-1f1f0\":71655,\"1f1e9-1f1f2\":71656,\"1f1e9-1f1f4\":71657,\"1f1e9-1f1ff\":71658,\"1f1ea-1f1e6\":71659,\"1f1ea-1f1e8\":71660,\"1f1ea-1f1ea\":71661,\"1f1ea-1f1ec\":71662,\"1f1ea-1f1ed\":71663,\"1f1ea-1f1f7\":71664,\"1f1ea-1f1f8\":71665,\"1f1ea-1f1f9\":71666,\"1f1ea-1f1fa\":71667,\"1f1eb-1f1ee\":71668,\"1f1eb-1f1ef\":71669,\"1f1eb-1f1f0\":71670,\"1f1eb-1f1f2\":71671,\"1f1eb-1f1f4\":71672,\"1f1eb-1f1f7\":71673,\"1f1ec-1f1e6\":71674,\"1f1ec-1f1e7\":71675,\"1f1ec-1f1e9\":71676,\"1f1ec-1f1ea\":71677,\"1f1ec-1f1eb\":71678,\"1f1ec-1f1ec\":71679,\"1f1ec-1f1ed\":71680,\"1f1ec-1f1ee\":71681,\"1f1ec-1f1f1\":71682,\"1f1ec-1f1f2\":71683,\"1f1ec-1f1f3\":71684,\"1f1ec-1f1f5\":71685,\"1f1ec-1f1f6\":71686,\"1f1ec-1f1f7\":71687,\"1f1ec-1f1f8\":71688,\"1f1ec-1f1f9\":71689,\"1f1ec-1f1fa\":71690,\"1f1ec-1f1fc\":71691,\"1f1ec-1f1fe\":71692,\"1f1ed-1f1f0\":71693,\"1f1ed-1f1f2\":71694,\"1f1ed-1f1f3\":71695,\"1f1ed-1f1f7\":71696,\"1f1ed-1f1f9\":71697,\"1f1ed-1f1fa\":71698,\"1f1ee-1f1e8\":71699,\"1f1ee-1f1e9\":71700,\"1f1ee-1f1ea\":71701,\"1f1ee-1f1f1\":71702,\"1f1ee-1f1f2\":71703,\"1f1ee-1f1f3\":71704,\"1f1ee-1f1f4\":71705,\"1f1ee-1f1f6\":71706,\"1f1ee-1f1f7\":71707,\"1f1ee-1f1f8\":71708,\"1f1ee-1f1f9\":71709,\"1f1ef-1f1ea\":71710,\"1f1ef-1f1f2\":71711,\"1f1ef-1f1f4\":71712,\"1f1ef-1f1f5\":71713,\"1f1f0-1f1ea\":71714,\"1f1f0-1f1ec\":71715,\"1f1f0-1f1ed\":71716,\"1f1f0-1f1ee\":71717,\"1f1f0-1f1f2\":71718,\"1f1f0-1f1f3\":71719,\"1f1f0-1f1f5\":71720,\"1f1f0-1f1f7\":71721,\"1f1f0-1f1fc\":71722,\"1f1f0-1f1fe\":71723,\"1f1f0-1f1ff\":71724,\"1f1f1-1f1e6\":71725,\"1f1f1-1f1e7\":71726,\"1f1f1-1f1e8\":71727,\"1f1f1-1f1ee\":71728,\"1f1f1-1f1f0\":71729,\"1f1f1-1f1f7\":71730,\"1f1f1-1f1f8\":71731,\"1f1f1-1f1f9\":71732,\"1f1f1-1f1fa\":71733,\"1f1f1-1f1fb\":71734,\"1f1f1-1f1fe\":71735,\"1f1f2-1f1e6\":71736,\"1f1f2-1f1e8\":71737,\"1f1f2-1f1e9\":71738,\"1f1f2-1f1ea\":71739,\"1f1f2-1f1eb\":71740,\"1f1f2-1f1ec\":71741,\"1f1f2-1f1ed\":71742,\"1f1f2-1f1f0\":71743,\"1f1f2-1f1f1\":71744,\"1f1f2-1f1f2\":71745,\"1f1f2-1f1f3\":71746,\"1f1f2-1f1f4\":71747,\"1f1f2-1f1f5\":71748,\"1f1f2-1f1f6\":71749,\"1f1f2-1f1f7\":71750,\"1f1f2-1f1f8\":71751,\"1f1f2-1f1f9\":71752,\"1f1f2-1f1fa\":71753,\"1f1f2-1f1fb\":71754,\"1f1f2-1f1fc\":71755,\"1f1f2-1f1fd\":71756,\"1f1f2-1f1fe\":71757,\"1f1f2-1f1ff\":71758,\"1f1f3-1f1e6\":71759,\"1f1f3-1f1e8\":71760,\"1f1f3-1f1ea\":71761,\"1f1f3-1f1eb\":71762,\"1f1f3-1f1ec\":71763,\"1f1f3-1f1ee\":71764,\"1f1f3-1f1f1\":71765,\"1f1f3-1f1f4\":71766,\"1f1f3-1f1f5\":71767,\"1f1f3-1f1f7\":71768,\"1f1f3-1f1fa\":71769,\"1f1f3-1f1ff\":71770,\"1f1f4-1f1f2\":71771,\"1f1f5-1f1e6\":71772,\"1f1f5-1f1ea\":71773,\"1f1f5-1f1eb\":71774,\"1f1f5-1f1ec\":71775,\"1f1f5-1f1ed\":71776,\"1f1f5-1f1f0\":71777,\"1f1f5-1f1f1\":71778,\"1f1f5-1f1f2\":71779,\"1f1f5-1f1f3\":71780,\"1f1f5-1f1f7\":71781,\"1f1f5-1f1f8\":71782,\"1f1f5-1f1f9\":71783,\"1f1f5-1f1fc\":71784,\"1f1f5-1f1fe\":71785,\"1f1f6-1f1e6\":71786,\"1f1f7-1f1ea\":71787,\"1f1f7-1f1f4\":71788,\"1f1f7-1f1f8\":71789,\"1f1f7-1f1fa\":71790,\"1f1f7-1f1fc\":71791,\"1f1f8-1f1e6\":71792,\"1f1f8-1f1e7\":71793,\"1f1f8-1f1e8\":71794,\"1f1f8-1f1e9\":71795,\"1f1f8-1f1ea\":71796,\"1f1f8-1f1ec\":71797,\"1f1f8-1f1ed\":71798,\"1f1f8-1f1ee\":71799,\"1f1f8-1f1ef\":71800,\"1f1f8-1f1f0\":71801,\"1f1f8-1f1f1\":71802,\"1f1f8-1f1f2\":71803,\"1f1f8-1f1f3\":71804,\"1f1f8-1f1f4\":71805,\"1f1f8-1f1f7\":71806,\"1f1f8-1f1f8\":71807,\"1f1f8-1f1f9\":71808,\"1f1f8-1f1fb\":71809,\"1f1f8-1f1fd\":71810,\"1f1f8-1f1fe\":71811,\"1f1f8-1f1ff\":71812,\"1f1f9-1f1e6\":71813,\"1f1f9-1f1e8\":71814,\"1f1f9-1f1e9\":71815,\"1f1f9-1f1eb\":71816,\"1f1f9-1f1ec\":71817,\"1f1f9-1f1ed\":71818,\"1f1f9-1f1ef\":71819,\"1f1f9-1f1f0\":71820,\"1f1f9-1f1f1\":71821,\"1f1f9-1f1f2\":71822,\"1f1f9-1f1f3\":71823,\"1f1f9-1f1f4\":71824,\"1f1f9-1f1f7\":71825,\"1f1f9-1f1f9\":71826,\"1f1f9-1f1fb\":71827,\"1f1f9-1f1fc\":71828,\"1f1f9-1f1ff\":71829,\"1f1fa-1f1e6\":71830,\"1f1fa-1f1ec\":71831,\"1f1fa-1f1f2\":71832,\"1f1fa-1f1f3\":71833,\"1f1fa-1f1f8\":71834,\"1f1fa-1f1fe\":71835,\"1f1fa-1f1ff\":71836,\"1f1fb-1f1e6\":71837,\"1f1fb-1f1e8\":71838,\"1f1fb-1f1ea\":71839,\"1f1fb-1f1ec\":71840,\"1f1fb-1f1ee\":71841,\"1f1fb-1f1f3\":71842,\"1f1fb-1f1fa\":71843,\"1f1fc-1f1eb\":71844,\"1f1fc-1f1f8\":71845,\"1f1fd-1f1f0\":71846,\"1f1fe-1f1ea\":71847,\"1f1fe-1f1f9\":71848,\"1f1ff-1f1e6\":71849,\"1f1ff-1f1f2\":71850,\"1f1ff-1f1fc\":71851,\"1f201\":62899,\"1f202\":62900,\"1f21a\":62906,\"1f22f\":62903,\"1f232\":62907,\"1f233\":62911,\"1f234\":62910,\"1f235\":62915,\"1f236\":62902,\"1f237\":62901,\"1f238\":62909,\"1f239\":62905,\"1f23a\":62914,\"1f250\":62904,\"1f251\":62908,\"1f300\":41010,\"1f301\":4857,\"1f302\":41012,\"1f303\":4858,\"1f304\":4860,\"1f305\":4861,\"1f306\":4862,\"1f307\":4863,\"1f308\":41011,\"1f309\":4864,\"1f30a\":41023,\"1f30b\":4815,\"1f30c\":4997,\"1f30d\":4806,\"1f30e\":4807,\"1f30f\":4808,\"1f310\":4809,\"1f311\":4977,\"1f312\":4978,\"1f313\":4979,\"1f314\":4980,\"1f315\":4981,\"1f316\":4982,\"1f317\":4983,\"1f318\":4984,\"1f319\":4985,\"1f31a\":4986,\"1f31b\":4987,\"1f31c\":4988,\"1f31d\":4991,\"1f31e\":4992,\"1f31f\":4995,\"1f320\":4996,\"1f321\":4989,\"1f324\":41001,\"1f325\":41002,\"1f326\":41003,\"1f327\":41004,\"1f328\":41005,\"1f329\":41006,\"1f32a\":41007,\"1f32b\":41008,\"1f32c\":41009,\"1f32d\":3725,\"1f32e\":3727,\"1f32f\":3728,\"1f330\":3708,\"1f331\":2659,\"1f332\":2661,\"1f333\":2662,\"1f334\":2663,\"1f335\":2664,\"1f336\":3698,\"1f337\":2658,\"1f338\":2649,\"1f339\":2653,\"1f33a\":2655,\"1f33b\":2656,\"1f33c\":2657,\"1f33d\":3697,\"1f33e\":2665,\"1f33f\":2666,\"1f340\":2668,\"1f341\":2669,\"1f342\":2670,\"1f343\":2671,\"1f344\":3705,\"1f345\":3690,\"1f346\":3694,\"1f347\":3674,\"1f348\":3675,\"1f349\":3676,\"1f34a\":3677,\"1f34b\":3678,\"1f34c\":3679,\"1f34d\":3680,\"1f34e\":3682,\"1f34f\":3683,\"1f350\":3684,\"1f351\":3685,\"1f352\":3686,\"1f353\":3687,\"1f354\":3722,\"1f355\":3724,\"1f356\":3718,\"1f357\":3719,\"1f358\":3744,\"1f359\":3745,\"1f35a\":3746,\"1f35b\":3747,\"1f35c\":3748,\"1f35d\":3749,\"1f35e\":3709,\"1f35f\":3723,\"1f360\":3750,\"1f361\":3756,\"1f362\":3751,\"1f363\":3752,\"1f364\":3753,\"1f365\":3754,\"1f366\":3765,\"1f367\":3766,\"1f368\":3767,\"1f369\":3768,\"1f36a\":3769,\"1f36b\":3774,\"1f36c\":3775,\"1f36d\":3776,\"1f36e\":3777,\"1f36f\":3778,\"1f370\":3771,\"1f371\":3743,\"1f372\":3735,\"1f373\":3733,\"1f374\":3801,\"1f375\":3783,\"1f376\":3784,\"1f377\":3786,\"1f378\":3787,\"1f379\":3788,\"1f37a\":3789,\"1f37b\":3790,\"1f37c\":3779,\"1f37d\":3800,\"1f37e\":3785,\"1f37f\":3739,\"1f380\":51040,\"1f381\":51041,\"1f382\":3770,\"1f383\":51024,\"1f384\":51025,\"1f385\":1527,\"1f386\":51026,\"1f387\":51027,\"1f388\":51030,\"1f389\":51031,\"1f38a\":51032,\"1f38b\":51033,\"1f38c\":71588,\"1f38d\":51034,\"1f38e\":51035,\"1f38f\":51036,\"1f390\":51037,\"1f391\":51038,\"1f392\":61134,\"1f393\":61147,\"1f396\":51045,\"1f397\":51042,\"1f399\":61167,\"1f39a\":61168,\"1f39b\":61169,\"1f39e\":61203,\"1f39f\":51043,\"1f3a0\":4866,\"1f3a1\":4868,\"1f3a2\":4869,\"1f3a3\":51072,\"1f3a4\":61170,\"1f3a5\":61202,\"1f3a6\":62819,\"1f3a7\":61171,\"1f3a8\":51105,\"1f3a9\":61146,\"1f3aa\":4871,\"1f3ab\":51044,\"1f3ac\":61205,\"1f3ad\":51103,\"1f3ae\":51086,\"1f3af\":51078,\"1f3b0\":51088,\"1f3b1\":51081,\"1f3b2\":51089,\"1f3b3\":51060,\"1f3b4\":51102,\"1f3b5\":61165,\"1f3b6\":61166,\"1f3b7\":61173,\"1f3b8\":61175,\"1f3b9\":61176,\"1f3ba\":61177,\"1f3bb\":61178,\"1f3bc\":61164,\"1f3bd\":51074,\"1f3be\":51058,\"1f3bf\":51075,\"1f3c0\":51054,\"1f3c1\":71586,\"1f3c2\":1600,\"1f3c3-200d-2640\":1584,\"1f3c3-200d-2642\":1583,\"1f3c3\":1582,\"1f3c4-200d-2640\":1606,\"1f3c4-200d-2642\":1605,\"1f3c4\":1604,\"1f3c5\":51047,\"1f3c6\":51046,\"1f3c7\":1598,\"1f3c8\":51056,\"1f3c9\":51057,\"1f3ca-200d-2640\":1612,\"1f3ca-200d-2642\":1611,\"1f3ca\":1610,\"1f3cb-200d-2640\":1618,\"1f3cb-200d-2642\":1617,\"1f3cb\":1616,\"1f3cc-200d-2640\":1603,\"1f3cc-200d-2642\":1602,\"1f3cc\":1601,\"1f3cd\":4902,\"1f3ce\":4901,\"1f3cf\":51061,\"1f3d0\":51055,\"1f3d1\":51062,\"1f3d2\":51063,\"1f3d3\":51065,\"1f3d4\":4813,\"1f3d5\":4817,\"1f3d6\":4818,\"1f3d7\":4824,\"1f3d8\":4829,\"1f3d9\":4859,\"1f3da\":4830,\"1f3db\":4823,\"1f3dc\":4819,\"1f3dd\":4820,\"1f3de\":4821,\"1f3df\":4822,\"1f3e0\":4831,\"1f3e1\":4832,\"1f3e2\":4833,\"1f3e3\":4834,\"1f3e4\":4835,\"1f3e5\":4836,\"1f3e6\":4837,\"1f3e7\":62729,\"1f3e8\":4838,\"1f3e9\":4839,\"1f3ea\":4840,\"1f3eb\":4841,\"1f3ec\":4842,\"1f3ed\":4843,\"1f3ee\":61216,\"1f3ef\":4844,\"1f3f0\":4845,\"1f3f3-200d-1f308\":71591,\"1f3f3-200d-26a7\":71592,\"1f3f3\":71590,\"1f3f4-200d-2620\":71593,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71852,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71853,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71854,\"1f3f4\":71589,\"1f3f5\":2652,\"1f3f7\":61234,\"1f3f8\":51066,\"1f3f9\":61303,\"1f3fa\":3805,\"1f3fb\":9525,\"1f3fc\":9526,\"1f3fd\":9527,\"1f3fe\":9528,\"1f3ff\":9529,\"1f400\":2576,\"1f401\":2575,\"1f402\":2556,\"1f403\":2557,\"1f404\":2558,\"1f405\":2547,\"1f406\":2548,\"1f407\":2579,\"1f408-200d-2b1b\":2544,\"1f408\":2543,\"1f409\":2618,\"1f40a\":2613,\"1f40b\":2622,\"1f40c\":2632,\"1f40d\":2616,\"1f40e\":2550,\"1f40f\":2563,\"1f410\":2565,\"1f411\":2564,\"1f412\":2531,\"1f413\":2596,\"1f414\":2595,\"1f415-200d-1f9ba\":2537,\"1f415\":2535,\"1f416\":2560,\"1f417\":2561,\"1f418\":2570,\"1f419\":2629,\"1f41a\":2630,\"1f41b\":2634,\"1f41c\":2635,\"1f41d\":2636,\"1f41e\":2638,\"1f41f\":2625,\"1f420\":2626,\"1f421\":2627,\"1f422\":2614,\"1f423\":2597,\"1f424\":2598,\"1f425\":2599,\"1f426\":2600,\"1f427\":2601,\"1f428\":2586,\"1f429\":2538,\"1f42a\":2566,\"1f42b\":2567,\"1f42c\":2623,\"1f42d\":2574,\"1f42e\":2555,\"1f42f\":2546,\"1f430\":2578,\"1f431\":2542,\"1f432\":2617,\"1f433\":2621,\"1f434\":2549,\"1f435\":2530,\"1f436\":2534,\"1f437\":2559,\"1f438\":2612,\"1f439\":2577,\"1f43a\":2539,\"1f43b-200d-2744\":2585,\"1f43b\":2584,\"1f43c\":2587,\"1f43d\":2562,\"1f43e\":2593,\"1f43f\":2580,\"1f440\":1381,\"1f441-200d-1f5e8\":1159,\"1f441\":1382,\"1f442\":1373,\"1f443\":1375,\"1f444\":1384,\"1f445\":1383,\"1f446\":1347,\"1f447\":1349,\"1f448\":1345,\"1f449\":1346,\"1f44a\":1355,\"1f44b\":1327,\"1f44c\":1336,\"1f44d\":1352,\"1f44e\":1353,\"1f44f\":1358,\"1f450\":1361,\"1f451\":61144,\"1f452\":61145,\"1f453\":61110,\"1f454\":61115,\"1f455\":61116,\"1f456\":61117,\"1f457\":61122,\"1f458\":61123,\"1f459\":61128,\"1f45a\":61129,\"1f45b\":61130,\"1f45c\":61131,\"1f45d\":61132,\"1f45e\":61136,\"1f45f\":61137,\"1f460\":61140,\"1f461\":61141,\"1f462\":61143,\"1f463\":1687,\"1f464\":1684,\"1f465\":1685,\"1f466\":1388,\"1f467\":1389,\"1f468-200d-1f33e\":1457,\"1f468-200d-1f373\":1460,\"1f468-200d-1f37c\":1524,\"1f468-200d-1f393\":1448,\"1f468-200d-1f3a4\":1478,\"1f468-200d-1f3a8\":1481,\"1f468-200d-1f3eb\":1451,\"1f468-200d-1f3ed\":1466,\"1f468-200d-1f466-200d-1f466\":1674,\"1f468-200d-1f466\":1673,\"1f468-200d-1f467-200d-1f466\":1676,\"1f468-200d-1f467-200d-1f467\":1677,\"1f468-200d-1f467\":1675,\"1f468-200d-1f468-200d-1f466\":1663,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1666,\"1f468-200d-1f468-200d-1f467\":1664,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1665,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1667,\"1f468-200d-1f469-200d-1f466\":1658,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1661,\"1f468-200d-1f469-200d-1f467\":1659,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1660,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1662,\"1f468-200d-1f4bb\":1475,\"1f468-200d-1f4bc\":1469,\"1f468-200d-1f527\":1463,\"1f468-200d-1f52c\":1472,\"1f468-200d-1f680\":1487,\"1f468-200d-1f692\":1490,\"1f468-200d-1f9af\":1574,\"1f468-200d-1f9b0\":1396,\"1f468-200d-1f9b1\":1397,\"1f468-200d-1f9b2\":1399,\"1f468-200d-1f9b3\":1398,\"1f468-200d-1f9bc\":1577,\"1f468-200d-1f9bd\":1580,\"1f468-200d-2695\":1445,\"1f468-200d-2696\":1454,\"1f468-200d-2708\":1484,\"1f468-200d-2764-200d-1f468\":1655,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1651,\"1f468\":1392,\"1f469-200d-1f33e\":1458,\"1f469-200d-1f373\":1461,\"1f469-200d-1f37c\":1523,\"1f469-200d-1f393\":1449,\"1f469-200d-1f3a4\":1479,\"1f469-200d-1f3a8\":1482,\"1f469-200d-1f3eb\":1452,\"1f469-200d-1f3ed\":1467,\"1f469-200d-1f466-200d-1f466\":1679,\"1f469-200d-1f466\":1678,\"1f469-200d-1f467-200d-1f466\":1681,\"1f469-200d-1f467-200d-1f467\":1682,\"1f469-200d-1f467\":1680,\"1f469-200d-1f469-200d-1f466\":1668,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1671,\"1f469-200d-1f469-200d-1f467\":1669,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1670,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1672,\"1f469-200d-1f4bb\":1476,\"1f469-200d-1f4bc\":1470,\"1f469-200d-1f527\":1464,\"1f469-200d-1f52c\":1473,\"1f469-200d-1f680\":1488,\"1f469-200d-1f692\":1491,\"1f469-200d-1f9af\":1575,\"1f469-200d-1f9b0\":1401,\"1f469-200d-1f9b1\":1403,\"1f469-200d-1f9b2\":1407,\"1f469-200d-1f9b3\":1405,\"1f469-200d-1f9bc\":1578,\"1f469-200d-1f9bd\":1581,\"1f469-200d-2695\":1446,\"1f469-200d-2696\":1455,\"1f469-200d-2708\":1485,\"1f469-200d-2764-200d-1f468\":1654,\"1f469-200d-2764-200d-1f469\":1656,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1650,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1652,\"1f469\":1400,\"1f46a\":1657,\"1f46b\":1647,\"1f46c\":1648,\"1f46d\":1646,\"1f46e-200d-2640\":1494,\"1f46e-200d-2642\":1493,\"1f46e\":1492,\"1f46f-200d-2640\":1590,\"1f46f-200d-2642\":1589,\"1f46f\":1588,\"1f470-200d-2640\":1518,\"1f470-200d-2642\":1517,\"1f470\":1516,\"1f471-200d-2640\":1409,\"1f471-200d-2642\":1410,\"1f471\":1391,\"1f472\":1511,\"1f473-200d-2640\":1510,\"1f473-200d-2642\":1509,\"1f473\":1508,\"1f474\":1412,\"1f475\":1413,\"1f476\":1386,\"1f477-200d-2640\":1504,\"1f477-200d-2642\":1503,\"1f477\":1502,\"1f478\":1507,\"1f479\":1109,\"1f47a\":1110,\"1f47b\":1111,\"1f47c\":1526,\"1f47d\":1112,\"1f47e\":1113,\"1f47f\":1104,\"1f480\":1105,\"1f481-200d-2640\":1428,\"1f481-200d-2642\":1427,\"1f481\":1426,\"1f482-200d-2640\":1500,\"1f482-200d-2642\":1499,\"1f482\":1498,\"1f483\":1585,\"1f484\":61152,\"1f485\":1366,\"1f486-200d-2640\":1560,\"1f486-200d-2642\":1559,\"1f486\":1558,\"1f487-200d-2640\":1563,\"1f487-200d-2642\":1562,\"1f487\":1561,\"1f488\":4870,\"1f489\":61326,\"1f48a\":61328,\"1f48b\":1127,\"1f48c\":1128,\"1f48d\":61153,\"1f48e\":61154,\"1f48f\":1649,\"1f490\":2648,\"1f491\":1653,\"1f492\":4846,\"1f493\":1133,\"1f494\":1138,\"1f495\":1135,\"1f496\":1131,\"1f497\":1132,\"1f498\":1129,\"1f499\":1145,\"1f49a\":1144,\"1f49b\":1143,\"1f49c\":1146,\"1f49d\":1130,\"1f49e\":1134,\"1f49f\":1136,\"1f4a0\":62946,\"1f4a1\":61214,\"1f4a2\":1151,\"1f4a3\":1157,\"1f4a4\":1163,\"1f4a5\":1152,\"1f4a6\":1154,\"1f4a7\":41022,\"1f4a8\":1155,\"1f4a9\":1107,\"1f4aa\":1368,\"1f4ab\":1153,\"1f4ac\":1158,\"1f4ad\":1162,\"1f4ae\":2650,\"1f4af\":1150,\"1f4b0\":61235,\"1f4b1\":62841,\"1f4b2\":62842,\"1f4b3\":61242,\"1f4b4\":61237,\"1f4b5\":61238,\"1f4b6\":61239,\"1f4b7\":61240,\"1f4b8\":61241,\"1f4b9\":61244,\"1f4ba\":4936,\"1f4bb\":61191,\"1f4bc\":61265,\"1f4bd\":61197,\"1f4be\":61198,\"1f4bf\":61199,\"1f4c0\":61200,\"1f4c1\":61266,\"1f4c2\":61267,\"1f4c3\":61227,\"1f4c4\":61229,\"1f4c5\":61269,\"1f4c6\":61270,\"1f4c7\":61273,\"1f4c8\":61274,\"1f4c9\":61275,\"1f4ca\":61276,\"1f4cb\":61277,\"1f4cc\":61278,\"1f4cd\":61279,\"1f4ce\":61280,\"1f4cf\":61282,\"1f4d0\":61283,\"1f4d1\":61232,\"1f4d2\":61226,\"1f4d3\":61225,\"1f4d4\":61218,\"1f4d5\":61219,\"1f4d6\":61220,\"1f4d7\":61221,\"1f4d8\":61222,\"1f4d9\":61223,\"1f4da\":61224,\"1f4db\":62847,\"1f4dc\":61228,\"1f4dd\":61264,\"1f4de\":61185,\"1f4df\":61186,\"1f4e0\":61187,\"1f4e1\":61325,\"1f4e2\":61159,\"1f4e3\":61160,\"1f4e4\":61249,\"1f4e5\":61250,\"1f4e6\":61251,\"1f4e7\":61246,\"1f4e8\":61247,\"1f4e9\":61248,\"1f4ea\":61253,\"1f4eb\":61252,\"1f4ec\":61254,\"1f4ed\":61255,\"1f4ee\":61256,\"1f4ef\":61161,\"1f4f0\":61230,\"1f4f1\":61182,\"1f4f2\":61183,\"1f4f3\":62823,\"1f4f4\":62824,\"1f4f5\":62751,\"1f4f6\":62822,\"1f4f7\":61207,\"1f4f8\":61208,\"1f4f9\":61209,\"1f4fa\":61206,\"1f4fb\":61172,\"1f4fc\":61210,\"1f4fd\":61204,\"1f4ff\":61151,\"1f500\":62801,\"1f501\":62802,\"1f502\":62803,\"1f503\":62769,\"1f504\":62770,\"1f505\":62820,\"1f506\":62821,\"1f507\":61155,\"1f508\":61156,\"1f509\":61157,\"1f50a\":61158,\"1f50b\":61188,\"1f50c\":61190,\"1f50d\":61211,\"1f50e\":61212,\"1f50f\":61290,\"1f510\":61291,\"1f511\":61292,\"1f512\":61288,\"1f513\":61289,\"1f514\":61162,\"1f515\":61163,\"1f516\":61233,\"1f517\":61313,\"1f518\":62947,\"1f519\":62771,\"1f51a\":62772,\"1f51b\":62773,\"1f51c\":62774,\"1f51d\":62775,\"1f51e\":62752,\"1f51f\":62876,\"1f520\":62877,\"1f521\":62878,\"1f522\":62879,\"1f523\":62880,\"1f524\":62881,\"1f525\":41021,\"1f526\":61215,\"1f527\":61306,\"1f528\":61294,\"1f529\":61308,\"1f52a\":3803,\"1f52b\":61301,\"1f52c\":61323,\"1f52d\":61324,\"1f52e\":51082,\"1f52f\":62787,\"1f530\":62848,\"1f531\":62846,\"1f532\":62949,\"1f533\":62948,\"1f534\":62916,\"1f535\":62920,\"1f536\":62940,\"1f537\":62941,\"1f538\":62942,\"1f539\":62943,\"1f53a\":62944,\"1f53b\":62945,\"1f53c\":62811,\"1f53d\":62813,\"1f549\":62778,\"1f54a\":2602,\"1f54b\":4854,\"1f54c\":4850,\"1f54d\":4852,\"1f54e\":62786,\"1f550\":4955,\"1f551\":4957,\"1f552\":4959,\"1f553\":4961,\"1f554\":4963,\"1f555\":4965,\"1f556\":4967,\"1f557\":4969,\"1f558\":4971,\"1f559\":4973,\"1f55a\":4975,\"1f55b\":4953,\"1f55c\":4956,\"1f55d\":4958,\"1f55e\":4960,\"1f55f\":4962,\"1f560\":4964,\"1f561\":4966,\"1f562\":4968,\"1f563\":4970,\"1f564\":4972,\"1f565\":4974,\"1f566\":4976,\"1f567\":4954,\"1f56f\":61213,\"1f570\":4952,\"1f573\":1156,\"1f574\":1587,\"1f575-200d-2640\":1497,\"1f575-200d-2642\":1496,\"1f575\":1495,\"1f576\":61111,\"1f577\":2641,\"1f578\":2642,\"1f579\":51087,\"1f57a\":1586,\"1f587\":61281,\"1f58a\":61261,\"1f58b\":61260,\"1f58c\":61262,\"1f58d\":61263,\"1f590\":1329,\"1f595\":1348,\"1f596\":1331,\"1f5a4\":1148,\"1f5a5\":61192,\"1f5a8\":61193,\"1f5b1\":61195,\"1f5b2\":61196,\"1f5bc\":51104,\"1f5c2\":61268,\"1f5c3\":61285,\"1f5c4\":61286,\"1f5d1\":61287,\"1f5d2\":61271,\"1f5d3\":61272,\"1f5dc\":61310,\"1f5dd\":61293,\"1f5de\":61231,\"1f5e1\":61299,\"1f5e3\":1683,\"1f5e8\":1160,\"1f5ef\":1161,\"1f5f3\":61257,\"1f5fa\":4810,\"1f5fb\":4816,\"1f5fc\":4847,\"1f5fd\":4848,\"1f5fe\":4811,\"1f5ff\":61362,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":114,\"1f608\":1103,\"1f609\":112,\"1f60a\":113,\"1f60b\":124,\"1f60c\":150,\"1f60d\":116,\"1f60e\":170,\"1f60f\":144,\"1f610\":139,\"1f611\":140,\"1f612\":145,\"1f613\":195,\"1f614\":151,\"1f615\":173,\"1f616\":192,\"1f617\":119,\"1f618\":118,\"1f619\":122,\"1f61a\":121,\"1f61b\":125,\"1f61c\":126,\"1f61d\":128,\"1f61e\":194,\"1f61f\":175,\"1f620\":1101,\"1f621\":1100,\"1f622\":189,\"1f623\":193,\"1f624\":199,\"1f625\":188,\"1f626\":184,\"1f627\":185,\"1f628\":186,\"1f629\":196,\"1f62a\":152,\"1f62b\":197,\"1f62c\":147,\"1f62d\":190,\"1f62e-200d-1f4a8\":148,\"1f62e\":178,\"1f62f\":179,\"1f630\":187,\"1f631\":191,\"1f632\":180,\"1f633\":181,\"1f634\":154,\"1f635-200d-1f4ab\":165,\"1f635\":164,\"1f636-200d-1f32b\":143,\"1f636\":141,\"1f637\":155,\"1f638\":1116,\"1f639\":1117,\"1f63a\":1115,\"1f63b\":1118,\"1f63c\":1119,\"1f63d\":1120,\"1f63e\":1123,\"1f63f\":1122,\"1f640\":1121,\"1f641\":176,\"1f642\":19,\"1f643\":110,\"1f644\":146,\"1f645-200d-2640\":1422,\"1f645-200d-2642\":1421,\"1f645\":1420,\"1f646-200d-2640\":1425,\"1f646-200d-2642\":1424,\"1f646\":1423,\"1f647-200d-2640\":1437,\"1f647-200d-2642\":1436,\"1f647\":1435,\"1f648\":1124,\"1f649\":1125,\"1f64a\":1126,\"1f64b-200d-2640\":1431,\"1f64b-200d-2642\":1430,\"1f64b\":1429,\"1f64c\":1359,\"1f64d-200d-2640\":1416,\"1f64d-200d-2642\":1415,\"1f64d\":1414,\"1f64e-200d-2640\":1419,\"1f64e-200d-2642\":1418,\"1f64e\":1417,\"1f64f\":1364,\"1f680\":4942,\"1f681\":4937,\"1f682\":4872,\"1f683\":4873,\"1f684\":4874,\"1f685\":4875,\"1f686\":4876,\"1f687\":4877,\"1f688\":4878,\"1f689\":4879,\"1f68a\":4880,\"1f68b\":4883,\"1f68c\":4884,\"1f68d\":4885,\"1f68e\":4886,\"1f68f\":4911,\"1f690\":4887,\"1f691\":4888,\"1f692\":4889,\"1f693\":4890,\"1f694\":4891,\"1f695\":4892,\"1f696\":4893,\"1f697\":4894,\"1f698\":4895,\"1f699\":4896,\"1f69a\":4898,\"1f69b\":4899,\"1f69c\":4900,\"1f69d\":4881,\"1f69e\":4882,\"1f69f\":4938,\"1f6a0\":4939,\"1f6a1\":4940,\"1f6a2\":4930,\"1f6a3-200d-2640\":1609,\"1f6a3-200d-2642\":1608,\"1f6a3\":1607,\"1f6a4\":4926,\"1f6a5\":4918,\"1f6a6\":4919,\"1f6a7\":4921,\"1f6a8\":4917,\"1f6a9\":71587,\"1f6aa\":61333,\"1f6ab\":62745,\"1f6ac\":61358,\"1f6ad\":62747,\"1f6ae\":62730,\"1f6af\":62748,\"1f6b0\":62731,\"1f6b1\":62749,\"1f6b2\":4907,\"1f6b3\":62746,\"1f6b4-200d-2640\":1621,\"1f6b4-200d-2642\":1620,\"1f6b4\":1619,\"1f6b5-200d-2640\":1624,\"1f6b5-200d-2642\":1623,\"1f6b5\":1622,\"1f6b6-200d-2640\":1566,\"1f6b6-200d-2642\":1565,\"1f6b6\":1564,\"1f6b7\":62750,\"1f6b8\":62743,\"1f6b9\":62733,\"1f6ba\":62734,\"1f6bb\":62735,\"1f6bc\":62736,\"1f6bd\":61340,\"1f6be\":62737,\"1f6bf\":61342,\"1f6c0\":1643,\"1f6c1\":61343,\"1f6c2\":62738,\"1f6c3\":62739,\"1f6c4\":62740,\"1f6c5\":62741,\"1f6cb\":61338,\"1f6cc\":1644,\"1f6cd\":61133,\"1f6ce\":4944,\"1f6cf\":61337,\"1f6d0\":62776,\"1f6d1\":4920,\"1f6d2\":61357,\"1f6d5\":4851,\"1f6d6\":4828,\"1f6d7\":61334,\"1f6e0\":61298,\"1f6e1\":61304,\"1f6e2\":4914,\"1f6e3\":4912,\"1f6e4\":4913,\"1f6e5\":4929,\"1f6e9\":4932,\"1f6eb\":4933,\"1f6ec\":4934,\"1f6f0\":4941,\"1f6f3\":4927,\"1f6f4\":4908,\"1f6f5\":4903,\"1f6f6\":4925,\"1f6f7\":51076,\"1f6f8\":4943,\"1f6f9\":4909,\"1f6fa\":4906,\"1f6fb\":4897,\"1f6fc\":4910,\"1f7e0\":62917,\"1f7e1\":62918,\"1f7e2\":62919,\"1f7e3\":62921,\"1f7e4\":62922,\"1f7e5\":62925,\"1f7e6\":62929,\"1f7e7\":62926,\"1f7e8\":62927,\"1f7e9\":62928,\"1f7ea\":62930,\"1f7eb\":62931,\"1f90c\":1337,\"1f90d\":1149,\"1f90e\":1147,\"1f90f\":1338,\"1f910\":137,\"1f911\":129,\"1f912\":156,\"1f913\":171,\"1f914\":135,\"1f915\":157,\"1f916\":1114,\"1f917\":130,\"1f918\":1343,\"1f919\":1344,\"1f91a\":1328,\"1f91b\":1356,\"1f91c\":1357,\"1f91d\":1363,\"1f91e\":1340,\"1f91f\":1342,\"1f920\":167,\"1f921\":1108,\"1f922\":158,\"1f923\":17,\"1f924\":153,\"1f925\":149,\"1f926-200d-2640\":1440,\"1f926-200d-2642\":1439,\"1f926\":1438,\"1f927\":160,\"1f928\":138,\"1f929\":117,\"1f92a\":127,\"1f92b\":134,\"1f92c\":1102,\"1f92d\":131,\"1f92e\":159,\"1f92f\":166,\"1f930\":1519,\"1f931\":1522,\"1f932\":1362,\"1f933\":1367,\"1f934\":1506,\"1f935-200d-2640\":1515,\"1f935-200d-2642\":1514,\"1f935\":1513,\"1f936\":1528,\"1f937-200d-2640\":1443,\"1f937-200d-2642\":1442,\"1f937\":1441,\"1f938-200d-2640\":1627,\"1f938-200d-2642\":1626,\"1f938\":1625,\"1f939-200d-2640\":1639,\"1f939-200d-2642\":1638,\"1f939\":1637,\"1f93a\":1597,\"1f93c-200d-2640\":1630,\"1f93c-200d-2642\":1629,\"1f93c\":1628,\"1f93d-200d-2640\":1633,\"1f93d-200d-2642\":1632,\"1f93d\":1631,\"1f93e-200d-2640\":1636,\"1f93e-200d-2642\":1635,\"1f93e\":1634,\"1f93f\":51073,\"1f940\":2654,\"1f941\":61180,\"1f942\":3791,\"1f943\":3792,\"1f944\":3802,\"1f945\":51069,\"1f947\":51048,\"1f948\":51049,\"1f949\":51050,\"1f94a\":51067,\"1f94b\":51068,\"1f94c\":51077,\"1f94d\":51064,\"1f94e\":51053,\"1f94f\":51059,\"1f950\":3710,\"1f951\":3693,\"1f952\":3700,\"1f953\":3721,\"1f954\":3695,\"1f955\":3696,\"1f956\":3711,\"1f957\":3738,\"1f958\":3734,\"1f959\":3730,\"1f95a\":3732,\"1f95b\":3780,\"1f95c\":3706,\"1f95d\":3689,\"1f95e\":3715,\"1f95f\":3757,\"1f960\":3758,\"1f961\":3759,\"1f962\":3799,\"1f963\":3737,\"1f964\":3794,\"1f965\":3692,\"1f966\":3702,\"1f967\":3773,\"1f968\":3713,\"1f969\":3720,\"1f96a\":3726,\"1f96b\":3742,\"1f96c\":3701,\"1f96d\":3681,\"1f96e\":3755,\"1f96f\":3714,\"1f970\":115,\"1f971\":198,\"1f972\":123,\"1f973\":168,\"1f974\":163,\"1f975\":161,\"1f976\":162,\"1f977\":1501,\"1f978\":169,\"1f97a\":182,\"1f97b\":61124,\"1f97c\":61113,\"1f97d\":61112,\"1f97e\":61138,\"1f97f\":61139,\"1f980\":3760,\"1f981\":2545,\"1f982\":2643,\"1f983\":2594,\"1f984\":2551,\"1f985\":2603,\"1f986\":2604,\"1f987\":2583,\"1f988\":2628,\"1f989\":2606,\"1f98a\":2540,\"1f98b\":2633,\"1f98c\":2553,\"1f98d\":2532,\"1f98e\":2615,\"1f98f\":2572,\"1f990\":3762,\"1f991\":3763,\"1f992\":2569,\"1f993\":2552,\"1f994\":2582,\"1f995\":2619,\"1f996\":2620,\"1f997\":2639,\"1f998\":2591,\"1f999\":2568,\"1f99a\":2610,\"1f99b\":2573,\"1f99c\":2611,\"1f99d\":2541,\"1f99e\":3761,\"1f99f\":2644,\"1f9a0\":2647,\"1f9a1\":2592,\"1f9a2\":2605,\"1f9a3\":2571,\"1f9a4\":2607,\"1f9a5\":2588,\"1f9a6\":2589,\"1f9a7\":2533,\"1f9a8\":2590,\"1f9a9\":2609,\"1f9aa\":3764,\"1f9ab\":2581,\"1f9ac\":2554,\"1f9ad\":2624,\"1f9ae\":2536,\"1f9af\":61312,\"1f9b4\":1380,\"1f9b5\":1371,\"1f9b6\":1372,\"1f9b7\":1379,\"1f9b8-200d-2640\":1532,\"1f9b8-200d-2642\":1531,\"1f9b8\":1530,\"1f9b9-200d-2640\":1535,\"1f9b9-200d-2642\":1534,\"1f9b9\":1533,\"1f9ba\":61114,\"1f9bb\":1374,\"1f9bc\":4905,\"1f9bd\":4904,\"1f9be\":1369,\"1f9bf\":1370,\"1f9c0\":3717,\"1f9c1\":3772,\"1f9c2\":3741,\"1f9c3\":3796,\"1f9c4\":3703,\"1f9c5\":3704,\"1f9c6\":3731,\"1f9c7\":3716,\"1f9c8\":3740,\"1f9c9\":3797,\"1f9ca\":3798,\"1f9cb\":3795,\"1f9cd-200d-2640\":1569,\"1f9cd-200d-2642\":1568,\"1f9cd\":1567,\"1f9ce-200d-2640\":1572,\"1f9ce-200d-2642\":1571,\"1f9ce\":1570,\"1f9cf-200d-2640\":1434,\"1f9cf-200d-2642\":1433,\"1f9cf\":1432,\"1f9d0\":172,\"1f9d1-200d-1f33e\":1456,\"1f9d1-200d-1f373\":1459,\"1f9d1-200d-1f37c\":1525,\"1f9d1-200d-1f384\":1529,\"1f9d1-200d-1f393\":1447,\"1f9d1-200d-1f3a4\":1477,\"1f9d1-200d-1f3a8\":1480,\"1f9d1-200d-1f3eb\":1450,\"1f9d1-200d-1f3ed\":1465,\"1f9d1-200d-1f4bb\":1474,\"1f9d1-200d-1f4bc\":1468,\"1f9d1-200d-1f527\":1462,\"1f9d1-200d-1f52c\":1471,\"1f9d1-200d-1f680\":1486,\"1f9d1-200d-1f692\":1489,\"1f9d1-200d-1f91d-200d-1f9d1\":1645,\"1f9d1-200d-1f9af\":1573,\"1f9d1-200d-1f9b0\":1402,\"1f9d1-200d-1f9b1\":1404,\"1f9d1-200d-1f9b2\":1408,\"1f9d1-200d-1f9b3\":1406,\"1f9d1-200d-1f9bc\":1576,\"1f9d1-200d-1f9bd\":1579,\"1f9d1-200d-2695\":1444,\"1f9d1-200d-2696\":1453,\"1f9d1-200d-2708\":1483,\"1f9d1\":1390,\"1f9d2\":1387,\"1f9d3\":1411,\"1f9d4-200d-2640\":1395,\"1f9d4-200d-2642\":1394,\"1f9d4\":1393,\"1f9d5\":1512,\"1f9d6-200d-2640\":1593,\"1f9d6-200d-2642\":1592,\"1f9d6\":1591,\"1f9d7-200d-2640\":1596,\"1f9d7-200d-2642\":1595,\"1f9d7\":1594,\"1f9d8-200d-2640\":1642,\"1f9d8-200d-2642\":1641,\"1f9d8\":1640,\"1f9d9-200d-2640\":1538,\"1f9d9-200d-2642\":1537,\"1f9d9\":1536,\"1f9da-200d-2640\":1541,\"1f9da-200d-2642\":1540,\"1f9da\":1539,\"1f9db-200d-2640\":1544,\"1f9db-200d-2642\":1543,\"1f9db\":1542,\"1f9dc-200d-2640\":1547,\"1f9dc-200d-2642\":1546,\"1f9dc\":1545,\"1f9dd-200d-2640\":1550,\"1f9dd-200d-2642\":1549,\"1f9dd\":1548,\"1f9de-200d-2640\":1553,\"1f9de-200d-2642\":1552,\"1f9de\":1551,\"1f9df-200d-2640\":1556,\"1f9df-200d-2642\":1555,\"1f9df\":1554,\"1f9e0\":1376,\"1f9e1\":1142,\"1f9e2\":61148,\"1f9e3\":61118,\"1f9e4\":61119,\"1f9e5\":61120,\"1f9e6\":61121,\"1f9e7\":51039,\"1f9e8\":51028,\"1f9e9\":51090,\"1f9ea\":61320,\"1f9eb\":61321,\"1f9ec\":61322,\"1f9ed\":4812,\"1f9ee\":61201,\"1f9ef\":61356,\"1f9f0\":61316,\"1f9f1\":4825,\"1f9f2\":61317,\"1f9f3\":4945,\"1f9f4\":61346,\"1f9f5\":51106,\"1f9f6\":51108,\"1f9f7\":61347,\"1f9f8\":51091,\"1f9f9\":61348,\"1f9fa\":61349,\"1f9fb\":61350,\"1f9fc\":61352,\"1f9fd\":61355,\"1f9fe\":61243,\"1f9ff\":51084,\"1fa70\":61142,\"1fa71\":61125,\"1fa72\":61126,\"1fa73\":61127,\"1fa74\":61135,\"1fa78\":61327,\"1fa79\":61329,\"1fa7a\":61331,\"1fa80\":51079,\"1fa81\":51080,\"1fa82\":4935,\"1fa83\":61302,\"1fa84\":51083,\"1fa85\":51092,\"1fa86\":51094,\"1fa90\":4993,\"1fa91\":61339,\"1fa92\":61345,\"1fa93\":61295,\"1fa94\":61217,\"1fa95\":61179,\"1fa96\":61149,\"1fa97\":61174,\"1fa98\":61181,\"1fa99\":61236,\"1fa9a\":61305,\"1fa9b\":61307,\"1fa9c\":61318,\"1fa9d\":61315,\"1fa9e\":61335,\"1fa9f\":61336,\"1faa0\":61341,\"1faa1\":51107,\"1faa2\":51109,\"1faa3\":61351,\"1faa4\":61344,\"1faa5\":61354,\"1faa6\":61360,\"1faa7\":61363,\"1faa8\":4826,\"1fab0\":2645,\"1fab1\":2646,\"1fab2\":2637,\"1fab3\":2640,\"1fab4\":2660,\"1fab5\":4827,\"1fab6\":2608,\"1fac0\":1377,\"1fac1\":1378,\"1fac2\":1686,\"1fad0\":3688,\"1fad1\":3699,\"1fad2\":3691,\"1fad3\":3712,\"1fad4\":3729,\"1fad5\":3736,\"1fad6\":3782,\"203c\":62834,\"21a9\":62765,\"21aa\":62766,\"231a\":4948,\"231b\":4946,\"23cf\":62818,\"23e9\":62805,\"23ea\":62809,\"23eb\":62812,\"23ec\":62814,\"23ed\":62806,\"23ee\":62810,\"23ef\":62807,\"23f0\":4949,\"23f1\":4950,\"23f2\":4951,\"23f3\":4947,\"23f8\":62815,\"23f9\":62816,\"23fa\":62817,\"24c2\":62890,\"25aa\":62938,\"25ab\":62939,\"25b6\":62804,\"25c0\":62808,\"25fb\":62935,\"25fc\":62934,\"25fd\":62937,\"25fe\":62936,\"260e\":61184,\"261d\":1350,\"262a\":62784,\"262e\":62785,\"262f\":62781,\"263a\":120,\"264a\":62790,\"264b\":62791,\"264c\":62792,\"264d\":62793,\"264e\":62794,\"264f\":62795,\"265f\":51099,\"267b\":62844,\"267e\":62833,\"267f\":62732,\"269b\":62777,\"269c\":62845,\"26a0\":62742,\"26a1\":41016,\"26a7\":62827,\"26aa\":62924,\"26ab\":62923,\"26b0\":61359,\"26b1\":61361,\"26bd\":51051,\"26be\":51052,\"26c4\":41019,\"26c5\":4999,\"26c8\":41000,\"26ce\":62800,\"26cf\":61296,\"26d1\":61150,\"26d3\":61314,\"26d4\":62744,\"26e9\":4853,\"26ea\":4849,\"26f0\":4814,\"26f1\":41015,\"26f2\":4855,\"26f3\":51070,\"26f4\":4928,\"26f5\":4924,\"26f7\":1599,\"26f8\":51071,\"26f9-200d-2640\":1615,\"26f9-200d-2642\":1614,\"26f9\":1613,\"26fa\":4856,\"26fd\":4915,\"270a\":1354,\"270b\":1330,\"270c\":1339,\"270d\":1365,\"270f\":61258,\"271d\":62782,\"274c\":62853,\"274e\":62854,\"2764-200d-1f525\":1139,\"2764-200d-1fa79\":1140,\"27a1\":62757,\"27b0\":62855,\"27bf\":62856,\"2b05\":62761,\"2b06\":62755,\"2b07\":62759,\"2b1b\":62932,\"2b1c\":62933,\"2b50\":4994,\"2b55\":62849,\"303d\":62857,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f48f-1f3fb\":0,\"1f48f-1f3fc\":0,\"1f48f-1f3fd\":0,\"1f48f-1f3fe\":0,\"1f48f-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f491-1f3fb\":0,\"1f491-1f3fc\":0,\"1f491-1f3fd\":0,\"1f491-1f3fe\":0,\"1f491-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91d-1f3fb\":0,\"1f91d-1f3fc\":0,\"1f91d-1f3fd\":0,\"1f91d-1f3fe\":0,\"1f91d-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb-200d-2640\":0,\"1f9d4-1f3fc-200d-2640\":0,\"1f9d4-1f3fd-200d-2640\":0,\"1f9d4-1f3fe-200d-2640\":0,\"1f9d4-1f3ff-200d-2640\":0,\"1f9d4-1f3fb-200d-2642\":0,\"1f9d4-1f3fc-200d-2642\":0,\"1f9d4-1f3fd-200d-2642\":0,\"1f9d4-1f3fe-200d-2642\":0,\"1f9d4-1f3ff-200d-2642\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = \"((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { Message, MessageEntity } from '../layer';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport copy from '../helpers/object/copy';\nimport encodeEntities from '../helpers/string/encodeEntities';\nimport Emoji, { EmojiVersions } from '../config/emoji';\nimport TLD from '../config/tld';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst alphaCharsRegExp = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nconst passConflictingEntities: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n export function getEmojiUnified(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!Emoji.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\n\n /* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n } */\n\n export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n \n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n }\n\n const CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n ]);\n export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n }\n\n function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n }\n\n /**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n\n contextHashtag?: string,\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean\n }> = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement, \n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontWeight = 'bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontStyle = 'italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: line-through;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: underline;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n \n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'var(--font-monospace)';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n \n break;\n }\n \n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n \n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version];\n if(emojiData.hasOwnProperty(entity.unicode)) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n //if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n \n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n nasty.i++;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? url\n : `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = `#/im?p=${encodeURIComponent(entity.user_id)}`;\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n element = document.createElement('a');\n element.className = 'mention';\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n // insertPart(entity, `
`, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = nasty.text.slice(0, entity.offset);\n const spoilerBefore = nasty.text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = partText = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = nasty.text.slice(entity.offset + entity.length);\n nasty.text = before + spoilerAfter + after;\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n }\n \n break;\n }\n }\n\n if(!usedText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentElement) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < (endOffset - 1)) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentElement) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n return fragment;\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n\n export function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n }\n \n /* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n } */\n \n /**\n * ! This function is still unsafe to use with .innerHTML\n */\n export function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n if(entities?.length) {\n entities = entities.filter(entity => entity._ === 'messageEntitySpoiler');\n }\n \n return wrapRichText(text, {\n entities, \n noEncoding: true,\n noTextFormat: true,\n noLinebreaks: true,\n noLinks: true\n }).textContent;\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return wrapRichText('');\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n // second regexp is for phone numbers (t.me/+38050...)\n if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n \n return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n \r\n // setTimeout(() => {\r\n doubleRaf().then(() => {\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n \r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n });\r\n // }, 0);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className)) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport type { AppMediaPlaybackController } from '../../components/appMediaPlaybackController';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { AutoDownloadSettings, Chat, NotifyPeer, PeerNotifySettings } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\nimport getTimeFormat from '../../helpers/getTimeFormat';\nimport copy from '../../helpers/object/copy';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport validateInitObject from '../../helpers/object/validateInitObject';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string, \n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n public oldVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const, \n 'private' as const, \n 'groups' as const, \n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach(mediaType => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach(peerType => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach(peerType => {\n delete autoDownloadSettings[peerType];\n });\n\n this.pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find(newTheme => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n this.pushToState('settings', state.settings);\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n this.oldVersion = state.version;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","import getDeepProperty from \"./getDeepProperty\";\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\nimport tsNow from './tsNow';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport {tsNow};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","export default function findAndSplice(array: Array, verify: (value: T, index?: number, array?: Array) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","export default function noop() {}\r\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every(key => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"../schedulers/pause\";\r\n\r\nconst texts = ['b', 'б'];\r\ntype FontType = 'text' | 'icons' | 'monospace';\r\n\r\nconst cache: {\r\n [key: string]: {\r\n [text: string]: Promise\r\n }\r\n} = {};\r\n\r\nconst fonts: {[type in FontType]: string} = {\r\n text: 'Roboto',\r\n icons: 'tgico',\r\n monospace: 'Roboto Mono'\r\n};\r\n\r\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\r\n text: texts,\r\n icons: undefined,\r\n monospace: texts\r\n}): Promise {\r\n if(!('fonts' in document)) {\r\n return Promise.resolve();\r\n }\r\n \r\n const promises: Promise[] = [];\r\n for(const type in types) {\r\n let _texts = types[type as FontType];\r\n if(_texts === 'all') {\r\n _texts = texts;\r\n }\r\n\r\n const font = fonts[type as FontType];\r\n const weights = type === 'icons' ? [500] : [400, 500];\r\n for(const weight of weights) {\r\n const _promises = (_texts || [undefined]).map(text => {\r\n const key = [weight, '1rem', font].join(' ');\r\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\r\n return promise;\r\n });\r\n promises.push(..._promises);\r\n }\r\n }\r\n\r\n return Promise.race([\r\n Promise.all(promises),\r\n pause(1000)\r\n ]);\r\n}\r\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","import { RestrictionReason } from \"../layer\";\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find(reason => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach(reason => {\n ignore.add(reason);\n });\n}\n","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach(key => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map(url => {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceID ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\nimport copy from \"../../helpers/object/copy\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.c0cc94110cda650246b2.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n \r\n private init() {\r\n this.worker = new WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n fileName = 'main-' + fileName;\r\n\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n\n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n}\n\nsetWorkerProxy();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from \"../helpers/bytes/bufferConcats\";\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport { IS_STICKY_INPUT_BUGGED } from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport { IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport appStateManager from './lib/appManagers/appStateManager';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !rootScope.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n //const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n //console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !rootScope.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n rootScope.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.addEventListener('overlay_toggle', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n let perf = performance.now();\n\n const langPromise = I18n.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.getState(), \n langPromise\n ]);\n I18n.setTimeFormat(state.settings.timeFormat);\n\n rootScope.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n pause(1000), \n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n \n if(this.hasAttribute(name)) {\n if(force) return true;\n \n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n \n this.setAttribute(name, \"\");\n return true;\n };\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.dc57886420f44ee8eaee.css b/public/main.dc57886420f44ee8eaee.css new file mode 100644 index 000000000..5abd811db --- /dev/null +++ b/public/main.dc57886420f44ee8eaee.css @@ -0,0 +1,4 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} +:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.25s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height:1.3125;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--esg-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#157ce1;--primary-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?5o4186) format("truetype"),url(assets/fonts/tgico.woff?5o4186) format("woff"),url(assets/fonts/tgico.svg?5o4186#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete:before{content:""}.tgico-delete_filled:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-flip:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward:before{content:""}.tgico-forward_filled:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-microphone_crossed:before{content:""}.tgico-microphone_crossed_filled:before{content:""}.tgico-microphone_filled:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-pip:before{content:""}.tgico-play:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply:before{content:""}.tgico-reply_filled:before{content:""}.tgico-rightpanel:before{content:""}.tgico-rotate_left:before{content:""}.tgico-rotate_right:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings:before{content:""}.tgico-settings_filled:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 6px;transform:translate(-.25rem,calc(var(--height)/-2 + .125rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.75);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:3}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin:0 .3125rem;padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.5rem 0;padding:0}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.75);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-left:var(--other-side-offset);margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#157ce1;background:var(--dark-primary-color);transition:background-color .2s,opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.25)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.25rem;height:var(--size);left:0;overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:3px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;cursor:pointer;display:inline-block;line-height:26px;margin-top:1px;min-height:24px;padding-left:3.375rem;position:relative;transition:opacity .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);left:0;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:.3125rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:4px 0 0}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;-webkit-user-drag:none;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title{color:#fff}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active b{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-background{fill:#fff!important}.chatlist-chat.active .verified-check{fill:#3390ec!important;fill:var(--primary-color)!important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist-chat span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:12px;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:50%;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner:not(.is-channel) .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.125rem;content:" ";left:-50%;position:absolute;top:-.125rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.125rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:-.125rem;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .25rem .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:18px;margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:1.25rem;padding:0 1px 0 3px}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in .reply.is-overriding-color:active,html.no-touch .bubble.is-in .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .name,.bubble.is-out.just-media .reply{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:6px;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem;margin-top:-.125rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3.5rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:calc(-.6875rem - 6px);box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main{--menu-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top:-3px;height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{max-width:100%;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short li:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:4px!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:4px!important;position:absolute;right:0}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);padding:12px 6px 6px;top:0;width:100%;z-index:2}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:initial;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill,40px)}.emoji-dropdown .emoji-padding.active .category-items>span{height:40px;justify-self:center;width:40px}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:0}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{margin:0 -.125rem;position:relative}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}.emoji-dropdown #content-stickers .scrollable{padding:0 5px}.emoji-dropdown .menu-horizontal-div{height:48px;width:100%}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:48px;line-height:48px;margin:0 12px;width:48px}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;margin-left:1px;margin-right:1px;padding:0;width:48px}.emoji-dropdown .stickers-padding .menu-wrapper{height:48px;max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{max-height:100%;max-width:100%;padding:8px}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{height:100%;width:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.gifs-masonry>.gif img,.gifs-masonry>.gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry>.gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(25px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;height:var(--size);position:absolute;right:0;top:0;width:var(--size)}.document-download,.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.6875rem 1rem;position:relative}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{height:3rem!important;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#2a9ef1;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{pointer-events:none;position:absolute}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:flex-end;display:flex;flex-direction:column;justify-content:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-right:1.125rem;margin-top:0!important}.popup-buttons .btn{border-radius:8px;font-weight:500;font-weight:var(--font-weight-bold);max-width:100%;padding:.5rem;position:relative;text-transform:uppercase}.popup-buttons .btn,.popup-buttons .btn+.btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popup-buttons .btn+.btn{margin-top:.5rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-weight:400;height:36px;margin-top:-3px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);margin:-3px 0 0;padding-left:1.5rem}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;margin-bottom:.625rem}.popup-peer .popup-container{max-width:min(400px,100%);padding:1rem 1.5rem .8125rem}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;text-overflow:ellipsis;word-break:break-word}.popup-peer .popup-buttons{margin-right:-.5rem;margin-top:1.625rem}.popup-peer .popup-buttons .btn{font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{align-items:center;display:flex;height:3.5rem;margin:0 -1.0625rem;padding:0 1.1875rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0;padding:0 2rem 0 1.5rem}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin-bottom:12px;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-call .popup-header,.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{border-bottom:1px solid transparent;border-top:1px solid transparent;margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -.625rem}.popup-mute .sidebar-left-section{margin-bottom:0!important;padding:0!important}.popup-mute .sidebar-left-section-content{margin:0!important}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--additional-height:.75rem;--reaction-size:1.5rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}[contenteditable] [style*=bold]{font-weight:500!important;font-weight:var(--font-weight-bold)!important}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:22.5rem;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast b{color:inherit}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{color:#a2acb4;content:attr(data-placeholder);display:block;pointer-events:none}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:Roboto!important;font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon{margin-left:.125rem}.premium-icon,.verified-icon{flex:0 0 auto;height:1.25rem;width:1.25rem}.premium-icon{line-height:1!important;margin-left:.25rem}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0} + +/*# sourceMappingURL=main.dc57886420f44ee8eaee.css.map*/ \ No newline at end of file diff --git a/public/main.dc57886420f44ee8eaee.css.map b/public/main.dc57886420f44ee8eaee.css.map new file mode 100644 index 000000000..ab511791b --- /dev/null +++ b/public/main.dc57886420f44ee8eaee.css.map @@ -0,0 +1 @@ +{"version":3,"file":"main.dc57886420f44ee8eaee.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.25s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height:1.3125;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--esg-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#157ce1;--primary-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?5o4186) format(\"truetype\"),url(assets/fonts/tgico.woff?5o4186) format(\"woff\"),url(assets/fonts/tgico.svg?5o4186#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-flip:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-microphone_crossed:before{content:\"\"}.tgico-microphone_crossed_filled:before{content:\"\"}.tgico-microphone_filled:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-pip:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-rotate_left:before{content:\"\"}.tgico-rotate_right:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 6px;transform:translate(-.25rem,calc(var(--height)/-2 + .125rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.75);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:3}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin:0 .3125rem;padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.5rem 0;padding:0}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.75);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-left:var(--other-side-offset);margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#157ce1;background:var(--dark-primary-color);transition:background-color .2s,opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.25)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.25rem;height:var(--size);left:0;overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:3px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;cursor:pointer;display:inline-block;line-height:26px;margin-top:1px;min-height:24px;padding-left:3.375rem;position:relative;transition:opacity .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);left:0;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:.3125rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:4px 0 0}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;-webkit-user-drag:none;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title{color:#fff}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active b{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-background{fill:#fff!important}.chatlist-chat.active .verified-check{fill:#3390ec!important;fill:var(--primary-color)!important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist-chat span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:overlay}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:12px;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:50%;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner:not(.is-channel) .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.125rem;content:\" \";left:-50%;position:absolute;top:-.125rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.125rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:-.125rem;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .25rem .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:18px;margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:1.25rem;padding:0 1px 0 3px}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in .reply.is-overriding-color:active,html.no-touch .bubble.is-in .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .name,.bubble.is-out.just-media .reply{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:6px;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem;margin-top:-.125rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.18);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3.5rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:calc(-.6875rem - 6px);box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main{--menu-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top:-3px;height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{max-width:100%;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short li:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:4px!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:4px!important;position:absolute;right:0}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);padding:12px 6px 6px;top:0;width:100%;z-index:2}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:initial;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill,40px)}.emoji-dropdown .emoji-padding.active .category-items>span{height:40px;justify-self:center;width:40px}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:0}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{margin:0 -.125rem;position:relative}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}.emoji-dropdown #content-stickers .scrollable{padding:0 5px}.emoji-dropdown .menu-horizontal-div{height:48px;width:100%}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:48px;line-height:48px;margin:0 12px;width:48px}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;margin-left:1px;margin-right:1px;padding:0;width:48px}.emoji-dropdown .stickers-padding .menu-wrapper{height:48px;max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{max-height:100%;max-width:100%;padding:8px}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{height:100%;width:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.gifs-masonry>.gif img,.gifs-masonry>.gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry>.gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(25px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;height:var(--size);position:absolute;right:0;top:0;width:var(--size)}.document-download,.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.6875rem 1rem;position:relative}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{height:3rem!important;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#2a9ef1;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{pointer-events:none;position:absolute}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:flex-end;display:flex;flex-direction:column;justify-content:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-right:1.125rem;margin-top:0!important}.popup-buttons .btn{border-radius:8px;font-weight:500;font-weight:var(--font-weight-bold);max-width:100%;padding:.5rem;position:relative;text-transform:uppercase}.popup-buttons .btn,.popup-buttons .btn+.btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popup-buttons .btn+.btn{margin-top:.5rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-weight:400;height:36px;margin-top:-3px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);margin:-3px 0 0;padding-left:1.5rem}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;margin-bottom:.625rem}.popup-peer .popup-container{max-width:min(400px,100%);padding:1rem 1.5rem .8125rem}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;text-overflow:ellipsis;word-break:break-word}.popup-peer .popup-buttons{margin-right:-.5rem;margin-top:1.625rem}.popup-peer .popup-buttons .btn{font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{align-items:center;display:flex;height:3.5rem;margin:0 -1.0625rem;padding:0 1.1875rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0;padding:0 2rem 0 1.5rem}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin-bottom:12px;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-call .popup-header,.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{border-bottom:1px solid transparent;border-top:1px solid transparent;margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.popup-mute .popup-container{width:16rem}.popup-mute .popup-body{margin:0 -.625rem}.popup-mute .sidebar-left-section{margin-bottom:0!important;padding:0!important}.popup-mute .sidebar-left-section-content{margin:0!important}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--additional-height:.75rem;--reaction-size:1.5rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}[contenteditable] [style*=bold]{font-weight:500!important;font-weight:var(--font-weight-bold)!important}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:22.5rem;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast b{color:inherit}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{color:#a2acb4;content:attr(data-placeholder);display:block;pointer-events:none}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{grid-column-gap:1px;display:grid;grid-template-columns:repeat(auto-fill,80px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:Roboto!important;font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon{margin-left:.125rem}.premium-icon,.verified-icon{flex:0 0 auto;height:1.25rem;width:1.25rem}.premium-icon{line-height:1!important;margin-left:.25rem}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.02f307d76034f3156ff7.bundle.worker.js b/public/mtproto.worker.02f307d76034f3156ff7.bundle.worker.js deleted file mode 100644 index 968b1045c..000000000 --- a/public/mtproto.worker.02f307d76034f3156ff7.bundle.worker.js +++ /dev/null @@ -1,4 +0,0 @@ -!function(e){var t={};function a(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,a),s.l=!0,s.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)a.d(n,s,function(t){return e[t]}.bind(null,s));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=3)}([function(e,t,a){(function(e){var n,s=function(e){"use strict";var t=1e7,a=9007199254740992,n=c(a),i="function"==typeof BigInt;function r(e,t,a,n){return void 0===e?r[0]:void 0!==t&&(10!=+t||a)?O(e,t,a,n):W(e)}function p(e,t){this.value=e,this.sign=t,this.isSmall=!1}function o(e){this.value=e,this.sign=e<0,this.isSmall=!0}function m(e){this.value=e}function d(e){return-a0?Math.floor(e):Math.ceil(e)}function h(e,a){var n,s,i=e.length,r=a.length,p=new Array(i),o=0,m=t;for(s=0;s=m?1:0,p[s]=n-o*m;for(;s0&&p.push(o),p}function f(e,t){return e.length>=t.length?h(e,t):h(t,e)}function _(e,a){var n,s,i=e.length,r=new Array(i),p=t;for(s=0;s0;)r[s++]=a%p,a=Math.floor(a/p);return r}function v(e,t){var a,n,s=e.length,i=t.length,r=new Array(s),p=0;for(a=0;a0;)r[s++]=o%p,o=Math.floor(o/p);return r}function S(e,t){for(var a=[];t-- >0;)a.push(0);return a.concat(e)}function I(e,a,n){return new p(e=0;--a)s=(i=1e7*s+e[a])-(n=u(i/t))*t,p[a]=0|n;return[p,0|s]}function A(e,a){var n,s=W(a);if(i)return[new m(e.value/s.value),new m(e.value%s.value)];var d,h=e.value,f=s.value;if(0===f)throw new Error("Cannot divide by zero");if(e.isSmall)return s.isSmall?[new o(u(h/f)),new o(h%f)]:[r[0],e];if(s.isSmall){if(1===f)return[e,r[0]];if(-1==f)return[e.negate(),r[0]];var _=Math.abs(f);if(_=0;s--){for(n=l-1,_[s+c]!==h&&(n=Math.floor((_[s+c]*l+_[s+c-1])/h)),i=0,r=0,o=v.length,p=0;po&&(s=1e7*(s+1)),a=Math.ceil(s/i);do{if(M(r=P(t,a),d)<=0)break;a--}while(a);m.push(a),d=v(d,r)}return m.reverse(),[y(m),y(d)]}(h,f))[0];var S=e.sign!==s.sign,I=n[1],k=e.sign;return"number"==typeof d?(S&&(d=-d),d=new o(d)):d=new p(d,S),"number"==typeof I?(k&&(I=-I),I=new o(I)):I=new p(I,k),[d,I]}function M(e,t){if(e.length!==t.length)return e.length>t.length?1:-1;for(var a=e.length-1;a>=0;a--)if(e[a]!==t[a])return e[a]>t[a]?1:-1;return 0}function R(e){var t=e.abs();return!t.isUnit()&&(!!(t.equals(2)||t.equals(3)||t.equals(5))||!(t.isEven()||t.isDivisibleBy(3)||t.isDivisibleBy(5))&&(!!t.lesser(49)||void 0))}function E(e,t){for(var a,n,i,r=e.prev(),p=r,o=0;p.isEven();)p=p.divide(2),o++;e:for(n=0;n=0?n=v(e,t):(n=v(t,e),a=!a),"number"==typeof(n=y(n))?(a&&(n=-n),new o(n)):new p(n,a)}(a,n,this.sign)},p.prototype.minus=p.prototype.subtract,o.prototype.subtract=function(e){var t=W(e),a=this.value;if(a<0!==t.sign)return this.add(t.negate());var n=t.value;return t.isSmall?new o(a-n):b(n,Math.abs(a),a>=0)},o.prototype.minus=o.prototype.subtract,m.prototype.subtract=function(e){return new m(this.value-W(e).value)},m.prototype.minus=m.prototype.subtract,p.prototype.negate=function(){return new p(this.value,!this.sign)},o.prototype.negate=function(){var e=this.sign,t=new o(-this.value);return t.sign=!e,t},m.prototype.negate=function(){return new m(-this.value)},p.prototype.abs=function(){return new p(this.value,!1)},o.prototype.abs=function(){return new o(Math.abs(this.value))},m.prototype.abs=function(){return new m(this.value>=0?this.value:-this.value)},p.prototype.multiply=function(e){var a,n,s,i=W(e),o=this.value,m=i.value,d=this.sign!==i.sign;if(i.isSmall){if(0===m)return r[0];if(1===m)return this;if(-1===m)return this.negate();if((a=Math.abs(m))0?function e(t,a){var n=Math.max(t.length,a.length);if(n<=30)return w(t,a);n=Math.ceil(n/2);var s=t.slice(n),i=t.slice(0,n),r=a.slice(n),p=a.slice(0,n),o=e(i,p),m=e(s,r),d=e(f(i,s),f(p,r)),c=f(f(o,S(v(v(d,o),m),n)),S(m,2*n));return l(c),c}(o,m):w(o,m),d)},p.prototype.times=p.prototype.multiply,o.prototype._multiplyBySmall=function(e){return d(e.value*this.value)?new o(e.value*this.value):I(Math.abs(e.value),c(Math.abs(this.value)),this.sign!==e.sign)},p.prototype._multiplyBySmall=function(e){return 0===e.value?r[0]:1===e.value?this:-1===e.value?this.negate():I(Math.abs(e.value),this.value,this.sign!==e.sign)},o.prototype.multiply=function(e){return W(e)._multiplyBySmall(this)},o.prototype.times=o.prototype.multiply,m.prototype.multiply=function(e){return new m(this.value*W(e).value)},m.prototype.times=m.prototype.multiply,p.prototype.square=function(){return new p(k(this.value),!1)},o.prototype.square=function(){var e=this.value*this.value;return d(e)?new o(e):new p(k(c(Math.abs(this.value))),!1)},m.prototype.square=function(e){return new m(this.value*this.value)},p.prototype.divmod=function(e){var t=A(this,e);return{quotient:t[0],remainder:t[1]}},m.prototype.divmod=o.prototype.divmod=p.prototype.divmod,p.prototype.divide=function(e){return A(this,e)[0]},m.prototype.over=m.prototype.divide=function(e){return new m(this.value/W(e).value)},o.prototype.over=o.prototype.divide=p.prototype.over=p.prototype.divide,p.prototype.mod=function(e){return A(this,e)[1]},m.prototype.mod=m.prototype.remainder=function(e){return new m(this.value%W(e).value)},o.prototype.remainder=o.prototype.mod=p.prototype.remainder=p.prototype.mod,p.prototype.pow=function(e){var t,a,n,s=W(e),i=this.value,p=s.value;if(0===p)return r[1];if(0===i)return r[0];if(1===i)return r[1];if(-1===i)return s.isEven()?r[1]:r[-1];if(s.sign)return r[0];if(!s.isSmall)throw new Error("The exponent "+s.toString()+" is too large.");if(this.isSmall&&d(t=Math.pow(i,p)))return new o(u(t));for(a=this,n=r[1];!0&p&&(n=n.times(a),--p),0!==p;)p/=2,a=a.square();return n},o.prototype.pow=p.prototype.pow,m.prototype.pow=function(e){var t=W(e),a=this.value,n=t.value,s=BigInt(0),i=BigInt(1),p=BigInt(2);if(n===s)return r[1];if(a===s)return r[0];if(a===i)return r[1];if(a===BigInt(-1))return t.isEven()?r[1]:r[-1];if(t.isNegative())return new m(s);for(var o=this,d=r[1];(n&i)===i&&(d=d.times(o),--n),n!==s;)n/=p,o=o.square();return d},p.prototype.modPow=function(e,t){if(e=W(e),(t=W(t)).isZero())throw new Error("Cannot take modPow with modulus 0");var a=r[1],n=this.mod(t);for(e.isNegative()&&(e=e.multiply(r[-1]),n=n.modInv(t));e.isPositive();){if(n.isZero())return r[0];e.isOdd()&&(a=a.multiply(n).mod(t)),e=e.divide(2),n=n.square().mod(t)}return a},m.prototype.modPow=o.prototype.modPow=p.prototype.modPow,p.prototype.compareAbs=function(e){var t=W(e),a=this.value,n=t.value;return t.isSmall?1:M(a,n)},o.prototype.compareAbs=function(e){var t=W(e),a=Math.abs(this.value),n=t.value;return t.isSmall?a===(n=Math.abs(n))?0:a>n?1:-1:-1},m.prototype.compareAbs=function(e){var t=this.value,a=W(e).value;return(t=t>=0?t:-t)===(a=a>=0?a:-a)?0:t>a?1:-1},p.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=W(e),a=this.value,n=t.value;return this.sign!==t.sign?t.sign?1:-1:t.isSmall?this.sign?-1:1:M(a,n)*(this.sign?-1:1)},p.prototype.compareTo=p.prototype.compare,o.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=W(e),a=this.value,n=t.value;return t.isSmall?a==n?0:a>n?1:-1:a<0!==t.sign?a<0?-1:1:a<0?1:-1},o.prototype.compareTo=o.prototype.compare,m.prototype.compare=function(e){if(e===1/0)return-1;if(e===-1/0)return 1;var t=this.value,a=W(e).value;return t===a?0:t>a?1:-1},m.prototype.compareTo=m.prototype.compare,p.prototype.equals=function(e){return 0===this.compare(e)},m.prototype.eq=m.prototype.equals=o.prototype.eq=o.prototype.equals=p.prototype.eq=p.prototype.equals,p.prototype.notEquals=function(e){return 0!==this.compare(e)},m.prototype.neq=m.prototype.notEquals=o.prototype.neq=o.prototype.notEquals=p.prototype.neq=p.prototype.notEquals,p.prototype.greater=function(e){return this.compare(e)>0},m.prototype.gt=m.prototype.greater=o.prototype.gt=o.prototype.greater=p.prototype.gt=p.prototype.greater,p.prototype.lesser=function(e){return this.compare(e)<0},m.prototype.lt=m.prototype.lesser=o.prototype.lt=o.prototype.lesser=p.prototype.lt=p.prototype.lesser,p.prototype.greaterOrEquals=function(e){return this.compare(e)>=0},m.prototype.geq=m.prototype.greaterOrEquals=o.prototype.geq=o.prototype.greaterOrEquals=p.prototype.geq=p.prototype.greaterOrEquals,p.prototype.lesserOrEquals=function(e){return this.compare(e)<=0},m.prototype.leq=m.prototype.lesserOrEquals=o.prototype.leq=o.prototype.lesserOrEquals=p.prototype.leq=p.prototype.lesserOrEquals,p.prototype.isEven=function(){return 0==(1&this.value[0])},o.prototype.isEven=function(){return 0==(1&this.value)},m.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)},p.prototype.isOdd=function(){return 1==(1&this.value[0])},o.prototype.isOdd=function(){return 1==(1&this.value)},m.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)},p.prototype.isPositive=function(){return!this.sign},o.prototype.isPositive=function(){return this.value>0},m.prototype.isPositive=o.prototype.isPositive,p.prototype.isNegative=function(){return this.sign},o.prototype.isNegative=function(){return this.value<0},m.prototype.isNegative=o.prototype.isNegative,p.prototype.isUnit=function(){return!1},o.prototype.isUnit=function(){return 1===Math.abs(this.value)},m.prototype.isUnit=function(){return this.abs().value===BigInt(1)},p.prototype.isZero=function(){return!1},o.prototype.isZero=function(){return 0===this.value},m.prototype.isZero=function(){return this.value===BigInt(0)},p.prototype.isDivisibleBy=function(e){var t=W(e);return!t.isZero()&&(!!t.isUnit()||(0===t.compareAbs(2)?this.isEven():this.mod(t).isZero()))},m.prototype.isDivisibleBy=o.prototype.isDivisibleBy=p.prototype.isDivisibleBy,p.prototype.isPrime=function(e){var t=R(this);if(void 0!==t)return t;var a=this.abs(),n=a.bitLength();if(n<=64)return E(a,[2,3,5,7,11,13,17,19,23,29,31,37]);for(var i=Math.log(2)*n.toJSNumber(),r=Math.ceil(!0===e?2*Math.pow(i,2):i),p=[],o=0;o-a?new o(e-1):new p(n,!0)},m.prototype.prev=function(){return new m(this.value-BigInt(1))};for(var D=[1];2*D[D.length-1]<=t;)D.push(2*D[D.length-1]);var T=D.length,V=D[T-1];function B(e){return Math.abs(e)<=t}function U(e,t,a){t=W(t);for(var n=e.isNegative(),i=t.isNegative(),r=n?e.not():e,p=i?t.not():t,o=0,m=0,d=null,c=null,y=[];!r.isZero()||!p.isZero();)o=(d=A(r,V))[1].toJSNumber(),n&&(o=V-1-o),m=(c=A(p,V))[1].toJSNumber(),i&&(m=V-1-m),r=d[0],p=c[0],y.push(a(o,m));for(var l=0!==a(n?1:0,i?1:0)?s(-1):s(0),g=y.length-1;g>=0;g-=1)l=l.multiply(V).add(s(y[g]));return l}p.prototype.shiftLeft=function(e){var t=W(e).toJSNumber();if(!B(t))throw new Error(String(t)+" is too large for shifting.");if(t<0)return this.shiftRight(-t);var a=this;if(a.isZero())return a;for(;t>=T;)a=a.multiply(V),t-=T-1;return a.multiply(D[t])},m.prototype.shiftLeft=o.prototype.shiftLeft=p.prototype.shiftLeft,p.prototype.shiftRight=function(e){var t,a=W(e).toJSNumber();if(!B(a))throw new Error(String(a)+" is too large for shifting.");if(a<0)return this.shiftLeft(-a);for(var n=this;a>=T;){if(n.isZero()||n.isNegative()&&n.isUnit())return n;n=(t=A(n,V))[1].isNegative()?t[0].prev():t[0],a-=T-1}return(t=A(n,D[a]))[1].isNegative()?t[0].prev():t[0]},m.prototype.shiftRight=o.prototype.shiftRight=p.prototype.shiftRight,p.prototype.not=function(){return this.negate().prev()},m.prototype.not=o.prototype.not=p.prototype.not,p.prototype.and=function(e){return U(this,e,(function(e,t){return e&t}))},m.prototype.and=o.prototype.and=p.prototype.and,p.prototype.or=function(e){return U(this,e,(function(e,t){return e|t}))},m.prototype.or=o.prototype.or=p.prototype.or,p.prototype.xor=function(e){return U(this,e,(function(e,t){return e^t}))},m.prototype.xor=o.prototype.xor=p.prototype.xor;function x(e){var a=e.value,n="number"==typeof a?a|1<<30:"bigint"==typeof a?a|BigInt(1<<30):a[0]+a[1]*t|1073758208;return n&-n}function F(e,t){return e=W(e),t=W(t),e.greater(t)?e:t}function L(e,t){return e=W(e),t=W(t),e.lesser(t)?e:t}function N(e,t){if(e=W(e).abs(),t=W(t).abs(),e.equals(t))return e;if(e.isZero())return t;if(t.isZero())return e;for(var a,n,s=r[1];e.isEven()&&t.isEven();)a=L(x(e),x(t)),e=e.divide(a),t=t.divide(a),s=s.multiply(a);for(;e.isEven();)e=e.divide(x(e));do{for(;t.isEven();)t=t.divide(x(t));e.greater(t)&&(n=t,t=e,e=n),t=t.subtract(e)}while(!t.isZero());return s.isUnit()?e:e.multiply(s)}p.prototype.bitLength=function(){var e=this;return e.compareTo(s(0))<0&&(e=e.negate().subtract(s(1))),0===e.compareTo(s(0))?s(0):s(function e(t,a){if(a.compareTo(t)<=0){var n=e(t,a.square(a)),i=n.p,r=n.e,p=i.multiply(a);return p.compareTo(t)<=0?{p:p,e:2*r+1}:{p:i,e:2*r}}return{p:s(1),e:0}}(e,s(2)).e).add(s(1))},m.prototype.bitLength=o.prototype.bitLength=p.prototype.bitLength;var O=function(e,t,a,n){a=a||"0123456789abcdefghijklmnopqrstuvwxyz",e=String(e),n||(e=e.toLowerCase(),a=a.toLowerCase());var s,i=e.length,r=Math.abs(t),p={};for(s=0;s=r)){if("1"===d&&1===r)continue;throw new Error(d+" is not a valid digit in base "+t+".")}}t=W(t);var o=[],m="-"===e[0];for(s=m?1:0;s"!==e[s]&&s=0;n--)s=s.add(e[n].times(i)),i=i.times(t);return a?s.negate():s}function G(e,t){if((t=s(t)).isZero()){if(e.isZero())return{value:[0],isNegative:!1};throw new Error("Cannot convert nonzero numbers to base 0.")}if(t.equals(-1)){if(e.isZero())return{value:[0],isNegative:!1};if(e.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-e.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:!1};var a=Array.apply(null,Array(e.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);return a.unshift([1]),{value:[].concat.apply([],a),isNegative:!1}}var n=!1;if(e.isNegative()&&t.isPositive()&&(n=!0,e=e.abs()),t.isUnit())return e.isZero()?{value:[0],isNegative:!1}:{value:Array.apply(null,Array(e.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:n};for(var i,r=[],p=e;p.isNegative()||p.compareAbs(t)>=0;){i=p.divmod(t),p=i.quotient;var o=i.remainder;o.isNegative()&&(o=t.minus(o).abs(),p=p.next()),r.push(o.toJSNumber())}return r.push(p.toJSNumber()),{value:r.reverse(),isNegative:n}}function K(e,t,a){var n=G(e,t);return(n.isNegative?"-":"")+n.value.map((function(e){return function(e,t){return e<(t=t||"0123456789abcdefghijklmnopqrstuvwxyz").length?t[e]:"<"+e+">"}(e,a)})).join("")}function j(e){if(d(+e)){var t=+e;if(t===u(t))return i?new m(BigInt(t)):new o(t);throw new Error("Invalid integer: "+e)}var a="-"===e[0];a&&(e=e.slice(1));var n=e.split(/e/i);if(n.length>2)throw new Error("Invalid integer: "+n.join("e"));if(2===n.length){var s=n[1];if("+"===s[0]&&(s=s.slice(1)),(s=+s)!==u(s)||!d(s))throw new Error("Invalid integer: "+s+" is not a valid exponent.");var r=n[0],c=r.indexOf(".");if(c>=0&&(s-=r.length-c-1,r=r.slice(0,c)+r.slice(c+1)),s<0)throw new Error("Cannot include negative exponent part for integers");e=r+=new Array(s+1).join("0")}if(!/^([0-9][0-9]*)$/.test(e))throw new Error("Invalid integer: "+e);if(i)return new m(BigInt(a?"-"+e:e));for(var y=[],g=e.length,h=g-7;g>0;)y.push(+e.slice(h,g)),(h-=7)<0&&(h=0),g-=7;return l(y),new p(y,a)}function W(e){return"number"==typeof e?function(e){if(i)return new m(BigInt(e));if(d(e)){if(e!==u(e))throw new Error(e+" is not an integer.");return new o(e)}return j(e.toString())}(e):"string"==typeof e?j(e):"bigint"==typeof e?new m(e):e}p.prototype.toArray=function(e){return G(this,e)},o.prototype.toArray=function(e){return G(this,e)},m.prototype.toArray=function(e){return G(this,e)},p.prototype.toString=function(e,t){if(void 0===e&&(e=10),10!==e)return K(this,e,t);for(var a,n=this.value,s=n.length,i=String(n[--s]);--s>=0;)a=String(n[s]),i+="0000000".slice(a.length)+a;return(this.sign?"-":"")+i},o.prototype.toString=function(e,t){return void 0===e&&(e=10),10!=e?K(this,e,t):String(this.value)},m.prototype.toString=o.prototype.toString,m.prototype.toJSON=p.prototype.toJSON=o.prototype.toJSON=function(){return this.toString()},p.prototype.valueOf=function(){return parseInt(this.toString(),10)},p.prototype.toJSNumber=p.prototype.valueOf,o.prototype.valueOf=function(){return this.value},o.prototype.toJSNumber=o.prototype.valueOf,m.prototype.valueOf=m.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};for(var z=0;z<1e3;z++)r[z]=W(z),z>0&&(r[-z]=W(-z));return r.one=r[1],r.zero=r[0],r.minusOne=r[-1],r.max=F,r.min=L,r.gcd=N,r.lcm=function(e,t){return e=W(e).abs(),t=W(t).abs(),e.divide(N(e,t)).multiply(t)},r.isInstance=function(e){return e instanceof p||e instanceof o||e instanceof m},r.randBetween=function(e,a,n){e=W(e),a=W(a);var s=n||Math.random,i=L(e,a),p=F(e,a).subtract(i).add(1);if(p.isSmall)return i.add(Math.floor(s()*p));for(var o=G(p,t).value,m=[],d=!0,c=0;c{let s=65535&e|0,i=e>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{s=s+t[n++]|0,i=i+s|0}while(--r);s%=65521,i%=65521}return s|i<<16|0};const a=new Uint32Array((()=>{let e,t=[];for(var a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t})());var n=(e,t,n,s)=>{const i=a,r=s+n;e^=-1;for(let a=s;a>>8^i[255&(e^t[a])];return-1^e},s=function(e,t){let a,n,s,i,r,p,o,m,d,c,y,l,g,u,h,f,_,v,b,w,P,S,I,k;const C=e.state;a=e.next_in,I=e.input,n=a+(e.avail_in-5),s=e.next_out,k=e.output,i=s-(t-e.avail_out),r=s+(e.avail_out-257),p=C.dmax,o=C.wsize,m=C.whave,d=C.wnext,c=C.window,y=C.hold,l=C.bits,g=C.lencode,u=C.distcode,h=(1<>>24,y>>>=v,l-=v,v=_>>>16&255,0===v)k[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(y&(1<>>=v,l-=v),l<15&&(y+=I[a++]<>>24,y>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=u[(65535&_)+(y&(1<p){e.msg="invalid distance too far back",C.mode=30;break e}if(y>>>=v,l-=v,v=s-i,w>v){if(v=w-v,v>m&&C.sane){e.msg="invalid distance too far back",C.mode=30;break e}if(P=0,S=c,0===d){if(P+=o-v,v2;)k[s++]=S[P++],k[s++]=S[P++],k[s++]=S[P++],b-=3;b&&(k[s++]=S[P++],b>1&&(k[s++]=S[P++]))}else{P=s-w;do{k[s++]=k[P++],k[s++]=k[P++],k[s++]=k[P++],b-=3}while(b>2);b&&(k[s++]=k[P++],b>1&&(k[s++]=k[P++]))}break}}break}}while(a>3,a-=b,l-=b<<3,y&=(1<{const y=c.bits;let l,g,u,h,f,_,v=0,b=0,w=0,P=0,S=0,I=0,k=0,C=0,A=0,M=0,R=null,E=0;const D=new Uint16Array(16),T=new Uint16Array(16);let V,B,U,x=null,F=0;for(v=0;v<=15;v++)D[v]=0;for(b=0;b=1&&0===D[P];P--);if(S>P&&(S=P),0===P)return s[m++]=20971520,s[m++]=20971520,c.bits=1,0;for(w=1;w0&&(0===e||1!==P))return-1;for(T[1]=0,v=1;v<15;v++)T[v+1]=T[v]+D[v];for(b=0;b852||2===e&&A>592)return 1;for(;;){V=v-k,d[b]<_?(B=0,U=d[b]):d[b]>_?(B=x[F+d[b]],U=R[E+d[b]]):(B=96,U=0),l=1<>k)+g]=V<<24|B<<16|U|0}while(0!==g);for(l=1<>=1;if(0!==l?(M&=l-1,M+=l):M=0,b++,0==--D[v]){if(v===P)break;v=t[a+d[b]]}if(v>S&&(M&h)!==u){for(0===k&&(k=S),f+=w,I=v-k,C=1<852||2===e&&A>592)return 1;u=M&h,s[u]=S<<24|I<<16|f-m|0}}return 0!==M&&(s[f+M]=v-k<<24|64<<16|0),c.bits=S,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:c,Z_BLOCK:y,Z_TREES:l,Z_OK:g,Z_STREAM_END:u,Z_NEED_DICT:h,Z_STREAM_ERROR:f,Z_DATA_ERROR:_,Z_MEM_ERROR:v,Z_BUF_ERROR:b,Z_DEFLATED:w}=d,P=12,S=30,I=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function k(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const C=e=>{if(!e||!e.state)return f;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,g},A=e=>{if(!e||!e.state)return f;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,C(e)},M=(e,t)=>{let a;if(!e||!e.state)return f;const n=e.state;return t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,A(e))},R=(e,t)=>{if(!e)return f;const a=new k;e.state=a,a.window=null;const n=M(e,t);return n!==g&&(e.state=null),n};let E,D,T=!0;const V=e=>{if(T){E=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(m(1,e.lens,0,288,E,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;m(2,e.lens,0,32,D,0,e.work,{bits:5}),T=!1}e.lencode=E,e.lenbits=9,e.distcode=D,e.distbits=5},B=(e,t,a,n)=>{let s;const i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(t.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(s=i.wsize-i.wnext,s>n&&(s=n),i.window.set(t.subarray(a-n,a-n+s),i.wnext),(n-=s)?(i.window.set(t.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave{let i,r,p,o,d,k,C,A,M,R,E,D,T,U,x,F,L,N,O,q,G,K,j=0;const W=new Uint8Array(4);let z,H;const J=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return f;i=e.state,i.mode===P&&(i.mode=13),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,k=e.avail_in,A=i.hold,M=i.bits,R=k,E=C,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>>8&255,i.check=n(i.check,W,2,0),A=0,M=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&A)<<8)+(A>>8))%31){e.msg="incorrect header check",i.mode=S;break}if((15&A)!==w){e.msg="unknown compression method",i.mode=S;break}if(A>>>=4,M-=4,G=8+(15&A),0===i.wbits)i.wbits=G;else if(G>i.wbits){e.msg="invalid window size",i.mode=S;break}i.dmax=1<>8&1),512&i.flags&&(W[0]=255&A,W[1]=A>>>8&255,i.check=n(i.check,W,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===k)break e;k--,A+=r[o++]<>>8&255,W[2]=A>>>16&255,W[3]=A>>>24&255,i.check=n(i.check,W,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>8),512&i.flags&&(W[0]=255&A,W[1]=A>>>8&255,i.check=n(i.check,W,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>>8&255,i.check=n(i.check,W,2,0)),A=0,M=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(D=i.length,D>k&&(D=k),D&&(i.head&&(G=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(r.subarray(o,o+D),G)),512&i.flags&&(i.check=n(i.check,r,D,o)),k-=D,o+=D,i.length-=D),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===k)break e;D=0;do{G=r[o+D++],i.head&&G&&i.length<65536&&(i.head.name+=String.fromCharCode(G))}while(G&&D>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=P;break;case 10:for(;M<32;){if(0===k)break e;k--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===k)break e;k--,A+=r[o++]<>>=1,M-=1,3&A){case 0:i.mode=14;break;case 1:if(V(i),i.mode=20,a===l){A>>>=2,M-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=S}A>>>=2,M-=2;break;case 14:for(A>>>=7&M,M-=7&M;M<32;){if(0===k)break e;k--,A+=r[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=S;break}if(i.length=65535&A,A=0,M=0,i.mode=15,a===l)break e;case 15:i.mode=16;case 16:if(D=i.length,D){if(D>k&&(D=k),D>C&&(D=C),0===D)break e;p.set(r.subarray(o,o+D),d),k-=D,o+=D,C-=D,d+=D,i.length-=D;break}i.mode=P;break;case 17:for(;M<14;){if(0===k)break e;k--,A+=r[o++]<>>=5,M-=5,i.ndist=1+(31&A),A>>>=5,M-=5,i.ncode=4+(15&A),A>>>=4,M-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=S;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,M-=3}for(;i.have<19;)i.lens[J[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,z={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,z),i.lenbits=z.bits,K){e.msg="invalid code lengths set",i.mode=S;break}i.have=0,i.mode=19;case 19:for(;i.have>>24,F=j>>>16&255,L=65535&j,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(H=x+2;M>>=x,M-=x,0===i.have){e.msg="invalid bit length repeat",i.mode=S;break}G=i.lens[i.have-1],D=3+(3&A),A>>>=2,M-=2}else if(17===L){for(H=x+3;M>>=x,M-=x,G=0,D=3+(7&A),A>>>=3,M-=3}else{for(H=x+7;M>>=x,M-=x,G=0,D=11+(127&A),A>>>=7,M-=7}if(i.have+D>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=S;break}for(;D--;)i.lens[i.have++]=G}}if(i.mode===S)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=S;break}if(i.lenbits=9,z={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,z),i.lenbits=z.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,z={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,z),i.distbits=z.bits,K){e.msg="invalid distances set",i.mode=S;break}if(i.mode=20,a===l)break e;case 20:i.mode=21;case 21:if(k>=6&&C>=258){e.next_out=d,e.avail_out=C,e.next_in=o,e.avail_in=k,i.hold=A,i.bits=M,s(e,E),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,k=e.avail_in,A=i.hold,M=i.bits,i.mode===P&&(i.back=-1);break}for(i.back=0;j=i.lencode[A&(1<>>24,F=j>>>16&255,L=65535&j,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>N)],x=j>>>24,F=j>>>16&255,L=65535&j,!(N+x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,i.length=L,0===F){i.mode=26;break}if(32&F){i.back=-1,i.mode=P;break}if(64&F){e.msg="invalid literal/length code",i.mode=S;break}i.extra=15&F,i.mode=22;case 22:if(i.extra){for(H=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;j=i.distcode[A&(1<>>24,F=j>>>16&255,L=65535&j,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>N)],x=j>>>24,F=j>>>16&255,L=65535&j,!(N+x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,64&F){e.msg="invalid distance code",i.mode=S;break}i.offset=L,i.extra=15&F,i.mode=24;case 24:if(i.extra){for(H=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=S;break}i.mode=25;case 25:if(0===C)break e;if(D=E-C,i.offset>D){if(D=i.offset-D,D>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=S;break}D>i.wnext?(D-=i.wnext,T=i.wsize-D):T=i.wnext-D,D>i.length&&(D=i.length),U=i.window}else U=p,T=d-i.offset,D=i.length;D>C&&(D=C),C-=D,i.length-=D;do{p[d++]=U[T++]}while(--D);0===i.length&&(i.mode=21);break;case 26:if(0===C)break e;p[d++]=i.length,C--,i.mode=21;break;case 27:if(i.wrap){for(;M<32;){if(0===k)break e;k--,A|=r[o++]<{if(!e||!e.state)return f;let t=e.state;return t.window&&(t.window=null),e.state=null,g},N=(e,t)=>{if(!e||!e.state)return f;const a=e.state;return 0==(2&a.wrap)?f:(a.head=t,t.done=!1,g)},O=(e,a)=>{const n=a.length;let s,i,r;return e&&e.state?(s=e.state,0!==s.wrap&&11!==s.mode?f:11===s.mode&&(i=1,i=t(i,a,n,0),i!==s.check)?_:(r=B(e,a,n,n),r?(s.mode=31,v):(s.havedict=1,g))):f};const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let G=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){G=!1}const K=new Uint8Array(256);for(let e=0;e<256;e++)K[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;K[254]=K[254]=1;var j=(e,t)=>{let a,n;const s=t||e.length,i=new Array(2*s);for(n=0,a=0;a4)i[n++]=65533,a+=r-1;else{for(t&=2===r?31:3===r?15:7;r>1&&a1?i[n++]=65533:t<65536?i[n++]=t:(t-=65536,i[n++]=55296|t>>10&1023,i[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&G)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let a="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let a=t-1;for(;a>=0&&128==(192&e[a]);)a--;return a<0||0===a?t:a+K[e[a]]>t?a:t},z={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},H=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},J=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Z=Object.prototype.toString,{Z_NO_FLUSH:Q,Z_FINISH:$,Z_OK:X,Z_STREAM_END:Y,Z_NEED_DICT:ee,Z_STREAM_ERROR:te,Z_DATA_ERROR:ae,Z_MEM_ERROR:ne}=d;function se(e){this.options=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const t in a)q(a,t)&&(e[t]=a[t])}}return e}({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new H,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==X)throw new Error(z[a]);if(this.header=new J,N(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=(e=>{let t,a,n,s,i,r=e.length,p=0;for(s=0;s>>6,t[i++]=128|63&a):a<65536?(t[i++]=224|a>>>12,t[i++]=128|a>>>6&63,t[i++]=128|63&a):(t[i++]=240|a>>>18,t[i++]=128|a>>>12&63,t[i++]=128|a>>>6&63,t[i++]=128|63&a);return t})(t.dictionary):"[object ArrayBuffer]"===Z.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(a=O(this.strm,t.dictionary),a!==X)))throw new Error(z[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||z[a.err];return a.result}se.prototype.push=function(e,t){const a=this.strm,n=this.options.chunkSize,s=this.options.dictionary;let i,r,p;if(this.ended)return!1;for(r=t===~~t?t:!0===t?$:Q,"[object ArrayBuffer]"===Z.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=F(a,r),i===ee&&s&&(i=O(a,s),i===X?i=F(a,r):i===ae&&(i=ee));a.avail_in>0&&i===Y&&a.state.wrap>0&&0!==e[a.next_in];)U(a),i=F(a,r);switch(i){case te:case ae:case ee:case ne:return this.onEnd(i),this.ended=!0,!1}if(p=a.avail_out,a.next_out&&(0===a.avail_out||i===Y))if("string"===this.options.to){let e=W(a.output,a.next_out),t=a.next_out-e,s=j(a.output,e);a.next_out=t,a.avail_out=n-t,t&&a.output.set(a.output.subarray(e,e+t),0),this.onData(s)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==X||0!==p){if(i===Y)return i=L(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},se.prototype.onData=function(e){this.chunks.push(e)},se.prototype.onEnd=function(e){e===X&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(e=>{let t=0;for(let a=0,n=e.length;ae+(t.byteLength||t.length),0),a=new Uint8Array(t);let n=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length}),a}a.r(t),a.d(t,"isWebpSupported",(function(){return na})),Uint8Array.prototype.concat=function(...e){return n(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(e){const t=t=>Promise.resolve(e()).then(t);return this.then(e=>t(()=>e),e=>t(()=>Promise.reject(e)))};const s={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};s.http=location.search.indexOf("http=1")>0,s.http&&(s.transport="https");var i=s;const r=i.debug,p="undefined"!=typeof window?window:self;var o=r;const m="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,d="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!m,c=d||m,y=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(a=>{a.length&&a.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},l=(...e)=>{self.postMessage(...e)},g=()=>{},u=m?y.bind(null,!1):d?l:g,h=m?y.bind(null,!0):d?l:g;class f{constructor(){this.prefix="",this.cache={},this.useStorage=!0,i.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const a in e)if(e.hasOwnProperty(a)){const n=e[a];if(this.cache[a]=n,this.useStorage&&!t)try{const e=JSON.stringify(n);localStorage.setItem(this.prefix+a,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class _{constructor(){this.taskId=0,this.tasks={},_.STORAGES.push(this),c||(this.storage=new f)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((a,n)=>{if(c){const n=this.taskId++;this.tasks[n]=a;u({type:"localStorageProxy",id:n,payload:{type:e,args:t}})}else{t=Array.prototype.slice.call(t);a(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}_.STORAGES=[];const v=new _;p.appStorage=v;var b=v,w={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],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:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],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:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-1460809483,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-551616469,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-1938625919,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{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:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],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"}],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"}],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"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"bot_attach_menu",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-468280483,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"},{name:"menu_button",type:"BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-362240487,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_scheduled",type:"flags.2?true"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:1370914559,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"string"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-381896846,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{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:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{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:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{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"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{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:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],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"}],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:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:-396644838,method:"messages.getUnreadReactions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-2099097129,method:"messages.readReactions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:451818415,method:"messages.toggleBotInAttachMenu",params:[{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:262163967,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"reply_to_msg_id",type:"flags.0?int"}],type:"WebViewResult"},{id:-768945848,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"}],type:"Bool"},{id:1790652275,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"}]},layer:140};function P(e){const t=e.length,a=new Array(t);for(let n=0;n>>0}function E(e,t){return e=R(e),t=R(t),M()(e).shiftLeft(32).add(M()(t)).toString(10)}const D=+w.API.constructors.find(e=>"boolFalse"===e.predicate).id,T=+w.API.constructors.find(e=>"boolTrue"===e.predicate).id,V=+w.API.constructors.find(e=>"vector"===e.predicate).id,B=+w.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class U{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(T,(t||"")+":bool"):this.writeInt(D,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);"string"!=typeof e&&(e=e?e.toString():"0");const{quotient:a,remainder:n}=M()(e).divmod(4294967296),s=a.toJSNumber(),i=n.toJSNumber();this.writeInt(i,(t||"")+":long[low]"),this.writeInt(s,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),n=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(n[0],(t||"")+":double[low]"),this.writeInt(n[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const n=a.length;n<=253?this.byteView[this.offset++]=n:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&n,this.byteView[this.offset++]=(65280&n)>>8,this.byteView[this.offset++]=(16711680&n)>>16);for(let e=0;e>>",P(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const n=e.length;if(t%32||8*n!==t){const s=new Error("Invalid bits: "+t+", "+n);throw console.error(s,e,a),s}this.debug&&console.log(">>>",P(e),(a||"")+":int"+t),this.checkLength(n),this.byteView.set(e,this.offset),this.offset+=n}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",P(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?w.MTProto:w.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const n=t.pFlags||t,s={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),s=e[0].split(".");if(!(t[s[0]]&1<<+s[1])){if(!("true"===e[1]?n[i.name]:void 0!==t[i.name]))continue;t[s[0]]|=1<<+s[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,s[i.name]=r)}for(let e in s)this.intView[s[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(V,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const n=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===s);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+s+" found");s===t&&(i=!0),i||this.writeInt(r.id,a+"["+s+"][id]");const p=e.pFlags,o={};for(const t of r.params){let n=t.type;if(-1!==n.indexOf("?")){const a=n.split("?"),s=a[0].split(".");if(!(e[s[0]]&1<<+s[1])){if(!("true"===a[1]?p&&p[t.name]:void 0!==e[t.name]))continue;e[s[0]]|=1<<+s[1]}n=a[1]}const i=this.storeObject(e[t.name],n,a+"["+s+"]["+t.name+"]");"#"===n&&(e[t.name]=e[t.name]||0,o[t.name]=i)}for(let t in o)this.intView[o[t]]=e[t];return r.type}}class x{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),P(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),n=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),n[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=E(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===T||t!==D&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,n="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const n=new Array(e);for(let t=0;t0){const s=e.substr(7,e.length-8);for(let e=0;ee.type===t),!n)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===B){const a=C(this.fetchBytes(t+"[packed_string]"));return new x(a).fetchObject(e,t)}if(i===V)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e0&&p{const t=new Uint8Array(e.length);for(let a=0;a{const a=t.subtract(e);return!(a.isNegative()||a.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:_,a_for_hash:v,u:b}=yield(()=>j(this,void 0,void 0,(function*(){for(;;){const e=F(c(t.secure_random)),a=r.modPow(e,i);if(f(a,i)){const t=L(a),s=F(yield Ve.invokeCrypto("sha256",n(t,u)));if(!s.isZero()&&!s.isNegative())return{a:e,a_for_hash:t,u:s}}}})))();let w;w=y.greater(h)?y:y.add(i),w=w.subtract(h).mod(i);const S=b.multiply(o),I=_.add(S),k=w.modPow(I,i),C=yield Ve.invokeCrypto("sha256",m(L(k),256));let A=yield Ve.invokeCrypto("sha256",l);A=G(A,yield Ve.invokeCrypto("sha256",g));const R=n(A,yield Ve.invokeCrypto("sha256",s.salt1),yield Ve.invokeCrypto("sha256",s.salt2),v,u,C),E=yield Ve.invokeCrypto("sha256",R);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(v),M1:E}}))}var z=new Uint8Array(256),H=new Uint8Array(256),J=new Uint32Array(256),Z=new Uint32Array(256),Q=new Uint32Array(256),$=new Uint32Array(256),X=new Uint32Array(256),Y=new Uint32Array(256),ee=new Uint32Array(256),te=new Uint32Array(256);function ae(e){if(e instanceof Uint32Array)return e;if("string"==typeof e){if(e.length%4!=0)for(var t=e.length%4;t<=4;t++)e+="\0x00";var a=new Uint32Array(e.length/4);for(t=0;t>7),r[i[m]^m]=m;for(;!z[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,z[p]=a,H[a]=p,s=16843009*i[t=i[e=i[p]]]^65537*t^257*e^16843008*p,n=257*i[a]^16843008*a,J[p]=n=n<<24^n>>>8,Z[p]=n=n<<24^n>>>8,Q[p]=n=n<<24^n>>>8,$[p]=n=n<<24^n>>>8,X[a]=s=s<<24^s>>>8,Y[a]=s=s<<24^s>>>8,ee[a]=s=s<<24^s>>>8,te[a]=s=s<<24^s>>>8,o=r[o]||1}();var se=function(){function e(e){var t=ae(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var a,n=1,s=t.length;s<4*t.length+28;s++)a=this.encKey[s-1],(s%t.length==0||8===t.length&&s%t.length==4)&&(a=z[a>>>24]<<24^z[a>>16&255]<<16^z[a>>8&255]<<8^z[255&a],s%t.length==0&&(a=a<<8^a>>>24^n<<24,n=n<<1^283*(n>>7))),this.encKey[s]=this.encKey[s-t.length]^a;for(var i=0;s;i++,s--)a=this.encKey[3&i?s:s-4],this.decKey[i]=s<=4||i<4?a:X[z[a>>>24]]^Y[z[a>>16&255]]^ee[z[a>>8&255]]^te[z[255&a]]}return e.prototype.encrypt=function(e){for(var t,a,n,s=ae(e),i=new Uint32Array(4),r=s[0]^this.encKey[0],p=s[1]^this.encKey[1],o=s[2]^this.encKey[2],m=s[3]^this.encKey[3],d=this.encKey.length/4-2,c=4,y=0;y>>24]^Z[p>>16&255]^Q[o>>8&255]^$[255&m]^this.encKey[c],a=J[p>>>24]^Z[o>>16&255]^Q[m>>8&255]^$[255&r]^this.encKey[c+1],n=J[o>>>24]^Z[m>>16&255]^Q[r>>8&255]^$[255&p]^this.encKey[c+2],m=J[m>>>24]^Z[r>>16&255]^Q[p>>8&255]^$[255&o]^this.encKey[c+3],r=t,p=a,o=n,c+=4;for(y=0;y<4;y++)i[y]=z[r>>>24]<<24^z[p>>16&255]<<16^z[o>>8&255]<<8^z[255&m]^this.encKey[c++],t=r,r=p,p=o,o=m,m=t;return i},e.prototype.decrypt=function(e){for(var t,a,n,s=ae(e),i=new Uint32Array(4),r=s[0]^this.decKey[0],p=s[3]^this.decKey[1],o=s[2]^this.decKey[2],m=s[1]^this.decKey[3],d=this.decKey.length/4-2,c=4,y=0;y>>24]^Y[p>>16&255]^ee[o>>8&255]^te[255&m]^this.decKey[c],a=X[p>>>24]^Y[o>>16&255]^ee[m>>8&255]^te[255&r]^this.decKey[c+1],n=X[o>>>24]^Y[m>>16&255]^ee[r>>8&255]^te[255&p]^this.decKey[c+2],m=X[m>>>24]^Y[r>>16&255]^ee[p>>8&255]^te[255&o]^this.decKey[c+3],r=t,p=a,o=n,c+=4;for(y=0;y<4;y++)i[3&-y]=H[r>>>24]<<24^H[p>>16&255]<<16^H[o>>8&255]<<8^H[255&m]^this.decKey[c++],t=r,r=p,p=o,o=m,m=t;return i},e}(),ie=function(){function e(e,t,a){void 0===a&&(a=16),this.key=ae(e),this.iv=ae(t),this.cipher=new se(e),this.blockSize=a/4}return e.prototype.encrypt=function(e,t){for(var a=ae(e),n=t||new Uint32Array(a.length),s=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),r=new Uint32Array(this.blockSize),p=0;p=this.blockSize&&this.incrementCounter(),s&&(i-=s,s=0)}return this.offset=(this.offset+a.length%4)%4,n},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}(),se);function pe(e){const t=new Uint8Array(e.byteLength);for(let a=0,n=4*e.length;a>>2]>>>24-a%4*8&255;return t}function oe(e){const t=K(e),a=[];for(let e=0,n=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}function me(e,t,a,n=!0){return pe(new ie(oe(t),oe(a))[n?"encrypt":"decrypt"](oe(e)))}function de(e,t,a){return me(q(e),t,a,!0)}function ce(e,t,a){return me(e,t,a,!1)}var ye="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle,le=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function ge(e,t,a){return le(this,void 0,void 0,(function*(){const n=yield ye.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return ye.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},n,512).then(e=>new Uint8Array(e))}))}function ue(e){const t=e.length,a=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(a[n++]=parseInt(e.charAt(0),16));for(let s=n;snew Uint8Array(e))}function _e(e){return ye.digest("SHA-256",K(e)).then(e=>new Uint8Array(e))}const ve={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function be(e){const t=ve[e];return crypto.getRandomValues(t),t[0]}function we(){return""+be(32)+be(32)%16777215}function Pe(e,t){return M.a.randBetween(e,t,()=>be(32)/4294967295)}function Se(e){const t=M.a[2];if(e.remainder(t).isZero())return t;const a=M()(1e3);let n,s,i,r,p,o,m;do{n=Pe(M.a.one,e.minus(1))}while(n.isZero()||n.eq(e.minus(t)));i=Pe(M.a.one,e.minus(1)),p=M.a.one,o=M.a.one;const d=M()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),c=a=>((a=(a=a.pow(t).mod(e)).add(n)).lesser(n)&&(a=a.add(d)),a=a.mod(e));do{s=i;for(let e=0;M()(e).lesser(p);++e)i=c(i);let t=M.a.zero;do{r=i;const n=M.a.min(a,p.minus(t));for(let t=0;M()(t).lesser(n);++t)i=c(i),o=o.multiply(s.greater(i)?s.minus(i):i.minus(s)).mod(e);m=M.a.gcd(o,e),t=t.add(a)}while(t.lesser(p)&&m.eq(M.a.one));p=p.shiftLeft(M.a.one)}while(m.eq(M.a.one));if(m.eq(e))do{r=c(r),m=M.a.gcd(s.minus(r).abs(),e)}while(m.eq(M.a.one));return m}function Ie(e){let t=function(e){const t=F(e),a=[],n=[];let s=Se(t);a.push(t.divide(s)),a.push(s);do{const e=a.pop();if(!e.eq(M.a.one))if(e.isPrime(!0)){n.push(e);for(let t=0;te.compare(t)),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce((e,t)=>e.multiply(t),M.a.one)]);const a=t[0],n=t[t.length-1];return(a.lesser(n)?[a,n]:[n,a]).map(e=>L(e))}var ke=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function Ce(e){return ke(this,void 0,void 0,(function*(){const{p:t,g:a}=e,n=(e=>{for(;;){const t=O(new Uint8Array(e.length)),a=F(t);if(!a.greater(M.a.one))continue;const n=F(e);if(a.lesser(n.subtract(M.a.one)))return t}})(t),s=ue(a.toString(16)),i=q(yield Ve.invokeCrypto("mod-pow",s,n,t),256,!0,!0,!0);return{a:n,g_a:i,g_a_hash:yield Ve.invokeCrypto("sha256",i),p:t}}))}var Ae=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function Me(e,t,a){return Ae(this,void 0,void 0,(function*(){const n=yield Ve.invokeCrypto("mod-pow",e,t,a);return{key:n,key_fingerprint:F((yield Ve.invokeCrypto("sha1",n)).slice(-8).reverse()).toString(10)}}))}var Re=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};function Ee(e){const t=e.length,a=8*t;let n=M()(e[0]).and(127).shiftLeft(a-8);for(let s=1;s{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|be(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return E(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),n=Math.abs(this.timeOffset-a)>10;if(this.lastMessageId=[0,0],this.timeOffset!==a){b.set({server_time_offset:a}),this.timeOffset=a;u({type:"applyServerTimeOffset",payload:a})}return n}};p.timeManager=Be;var Ue=Be;var xe="undefined"!=typeof window?window:self;const Fe=navigator?navigator.userAgent:null,Le=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&xe.MSStream,!!("safari"in xe)||!(!Fe||!(/\b(iPad|iPhone|iPod)\b/.test(Fe)||Fe.match("Safari")&&!Fe.match("Chrome")))),Ne=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i);var Oe;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(Oe||(Oe={}));const qe=[Oe.None,Oe.Error,Oe.Warn,Oe.Log,Oe.Debug],Ge=Date.now();function Ke(){return"["+((Date.now()-Ge)/1e3).toFixed(3)+"]"}let je;const We=Le||Ne;je=We?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const ze=!We,He=We?2:3;function Je(){const e=(new Error).stack.split("\n"),t=e[He]||e[e.length-1];return"["+(je(t)||"")+"]"}const Ze={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},Qe=[["debug",Oe.Debug],["info",Oe.Log],["warn",Oe.Warn],["error",Oe.Error],["assert",Oe.Error],["trace",Oe.Log]];function $e(e,t=Oe.Log|Oe.Warn|Oe.Error,a=!1,n=""){let s;o||a||(t=Oe.Error),ze?n||(m?n=Ze.yellow:d&&(n=Ze.cyan)):n="";let i=n;n=n?`%s ${n}%s`:"%s";const r=function(...a){return t&Oe.Log&&console.log(n,Ke(),e,Je(),...a)};return Qe.forEach(([a,s])=>{r[a]=function(...i){return t&s&&console[a](n,Ke(),e,Je(),...i)}}),r.setPrefix=function(t){s=t,e="["+t+"]"},r.setPrefix(e),r.setLevel=function(e){t=qe.slice(0,e+1).reduce((e,t)=>e|t,0)},r.bindPrefix=function(e){return $e(`${s}] [${e}`,t,a,i)},r}const Xe={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.3",versionFull:"1.4.3 (177)",build:177,langPackVersion:"0.4.0",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};Xe.isMainDomain&&(Xe.id=2496,Xe.hash="8da85b0d5bfe62527e5b244c209159c3");var Ye=Xe;function et(){}function tt(e){return new Promise(t=>{setTimeout(t,e)})}function at(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((a,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,a(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(et).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}function nt(e,t){const a=e.findIndex(t);return-1!==a?e.splice(a,1)[0]:void 0}class st{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,a){var n,s;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:a}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(s=a)||void 0===s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,a){this.listeners[e]&&nt(this.listeners[e],e=>e.callback===t)}_dispatchEvent(e,t,...a){this.reuseResults&&(this.listenerResults[e]=a);const n=t&&[],s=this.listeners[e];if(s){s.slice().forEach(t=>{var i;if(-1===s.findIndex(e=>e.callback===t.callback))return;let r;try{r=t.callback(...a)}catch(e){console.error(e)}n&&n.push(r),(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,t.callback)})}return n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}function it(e,t){const a=e.indexOf(t),n=-1!==a&&e.splice(a,1);return n&&n[0]}class rt extends st{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.debug=i.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let n=Oe.Error|Oe.Log;return this.debug&&(n|=Oe.Debug),this.log=$e("WS-"+e+a,n),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}var pt,ot,mt,dt,ct=function(e,t,a,n,s){if("m"===n)throw new TypeError("Private method is not writable");if("a"===n&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===n?s.call(e,a):s?s.value=a:t.set(e,a),a},yt=function(e,t,a,n){if("a"===a&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?n:"a"===a?n.call(e):n?n.value:t.get(e)};class lt{constructor(e){this.counter=e}increment(){const e=this.counter;for(let t=15;t>=0;--t){if(255!==e[t]){++e[t];break}e[t]=0}}}class gt{constructor(e,t){pt.set(this,void 0),ot.set(this,void 0),mt.set(this,void 0),dt.set(this,void 0),ct(this,pt,new lt(t),"f"),ct(this,dt,new re(e),"f"),ct(this,mt,16,"f")}update(e){var t,a;const n=e.slice();for(let e=0;e{this.connected=!0,At.setTransportOpened("websocket");const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(ht.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",P(t))},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),n=a-this.lastCloseTime;e=!isNaN(n)&&n{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(ht.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let r=Oe.Error|Oe.Log;this.debug&&(r|=Oe.Debug),this.log=$e("TCP-"+t+n,r),this.log("constructor"),this.connect()}clear(){this.connected&&At.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.pending.forEach(e=>{e.reject&&e.reject()}),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,n)=>{this.pending.push({resolve:a,reject:n,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",n.length),i||(i=a.encoded=this.encodeBody(n)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let vt=0;class bt extends st{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++vt,wt.set(this.id,this);const n={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};h(n)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};h(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};h(e)}}const wt=new Map,Pt=i.test?"_test":"";class St{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=i.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+Pt,s=`wss://${Ye.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;return new _t(Le&&d&&void 0!==bt?bt:rt,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let n;if(i.ssl||!i.http){n="https://"+(this.sslSubdomains[e-1]+("client"!==t?"-1":""))+".web.telegram.org/"+(i.test?"apiw_test1":"apiw1")}else for(let t of this.dcOptions)if(t.id===e){n="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new Rt(e,n,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=i.transport,n=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const s=this.chosenServers[a][t];e in s||(s[e]=[]);const r=s[e];if(!r.length||!n){let s;const i="client"===t?"":"-1";return s=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,i),s?(n&&r.push(s),s):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const n in e[a])for(const s in e[a][n]){it(e[a][n][s],t)}}}const It=new St;p&&(p.dcConfigurator=It);var kt=It,Ct=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var At=new class extends st{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",e=>{e.get("websocket")||this.waitForWebSocket()}),setTimeout(()=>{this.waitForWebSocket()},200)}pingTransports(){return Ct(this,void 0,void 0,(function*(){const e=this.transports={https:kt.chooseServer(Ye.baseDcId,"client","https",!1),websocket:kt.chooseServer(Ye.baseDcId,"client","websocket",!1)},t=at();this.transports.https._send(new Uint8Array,"no-cors").then(()=>t.resolve(!0),()=>t.resolve(!1)),setTimeout(()=>t.resolve(!1),2e3);const a=at(),n=e.websocket;n.setAutoReconnect(!1),n.connection.addEventListener("close",()=>a.resolve(!1),{once:!0}),n.connection.addEventListener("open",()=>a.resolve(!0),{once:!0}),setTimeout(()=>{a.isFulfilled||a.isRejected||(n.connection&&n.connection.close(),a.resolve(!1))},2e3);const[s,i]=yield Promise.all([t,a]);for(const t in e){e[t].destroy()}return{https:s||this.opened.get("https")>0,websocket:i||this.opened.get("websocket")>0}}))}waitForWebSocket(){return Ct(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield tt(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}},Mt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class Rt{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=i.debug&&!1;let n=Oe.Error|Oe.Log;this.debug&&(n|=Oe.Debug),this.log=$e("HTTP-"+e+a,n),this.log("constructor"),this.connected=!1}_send(e,t){return this.debug&&this.log.debug("-> body length to send:",e.length),fetch(this.url,{method:"POST",body:e,mode:t}).then(e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then(e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))}),e;return this.setConnected(!0),e.arrayBuffer().then(e=>new Uint8Array(e))},e=>{throw this.setConnected(!1),e})}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,At.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach(e=>e.reject()),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})});return this.releasePending(),t}}releasePending(){return Mt(this,void 0,void 0,(function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=at(),a=this.delays,n=this.delays.pingMaxTime,s=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,n),i=Math.round(a.disconnectDelayMin+s/n*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,p=Date.now(),o=this.lastPingDelayDisconnectId=we(),m={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:o,disconnect_delay:i},m),this.log(`sendPingDelayDisconnect: ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${m.messageId}`);const d=self.setTimeout(t.reject,r);t.then(e=>{clearTimeout(d);const t=Date.now()-p;if(this.lastPingTime=t/1e3,this.log(`sendPingDelayDisconnect: pong, reason='${e}', time=${s}, msgId=${m.messageId}`),t>r)throw void 0;return tt(Math.max(0,this.delays.pingInterval-t))}).catch(()=>{clearTimeout(d);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(this.log.error("sendPingDelayDisconnect: catch, closing connection",this.lastPingTime,m.messageId),e.connection.close())}).finally(()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())})},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()})},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new U({mtproto:!0}),a=we();t.storeMethod("ping",{ping_id:a});const n={msg_id:Ue.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(ht.Connecting),this.sendEncryptedRequest(n).then(()=>{this.toggleOffline(!1)},()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=xe.setTimeout(()=>this.checkConnection("from failed checkConnection request"),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)})},this.authKeyUint8=K(this.authKey),this.serverSalt=K(n),this.isFileUpload=!!s.fileUpload,this.isFileDownload=!!s.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Tt.file:Tt.client;const r=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+r,this.log=$e(this.name,Oe.Log|Oe.Debug|Oe.Error|Oe.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=O(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&function(e,t){for(let a=e.length-1;a>=0;--a)t(e[a],a,e)}(t.inner,(e,a)=>{const n=this.updateSentMessage(e);n?t.inner[a]=n.msg_id:t.inner.splice(a,1)}),t.msg_id=Ue.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const n=new U({mtproto:!0});n.storeMethod(e,t);const s=Ue.generateId(),r=this.generateSeqNo(),p={msg_id:s,seq_no:r,body:n.getBytes(!0)};return i.debug&&this.log("MT call",e,t,s,r),this.pushMessage(p,a)}wrapMtpMessage(e,t){const a=new U({mtproto:!0});a.storeObject(e,"Object");const n=Ue.generateId(),s=this.generateSeqNo(t.notContentRelated),r={msg_id:n,seq_no:s,body:a.getBytes(!0)};return i.debug&&this.log("MT message",e,n,s),this.pushMessage(r,t)}wrapApiCall(e,t={},a={}){const n=new U(a);if(!this.connectionInited){const e=w.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");n.storeInt(+e.id,"invokeWithLayer"),n.storeInt(w.layer,"layer");const t=w.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");n.storeInt(+t.id,"initConnection"),n.storeInt(0,"flags"),n.storeInt(Ye.id,"api_id"),n.storeString(Ft.userAgent||"Unknown UserAgent","device_model"),n.storeString(navigator.platform||"Unknown Platform","system_version"),n.storeString(Ye.version+(Ye.isMainDomain?" "+Ye.suffix:""),"app_version"),n.storeString(navigator.language||"en","system_lang_code"),n.storeString(Ye.langPack,"lang_pack"),n.storeString(Ft.language,"lang_code")}if(a.afterMessageId){if(void 0===Bt){const e=w.API.methods.find(e=>"invokeAfterMsg"===e.method);Bt=e?+e.id:0}Bt?(n.storeInt(Bt,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:Ue.generateId(),seq_no:this.generateSeqNo(),body:n.getBytes(!0),isAPI:!0};return i.debug?this.log("Api call",e,s,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(s,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof Rt&&(this.longPollInterval=xe.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(ht.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){if(this.sendingLongPoll)return;this.sendingLongPoll=!0;this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then(()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)},e=>{this.log("Long-poll failed",e)}).finally(()=>{this.sendingLongPoll=void 0})}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(ht.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=xe.setTimeout(()=>this.checkConnection("from toggleOfline"),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(ht.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?ht.Closed:ht.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then(e=>(this.toggleOffline(!1),this.parseResponse(e).then(e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))),e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1)).then(e=>{const t=this.sentMessages;a.forEach(a=>{const n=t[a];if(n){const s=n.deferred;delete t[a],delete this.pendingMessages[a],e?s.resolve():s.reject()}})})}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=at()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),S(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(ht.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=xe.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){var a;const n=e===ht.Connected,s=this.status!==e;this.isOnline=n,this.status=e,s&&(Ft.onConnectionStatusChange&&Ft.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,n=this.sentMessages[e];if(n.container)for(const e of n.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;n.acked&&this.log.error("pushResend: acked message?",n),this.debug&&this.log.debug("pushResend:",e,n,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Dt(this,void 0,void 0,(function*(){const a=t?0:8,s=n(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield Ve.invokeCrypto("sha256",s);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),s=new Uint8Array(52),i=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),i.push(Ve.invokeCrypto("sha256",n)),s.set(this.authKeyUint8.subarray(40+a,40+a+36),0),s.set(e,36),i.push(Ve.invokeCrypto("sha256",s)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),n=new Uint8Array(e[0]),s=new Uint8Array(e[1]);return t.set(n.subarray(0,8)),t.set(s.subarray(8,24),8),t.set(n.subarray(24,32),24),a.set(s.subarray(0,8)),a.set(n.subarray(8,24),8),a.set(s.subarray(24,32),24),[t,a]})}isStopped(){return Ft.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Vt),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let n=0,s=!1,i=!1,r=!1;const p=Object.keys(this.pendingMessages).map(e=>M()(e)).sort((e,t)=>e.compare(t)).map(e=>e.toString(10));for(const e of p){const p=this.sentMessages[e];if(p&&p.body){const e=p.body.length+32;if(n+e>655360&&(this.log.warn("lengthOverflow",p,a),r=!0,t))break;a.push(p),n+=e,p.isAPI?s=!0:p.longPoll&&(i=!0),t=p}delete this.pendingMessages[e]}if(this.transport instanceof Rt&&s&&!i){const e=new U({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:Ue.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const o=a.filter(e=>e.noResponse).map(e=>e.msg_id);if(a.length>1){const e=this.generateContainerMessage(n,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const m=this.sendEncryptedRequest(t);this.transport instanceof Rt&&this.handleSentEncryptedRequestHTTP(m,t,o),this.transport instanceof Rt||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new U({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const n=[];t.forEach((e,t)=>{n.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const s={msg_id:Ue.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:n};return i.debug&&this.log.warn("Container",n,s.msg_id,s.seq_no),{message:s,messageWithBody:Object.assign({body:a.getBytes(!0)},s)}}getEncryptedMessage(e){return Dt(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield Ve.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>Ve.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new U({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+be(8)%5),i=n(a,O(new Uint8Array(s)));return this.getEncryptedMessage(i).then(e=>{const t=new U({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return Dt(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof Rt))return a;const n={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then(e=>{if(!(null==e?void 0:e.byteLength))throw n;return e},e=>{throw e.message||e.type||(e=Object.assign(n,{type:"NETWORK_BAD_REQUEST",originalError:e})),e})}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new x(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!Et(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+P(a));const n=t.fetchIntBytes(128,!0,"msg_key"),s=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(n,s).then(e=>this.getMsgKey(e,!1).then(t=>{if(!Et(n,t))throw this.log.warn("[MT] msg_keys",n,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new x(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const s=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!(Et(s,this.sessionId)||this.prevSessionId&&Et(s,this.prevSessionId)))throw this.log.warn("Sessions",s,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+P(s));const r=a.fetchInt("seq_no"),p=e.byteLength,o=a.fetchInt("message_data[length]");let m=a.getOffset();if(o%4||o>p-m)throw new Error("[MT] Invalid body length: "+o);const d=a.fetchRawBytes(o,!0,"message_data");m=a.getOffset();const c=p-m;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);a=new x(d,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const n=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==n+e.bytes&&a.setOffset(n+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const n=this.sentMessages[e.req_msg_id],s=n&&n.resultType||"Object";e.req_msg_id&&!n||(e.result=a.fetchObject(s,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:i,sessionId:s,seqNo:r}}))}applyServerSalt(e){const t=(a=e,q(L(M()(a)).reverse(),8,!0,!1,!1));var a;b.set({["dc"+this.dcId+"_server_salt"]:P(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof Rt&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof Rt&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof Rt&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach(a=>{const n=t[a];if(n.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(n.container){for(const a of n.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0}),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=M()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),Ue.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const n=this.updateSentMessage(e.bad_msg_id);n&&this.pushResend(n.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),b.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&Ft.updatesProcessor&&Ft.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,n]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&n.length)for(const e of a.msgIds){const t=n.indexOf(e);-1!==t&&n.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,n=this.sentMessages[a];if(this.processMessageAck(a),n){const t=n.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),n.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;this.lastPingDelayDisconnectId===t&&this.pingDelayDisconnectDeferred.resolve("pong");break}default:this.ackMessage(t),null!==Ft.updatesProcessor&&Ft.updatesProcessor(e)}}}const xt=new class{constructor(){this.networkers=[],this.language=navigator.language||Ye.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){it(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,n,s){const i=new Ut(e,t,a,n,s);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter(e=>e.isStopped());this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};p&&(p.networkerFactory=xt);var Ft=xt,Lt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Nt=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,i.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map(e=>{const t=new U;t.storeBytes(ue(e.modulus),"n"),t.storeBytes(ue(e.exponent),"e");const a=t.getBuffer();return Ve.invokeCrypto("sha1",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[P(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return Lt(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(o&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw p;try{const t=new x(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const n=t.fetchLong("msg_id");"0"===n&&this.log.error("msg_id === 0",n);const s=t.fetchInt("msg_len");return s||this.log.error("no msg_len",s),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(p,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(p,{originalError:e})),e})}sendReqPQ(e){return Ot(this,void 0,void 0,(function*(){const t=new U({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),o&&this.log("Send req_pq",P(e.nonce));try{const n=this.sendPlainRequest(e.dcId,t.getBytes(!0));Nt.prepare(),a=yield n}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!Et(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,o&&this.log("Got ResPQ",P(e.serverNonce),P(e.pq),e.fingerprints);const s=yield Nt.select(e.fingerprints);if(!s)throw new Error("[MT] No public key found");e.publicKey=s,o&&this.log("PQ factorization start",e.pq);try{var i=yield Ve.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=i[0],e.q=i[1],o&&this.log("PQ factorization done",i),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ot(this,void 0,void 0,(function*(){e.newNonce=O(new Uint8Array(32));const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new U({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const s=q(n,192,!1,!0,!1),i=s.slice().reverse(),r=yield(()=>Ot(this,void 0,void 0,(function*(){for(;;){const t=O(new Uint8Array(32)),a=i.concat(yield Ve.invokeCrypto("sha256",t.concat(s)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield Ve.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),r=G(t,yield Ve.invokeCrypto("sha256",n)).concat(n),p=F(r),o=M()(e.publicKey.modulus,16);if(-1===p.compare(o))return r}})))(),p=q(yield Ve.invokeCrypto("rsa-encrypt",r,e.publicKey),256,!0,!0,!0),m={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},d=new U({mtproto:!0});d.storeMethod("req_DH_params",m);const c=d.getBytes(!0);let y;o&&this.log("Send req_DH_params",m);try{y=yield this.sendPlainRequest(e.dcId,c)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const l=y.fetchObject("Server_DH_Params","RESPONSE");if(o&&this.log("Sent req_DH_params, response:",l),"server_DH_params_fail"!==l._&&"server_DH_params_ok"!==l._)throw new Error("[MT] Server_DH_Params response invalid: "+l._);if(!Et(e.nonce,l.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!Et(e.serverNonce,l.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===l._){if(!Et((yield Ve.invokeCrypto("sha1",e.newNonce)).slice(-16),l.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,l.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ot(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield Ve.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield Ve.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield Ve.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield Ve.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield Ve.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),s=a.slice(20),i=new x(s,{mtproto:!0}),r=i.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==r._)throw new Error("[MT] server_DH_inner_data response invalid: "+r);if(!Et(e.nonce,r.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!Et(e.serverNonce,r.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");o&&this.log("Done decrypting answer"),e.g=r.g,e.dhPrime=r.dh_prime,e.gA=r.g_a,e.serverTime=r.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=i.getOffset();if(!Et(n,yield Ve.invokeCrypto("sha1",s.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");Ue.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){o&&this.log("Verifying DH params",e,t,a);const n=P(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==n)throw new Error("[MT] DH params are not verified: unknown dhPrime");o&&this.log("dhPrime cmp OK");const s=F(a),i=M()(n,16);if(s.compare(M.a.one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(s.compare(i.subtract(M.a.one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");o&&this.log("1 < gA < dhPrime-1 OK");const r=M()(2).pow(1984);if(s.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(s.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return o&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ot(this,void 0,void 0,(function*(){const t=ue(e.g.toString(16));e.b=O(new Uint8Array(256));try{var a=yield Ve.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new U({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const s=(yield Ve.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),i=yield Ve.invokeCrypto("aes-encrypt",s,e.tmpAesKey,e.tmpAesIv),r=new U({mtproto:!0});let p;r.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:i}),o&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,r.getBytes(!0))}catch(e){throw e}const m=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==m._&&"dh_gen_retry"!==m._&&"dh_gen_fail"!==m._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+m._);if(!Et(e.nonce,m.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!Et(e.serverNonce,m.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var d=yield Ve.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw d}const c=yield Ve.invokeCrypto("sha1",d),y=c.slice(0,8),l=c.slice(-8);switch(o&&this.log("Got Set_client_DH_params_answer",m._,d),m._){case"dh_gen_ok":{const t=(yield Ve.invokeCrypto("sha1",e.newNonce.concat([1],y))).slice(-16);if(!Et(t,m.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,m),new Error("new_nonce_hash1 mismatch");const a=G(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return o&&this.log("Auth successfull!",l,d,a),e.authKeyId=l,e.authKey=d,e.serverSalt=a,e}case"dh_gen_retry":if(!Et((yield Ve.invokeCrypto("sha1",e.newNonce.concat([2],y))).slice(-16),m.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e);case"dh_gen_fail":if(!Et((yield Ve.invokeCrypto("sha1",e.newNonce.concat([3],y))).slice(-16),m.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=At.pingTransports().then(({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)})}auth(e){let t=this.cached[e];return t||(t=new Promise((t,a)=>Ot(this,void 0,void 0,(function*(){let n;yield this.getTransportType();let s=1;for(;s++<=3;)try{const a={dcId:e,nonce:O(new Uint8Array(16))},n=this.sendReqPQ(a);return void t(yield n)}catch(e){n=e}a(n)}))),this.cached[e]=t)}};function Gt(e,t=""){let a;Array.isArray(e)||(e=[e]);const n=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{a=new Blob(e,{type:n})}catch(t){let s=new BlobBuilder;e.forEach(e=>{s.append(e)}),a=s.getBlob(n)}return a}class Kt{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let a in t)void 0!==t[a]&&(e[a]=t[a])}(this,e),i.test&&(this.name+="_test"),this.storeName=t,this.log=$e("IDB-"+this.storeName),this.openDatabase(!0),Kt.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let a=!1;return setTimeout(()=>{a||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,n)=>{t.onsuccess=s=>{a=!0;const i=t.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{a=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},t.onupgradeneeded=e=>{a=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var a;const n=e.createObjectStore(t.name);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const e of t.indexes)n.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",a=>e.map((e,n)=>a.put(t[n],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Gt(t)),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,a,n=this.storeName){let s;return a&&(s=performance.now(),this.log(a+": start")),this.openDatabase().then(i=>new Promise((r,p)=>{const o=i.transaction([n],e);o.onerror=e=>{clearTimeout(m),p(o.error)},o.oncomplete=e=>{clearTimeout(m),a&&this.log(a+": end",performance.now()-s);const t=y.map(e=>e.result);r(c?t:t[0])};const m=setTimeout(()=>{this.log.error("transaction not finished",o)},1e4),d=t(o.objectStore(n)),c=Array.isArray(d),y=c?d:[].concat(d)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}Kt.STORAGES=[];var jt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Wt=new class{constructor(){this.log=$e("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=i.transport,At.addEventListener("transport",e=>{this.changeTransportType(e)})}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const n in a){const s=a[n];for(const a in s){s[a].forEach((s,i,r)=>{e({networker:s,dcId:+a,connectionType:n,transportType:t,index:i,array:r})})}}}}chooseServer(e,t,a){return kt.chooseServer(e,t,a,"client"===t)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],n=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=n,this.transportType=e;for(const a in this.gettingNetworkers){const n=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const s=a.replace(t,e);this.gettingNetworkers[s]=n,this.log("changed networker getKey from",a,"to",s)}this.iterateNetworkers(e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)})}getBaseDcId(){return jt(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield b.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(Ye.baseDcId)),this.baseDcId}))}setUserAuth(e){return jt(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}b.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,b.set({dc:this.baseDcId})}logOut(){return jt(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>b.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,Kt.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(n,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(n)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const s=this.cachedNetworkers[n][a];e in s||(s[e]=[]);const i=s[e],r="client"===a||"https"===n?1:3;if(i.length>=r){let e=i.length-1,t=!1;for(;e>=0;--e)if(i[e].isOnline){t=!0;break}const a=t?i.splice(e,1)[0]:i.pop();return i.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const o=`dc${e}_auth_key`,m=`dc${e}_server_salt`;let d=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([o,m].map(e=>b.get(e))).then(([s,r])=>jt(this,void 0,void 0,(function*(){let c,y;if(s&&512===s.length){r&&16===r.length||(r="AAAAAAAAAAAAAAAA");const a=ue(s),n=(yield Ve.invokeCrypto("sha1",a)).slice(-8),i=ue(r);c=Ft.getNetworker(e,a,n,i,t)}else try{const a=yield qt.auth(e);b.set({[o]:P(a.authKey),[m]:P(a.serverSalt)}),c=Ft.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){y=e}const l=this.getTransportType(a);if(l!==n&&(p=this.generateNetworkerGetKey(e,l,a),d.destroy(),St.removeTransport(kt.chosenServers,d),c&&(d=this.chooseServer(e,a,l)),this.log("transport has been changed during authorization from",n,"to",l)),delete this.gettingNetworkers[p],y)throw this.log("get networker error",y,y.stack),y;return this.changeNetworkerTransport(c,d),i.unshift(c),this.setOnDrainIfNeeded(c),c})))}changeNetworkerTransport(e,t){const a=e.transport;a&&St.removeTransport(kt.chosenServers,a),e.changeTransport(t)}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),Ft.removeNetworker(e),St.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const n=at();let{afterMessageId:s,prepareTempMessageId:i}=a;if(i&&n.then(()=>{delete this.afterMessageTempIds[i]}),p){const s=Date.now(),i=xe.setInterval(()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-s)/1e3)},5e3);n.catch(et).finally(()=>{clearInterval(i)})}let r,o,m=(new Error).stack||"empty stack";const d=()=>{if(s){const e=this.afterMessageTempIds[s];e&&(a.afterMessageId=e.messageId)}const p=o.wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:n}),p.catch(n=>{if("FILE_REFERENCE_EXPIRED"!==n.type&&this.log.error("Error",n.code,n.type,this.baseDcId,r,e,t),401===n.code&&this.baseDcId===r)throw"SESSION_PASSWORD_NEEDED"!==n.type&&(b.delete("dc"),b.delete("user_auth")),n;if(401===n.code&&this.baseDcId&&r!==this.baseDcId){if(void 0===this.cachedExportPromise[r]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:r},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:r,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[r]=e}return this.cachedExportPromise[r].then(()=>d())}if(303!==n.code){if(400===n.code&&0===n.type.indexOf("FILE_MIGRATE")){const s=+n.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(s!==r)return a.dcId=s,this.invokeApi(e,t,a);throw n}if(400===n.code&&"CONNECTION_NOT_INITED"===n.type)return Ft.unsetConnectionInited(),d();if(a.rawError||420!==n.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(n.type)){const e=this.afterMessageTempIds[s];return s=void 0,delete a.afterMessageId,e?e.promise.then(()=>d()):d()}if(a.rawError||500!==n.code){if("UNKNOWN"===n.type)return tt(1e3).then(()=>d());throw n}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw n;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,tt(1e3*a.waitTime).then(()=>d())}}{const e=+n.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)throw n;return tt(1e3*e).then(()=>d())}}{const s=+n.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(s!==r)return a.dcId?a.dcId=s:this.setBaseDcId(s),this.invokeApi(e,t,a)}})};let c;return c=(r=a.dcId||this.baseDcId)?this.getNetworker(r,a):this.getBaseDcId().then(e=>this.getNetworker(r=e,a)),c.then(e=>{o=e;const t=d();return o.attachPromise(n,a),t}).then(n.resolve).catch(t=>jt(this,void 0,void 0,(function*(){if(t?S(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=m||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)),t}))).catch(n.reject),n}};p.apiManager=Wt;var zt=Wt;var Ht=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Jt=new class{constructor(){this.blobSupported=!0;try{Gt([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}getFakeFileWriter(e,t,a){let n=new Uint8Array(t);return{write:(e,t)=>Ht(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.set(e,t)})),truncate:()=>{n=new Uint8Array},trim:e=>{n=n.slice(0,e)},finalize:(t=!0)=>{const s=Gt(n,e);return t&&a&&a(s),s},getParts:()=>n,replaceParts:e=>{n=e}}}},Zt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class Qt{constructor(e){this.dbName=e,this.useStorage=!0,i.test&&(this.dbName+="_test"),Qt.STORAGES.length&&(this.useStorage=Qt.STORAGES[0].useStorage),this.openDatabase(),Qt.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(a=>a.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=Gt(t));const a=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,a).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,a)=>Zt(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{a(),n=!0},15e3);try{const a=yield this.openDatabase();if(!a)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(a);if(n)return;t(s)}catch(e){a(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t,a){const n=Jt.getFakeFileWriter(a,t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}function $t(e){return function(e,t){return new Promise(a=>{const n=new FileReader;n.addEventListener("loadend",e=>{a(e.target.result)}),n[t](e)})}(e,"readAsArrayBuffer")}Qt.STORAGES=[];var Xt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Yt=new class{constructor(){this.cacheStorage=new Qt("cachedFiles"),this.cachedDownloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.webpConvertPromises={},this.refreshReferencePromises={},this.log=$e("AFM",Oe.Error|Oe.Log),this.tempId=0,this.queueId=0,this.debug=i.debug,this.uncompressTGS=(e,t)=>Ve.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return Ne?Ve.invokeCrypto("gzipUncompress",a,!0).then(e=>function(e){const t=e.indexOf("/,` width="${s}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e)).then(e=>(new TextEncoder).encode(e)):Ve.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>{const a=at();return u({type:"convertWebp",payload:{fileName:t,bytes:e}}),this.webpConvertPromises[t]=a},setInterval(()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}},18e5)}downloadRequest(e,t,a,n,s=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise((e,r)=>{i.push({id:t,queueId:s,cb:a,deferred:{resolve:e,reject:r},activeDelta:n})});return setTimeout(()=>{this.downloadCheck(e)},0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const n=nt(t,e=>0===e.queueId)||nt(t,e=>e.queueId===this.queueId)||t.shift(),s=n.activeDelta||1;this.downloadActives[e]+=s,n.cb().then(t=>{this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.resolve(t)},t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.reject(t)})}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=(this.cachedDownloadPromises[e]?[this.cachedDownloadPromises[e]]:void 0)||(this.uploadPromises[e]?Array.from(this.uploadPromises[e]):[]);let a=!1;for(let e=0,n=t.length;eXt(this,void 0,void 0,(function*(){return r&&r(),zt.invokeApi("upload.getWebFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0})})),this.getDelta(n),i)}requestFilePart(e,t,a,n,s=0,i=0,r){return this.downloadRequest(e,s,()=>Xt(this,void 0,void 0,(function*(){r&&r();const s=()=>Xt(this,void 0,void 0,(function*(){r&&r();return zt.invokeApi("upload.getFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0}).catch(e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(s);throw e})})),i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=P(i);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(s)}return s()})),this.getDelta(n),i)}getDelta(e){return e/1024/128}getLimitPart(e){let t=131072;for(;e/t>2e3;)t*=2;return t}refreshReference(e){const t=e.file_reference,a=P(t);let n=this.refreshReferencePromises[a];if(!n){const s=at();n=this.refreshReferencePromises[a]={deferred:s,timeout:xe.setTimeout(()=>{this.log.error("Didn't refresh the reference:",e),s.reject("REFERENCE_IS_NOT_REFRESHED")},6e4)},s.catch(et).finally(()=>{clearTimeout(n.timeout)});u({type:"refreshReference",payload:t})}return n.deferred.then(t=>{if(a===P(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t})}downloadFile(e){var t;if(!Jt.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:n,location:s}=e;let i;"application/x-tgwallpattern"===e.mimeType?(i=this.uncompressTGV,e.mimeType="image/svg+xml"):"image/webp"!==e.mimeType||na()?"application/x-tgsticker"===e.mimeType&&(i=this.uncompressTGS,e.mimeType="application/json"):(i=this.convertWebp,e.mimeType="image/png");const r=function(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}(s,e.fileName),p=this.cachedDownloadPromises[r],o=this.getFileStorage();if(this.debug&&this.log("downloadFile",r,a,s,e.mimeType),p)return a?p.then(t=>t instanceof Blob&&t.sizethis.downloadFile(e)).catch(()=>this.downloadFile(e))):t):p;const m=at(),d=e.mimeType||"image/jpeg";let c,y,l=!1,g=e=>{c=e,delete this.cachedDownloadPromises[r],m.reject(c),g=()=>{},!y||c&&"DOWNLOAD_CANCELED"===c.type||y.truncate()};const u=this.tempId++;o.getFile(r).then(e=>Xt(this,void 0,void 0,(function*(){if(e.size{const t=e.limitPart||this.getLimitPart(a);o.getFileWriter(r,a||t,d).then(p=>{let o;y=p;let d,c=Promise.resolve();const h=e=>Xt(this,void 0,void 0,(function*(){if(i){return yield i(e,r)}return e})),_="inputWebFileLocation"===s._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];o=0;do{d=at(),v.push({offset:o,writeFilePromise:c,writeFileDeferred:d}),c=d,o+=t}while(oXt(this,void 0,void 0,(function*(){const{offset:o,writeFilePromise:d,writeFileDeferred:c}=v.shift();try{f();const y=yield _(n,s,o,t,u,e.queueId,f),g=y.bytes;v.length&&w(),this.debug&&this.log("downloadFile requestFilePart result:",r,y);const P=o+t>=a||!g.byteLength;if(g.byteLength&&(b+=g.byteLength,m.notify({done:b,offset:o,total:a}),yield d,f(),yield p.write(g,o)),P&&i){const e=p.getParts(),t=yield h(e);f(),p.replaceParts(t)}if(c.resolve(),P){l=!0;const e=a||g.byteLength;a||p.trim(e),m.resolve(p.finalize(e<20971520))}}catch(e){g(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)})});const f=()=>{if(c)throw c};return m.cancel=()=>{if(!c&&!l){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",g(e)}},m.notify=e=>{h({progress:Object.assign({fileName:r},e)})},this.cachedDownloadPromises[r]=m,m.catch(et).finally(()=>{delete this.cachedDownloadPromises[r]}),m}deleteFile(e){return delete this.cachedDownloadPromises[e],this.getFileStorage().delete(e)}uploadFile({file:e,fileName:t}){var a;const n=e.size,s=n>=10485760;let i=!1,r=!1,p=0,o=262144;n>67108864?o=524288:n<102400&&(o=32768);const m=this.getDelta(o),d=Math.ceil(n/o),c=we();let y=0;const l={_:s?"inputFileBig":"inputFile",id:c,parts:d,name:t,md5_checksum:""},g={notify:e=>{}},u=new Promise((e,t)=>{if(d>4e3)return t({type:"FILE_TOO_BIG"});g.resolve=e,g.reject=t});if(Object.assign(u,g),d>4e3)return u;let f=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),u.reject(e),i=!0,f=()=>{}};const _=s?"upload.saveBigFilePart":"upload.saveFilePart",v=this.tempId++,b=this;const w=function*(){for(let t=0;t$t(e.slice(t,t+o)).then(e=>{if(i)throw{type:"UPLOAD_CANCELED"};return b.debug&&b.log("Upload file part, isBig:",s,a,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),zt.invokeApi(_,{file_id:c,file_part:a,file_total_parts:d,bytes:e},{fileUpload:!0}).then(e=>{p++,u.notify({done:p*o,total:n}),p>=d&&(u.resolve(l),r=!0)},f)}),m).catch(f)}}(),P=()=>{if(i)return;const e=w.next();e.done||i||e.value.then(P)};for(let e=0,t=Math.min(1/0,d);e{i||r||(i=!0,f({type:"UPLOAD_CANCELED"}))},u.notify=e=>{h({progress:Object.assign({fileName:t},e)})},u.finally(()=>{S.delete(u),S.size||delete this.uploadPromises[t]});const S=null!==(a=this.uploadPromises[t])&&void 0!==a?a:this.uploadPromises[t]=new Set;return S.add(u),u}};p.apiFileManager=Yt;var ea=Yt,ta=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let aa=!1;const na=()=>aa;Ft.setUpdatesProcessor(e=>{h({update:e})}),Ft.onConnectionStatusChange=e=>{h({type:"connectionStatusChange",payload:e})};const sa={convertWebp:e=>{const{fileName:t,bytes:a}=e.payload,n=ea.webpConvertPromises[t];n&&(n.resolve(a),delete ea.webpConvertPromises[t])},webpSupport:e=>{aa=e.payload},socketProxy:e=>{const t=e.payload,a=t.id,n=wt.get(a);"message"===t.type?n.dispatchEvent("message",t.payload):"open"===t.type?n.dispatchEvent("open"):"close"===t.type&&(n.dispatchEvent("close"),wt.delete(a))},localStorageProxy:e=>{b.finishTask(e.id,e.payload)},userAgent:e=>{Ft.userAgent=e.payload},online:()=>{Ft.forceReconnectTimeout()},forceReconnect:()=>{Ft.forceReconnect()},toggleStorage:e=>{const t=e.payload;Qt.toggleStorage(t)},refreshReference:e=>{const t=P(e.originalPayload),a=ea.refreshReferencePromises[t],n=null==a?void 0:a.deferred;n&&(e.error?n.reject(e.error):n.resolve(e.payload))},crypto:e=>{Ve.invokeCrypto(e.task,...e.args).then(t=>{h({taskId:e.taskId,result:t})})}};xe.addEventListener("message",e=>ta(void 0,void 0,void 0,(function*(){try{const t=e.data,a=t.taskId,n=sa[t.type];if(n)return void n(t);if(!t.task)return;switch(t.task){case"requestFilePart":case"setQueueId":case"cancelDownload":case"uploadFile":case"downloadFile":try{let e=ea[t.task].apply(ea,t.args);e instanceof Promise&&(e=yield e),h({taskId:a,result:e})}catch(e){h({taskId:a,error:e})}break;case"getNetworker":zt[t.task].apply(zt,t.args).finally(()=>{h({taskId:a,result:null})});break;case"setLanguage":case"startAll":case"stopAll":Ft[t.task].apply(Ft,t.args);break;default:try{let e=zt[t.task].apply(zt,t.args);e instanceof Promise&&(e=yield e),h({taskId:a,result:e})}catch(e){h({taskId:a,error:e})}}}catch(e){console.error("worker task error:",e)}}))),h("ready")}]); -//# sourceMappingURL=mtproto.worker.02f307d76034f3156ff7.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.02f307d76034f3156ff7.bundle.worker.js.map b/public/mtproto.worker.02f307d76034f3156ff7.bundle.worker.js.map deleted file mode 100644 index b346719fc..000000000 --- a/public/mtproto.worker.02f307d76034f3156ff7.bundle.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/big-integer/BigInteger.js","webpack:///./node_modules/pako/dist/pako_inflate.min.js","webpack:///(webpack)/buildin/module.js","webpack:///./src/helpers/bytes/bufferConcats.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./src/helpers/bytes/bytesToHex.ts","webpack:///./src/helpers/object/isObject.ts","webpack:///./src/helpers/gzipUncompress.ts","webpack:///./src/helpers/number/intToUint.ts","webpack:///./src/helpers/long/longFromInts.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/helpers/bigInt/bigIntConversion.ts","webpack:///./src/helpers/bytes/bytesModPow.ts","webpack:///./src/helpers/array/randomize.ts","webpack:///./src/helpers/bytes/addPadding.ts","webpack:///./src/helpers/bytes/bytesXor.ts","webpack:///./src/helpers/bytes/convertToUint8Array.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./node_modules/@cryptography/aes/dist/es/aes.js","webpack:///./src/helpers/bytes/bytesFromWordss.ts","webpack:///./src/helpers/bytes/bytesToWordss.ts","webpack:///./src/lib/crypto/utils/aesIGE.ts","webpack:///./src/lib/crypto/subtle.ts","webpack:///./src/lib/crypto/utils/pbkdf2.ts","webpack:///./src/helpers/bytes/bytesFromHex.ts","webpack:///./src/lib/crypto/utils/rsa.ts","webpack:///./src/lib/crypto/utils/sha1.ts","webpack:///./src/lib/crypto/utils/sha256.ts","webpack:///./src/helpers/random.ts","webpack:///./src/helpers/bigInt/bigIntRandom.ts","webpack:///./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack:///./src/lib/crypto/generateDh.ts","webpack:///./src/lib/crypto/computeDhKey.ts","webpack:///./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/lib/logger.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/array/findAndSplice.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/array/indexOfAndSplice.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/transports/controller.ts","webpack:///./src/lib/mtproto/transports/http.ts","webpack:///./src/helpers/bytes/bytesCmp.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/helpers/array/forEachReverse.ts","webpack:///./src/helpers/long/sortLongsArray.ts","webpack:///./src/helpers/long/longToBytes.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/helpers/blob/blobConstruct.ts","webpack:///./src/helpers/blob/blobSafeMimeType.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object/safeAssign.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/helpers/blob/readBlobAs.ts","webpack:///./src/lib/mtproto/apiFileManager.ts","webpack:///./src/helpers/fixFirefoxSvg.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","BASE","MAX_INT","MAX_INT_ARR","smallToArray","supportsNativeBigInt","BigInt","Integer","v","radix","alphabet","caseSensitive","parseBase","parseValue","BigInteger","sign","this","isSmall","SmallInteger","NativeBigInt","isPrecise","Math","floor","arrayToSmall","arr","trim","length","compareAbs","createArray","x","Array","truncate","ceil","add","a","b","sum","l_a","l_b","carry","base","push","addAny","addSmall","subtract","difference","a_l","b_l","borrow","subtractSmall","multiplyLong","product","a_i","j","multiplySmall","shiftLeft","concat","multiplySmallAndArray","square","divModSmall","lambda","q","remainder","divisor","quotient","divModAny","self","Error","negate","abs","comparison","quotientDigit","shift","result","divisorMostSignificantDigit","divMod1","guess","xlen","highx","highy","check","part","unshift","reverse","divMod2","qSign","mod","mSign","isBasicPrime","isUnit","equals","isEven","isDivisibleBy","lesser","millerRabinTest","nPrev","prev","divide","next","bigInt","modPow","plus","subtractAny","minus","small","multiply","l1","l2","multiplyKaratsuba","y","max","slice","ac","bd","abcd","times","_multiplyBySmall","divmod","over","pow","toString","_0","_1","_2","isNegative","exp","isZero","modInv","isPositive","isOdd","compare","Infinity","compareTo","eq","notEquals","neq","greater","gt","lt","greaterOrEquals","geq","lesserOrEquals","leq","isPrime","strict","bits","bitLength","logN","log","toJSNumber","isProbablePrime","iterations","rng","randBetween","lastT","lastR","zero","newT","one","newR","powersOfTwo","powers2Length","highestPower2","shift_isSmall","bitwise","fn","xSign","ySign","xRem","not","yRem","xDigit","yDigit","xDivMod","yDivMod","String","shiftRight","remQuo","and","or","xor","roughLOB","min","gcd","integerLogarithm","tmp","e","text","toLowerCase","absBase","alphabetValues","digits","start","parseBaseFromArray","val","toBase","apply","map","valueOf","neg","Number","out","left","digit","toBaseString","stringify","join","parseStringValue","split","decimalPlace","indexOf","test","parseNumberValue","toArray","str","toJSON","parseInt","minusOne","lcm","isInstance","usedRNG","random","low","range","restricted","top","fromArray","Uint32Array","f","h","u","w","k","_","g","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","lencode","distcode","lenbits","distbits","msg","sane","Uint16Array","Uint8Array","Z","S","O","U","T","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","last","wrap","havedict","flags","total","head","wbits","offset","extra","ncode","nlen","ndist","have","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","K","P","Y","G","X","W","done","time","xflags","os","extra_len","fromCharCode","comment","hcrc","data_type","2","1","0","J","Q","V","$","ee","te","ie","ne","options","arguments","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","header","dictionary","charCodeAt","ae","onEnd","onData","re","se","oe","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","webpackPolyfill","deprecate","paths","children","bufferConcats","args","reduce","acc","byteLength","lastLength","forEach","ArrayBuffer","Promise","finally","onFinally","callback","resolve","then","reason","reject","Modes","location","search","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","MOUNT_CLASS_TO","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","listeners","listener","postMessage","notifyWorker","noop","notifySomeone","notifyAll","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","undefined","obj","onlyLocal","stringified","setItem","saveLocal","removeItem","keys","delete","enabled","clear","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","bytesToHex","bytes","isObject","gzipUncompress","intToUint","longFromInts","high","boolFalse","API","constructors","find","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","buffer","intView","byteView","resultBuffer","resultInt32","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","console","checkLength","writeInt","iHigh","iLow","sLong","isArray","storeLongP","storeIntBytes","Float64Array","sUTF8","unescape","encodeURIComponent","len","error","methodName","params","methodData","methods","method","storeInt","pFlags","flagsOffsets","param","condType","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","substr","itemType","schema","isBare","constructorData","charAt","override","readInt","doubleView","longDec","num","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","index","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","TLDeserialization","TLSerialization","bigIntFromBytes","bigIntToBytes","bytesModPow","bytesBigInt","expBigInt","modBigInt","randomize","crypto","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","needPadding","padding","bytesXor","bytes1","bytes2","convertToUint8Array","TextEncoder","encode","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","invokeCrypto","hash","makePasswordHash","salt1","salt2","padArray","flipper","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","a_for_hash","secure_random","generate_and_check_random","g_b","ux","a_ux","h1","buff","M1","srp_id","Si","T1","T2","T3","T4","T5","T6","T7","T8","getWords","buf","pos","right","x2","x4","tEnc","tDec","xInv","computeTables","AES","_key","encKey","decKey","rcon","encrypt","_message","a2","b2","c2","message","rounds","decrypt","AES_IGE","iv","cipher","cipherText","prevX","prevY","yXOR","counter","incrementCounter","bytesFromWordss","bytesToWordss","words","aesSync","keyBytes","ivBytes","aesEncryptSync","aesDecryptSync","subtle","pbkdf2","salt","importKey","deriveBits","bytesFromHex","hexString","rsaEncrypt","publicKey","exponent","modulus","sha1","digest","sha256","arrays","8","16","32","nextRandomUint","array","randomLong","bigIntRandom","BrentPollardFactor","two","ys","bigIntUint64MinusPqPlusOne","performY","condition","factorizeBrentPollardPQ","pqBytes","factors","primes","factor","pop","primeFactors","sort","splice","generateDh","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","computeDhKey","key_fingerprint","readBigIntFromBytesBE","_bits","emojis","getEmojisFingerprint","emojisLength","partOffset","codePoints","performTaskWorker","super","webWorker","awaiting","pending","utils","task","timeManager","lastMessageId","timeOffset","timeTicks","Date","now","messageId","serverTime","localTime","newTimeOffset","changed","server_time_offset","USER_AGENT","navigator","userAgent","IS_SAFARI","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","splitted","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","logger","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","App","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","hostname","suffix","pause","ms","setTimeout","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","deferred","catch","cancel","assign","findAndSplice","verify","findIndex","reuseResults","_constructor","listenerResults","once","addEventListener","collectResults","removeEventListener","_dispatchEvent","indexOfAndSplice","item","idx","spliced","dcId","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","data","send","body","ws","logTypes","connect","WebSocket","binaryType","Counter","initialValue","encrypted","increment","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","ConnectionStatus","tag","Connection","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","setTransportOpened","init","connection","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","decode","readPacket","parseResponse","response","processMessage","sessionId","onClose","needTimeout","retryAt","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","clearTimeout","Connecting","bodySent","setTransportClosed","setAutoReconnect","enable","toEncode","encodePacket","promise","socketId","socketsProxied","Map","TEST_SUFFIX","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportHTTP","dcOption","transportType","reuse","client","download","upload","servers","transports","dcConfigurator","opened","waitForWebSocket","https","chooseServer","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","fetch","status","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","bytesCmp","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","file","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","offline","isOnline","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","delays","lastPingTime","disconnectDelay","round","timeoutTime","startTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","warn","serializer","storeMethod","pingMessage","msg_id","generateId","seq_no","generateSeqNo","getBytes","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","sentMessageId","sentMessage","container","forEachReverse","inner","innerSentMessageId","innerSentMessage","updateSentMessage","pushMessage","connectionInited","invokeWithLayer","layer","initConnection","language","afterMessageId","resultType","isAPI","oldTransport","nextReqTimeout","longPollInterval","clearInterval","clearPingDelayDisconnect","setInterval","forceReconnect","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","noResponseMsgs","sqrt","pushResend","shouldResolve","msgId","timeout","TimedOut","setDrainTimeout","onDrainTimeout","onDrain","willChange","onConnectionStatusChange","innerMsgId","acked","dataWithPadding","isOut","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","promises","results","aesKey","aesIv","sha2a","sha2b","akStopped","ackMsgIds","wrapMtpMessage","msg_ids","pendingResendReqLength","msgIds","outMessage","messages","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","long","messageByteLength","filter","generateContainerMessage","messageWithBody","handleSentEncryptedRequestHTTP","innerMessages","storeRawBytes","getMsgKey","keyIv","getAesKeyIv","encryptedData","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","requestData","getEncryptedOutput","baseError","code","originalError","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","setOffset","mt_rpc_result","req_msg_id","newServerSalt","cb","performScheduledRequest","notEmpty","rawError","matches","error_message","error_code","description","applyServerTime","innerMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedTimeOffset","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResend","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","processError","networkerFactory","networkers","stoppedNetworkers","langCode","forceReconnectTimeout","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","cached","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","twoPow","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","new_nonce_hash2","new_nonce_hash3","getTransportTypePromise","getTransportType","_try","sendReqPQ","blobConstruct","blobParts","mimeType","blob","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","db","storeName","storageIsAvailable","fromObject","safeAssign","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onerror","onsuccess","calledNew","onabort","transaction","target","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","createObjectStore","indexes","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","fileName","save","perf","performance","oncomplete","requests","getAll","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","connections","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","replace","iterateNetworkers","info","changeNetworkerTransport","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","invokeApi","ignoreErrors","closeDatabases","handled","maxNetworkers","found","getKey","generateNetworkerGetKey","ak","ss","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","removeTransport","changeTransport","canRelease","removeNetworker","prepareTempMessageId","interval","cachedNetworker","performRequest","after","wrapApiCall","exportResolve","exportReject","dc_id","noErrorBox","exportedAuth","newDcId","unsetConnectionInited","includes","stopTime","waitTime","floodMaxTimeout","attachPromise","logOut","blobSupported","size","saveFileCallback","write","finalize","saveToStorage","getParts","replaceParts","parts","dbName","caches","timeoutOperation","Response","headers","rejected","res","fileSize","fakeWriter","getFakeFileWriter","saveFile","deleteAll","readBlobAsArrayBuffer","reader","FileReader","readBlobAs","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","uncompressTGV","svgIndex","__","width","height","fixFirefoxSvg","convertWebp","convertPromise","hex","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","fileManager","isAvailable","process","isWebpSupported","ext","thumb_size","Boolean","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","getFileNameByLocation","cachedPromise","fileStorage","getFileStorage","deleteFile","downloadFile","cacheFileWriter","resolved","errorHandler","getFile","limitPart","getLimitPart","getFileWriter","fileWriter","writeFileDeferred","writeFilePromise","processDownloaded","requestWebFilePart","requestFilePart","delayed","superpuper","isFinal","processedResult","realSize","progress","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","md5_checksum","details","it","file_id","file_part","file_total_parts","generator","Set","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"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","file":"mtproto.worker.02f307d76034f3156ff7.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n","var bigInt = (function (undefined) {\r\n \"use strict\";\r\n\r\n var BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_INT = 9007199254740992,\r\n MAX_INT_ARR = smallToArray(MAX_INT),\r\n DEFAULT_ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyz\";\r\n\r\n var supportsNativeBigInt = typeof BigInt === \"function\";\r\n\r\n function Integer(v, radix, alphabet, caseSensitive) {\r\n if (typeof v === \"undefined\") return Integer[0];\r\n if (typeof radix !== \"undefined\") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);\r\n return parseValue(v);\r\n }\r\n\r\n function BigInteger(value, sign) {\r\n this.value = value;\r\n this.sign = sign;\r\n this.isSmall = false;\r\n }\r\n BigInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function SmallInteger(value) {\r\n this.value = value;\r\n this.sign = value < 0;\r\n this.isSmall = true;\r\n }\r\n SmallInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function NativeBigInt(value) {\r\n this.value = value;\r\n }\r\n NativeBigInt.prototype = Object.create(Integer.prototype);\r\n\r\n function isPrecise(n) {\r\n return -MAX_INT < n && n < MAX_INT;\r\n }\r\n\r\n function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes\r\n if (n < 1e7)\r\n return [n];\r\n if (n < 1e14)\r\n return [n % 1e7, Math.floor(n / 1e7)];\r\n return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];\r\n }\r\n\r\n function arrayToSmall(arr) { // If BASE changes this function may need to change\r\n trim(arr);\r\n var length = arr.length;\r\n if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {\r\n switch (length) {\r\n case 0: return 0;\r\n case 1: return arr[0];\r\n case 2: return arr[0] + arr[1] * BASE;\r\n default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n function trim(v) {\r\n var i = v.length;\r\n while (v[--i] === 0);\r\n v.length = i + 1;\r\n }\r\n\r\n function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger\r\n var x = new Array(length);\r\n var i = -1;\r\n while (++i < length) {\r\n x[i] = 0;\r\n }\r\n return x;\r\n }\r\n\r\n function truncate(n) {\r\n if (n > 0) return Math.floor(n);\r\n return Math.ceil(n);\r\n }\r\n\r\n function add(a, b) { // assumes a and b are arrays with a.length >= b.length\r\n var l_a = a.length,\r\n l_b = b.length,\r\n r = new Array(l_a),\r\n carry = 0,\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l_b; i++) {\r\n sum = a[i] + b[i] + carry;\r\n carry = sum >= base ? 1 : 0;\r\n r[i] = sum - carry * base;\r\n }\r\n while (i < l_a) {\r\n sum = a[i] + carry;\r\n carry = sum === base ? 1 : 0;\r\n r[i++] = sum - carry * base;\r\n }\r\n if (carry > 0) r.push(carry);\r\n return r;\r\n }\r\n\r\n function addAny(a, b) {\r\n if (a.length >= b.length) return add(a, b);\r\n return add(b, a);\r\n }\r\n\r\n function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l; i++) {\r\n sum = a[i] - base + carry;\r\n carry = Math.floor(sum / base);\r\n r[i] = sum - carry * base;\r\n carry += 1;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall) {\r\n return new BigInteger(addSmall(a, Math.abs(b)), this.sign);\r\n }\r\n return new BigInteger(addAny(a, b), this.sign);\r\n };\r\n BigInteger.prototype.plus = BigInteger.prototype.add;\r\n\r\n SmallInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n if (isPrecise(a + b)) return new SmallInteger(a + b);\r\n b = smallToArray(Math.abs(b));\r\n }\r\n return new BigInteger(addSmall(b, Math.abs(a)), a < 0);\r\n };\r\n SmallInteger.prototype.plus = SmallInteger.prototype.add;\r\n\r\n NativeBigInt.prototype.add = function (v) {\r\n return new NativeBigInt(this.value + parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.plus = NativeBigInt.prototype.add;\r\n\r\n function subtract(a, b) { // assumes a and b are arrays with a >= b\r\n var a_l = a.length,\r\n b_l = b.length,\r\n r = new Array(a_l),\r\n borrow = 0,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < b_l; i++) {\r\n difference = a[i] - borrow - b[i];\r\n if (difference < 0) {\r\n difference += base;\r\n borrow = 1;\r\n } else borrow = 0;\r\n r[i] = difference;\r\n }\r\n for (i = b_l; i < a_l; i++) {\r\n difference = a[i] - borrow;\r\n if (difference < 0) difference += base;\r\n else {\r\n r[i++] = difference;\r\n break;\r\n }\r\n r[i] = difference;\r\n }\r\n for (; i < a_l; i++) {\r\n r[i] = a[i];\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function subtractAny(a, b, sign) {\r\n var value;\r\n if (compareAbs(a, b) >= 0) {\r\n value = subtract(a, b);\r\n } else {\r\n value = subtract(b, a);\r\n sign = !sign;\r\n }\r\n value = arrayToSmall(value);\r\n if (typeof value === \"number\") {\r\n if (sign) value = -value;\r\n return new SmallInteger(value);\r\n }\r\n return new BigInteger(value, sign);\r\n }\r\n\r\n function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n carry = -b,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < l; i++) {\r\n difference = a[i] + carry;\r\n carry = Math.floor(difference / base);\r\n difference %= base;\r\n r[i] = difference < 0 ? difference + base : difference;\r\n }\r\n r = arrayToSmall(r);\r\n if (typeof r === \"number\") {\r\n if (sign) r = -r;\r\n return new SmallInteger(r);\r\n } return new BigInteger(r, sign);\r\n }\r\n\r\n BigInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall)\r\n return subtractSmall(a, Math.abs(b), this.sign);\r\n return subtractAny(a, b, this.sign);\r\n };\r\n BigInteger.prototype.minus = BigInteger.prototype.subtract;\r\n\r\n SmallInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n return new SmallInteger(a - b);\r\n }\r\n return subtractSmall(b, Math.abs(a), a >= 0);\r\n };\r\n SmallInteger.prototype.minus = SmallInteger.prototype.subtract;\r\n\r\n NativeBigInt.prototype.subtract = function (v) {\r\n return new NativeBigInt(this.value - parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;\r\n\r\n BigInteger.prototype.negate = function () {\r\n return new BigInteger(this.value, !this.sign);\r\n };\r\n SmallInteger.prototype.negate = function () {\r\n var sign = this.sign;\r\n var small = new SmallInteger(-this.value);\r\n small.sign = !sign;\r\n return small;\r\n };\r\n NativeBigInt.prototype.negate = function () {\r\n return new NativeBigInt(-this.value);\r\n }\r\n\r\n BigInteger.prototype.abs = function () {\r\n return new BigInteger(this.value, false);\r\n };\r\n SmallInteger.prototype.abs = function () {\r\n return new SmallInteger(Math.abs(this.value));\r\n };\r\n NativeBigInt.prototype.abs = function () {\r\n return new NativeBigInt(this.value >= 0 ? this.value : -this.value);\r\n }\r\n\r\n\r\n function multiplyLong(a, b) {\r\n var a_l = a.length,\r\n b_l = b.length,\r\n l = a_l + b_l,\r\n r = createArray(l),\r\n base = BASE,\r\n product, carry, i, a_i, b_j;\r\n for (i = 0; i < a_l; ++i) {\r\n a_i = a[i];\r\n for (var j = 0; j < b_l; ++j) {\r\n b_j = b[j];\r\n product = a_i * b_j + r[i + j];\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n r[i + j + 1] += carry;\r\n }\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n carry = 0,\r\n product, i;\r\n for (i = 0; i < l; i++) {\r\n product = a[i] * b + carry;\r\n carry = Math.floor(product / base);\r\n r[i] = product - carry * base;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n function shiftLeft(x, n) {\r\n var r = [];\r\n while (n-- > 0) r.push(0);\r\n return r.concat(x);\r\n }\r\n\r\n function multiplyKaratsuba(x, y) {\r\n var n = Math.max(x.length, y.length);\r\n\r\n if (n <= 30) return multiplyLong(x, y);\r\n n = Math.ceil(n / 2);\r\n\r\n var b = x.slice(n),\r\n a = x.slice(0, n),\r\n d = y.slice(n),\r\n c = y.slice(0, n);\r\n\r\n var ac = multiplyKaratsuba(a, c),\r\n bd = multiplyKaratsuba(b, d),\r\n abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));\r\n\r\n var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));\r\n trim(product);\r\n return product;\r\n }\r\n\r\n // The following function is derived from a surface fit of a graph plotting the performance difference\r\n // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.\r\n function useKaratsuba(l1, l2) {\r\n return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;\r\n }\r\n\r\n BigInteger.prototype.multiply = function (v) {\r\n var n = parseValue(v),\r\n a = this.value, b = n.value,\r\n sign = this.sign !== n.sign,\r\n abs;\r\n if (n.isSmall) {\r\n if (b === 0) return Integer[0];\r\n if (b === 1) return this;\r\n if (b === -1) return this.negate();\r\n abs = Math.abs(b);\r\n if (abs < BASE) {\r\n return new BigInteger(multiplySmall(a, abs), sign);\r\n }\r\n b = smallToArray(abs);\r\n }\r\n if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes\r\n return new BigInteger(multiplyKaratsuba(a, b), sign);\r\n return new BigInteger(multiplyLong(a, b), sign);\r\n };\r\n\r\n BigInteger.prototype.times = BigInteger.prototype.multiply;\r\n\r\n function multiplySmallAndArray(a, b, sign) { // a >= 0\r\n if (a < BASE) {\r\n return new BigInteger(multiplySmall(b, a), sign);\r\n }\r\n return new BigInteger(multiplyLong(b, smallToArray(a)), sign);\r\n }\r\n SmallInteger.prototype._multiplyBySmall = function (a) {\r\n if (isPrecise(a.value * this.value)) {\r\n return new SmallInteger(a.value * this.value);\r\n }\r\n return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);\r\n };\r\n BigInteger.prototype._multiplyBySmall = function (a) {\r\n if (a.value === 0) return Integer[0];\r\n if (a.value === 1) return this;\r\n if (a.value === -1) return this.negate();\r\n return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);\r\n };\r\n SmallInteger.prototype.multiply = function (v) {\r\n return parseValue(v)._multiplyBySmall(this);\r\n };\r\n SmallInteger.prototype.times = SmallInteger.prototype.multiply;\r\n\r\n NativeBigInt.prototype.multiply = function (v) {\r\n return new NativeBigInt(this.value * parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;\r\n\r\n function square(a) {\r\n //console.assert(2 * BASE * BASE < MAX_INT);\r\n var l = a.length,\r\n r = createArray(l + l),\r\n base = BASE,\r\n product, carry, i, a_i, a_j;\r\n for (i = 0; i < l; i++) {\r\n a_i = a[i];\r\n carry = 0 - a_i * a_i;\r\n for (var j = i; j < l; j++) {\r\n a_j = a[j];\r\n product = 2 * (a_i * a_j) + r[i + j] + carry;\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n }\r\n r[i + l] = carry;\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.square = function () {\r\n return new BigInteger(square(this.value), false);\r\n };\r\n\r\n SmallInteger.prototype.square = function () {\r\n var value = this.value * this.value;\r\n if (isPrecise(value)) return new SmallInteger(value);\r\n return new BigInteger(square(smallToArray(Math.abs(this.value))), false);\r\n };\r\n\r\n NativeBigInt.prototype.square = function (v) {\r\n return new NativeBigInt(this.value * this.value);\r\n }\r\n\r\n function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n base = BASE,\r\n result = createArray(b.length),\r\n divisorMostSignificantDigit = b[b_l - 1],\r\n // normalization\r\n lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),\r\n remainder = multiplySmall(a, lambda),\r\n divisor = multiplySmall(b, lambda),\r\n quotientDigit, shift, carry, borrow, i, l, q;\r\n if (remainder.length <= a_l) remainder.push(0);\r\n divisor.push(0);\r\n divisorMostSignificantDigit = divisor[b_l - 1];\r\n for (shift = a_l - b_l; shift >= 0; shift--) {\r\n quotientDigit = base - 1;\r\n if (remainder[shift + b_l] !== divisorMostSignificantDigit) {\r\n quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);\r\n }\r\n // quotientDigit <= base - 1\r\n carry = 0;\r\n borrow = 0;\r\n l = divisor.length;\r\n for (i = 0; i < l; i++) {\r\n carry += quotientDigit * divisor[i];\r\n q = Math.floor(carry / base);\r\n borrow += remainder[shift + i] - (carry - q * base);\r\n carry = q;\r\n if (borrow < 0) {\r\n remainder[shift + i] = borrow + base;\r\n borrow = -1;\r\n } else {\r\n remainder[shift + i] = borrow;\r\n borrow = 0;\r\n }\r\n }\r\n while (borrow !== 0) {\r\n quotientDigit -= 1;\r\n carry = 0;\r\n for (i = 0; i < l; i++) {\r\n carry += remainder[shift + i] - base + divisor[i];\r\n if (carry < 0) {\r\n remainder[shift + i] = carry + base;\r\n carry = 0;\r\n } else {\r\n remainder[shift + i] = carry;\r\n carry = 1;\r\n }\r\n }\r\n borrow += carry;\r\n }\r\n result[shift] = quotientDigit;\r\n }\r\n // denormalization\r\n remainder = divModSmall(remainder, lambda)[0];\r\n return [arrayToSmall(result), arrayToSmall(remainder)];\r\n }\r\n\r\n function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/\r\n // Performs faster than divMod1 on larger input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n result = [],\r\n part = [],\r\n base = BASE,\r\n guess, xlen, highx, highy, check;\r\n while (a_l) {\r\n part.unshift(a[--a_l]);\r\n trim(part);\r\n if (compareAbs(part, b) < 0) {\r\n result.push(0);\r\n continue;\r\n }\r\n xlen = part.length;\r\n highx = part[xlen - 1] * base + part[xlen - 2];\r\n highy = b[b_l - 1] * base + b[b_l - 2];\r\n if (xlen > b_l) {\r\n highx = (highx + 1) * base;\r\n }\r\n guess = Math.ceil(highx / highy);\r\n do {\r\n check = multiplySmall(b, guess);\r\n if (compareAbs(check, part) <= 0) break;\r\n guess--;\r\n } while (guess);\r\n result.push(guess);\r\n part = subtract(part, check);\r\n }\r\n result.reverse();\r\n return [arrayToSmall(result), arrayToSmall(part)];\r\n }\r\n\r\n function divModSmall(value, lambda) {\r\n var length = value.length,\r\n quotient = createArray(length),\r\n base = BASE,\r\n i, q, remainder, divisor;\r\n remainder = 0;\r\n for (i = length - 1; i >= 0; --i) {\r\n divisor = remainder * base + value[i];\r\n q = truncate(divisor / lambda);\r\n remainder = divisor - q * lambda;\r\n quotient[i] = q | 0;\r\n }\r\n return [quotient, remainder | 0];\r\n }\r\n\r\n function divModAny(self, v) {\r\n var value, n = parseValue(v);\r\n if (supportsNativeBigInt) {\r\n return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];\r\n }\r\n var a = self.value, b = n.value;\r\n var quotient;\r\n if (b === 0) throw new Error(\"Cannot divide by zero\");\r\n if (self.isSmall) {\r\n if (n.isSmall) {\r\n return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];\r\n }\r\n return [Integer[0], self];\r\n }\r\n if (n.isSmall) {\r\n if (b === 1) return [self, Integer[0]];\r\n if (b == -1) return [self.negate(), Integer[0]];\r\n var abs = Math.abs(b);\r\n if (abs < BASE) {\r\n value = divModSmall(a, abs);\r\n quotient = arrayToSmall(value[0]);\r\n var remainder = value[1];\r\n if (self.sign) remainder = -remainder;\r\n if (typeof quotient === \"number\") {\r\n if (self.sign !== n.sign) quotient = -quotient;\r\n return [new SmallInteger(quotient), new SmallInteger(remainder)];\r\n }\r\n return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];\r\n }\r\n b = smallToArray(abs);\r\n }\r\n var comparison = compareAbs(a, b);\r\n if (comparison === -1) return [Integer[0], self];\r\n if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];\r\n\r\n // divMod1 is faster on smaller input sizes\r\n if (a.length + b.length <= 200)\r\n value = divMod1(a, b);\r\n else value = divMod2(a, b);\r\n\r\n quotient = value[0];\r\n var qSign = self.sign !== n.sign,\r\n mod = value[1],\r\n mSign = self.sign;\r\n if (typeof quotient === \"number\") {\r\n if (qSign) quotient = -quotient;\r\n quotient = new SmallInteger(quotient);\r\n } else quotient = new BigInteger(quotient, qSign);\r\n if (typeof mod === \"number\") {\r\n if (mSign) mod = -mod;\r\n mod = new SmallInteger(mod);\r\n } else mod = new BigInteger(mod, mSign);\r\n return [quotient, mod];\r\n }\r\n\r\n BigInteger.prototype.divmod = function (v) {\r\n var result = divModAny(this, v);\r\n return {\r\n quotient: result[0],\r\n remainder: result[1]\r\n };\r\n };\r\n NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;\r\n\r\n\r\n BigInteger.prototype.divide = function (v) {\r\n return divModAny(this, v)[0];\r\n };\r\n NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {\r\n return new NativeBigInt(this.value / parseValue(v).value);\r\n };\r\n SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;\r\n\r\n BigInteger.prototype.mod = function (v) {\r\n return divModAny(this, v)[1];\r\n };\r\n NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {\r\n return new NativeBigInt(this.value % parseValue(v).value);\r\n };\r\n SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;\r\n\r\n BigInteger.prototype.pow = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value,\r\n value, x, y;\r\n if (b === 0) return Integer[1];\r\n if (a === 0) return Integer[0];\r\n if (a === 1) return Integer[1];\r\n if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.sign) {\r\n return Integer[0];\r\n }\r\n if (!n.isSmall) throw new Error(\"The exponent \" + n.toString() + \" is too large.\");\r\n if (this.isSmall) {\r\n if (isPrecise(value = Math.pow(a, b)))\r\n return new SmallInteger(truncate(value));\r\n }\r\n x = this;\r\n y = Integer[1];\r\n while (true) {\r\n if (b & 1 === 1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === 0) break;\r\n b /= 2;\r\n x = x.square();\r\n }\r\n return y;\r\n };\r\n SmallInteger.prototype.pow = BigInteger.prototype.pow;\r\n\r\n NativeBigInt.prototype.pow = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value, b = n.value;\r\n var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);\r\n if (b === _0) return Integer[1];\r\n if (a === _0) return Integer[0];\r\n if (a === _1) return Integer[1];\r\n if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.isNegative()) return new NativeBigInt(_0);\r\n var x = this;\r\n var y = Integer[1];\r\n while (true) {\r\n if ((b & _1) === _1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === _0) break;\r\n b /= _2;\r\n x = x.square();\r\n }\r\n return y;\r\n }\r\n\r\n BigInteger.prototype.modPow = function (exp, mod) {\r\n exp = parseValue(exp);\r\n mod = parseValue(mod);\r\n if (mod.isZero()) throw new Error(\"Cannot take modPow with modulus 0\");\r\n var r = Integer[1],\r\n base = this.mod(mod);\r\n if (exp.isNegative()) {\r\n exp = exp.multiply(Integer[-1]);\r\n base = base.modInv(mod);\r\n }\r\n while (exp.isPositive()) {\r\n if (base.isZero()) return Integer[0];\r\n if (exp.isOdd()) r = r.multiply(base).mod(mod);\r\n exp = exp.divide(2);\r\n base = base.square().mod(mod);\r\n }\r\n return r;\r\n };\r\n NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;\r\n\r\n function compareAbs(a, b) {\r\n if (a.length !== b.length) {\r\n return a.length > b.length ? 1 : -1;\r\n }\r\n for (var i = a.length - 1; i >= 0; i--) {\r\n if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n\r\n BigInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) return 1;\r\n return compareAbs(a, b);\r\n };\r\n SmallInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = Math.abs(this.value),\r\n b = n.value;\r\n if (n.isSmall) {\r\n b = Math.abs(b);\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n return -1;\r\n };\r\n NativeBigInt.prototype.compareAbs = function (v) {\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n a = a >= 0 ? a : -a;\r\n b = b >= 0 ? b : -b;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n\r\n BigInteger.prototype.compare = function (v) {\r\n // See discussion about comparison with Infinity:\r\n // https://github.com/peterolson/BigInteger.js/issues/61\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (this.sign !== n.sign) {\r\n return n.sign ? 1 : -1;\r\n }\r\n if (n.isSmall) {\r\n return this.sign ? -1 : 1;\r\n }\r\n return compareAbs(a, b) * (this.sign ? -1 : 1);\r\n };\r\n BigInteger.prototype.compareTo = BigInteger.prototype.compare;\r\n\r\n SmallInteger.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) {\r\n return a == b ? 0 : a > b ? 1 : -1;\r\n }\r\n if (a < 0 !== n.sign) {\r\n return a < 0 ? -1 : 1;\r\n }\r\n return a < 0 ? 1 : -1;\r\n };\r\n SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;\r\n\r\n NativeBigInt.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;\r\n\r\n BigInteger.prototype.equals = function (v) {\r\n return this.compare(v) === 0;\r\n };\r\n NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;\r\n\r\n BigInteger.prototype.notEquals = function (v) {\r\n return this.compare(v) !== 0;\r\n };\r\n NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;\r\n\r\n BigInteger.prototype.greater = function (v) {\r\n return this.compare(v) > 0;\r\n };\r\n NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;\r\n\r\n BigInteger.prototype.lesser = function (v) {\r\n return this.compare(v) < 0;\r\n };\r\n NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;\r\n\r\n BigInteger.prototype.greaterOrEquals = function (v) {\r\n return this.compare(v) >= 0;\r\n };\r\n NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;\r\n\r\n BigInteger.prototype.lesserOrEquals = function (v) {\r\n return this.compare(v) <= 0;\r\n };\r\n NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;\r\n\r\n BigInteger.prototype.isEven = function () {\r\n return (this.value[0] & 1) === 0;\r\n };\r\n SmallInteger.prototype.isEven = function () {\r\n return (this.value & 1) === 0;\r\n };\r\n NativeBigInt.prototype.isEven = function () {\r\n return (this.value & BigInt(1)) === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isOdd = function () {\r\n return (this.value[0] & 1) === 1;\r\n };\r\n SmallInteger.prototype.isOdd = function () {\r\n return (this.value & 1) === 1;\r\n };\r\n NativeBigInt.prototype.isOdd = function () {\r\n return (this.value & BigInt(1)) === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isPositive = function () {\r\n return !this.sign;\r\n };\r\n SmallInteger.prototype.isPositive = function () {\r\n return this.value > 0;\r\n };\r\n NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;\r\n\r\n BigInteger.prototype.isNegative = function () {\r\n return this.sign;\r\n };\r\n SmallInteger.prototype.isNegative = function () {\r\n return this.value < 0;\r\n };\r\n NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;\r\n\r\n BigInteger.prototype.isUnit = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isUnit = function () {\r\n return Math.abs(this.value) === 1;\r\n };\r\n NativeBigInt.prototype.isUnit = function () {\r\n return this.abs().value === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isZero = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isZero = function () {\r\n return this.value === 0;\r\n };\r\n NativeBigInt.prototype.isZero = function () {\r\n return this.value === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isDivisibleBy = function (v) {\r\n var n = parseValue(v);\r\n if (n.isZero()) return false;\r\n if (n.isUnit()) return true;\r\n if (n.compareAbs(2) === 0) return this.isEven();\r\n return this.mod(n).isZero();\r\n };\r\n NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;\r\n\r\n function isBasicPrime(v) {\r\n var n = v.abs();\r\n if (n.isUnit()) return false;\r\n if (n.equals(2) || n.equals(3) || n.equals(5)) return true;\r\n if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;\r\n if (n.lesser(49)) return true;\r\n // we don't know if it's prime: let the other functions figure it out\r\n }\r\n\r\n function millerRabinTest(n, a) {\r\n var nPrev = n.prev(),\r\n b = nPrev,\r\n r = 0,\r\n d, t, i, x;\r\n while (b.isEven()) b = b.divide(2), r++;\r\n next: for (i = 0; i < a.length; i++) {\r\n if (n.lesser(a[i])) continue;\r\n x = bigInt(a[i]).modPow(b, n);\r\n if (x.isUnit() || x.equals(nPrev)) continue;\r\n for (d = r - 1; d != 0; d--) {\r\n x = x.square().mod(n);\r\n if (x.isUnit()) return false;\r\n if (x.equals(nPrev)) continue next;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Set \"strict\" to true to force GRH-supported lower bound of 2*log(N)^2\r\n BigInteger.prototype.isPrime = function (strict) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var bits = n.bitLength();\r\n if (bits <= 64)\r\n return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\r\n var logN = Math.log(2) * bits.toJSNumber();\r\n var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt(i + 2));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;\r\n\r\n BigInteger.prototype.isProbablePrime = function (iterations, rng) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var t = iterations === undefined ? 5 : iterations;\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt.randBetween(2, n.minus(2), rng));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;\r\n\r\n BigInteger.prototype.modInv = function (n) {\r\n var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;\r\n while (!newR.isZero()) {\r\n q = r.divide(newR);\r\n lastT = t;\r\n lastR = r;\r\n t = newT;\r\n r = newR;\r\n newT = lastT.subtract(q.multiply(newT));\r\n newR = lastR.subtract(q.multiply(newR));\r\n }\r\n if (!r.isUnit()) throw new Error(this.toString() + \" and \" + n.toString() + \" are not co-prime\");\r\n if (t.compare(0) === -1) {\r\n t = t.add(n);\r\n }\r\n if (this.isNegative()) {\r\n return t.negate();\r\n }\r\n return t;\r\n };\r\n\r\n NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;\r\n\r\n BigInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return subtractSmall(value, 1, this.sign);\r\n }\r\n return new BigInteger(addSmall(value, 1), this.sign);\r\n };\r\n SmallInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (value + 1 < MAX_INT) return new SmallInteger(value + 1);\r\n return new BigInteger(MAX_INT_ARR, false);\r\n };\r\n NativeBigInt.prototype.next = function () {\r\n return new NativeBigInt(this.value + BigInt(1));\r\n }\r\n\r\n BigInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return new BigInteger(addSmall(value, 1), true);\r\n }\r\n return subtractSmall(value, 1, this.sign);\r\n };\r\n SmallInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);\r\n return new BigInteger(MAX_INT_ARR, true);\r\n };\r\n NativeBigInt.prototype.prev = function () {\r\n return new NativeBigInt(this.value - BigInt(1));\r\n }\r\n\r\n var powersOfTwo = [1];\r\n while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);\r\n var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];\r\n\r\n function shift_isSmall(n) {\r\n return Math.abs(n) <= BASE;\r\n }\r\n\r\n BigInteger.prototype.shiftLeft = function (v) {\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftRight(-n);\r\n var result = this;\r\n if (result.isZero()) return result;\r\n while (n >= powers2Length) {\r\n result = result.multiply(highestPower2);\r\n n -= powers2Length - 1;\r\n }\r\n return result.multiply(powersOfTwo[n]);\r\n };\r\n NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;\r\n\r\n BigInteger.prototype.shiftRight = function (v) {\r\n var remQuo;\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftLeft(-n);\r\n var result = this;\r\n while (n >= powers2Length) {\r\n if (result.isZero() || (result.isNegative() && result.isUnit())) return result;\r\n remQuo = divModAny(result, highestPower2);\r\n result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n n -= powers2Length - 1;\r\n }\r\n remQuo = divModAny(result, powersOfTwo[n]);\r\n return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n };\r\n NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;\r\n\r\n function bitwise(x, y, fn) {\r\n y = parseValue(y);\r\n var xSign = x.isNegative(), ySign = y.isNegative();\r\n var xRem = xSign ? x.not() : x,\r\n yRem = ySign ? y.not() : y;\r\n var xDigit = 0, yDigit = 0;\r\n var xDivMod = null, yDivMod = null;\r\n var result = [];\r\n while (!xRem.isZero() || !yRem.isZero()) {\r\n xDivMod = divModAny(xRem, highestPower2);\r\n xDigit = xDivMod[1].toJSNumber();\r\n if (xSign) {\r\n xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers\r\n }\r\n\r\n yDivMod = divModAny(yRem, highestPower2);\r\n yDigit = yDivMod[1].toJSNumber();\r\n if (ySign) {\r\n yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers\r\n }\r\n\r\n xRem = xDivMod[0];\r\n yRem = yDivMod[0];\r\n result.push(fn(xDigit, yDigit));\r\n }\r\n var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);\r\n for (var i = result.length - 1; i >= 0; i -= 1) {\r\n sum = sum.multiply(highestPower2).add(bigInt(result[i]));\r\n }\r\n return sum;\r\n }\r\n\r\n BigInteger.prototype.not = function () {\r\n return this.negate().prev();\r\n };\r\n NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;\r\n\r\n BigInteger.prototype.and = function (n) {\r\n return bitwise(this, n, function (a, b) { return a & b; });\r\n };\r\n NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;\r\n\r\n BigInteger.prototype.or = function (n) {\r\n return bitwise(this, n, function (a, b) { return a | b; });\r\n };\r\n NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;\r\n\r\n BigInteger.prototype.xor = function (n) {\r\n return bitwise(this, n, function (a, b) { return a ^ b; });\r\n };\r\n NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;\r\n\r\n var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;\r\n function roughLOB(n) { // get lowestOneBit (rough)\r\n // SmallInteger: return Min(lowestOneBit(n), 1 << 30)\r\n // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]\r\n var v = n.value,\r\n x = typeof v === \"number\" ? v | LOBMASK_I :\r\n typeof v === \"bigint\" ? v | BigInt(LOBMASK_I) :\r\n v[0] + v[1] * BASE | LOBMASK_BI;\r\n return x & -x;\r\n }\r\n\r\n function integerLogarithm(value, base) {\r\n if (base.compareTo(value) <= 0) {\r\n var tmp = integerLogarithm(value, base.square(base));\r\n var p = tmp.p;\r\n var e = tmp.e;\r\n var t = p.multiply(base);\r\n return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };\r\n }\r\n return { p: bigInt(1), e: 0 };\r\n }\r\n\r\n BigInteger.prototype.bitLength = function () {\r\n var n = this;\r\n if (n.compareTo(bigInt(0)) < 0) {\r\n n = n.negate().subtract(bigInt(1));\r\n }\r\n if (n.compareTo(bigInt(0)) === 0) {\r\n return bigInt(0);\r\n }\r\n return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));\r\n }\r\n NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;\r\n\r\n function max(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.greater(b) ? a : b;\r\n }\r\n function min(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.lesser(b) ? a : b;\r\n }\r\n function gcd(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n if (a.equals(b)) return a;\r\n if (a.isZero()) return b;\r\n if (b.isZero()) return a;\r\n var c = Integer[1], d, t;\r\n while (a.isEven() && b.isEven()) {\r\n d = min(roughLOB(a), roughLOB(b));\r\n a = a.divide(d);\r\n b = b.divide(d);\r\n c = c.multiply(d);\r\n }\r\n while (a.isEven()) {\r\n a = a.divide(roughLOB(a));\r\n }\r\n do {\r\n while (b.isEven()) {\r\n b = b.divide(roughLOB(b));\r\n }\r\n if (a.greater(b)) {\r\n t = b; b = a; a = t;\r\n }\r\n b = b.subtract(a);\r\n } while (!b.isZero());\r\n return c.isUnit() ? a : a.multiply(c);\r\n }\r\n function lcm(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n return a.divide(gcd(a, b)).multiply(b);\r\n }\r\n function randBetween(a, b, rng) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n var usedRNG = rng || Math.random;\r\n var low = min(a, b), high = max(a, b);\r\n var range = high.subtract(low).add(1);\r\n if (range.isSmall) return low.add(Math.floor(usedRNG() * range));\r\n var digits = toBase(range, BASE).value;\r\n var result = [], restricted = true;\r\n for (var i = 0; i < digits.length; i++) {\r\n var top = restricted ? digits[i] + (i + 1 < digits.length ? digits[i + 1] / BASE : 0) : BASE;\r\n var digit = truncate(usedRNG() * top);\r\n result.push(digit);\r\n if (digit < digits[i]) restricted = false;\r\n }\r\n return low.add(Integer.fromArray(result, BASE, false));\r\n }\r\n\r\n var parseBase = function (text, base, alphabet, caseSensitive) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n text = String(text);\r\n if (!caseSensitive) {\r\n text = text.toLowerCase();\r\n alphabet = alphabet.toLowerCase();\r\n }\r\n var length = text.length;\r\n var i;\r\n var absBase = Math.abs(base);\r\n var alphabetValues = {};\r\n for (i = 0; i < alphabet.length; i++) {\r\n alphabetValues[alphabet[i]] = i;\r\n }\r\n for (i = 0; i < length; i++) {\r\n var c = text[i];\r\n if (c === \"-\") continue;\r\n if (c in alphabetValues) {\r\n if (alphabetValues[c] >= absBase) {\r\n if (c === \"1\" && absBase === 1) continue;\r\n throw new Error(c + \" is not a valid digit in base \" + base + \".\");\r\n }\r\n }\r\n }\r\n base = parseValue(base);\r\n var digits = [];\r\n var isNegative = text[0] === \"-\";\r\n for (i = isNegative ? 1 : 0; i < text.length; i++) {\r\n var c = text[i];\r\n if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));\r\n else if (c === \"<\") {\r\n var start = i;\r\n do { i++; } while (text[i] !== \">\" && i < text.length);\r\n digits.push(parseValue(text.slice(start + 1, i)));\r\n }\r\n else throw new Error(c + \" is not a valid character\");\r\n }\r\n return parseBaseFromArray(digits, base, isNegative);\r\n };\r\n\r\n function parseBaseFromArray(digits, base, isNegative) {\r\n var val = Integer[0], pow = Integer[1], i;\r\n for (i = digits.length - 1; i >= 0; i--) {\r\n val = val.add(digits[i].times(pow));\r\n pow = pow.times(base);\r\n }\r\n return isNegative ? val.negate() : val;\r\n }\r\n\r\n function stringify(digit, alphabet) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n if (digit < alphabet.length) {\r\n return alphabet[digit];\r\n }\r\n return \"<\" + digit + \">\";\r\n }\r\n\r\n function toBase(n, base) {\r\n base = bigInt(base);\r\n if (base.isZero()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n throw new Error(\"Cannot convert nonzero numbers to base 0.\");\r\n }\r\n if (base.equals(-1)) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n if (n.isNegative())\r\n return {\r\n value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))\r\n .map(Array.prototype.valueOf, [1, 0])\r\n ),\r\n isNegative: false\r\n };\r\n\r\n var arr = Array.apply(null, Array(n.toJSNumber() - 1))\r\n .map(Array.prototype.valueOf, [0, 1]);\r\n arr.unshift([1]);\r\n return {\r\n value: [].concat.apply([], arr),\r\n isNegative: false\r\n };\r\n }\r\n\r\n var neg = false;\r\n if (n.isNegative() && base.isPositive()) {\r\n neg = true;\r\n n = n.abs();\r\n }\r\n if (base.isUnit()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n\r\n return {\r\n value: Array.apply(null, Array(n.toJSNumber()))\r\n .map(Number.prototype.valueOf, 1),\r\n isNegative: neg\r\n };\r\n }\r\n var out = [];\r\n var left = n, divmod;\r\n while (left.isNegative() || left.compareAbs(base) >= 0) {\r\n divmod = left.divmod(base);\r\n left = divmod.quotient;\r\n var digit = divmod.remainder;\r\n if (digit.isNegative()) {\r\n digit = base.minus(digit).abs();\r\n left = left.next();\r\n }\r\n out.push(digit.toJSNumber());\r\n }\r\n out.push(left.toJSNumber());\r\n return { value: out.reverse(), isNegative: neg };\r\n }\r\n\r\n function toBaseString(n, base, alphabet) {\r\n var arr = toBase(n, base);\r\n return (arr.isNegative ? \"-\" : \"\") + arr.value.map(function (x) {\r\n return stringify(x, alphabet);\r\n }).join('');\r\n }\r\n\r\n BigInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n SmallInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n NativeBigInt.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n BigInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix !== 10) return toBaseString(this, radix, alphabet);\r\n var v = this.value, l = v.length, str = String(v[--l]), zeros = \"0000000\", digit;\r\n while (--l >= 0) {\r\n digit = String(v[l]);\r\n str += zeros.slice(digit.length) + digit;\r\n }\r\n var sign = this.sign ? \"-\" : \"\";\r\n return sign + str;\r\n };\r\n\r\n SmallInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix != 10) return toBaseString(this, radix, alphabet);\r\n return String(this.value);\r\n };\r\n\r\n NativeBigInt.prototype.toString = SmallInteger.prototype.toString;\r\n\r\n NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }\r\n\r\n BigInteger.prototype.valueOf = function () {\r\n return parseInt(this.toString(), 10);\r\n };\r\n BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;\r\n\r\n SmallInteger.prototype.valueOf = function () {\r\n return this.value;\r\n };\r\n SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;\r\n NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {\r\n return parseInt(this.toString(), 10);\r\n }\r\n\r\n function parseStringValue(v) {\r\n if (isPrecise(+v)) {\r\n var x = +v;\r\n if (x === truncate(x))\r\n return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);\r\n throw new Error(\"Invalid integer: \" + v);\r\n }\r\n var sign = v[0] === \"-\";\r\n if (sign) v = v.slice(1);\r\n var split = v.split(/e/i);\r\n if (split.length > 2) throw new Error(\"Invalid integer: \" + split.join(\"e\"));\r\n if (split.length === 2) {\r\n var exp = split[1];\r\n if (exp[0] === \"+\") exp = exp.slice(1);\r\n exp = +exp;\r\n if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error(\"Invalid integer: \" + exp + \" is not a valid exponent.\");\r\n var text = split[0];\r\n var decimalPlace = text.indexOf(\".\");\r\n if (decimalPlace >= 0) {\r\n exp -= text.length - decimalPlace - 1;\r\n text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);\r\n }\r\n if (exp < 0) throw new Error(\"Cannot include negative exponent part for integers\");\r\n text += (new Array(exp + 1)).join(\"0\");\r\n v = text;\r\n }\r\n var isValid = /^([0-9][0-9]*)$/.test(v);\r\n if (!isValid) throw new Error(\"Invalid integer: \" + v);\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(sign ? \"-\" + v : v));\r\n }\r\n var r = [], max = v.length, l = LOG_BASE, min = max - l;\r\n while (max > 0) {\r\n r.push(+v.slice(min, max));\r\n min -= l;\r\n if (min < 0) min = 0;\r\n max -= l;\r\n }\r\n trim(r);\r\n return new BigInteger(r, sign);\r\n }\r\n\r\n function parseNumberValue(v) {\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(v));\r\n }\r\n if (isPrecise(v)) {\r\n if (v !== truncate(v)) throw new Error(v + \" is not an integer.\");\r\n return new SmallInteger(v);\r\n }\r\n return parseStringValue(v.toString());\r\n }\r\n\r\n function parseValue(v) {\r\n if (typeof v === \"number\") {\r\n return parseNumberValue(v);\r\n }\r\n if (typeof v === \"string\") {\r\n return parseStringValue(v);\r\n }\r\n if (typeof v === \"bigint\") {\r\n return new NativeBigInt(v);\r\n }\r\n return v;\r\n }\r\n // Pre-define numbers in range [-999,999]\r\n for (var i = 0; i < 1000; i++) {\r\n Integer[i] = parseValue(i);\r\n if (i > 0) Integer[-i] = parseValue(-i);\r\n }\r\n // Backwards compatibility\r\n Integer.one = Integer[1];\r\n Integer.zero = Integer[0];\r\n Integer.minusOne = Integer[-1];\r\n Integer.max = max;\r\n Integer.min = min;\r\n Integer.gcd = gcd;\r\n Integer.lcm = lcm;\r\n Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };\r\n Integer.randBetween = randBetween;\r\n\r\n Integer.fromArray = function (digits, base, isNegative) {\r\n return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);\r\n };\r\n\r\n return Integer;\r\n})();\r\n\r\n// Node.js check\r\nif (typeof module !== \"undefined\" && module.hasOwnProperty(\"exports\")) {\r\n module.exports = bigInt;\r\n}\r\n\r\n//amd check\r\nif (typeof define === \"function\" && define.amd) {\r\n define( function () {\r\n return bigInt;\r\n });\r\n}\r\n","/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,s=0;for(;0!==i;){s=i>2e3?2e3:i,i-=s;do{a=a+t[n++]|0,r=r+a|0}while(--s);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,s=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,s,o,l,d,f,h,c,u,w,b,k,m,_,g,v,p,y,x,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),s=a+(e.avail_out-257),o=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,h=A.window,c=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,c>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(c&(1<>>=g,u-=g),u<15&&(c+=E[i++]<>>24,c>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(c&(1<o){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(c>>>=g,u-=g,g=a-r,p>g){if(g=p-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(y=0,x=h,0===f){if(y+=l-g,g2;)R[a++]=x[y++],R[a++]=x[y++],R[a++]=x[y++],v-=3;v&&(R[a++]=x[y++],v>1&&(R[a++]=x[y++]))}else{y=a-p;do{R[a++]=R[y++],R[a++]=R[y++],R[a++]=R[y++],v-=3}while(v>2);v&&(R[a++]=R[y++],v>1&&(R[a++]=R[y++]))}break}}break}}while(i>3,i-=v,u-=v<<3,c&=(1<{const u=c.bits;let w,b,k,m,_,g,v=0,p=0,y=0,x=0,E=0,R=0,A=0,Z=0,S=0,O=0,U=null,T=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(v=0;v<=r;v++)D[v]=0;for(p=0;p=1&&0===D[x];x--);if(E>x&&(E=x),0===x)return a[f++]=20971520,a[f++]=20971520,c.bits=1,0;for(y=1;y0&&(0===e||1!==x))return-1;for(I[1]=0,v=1;v852||2===e&&S>592)return 1;for(;;){B=v-A,h[p]g?(N=z[F+h[p]],C=U[T+h[p]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(O&=w-1,O+=w):O=0,p++,0==--D[v]){if(v===x)break;v=t[i+h[p]]}if(v>E&&(O&m)!==k){for(0===A&&(A=E),_+=y,R=v-A,Z=1<852||2===e&&S>592)return 1;k=O&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==O&&(a[_+O]=v-A<<24|64<<16|0),c.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:c,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:v,Z_BUF_ERROR:p,Z_DEFLATED:y}=h,x=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},O=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},U=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=O(e,t);return n!==b&&(e.state=null),n};let T,D,I=!0;const B=e=>{if(I){T=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,T,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=T,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveU(e,15),inflateInit2:U,inflate:(e,i)=>{let r,s,o,l,d,h,A,Z,S,O,U,T,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===x&&(r.mode=13),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,O=h,U=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==y){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(T=r.length,T>h&&(T=h),T&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+T),j)),512&r.flags&&(r.check=n(r.check,s,T,l)),h-=T,l+=T,r.length-=T),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===h)break e;T=0;do{j=s[l+T++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&T>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=x;break;case 10:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===h)break e;h--,Z+=s[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(T=r.length,T){if(T>h&&(T=h),T>A&&(T=A),0===T)break e;o.set(s.subarray(l,l+T),d),h-=T,l+=T,A-=T,d+=T,r.length-=T;break}r.mode=x;break;case 17:for(;S<14;){if(0===h)break e;h--,Z+=s[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],T=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,T=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,T=11+(127&Z),Z>>>=7,S-=7}if(r.have+T>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;T--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(h>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=h,r.hold=Z,r.bits=S,a(e,U),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,r.mode===x&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=x;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(T=U-A,r.offset>T){if(T=r.offset-T,T>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}T>r.wnext?(T-=r.wnext,D=r.wsize-T):D=r.wnext-T,T>r.length&&(T=r.length),I=r.window}else I=o,D=d-r.offset,T=r.length;T>A&&(T=A),A-=T,r.length-=T;do{o[d++]=I[D++]}while(--T);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;o[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===h)break e;h--,Z|=s[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,s;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(s=N(e,i,n,n),s?(a.mode=31,v):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{let t,i,n,a,r,s=e.length,o=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{let i,n;const a=t||e.length,r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(t&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:t<65536?r[n++]=t:(t-=65536,r[n++]=55296|t>>10&1023,r[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=h;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,s),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,s):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,s);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==o){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,se=ae,oe=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=h,fe={Inflate:re,inflate:se,inflateRaw:oe,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=se,e.inflateRaw=oe,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n \n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from \"../helpers/bytes/bufferConcats\";\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"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\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"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\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1460809483,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-551616469,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1938625919,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"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\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"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\"}],\"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\"}],\"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\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-468280483,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"},{\"name\":\"menu_button\",\"type\":\"BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-362240487,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":1370914559,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-381896846,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"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\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"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\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"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\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"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\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"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\"}],\"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\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-396644838,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-2099097129,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":451818415,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":262163967,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"WebViewResult\"},{\"id\":-768945848,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"Bool\"},{\"id\":1790652275,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"}]},\"layer\":140} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from \"big-integer\";\nimport intToUint from \"../number/intToUint\";\n\nexport default function longFromInts(high: number, low: number): string {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low)).toString(10);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport longFromInts from '../../helpers/long/longFromInts';\n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n const {quotient, remainder} = bigInt(sLong).divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","import bigInt from 'big-integer';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n","import { bigIntFromBytes, bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\n}\n","import randomize from \"../array/randomize\";\nimport bufferConcats from \"./bufferConcats\";\n\nexport default function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport addPadding from \"../../helpers/bytes/addPadding\";\r\nimport bufferConcats from \"../../helpers/bytes/bufferConcats\";\r\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\r\nimport convertToUint8Array from \"../../helpers/bytes/convertToUint8Array\";\r\nimport bigInt from 'big-integer';\r\nimport { bigIntFromBytes, bigIntToBytes } from \"../../helpers/bigInt/bigIntConversion\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\r\n\r\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\r\n\r\n return buffer;\r\n}\r\n\r\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n\r\n const p = bigIntFromBytes(algo.p);\r\n const g = bigInt(algo.g);\r\n\r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = bigInt(bytesToHex(pw_hash), 16);\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = g.modPow(x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bigIntToBytes(v);\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = bigIntFromBytes(state.srp_B);\r\n \r\n const pForHash = padArray(bigIntToBytes(p), 256);\r\n const gForHash = padArray(bigIntToBytes(g), 256);\r\n const b_for_hash = padArray(bigIntToBytes(B), 256);\r\n\r\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\r\n const k = bigIntFromBytes(kHash);\r\n\r\n const k_v = k.multiply(v).mod(p);\r\n\r\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\r\n const diff = prime.subtract(modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(diff.isNegative() ||\r\n diff.bitLength().toJSNumber() < min_diff_bits_count || \r\n modexp.bitLength().toJSNumber() < min_diff_bits_count || \r\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = bigIntFromBytes(flipper(state.secure_random));\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n const A = g.modPow(a, p);\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bigIntToBytes(A);\r\n\r\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\r\n // const u = bigInt(s.hex, 16);\r\n const u = bigIntFromBytes(s);\r\n if(!u.isZero() && !u.isNegative())\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n let g_b: bigInt.BigInteger;\r\n if(!B.greater(k_v)) {\r\n g_b = B.add(p);\r\n } else g_b = B;\r\n g_b = g_b.subtract(k_v).mod(p);\r\n\r\n const ux = u.multiply(x);\r\n const a_ux = a.add(ux);\r\n const S = g_b.modPow(a_ux, p);\r\n\r\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\r\n\r\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\r\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(\r\n h1, \r\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\r\n\r\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n };\r\n\r\n return out;\r\n}\r\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","import convertToUint8Array from \"./convertToUint8Array\";\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n //console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n //console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","import subtle from \"../subtle\";\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","import type { RSAPublicKeyHex } from \"../../mtproto/rsaKeysManager\";\nimport bytesModPow from \"../../../helpers/bytes/bytesModPow\";\nimport bytesFromHex from \"../../../helpers/bytes/bytesFromHex\";\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from \"../../../helpers/bytes/convertToUint8Array\";\nimport subtle from \"../subtle\";\n//import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from \"big-integer\";\nimport { nextRandomUint } from \"../random\";\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from \"big-integer\";\nimport { bigIntFromBytes, bigIntToBytes } from \"../../../../helpers/bigInt/bigIntConversion\";\nimport bigIntRandom from \"../../../../helpers/bigInt/bigIntRandom\";\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do \n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0], \n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n \n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map(b => bigIntToBytes(b)) as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from \"big-integer\";\nimport randomize from \"../../helpers/array/randomize\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport { MessagesDhConfig } from \"../../layer\";\nimport CallInstance from \"../calls/callInstance\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n \n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n \n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n \n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n \n return a;\n }\n };\n \n const a = generateA(p);\n // const a = new Uint8Array([0]);\n \n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n \n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n \n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport cryptoWorker from \"./cryptoworker\";\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse(); // key_fingerprint: key_fingerprint as any // ! it doesn't work\n const key_fingerprint_long = bigIntFromBytes(key_fingerprint).toString(10); // bigInt2str(str2bigInt(bytesToHex(key_fingerprint), 16), 10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoworker';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n \n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport gzipUncompress from '../../helpers/gzipUncompress';\r\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\r\nimport computeSRP from './srp';\r\nimport { aesEncryptSync, aesDecryptSync } from './utils/aesIGE';\r\nimport pbkdf2 from './utils/pbkdf2';\r\nimport rsaEncrypt from './utils/rsa';\r\nimport sha1 from './utils/sha1';\r\nimport sha256 from './utils/sha256';\r\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\r\nimport generateDh from './generateDh';\r\nimport computeDhKey from './computeDhKey';\r\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\r\n// import factorizeTdlibPQ from './utils/factorize/tdlib';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1': sha1,\r\n 'sha256': sha256,\r\n 'pbkdf2': pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': factorizeTdlibPQ, \r\n // 'factorize-new-new': pqPrimeLeemonNew, \r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP,\r\n 'generate-dh': generateDh,\r\n 'compute-dh-key': computeDhKey,\r\n 'get-emojis-fingerprint': getEmojisFingerprint\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport type gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport type { Awaited } from \"../../types\";\r\nimport type getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport type computeDhKey from \"./computeDhKey\";\r\nimport type generateDh from \"./generateDh\";\r\nimport type computeSRP from \"./srp\";\r\nimport type { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport type factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\n// import type factorizeTdlibPQ from \"./utils/factorize/tdlib\";\r\nimport type pbkdf2 from \"./utils/pbkdf2\";\r\nimport type rsaEncrypt from \"./utils/rsa\";\r\nimport type sha1 from \"./utils/sha1\";\r\nimport type sha256 from \"./utils/sha256\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1': typeof sha1,\r\n 'sha256': typeof sha256,\r\n 'pbkdf2': typeof pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': typeof factorizeTdlibPQ,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP,\r\n 'generate-dh': typeof generateDh,\r\n 'compute-dh-key': typeof computeDhKey,\r\n 'get-emojis-fingerprint': typeof getEmojisFingerprint\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(\r\n method: Method, \r\n ...args: Parameters\r\n ): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\nimport longFromInts from '../../helpers/long/longFromInts';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n }\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.0',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","export default function noop() {}\r\n","export default function pause(ms: number) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","export default function findAndSplice(array: Array, verify: (value: T, index?: number, array?: Array) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\nimport findAndSplice from \"./array/findAndSplice\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n findAndSplice(this.listeners[name], l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport randomize from \"../../../helpers/array/randomize\";\r\nimport bytesFromWordss from \"../../../helpers/bytes/bytesFromWordss\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n public counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this.counter = initialValue;\r\n }\r\n\r\n public increment() {\r\n const counter = this.counter;\r\n for(let i = 15; i >= 0; --i) {\r\n if(counter[i] === 255) {\r\n counter[i] = 0;\r\n } else {\r\n ++counter[i];\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n #counter: Counter;\r\n #remainingCounter: Uint8Array;\r\n #remainingCounterIndex: number;\r\n #aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this.#counter = new Counter(counter);\r\n this.#aes = new AES(key);\r\n this.#remainingCounterIndex = 16;\r\n }\r\n\r\n public update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; ++i) {\r\n if(this.#remainingCounterIndex === 16) {\r\n this.#remainingCounter = new Uint8Array(bytesFromWordss(this.#aes.encrypt(this.#counter.counter)));\r\n this.#remainingCounterIndex = 0;\r\n this.#counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this.#remainingCounter[this.#remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private encNew: CTR;\r\n private decNew: CTR;\r\n // private cryptoEncKey: CryptoKey;\r\n // encIv: Uint8Array;\r\n\r\n public /* async */ init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n randomize(initPayload);\r\n \r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n randomize(initPayload);\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = /* await */ this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\nimport bytesToHex from \"../../../helpers/bytes/bytesToHex\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = /* async */() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = /* await */ this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\nimport App from '../../config/app';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n\r\n \r\nimport HTTP from './transports/http';\r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport { DcId } from '../../types';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n let chosenServer: string;\r\n if(Modes.ssl || !Modes.http) {\r\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\r\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\r\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\r\n } else {\r\n for(let dcOption of this.dcOptions) {\r\n if(dcOption.id === dcId) {\r\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n return new HTTP(dcId, chosenServer, logSuffix);\r\n };\r\n \r\n\r\n public chooseServer(\r\n dcId: DcId, \r\n connectionType: ConnectionType = 'client', \r\n transportType: TransportType = Modes.transport, \r\n reuse = true\r\n ) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n indexOfAndSplice(transports, transport);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst dcConfigurator = new DcConfigurator();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.dcConfigurator = dcConfigurator);\r\nexport default dcConfigurator;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../config/app\";\nimport deferredPromise from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport pause from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n \n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from '../../../helpers/schedulers/pause';\r\nimport { DcId } from '../../../types';\r\nimport { logger, LogTypes } from '../../logger';\r\nimport type MTPNetworker from '../networker';\r\nimport MTTransport from './transport';\r\nimport Modes from '../../../config/modes';\r\n\r\n \r\nimport transportController from './controller';\r\n \r\n\r\nexport default class HTTP implements MTTransport {\r\n public networker: MTPNetworker;\r\n private log: ReturnType;\r\n\r\n private pending: Array<{\r\n resolve: (body: Uint8Array) => void, \r\n reject: any, \r\n body: Uint8Array\r\n }> = [];\r\n private releasing: boolean;\r\n\r\n public connected: boolean;\r\n private destroyed: boolean;\r\n private debug: boolean;\r\n \r\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\r\n this.debug = Modes.debug && false;\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n \r\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n\r\n this.connected = false;\r\n }\r\n\r\n public _send(body: Uint8Array, mode?: RequestMode) {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\r\n if(response.status !== 200 && !mode) {\r\n response.arrayBuffer().then(buffer => {\r\n this.log.error('not 200', \r\n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\r\n });\r\n\r\n throw response;\r\n }\r\n\r\n this.setConnected(true);\r\n\r\n // * test resending by dropping random request\r\n // if(Math.random() > .5) {\r\n // throw 'asd';\r\n // }\r\n\r\n return response.arrayBuffer().then(buffer => {\r\n return new Uint8Array(buffer);\r\n }); \r\n }, (err) => {\r\n this.setConnected(false);\r\n throw err;\r\n });\r\n }\r\n\r\n private setConnected(connected: boolean) {\r\n if(this.connected === connected || this.destroyed) {\r\n return;\r\n }\r\n\r\n this.connected = connected;\r\n\r\n \r\n transportController.setTransportValue('https', connected);\r\n \r\n }\r\n\r\n public destroy() {\r\n this.setConnected(false);\r\n this.destroyed = true;\r\n this.pending.forEach(pending => pending.reject());\r\n this.pending.length = 0;\r\n }\r\n\r\n public send(body: Uint8Array) {\r\n if(this.networker) {\r\n return this._send(body);\r\n } else {\r\n const promise = new Promise((resolve, reject) => {\r\n this.pending.push({resolve, reject, body});\r\n });\r\n\r\n this.releasePending();\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n private async releasePending() {\r\n if(this.releasing) return;\r\n\r\n this.releasing = true;\r\n // this.log('-> messages to send:', this.pending.length);\r\n for(let i = 0; i < this.pending.length; ++i) {\r\n const pending = this.pending[i];\r\n const {body, resolve} = pending;\r\n\r\n try {\r\n const result = await this._send(body);\r\n resolve(result);\r\n this.pending.splice(i, 1);\r\n } catch(err) {\r\n this.log.error('Send plain request error:', err);\r\n await pause(5000);\r\n }\r\n\r\n --i;\r\n }\r\n\r\n this.releasing = false;\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingDelayDisconnectId: string;\n \n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n \n private sendPing = () => {\n // return;\n \n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n \n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n \n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n \n this.log(`sendPingDelayDisconnect: ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}`);\n const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log(`sendPingDelayDisconnect: pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n \n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n this.log.error('sendPingDelayDisconnect: catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n \n this.sentMessages[message.msg_id] = Object.assign(\n message, \n options, \n promise ? {deferred: promise} : undefined\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n \n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n \n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n // if(this.debug) {\n // this.log.debug('Rpc response', message.result, sentMessage);\n // }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n this.pingDelayDisconnectDeferred.resolve('pong');\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","import bigInt from \"big-integer\";\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map(bigInt => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport { bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n \n return bytes;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport Modes from \"../../config/modes\";\r\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from \"./transports/controller\";\n \n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport DEBUG from \"../../config/debug\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport bigInt from \"big-integer\";\nimport randomize from \"../../helpers/array/randomize\";\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = randomize(new Uint8Array(256));\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: randomize(new Uint8Array(16))\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\nimport Modes from '../../config/modes';\r\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport pause from '../../helpers/schedulers/pause';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport transportController from './transports/controller';\r\nimport MTTransport from './transports/transport';\r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nconst FILE_NETWORKERS_COUNT = 3;\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTPNetworker[]\r\n }\r\n }\r\n };\r\n \r\n private cachedExportPromise: {[x: number]: Promise};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\r\n private baseDcId: DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType;\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n };\r\n\r\n private transportType: TransportType;\r\n \r\n constructor() {\r\n this.log = logger('API');\r\n\r\n this.cachedNetworkers = {} as any;\r\n this.cachedExportPromise = {};\r\n this.gettingNetworkers = {};\r\n this.baseDcId = 0;\r\n this.afterMessageTempIds = {};\r\n\r\n this.transportType = Modes.transport;\r\n\r\n \r\n transportController.addEventListener('transport', (transportType) => {\r\n this.changeTransportType(transportType);\r\n });\r\n \r\n }\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n private getTransportType(connectionType: ConnectionType) {\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType: TransportType = this.transportType;\r\n \r\n\r\n return transportType;\r\n }\r\n\r\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\r\n for(const transportType in this.cachedNetworkers) {\r\n const connections = this.cachedNetworkers[transportType as TransportType];\r\n for(const connectionType in connections) {\r\n const dcs = connections[connectionType as ConnectionType];\r\n for(const dcId in dcs) {\r\n const networkers = dcs[dcId as any as DcId];\r\n networkers.forEach((networker, idx, arr) => {\r\n callback({\r\n networker,\r\n dcId: +dcId as DcId,\r\n connectionType: connectionType as ConnectionType,\r\n transportType: transportType as TransportType,\r\n index: idx,\r\n array: arr\r\n });\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\r\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n }\r\n\r\n public changeTransportType(transportType: TransportType) {\r\n const oldTransportType = this.transportType;\r\n if(oldTransportType === transportType) {\r\n return;\r\n }\r\n\r\n this.log('changing transport from', oldTransportType, 'to', transportType);\r\n\r\n const oldObject = this.cachedNetworkers[oldTransportType];\r\n const newObject = this.cachedNetworkers[transportType];\r\n this.cachedNetworkers[transportType] = oldObject;\r\n this.cachedNetworkers[oldTransportType] = newObject;\r\n\r\n this.transportType = transportType;\r\n\r\n for(const oldGetKey in this.gettingNetworkers) {\r\n const promise = this.gettingNetworkers[oldGetKey];\r\n delete this.gettingNetworkers[oldGetKey];\r\n\r\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\r\n this.gettingNetworkers[newGetKey] = promise;\r\n\r\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\r\n }\r\n\r\n this.iterateNetworkers((info) => {\r\n const transportType = this.getTransportType(info.connectionType);\r\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\r\n this.changeNetworkerTransport(info.networker, transport);\r\n });\r\n }\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n\r\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\r\n return [dcId, transportType, connectionType].join('-');\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n const transportType = this.getTransportType(connectionType);\r\n if(!this.cachedNetworkers[transportType]) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : FILE_NETWORKERS_COUNT;\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n let transport = this.chooseServer(dcId, connectionType, transportType);\r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n let networker: MTPNetworker, error: any;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n sessionStorage.set({\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n });\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\r\n } catch(_error) {\r\n error = _error;\r\n }\r\n }\r\n\r\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\r\n const newTransportType = this.getTransportType(connectionType);\r\n if(newTransportType !== transportType) {\r\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\r\n transport.destroy();\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\r\n\r\n if(networker) {\r\n transport = this.chooseServer(dcId, connectionType, newTransportType);\r\n }\r\n\r\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n\r\n if(error) {\r\n this.log('get networker error', error, (error as Error).stack);\r\n throw error;\r\n }\r\n\r\n this.changeNetworkerTransport(networker, transport);\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\r\n const oldTransport = networker.transport;\r\n if(oldTransport) {\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, oldTransport);\r\n }\r\n\r\n networker.changeTransport(transport);\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n this.changeNetworkerTransport(networker);\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = async(error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n throw error;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n\r\n throw error;\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (): Promise => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = cachedNetworker.wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.catch((error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n throw error;\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n return this.cachedExportPromise[dcId].then(() => performRequest());\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n return this.invokeApi(method, params, options);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n options.dcId = newDcId;\r\n return this.invokeApi(method, params, options);\r\n } else {\r\n throw error;\r\n }\r\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\r\n networkerFactory.unsetConnectionInited();\r\n return performRequest();\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n throw error;\r\n }\r\n \r\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) return after.promise.then(() => performRequest());\r\n else return performRequest();\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n throw error;\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n return pause(options.waitTime * 1000).then(() => performRequest());\r\n } else if(error.type === 'UNKNOWN') {\r\n return pause(1000).then(() => performRequest());\r\n } else {\r\n throw error;\r\n }\r\n });\r\n }\r\n \r\n let p: Promise;\r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n p = this.getNetworker(dcId, options);\r\n } else {\r\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\r\n }\r\n\r\n p.then((networker) => {\r\n cachedNetworker = networker;\r\n const promise = performRequest();\r\n cachedNetworker.attachPromise(deferred, options as MTMessage);\r\n return promise;\r\n })\r\n .then(deferred.resolve)\r\n .catch(rejectPromise)\r\n .catch(deferred.reject);\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ReferenceBytes } from \"./referenceDatabase\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { notifyAll, notifySomeone } from \"../../helpers/context\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { InputFile, InputFileLocation, InputWebFileLocation, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId, WorkerTaskVoidTemplate } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport fileManager from \"../fileManager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"./apiManager\";\r\nimport { isWebpSupported } from \"./mtproto.worker\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\nimport readBlobAsArrayBuffer from \"../../helpers/blob/readBlobAsArrayBuffer\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport fixFirefoxSvg from \"../../helpers/fixFirefoxSvg\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n // getFileMethod: Parameters[1]\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\nexport interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n};\r\n\r\nexport interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n originalPayload: ReferenceBytes\r\n};\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\n\r\nexport class ApiFileManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private cachedDownloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: Set>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public webpConvertPromises: {[fileName: string]: CancellablePromise} = {};\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n constructor() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : 36;\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = findAndSplice(downloadPull, d => d.queueId === 0) || findAndSplice(downloadPull, d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n \r\n data.cb()\r\n .then((result) => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.resolve(result);\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.reject(error);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = (this.cachedDownloadPromises[fileName] ? [this.cachedDownloadPromises[fileName]] : undefined) || \r\n (this.uploadPromises[fileName] ? Array.from(this.uploadPromises[fileName]) : []);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then(buffer => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes = 128 * 1024;\r\n\r\n while((size / bytes) > 2000) {\r\n bytes *= 2;\r\n }\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n const buffer = bytes.slice().buffer;\r\n if(IS_FIREFOX) {\r\n return cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\r\n return fixFirefoxSvg(text as string);\r\n }).then((text) => {\r\n const textEncoder = new TextEncoder();\r\n return textEncoder.encode(text);\r\n });\r\n }\r\n\r\n return cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const convertPromise = deferredPromise();\r\n\r\n const task = {type: 'convertWebp', payload: {fileName, bytes}};\r\n notifySomeone(task);\r\n return this.webpConvertPromises[fileName] = convertPromise;\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n const task = {type: 'refreshReference', payload: reference};\r\n notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then(reference => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public downloadFile(options: DownloadOptions): DownloadPromise {\r\n if(!fileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n options.mimeType = 'image/svg+xml';\r\n } else if(options.mimeType === 'image/webp' && !isWebpSupported()) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.cachedDownloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob) => {\r\n if(blob instanceof Blob && blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.deleteFile(fileName).then(() => {\r\n return this.downloadFile(options);\r\n }).catch(() => {\r\n return this.downloadFile(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred: DownloadPromise = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.cachedDownloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n await this.deleteFile(fileName);\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch(() => {\r\n //this.log('not cached', fileName);\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, size || limit, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = offset + limit >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n deferred.notify({done, offset, total: size});\r\n //}\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await fileWriter.write(bytes, offset);\r\n }\r\n\r\n if(isFinal && process) {\r\n const bytes = fileWriter.getParts();\r\n const processedResult = await processDownloaded(bytes);\r\n checkCancel();\r\n\r\n fileWriter.replaceParts(processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n const realSize = size || bytes.byteLength;\r\n if(!size) {\r\n fileWriter.trim(realSize);\r\n }\r\n\r\n deferred.resolve(fileWriter.finalize(realSize < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number, offset: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n this.cachedDownloadPromises[fileName] = deferred;\r\n\r\n deferred.catch(noop).finally(() => {\r\n delete this.cachedDownloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n private deleteFile(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.cachedDownloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public uploadFile({file, fileName}: {file: Blob | File, fileName: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferredHelper: {\r\n resolve?: (input: typeof resultInputFile) => void,\r\n reject?: (error: any) => void,\r\n notify?: (details: {done: number, total: number}) => void\r\n } = {\r\n notify: (details: {done: number, total: number}) => {}\r\n };\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n if(totalParts > 4000) {\r\n return reject({type: 'FILE_TOO_BIG'});\r\n }\r\n\r\n deferredHelper.resolve = resolve;\r\n deferredHelper.reject = reject;\r\n });\r\n Object.assign(deferred, deferredHelper);\r\n\r\n if(totalParts > 4000) {\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then(buffer => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then((result) => {\r\n doneParts++;\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n deferred.finally(() => {\r\n set.delete(deferred);\r\n if(!set.size) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n const set = this.uploadPromises[fileName] ?? (this.uploadPromises[fileName] = new Set());\r\n set.add(deferred);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiFileManager = new ApiFileManager();\r\nMOUNT_CLASS_TO.apiFileManager = apiFileManager;\r\nexport default apiFileManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\n\nimport type { LocalStorageProxyTask } from '../localStorage';\nimport type { WebpConvertTask } from '../webp/webpWorkerController';\nimport type { ToggleStorageTask } from './mtprotoworker';\nimport type { RefreshReferenceTaskResponse } from './apiFileManager';\nimport apiManager from \"./apiManager\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\nimport networkerFactory from \"./networkerFactory\";\nimport apiFileManager from './apiFileManager';\nimport { notifyAll } from '../../helpers/context';\nimport CacheStorageController from '../cacheStorage';\nimport sessionStorage from '../sessionStorage';\nimport { socketsProxied } from './transports/socketProxied';\nimport ctx from '../../environment/ctx';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nlet webpSupported = false;\nexport const isWebpSupported = () => {\n return webpSupported;\n};\n\nnetworkerFactory.setUpdatesProcessor((obj) => {\n notifyAll({update: obj});\n});\n\nnetworkerFactory.onConnectionStatusChange = (status) => {\n notifyAll({type: 'connectionStatusChange', payload: status});\n};\n\nconst taskListeners = {\n convertWebp: (task: WebpConvertTask) => {\n const {fileName, bytes} = task.payload;\n const deferred = apiFileManager.webpConvertPromises[fileName];\n if(deferred) {\n deferred.resolve(bytes);\n delete apiFileManager.webpConvertPromises[fileName];\n }\n },\n\n webpSupport: (task: any) => {\n webpSupported = task.payload;\n },\n\n socketProxy: (task: any) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n \n const socketProxied = socketsProxied.get(id);\n if(socketTask.type === 'message') {\n socketProxied.dispatchEvent('message', socketTask.payload);\n } else if(socketTask.type === 'open') {\n socketProxied.dispatchEvent('open');\n } else if(socketTask.type === 'close') {\n socketProxied.dispatchEvent('close');\n socketsProxied.delete(id);\n }\n },\n\n localStorageProxy: (task: LocalStorageProxyTask) => {\n sessionStorage.finishTask(task.id, task.payload);\n },\n\n userAgent: (task: any) => {\n networkerFactory.userAgent = task.payload;\n },\n\n online: () => {\n networkerFactory.forceReconnectTimeout();\n },\n\n forceReconnect: () => {\n networkerFactory.forceReconnect();\n },\n\n toggleStorage: (task: ToggleStorageTask) => {\n const enabled = task.payload;\n // AppStorage.toggleStorage(enabled);\n CacheStorageController.toggleStorage(enabled);\n },\n\n refreshReference: (task: RefreshReferenceTaskResponse) => {\n const hex = bytesToHex(task.originalPayload);\n const r = apiFileManager.refreshReferencePromises[hex];\n const deferred = r?.deferred;\n if(deferred) {\n if(task.error) {\n deferred.reject(task.error);\n } else {\n deferred.resolve(task.payload);\n }\n }\n },\n\n crypto: (task: any) => {\n cryptoWorker.invokeCrypto(task.task, ...task.args as any).then(result => {\n notifyAll({taskId: task.taskId, result});\n });\n }\n};\n\nconst onMessage = async(e: any) => {\n try {\n const task: {\n task: string,\n taskId: number,\n args: any[],\n type?: string\n } = e.data;\n const taskId = task.taskId;\n\n // @ts-ignore\n const f = taskListeners[task.type];\n if(f) {\n f(task);\n return;\n }\n\n if(!task.task) {\n return;\n }\n\n switch(task.task) {\n case 'requestFilePart':\n case 'setQueueId':\n case 'cancelDownload':\n case 'uploadFile':\n case 'downloadFile': {\n try {\n // @ts-ignore\n let result: any = apiFileManager[task.task].apply(apiFileManager, task.args);\n \n if(result instanceof Promise) {\n /* (result as ReturnType).notify = (progress: {done: number, total: number, offset: number}) => {\n notify({progress: {fileName, ...progress}});\n }; */\n result = await result;\n }\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n\n break;\n }\n\n case 'getNetworker': {\n // @ts-ignore\n apiManager[task.task].apply(apiManager, task.args).finally(() => {\n notifyAll({taskId, result: null});\n });\n \n break;\n }\n\n case 'setLanguage':\n case 'startAll':\n case 'stopAll': {\n // @ts-ignore\n networkerFactory[task.task].apply(networkerFactory, task.args);\n break;\n }\n \n default: {\n try {\n // @ts-ignore\n let result = apiManager[task.task].apply(apiManager, task.args);\n \n if(result instanceof Promise) {\n result = await result;\n }\n\n //console.log(notifyAll);\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n \n //throw new Error('Unknown task: ' + task.task);\n break;\n }\n }\n } catch(err) {\n console.error('worker task error:', err);\n }\n};\n\n//console.log('[WORKER] Will send ready', Date.now() / 1000);\nctx.addEventListener('message', onMessage);\nnotifyAll('ready');\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js b/public/mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js new file mode 100644 index 000000000..16ced3c7f --- /dev/null +++ b/public/mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,a,s,n,i,r={3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},1962:(e,t,a)=>{a.d(t,{C:()=>r,Z:()=>o});var s=a(1267),n=a(5953),i=a(5003);class r{constructor(e){(0,n.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,i.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),r.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new r(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}r.INSTANCES=[];class o{constructor(e,t){this.storeName=t,this.log=(0,i.kg)(["IDB",e.name,t].join("-")),this.idb=r.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,s)=>a.put(t[s],e)))),"",a)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(m?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),g=t(p.objectStore(s)),m=Array.isArray(g),h=m?g:[].concat(g);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},3821:(e,t,a)=>{a.d(t,{H:()=>hs}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const g=new l;d.GO.rootScope=g;const m=g;var h=a(7922);const u=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(function(e,t){const a=t.split(".");let s=e;return a.forEach((e=>{e&&(s=s[e])})),s}(e,s.slice(0,-1).join(".")))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&m.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var y=a(4159),_=a(3725),b=a(5418),v=a(1267),P=a(1655),M=a(5003),S=a(319);const I=new class{constructor(){this.sent=this.received=0,this.awaitingChunks=new Map}addSent(e,t){this.sent+=t}addReceived(e,t){this.received+=t;const a=this.awaitingChunks.get(e),s=null==a?void 0:a.length;if(s)for(let e=0;e=s.length){s.deferred.resolve();break}}}waitForChunk(e,t){const a=(0,_.Z)();let s=this.awaitingChunks.get(e);s||this.awaitingChunks.set(e,s=[]);const n={length:t,deferred:a};return a.catch(S.Z).finally((()=>{(0,P.Z)(s,n)})),s.push(n),a}};d.GO&&(d.GO.networkStats=I);const C=I;class w{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=v.Z.debug&&!1;let s=M.v9.Error|M.v9.Log;this.debug&&(s|=M.v9.Debug),this.log=(0,M.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),C.addSent(this.dcId,a),fetch(this.url,{method:"POST",body:e,mode:t}).then((e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then((e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))})),e;return this.setConnected(!0),e.arrayBuffer().then((e=>(C.addReceived(this.dcId,e.byteLength),new Uint8Array(e))))}),(e=>{throw this.setConnected(!1),e}))}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,H.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let s=M.v9.Error|M.v9.Log;return this.debug&&(s|=M.v9.Debug),this.log=(0,M.kg)(`WS-${e}`+a,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}function A(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var D=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class U{constructor(){this._process=(e,t)=>s.Z.invoke("invoke",{method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}]},void 0,void 0,[e.buffer])}init(e){return D(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(A(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;A(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>D(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return D(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const E=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var T=a(9174);function R(e){const t=e.length,a=new Array(t);for(let s=0;sx(this,void 0,void 0,(function*(){this.connected=!0,H.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(T.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>x(this,void 0,void 0,(function*(){C.addReceived(this.dcId,e.byteLength);let t=yield this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",R(t))})),this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(T.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=M.v9.Error|M.v9.Log;this.debug&&(i|=M.v9.Debug),this.log=(0,M.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&H.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.obfuscation&&this.obfuscation.destroy(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=void 0;if(!this.networker){const a=new Promise(((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){var e;return x(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;C.addSent(this.dcId,r.byteLength),this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}let V=0;class O extends p.Z{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++V,L.set(this.id,this);const s={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};(0,c.sj)(s)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};(0,c.sj)(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};(0,c.sj)(e)}}const L=new Map,N=v.Z.test?"_test":"";class Z{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=v.Z.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a,s)=>{const n="client"!==t?"apiws"+(s?"_premium":""):"apiws"+N,r=`wss://${y.Z.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`,o="upload"===t?"-U":"download"===t?"-D":"";let p;return p=i().IS_SAFARI&&c.N5&&void 0!==O?O:k,new B(p,e,r,o,1e4)},this.transportHTTP=(e,t,a,s)=>{let n;if(v.Z.ssl||!v.Z.http)n="https://"+this.sslSubdomains[e-1]+("client"!==t?"-1":"")+".web.telegram.org/"+(v.Z.test?"apiw_test1":"apiw1");else for(let t of this.dcOptions)if(t.id===e){n="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new w(e,n,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=v.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;const o="client"===t?"":"-1";return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,o,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,P.Z)(i,t)}}}var q=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class G extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return q(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new Z,a=this.transports={https:t.chooseServer(y.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(y.Z.baseDcId,"client","websocket",!1)},s=(0,_.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,_.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return q(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield(0,b.Z)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}const H=new G,j=(0,_.Z)();var W=a(6654);class z{setManagers(e){Object.assign(this,e)}after(){}}var K=a(3127),J=a(3989),Q=a(5466);let $;function Y(e){return null!=$?$:$=function(e){return t=this,a=void 0,n=function*(){const t=(0,Q.$)((0,M.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class ee extends z{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return A(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}check(e,t,a={}){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var te=a(6848);class ae extends z{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,M.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[R(e)]=e;for(const e of a)if((0,te.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[R(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if((0,te.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[R(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=this.appMessagesManager.wrapSingleMessage(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=R(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=R(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),"NO_NEW_CONTEXT"}))}}var se=a(7298),ne=a(5082),ie=a(252),re=a(7625),oe=a(6519);function pe(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var de=a(2790),fe=a(2946),ce=a(3781),le=a(3385),ge=a(5880),me=a(8050);function he(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,fe.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,fe.Z)(e)))),new Set(s.filter(Boolean))}function ue(e,t){const a={writable:!0,configurable:!0},s={};t.forEach((t=>{e.hasOwnProperty(t)||(s[t]=a)})),Object.defineProperties(e,s)}function ye(e,t,a){return e[t]=a}const _e=void 0;class be extends z{constructor(){super(...arguments),this.folders={},this.clear=(e=!1)=>{this.pinnedOrders={0:[],1:[]},e?this.allDialogsLoaded={}:(this.storage.clear(),this.setDialogsLoaded(0,!1),this.setDialogsLoaded(1,!1),this.setDialogsLoaded(_e,!1),this.savePinnedOrders()),this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ne.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:a,peer:s}=e,n=(0,fe.Z)(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog(i)),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=(0,fe.Z)(e.peer.peer),n=this.getDialogOnly(s);n&&(e.pFlags.pinned?n.pFlags.pinned=!0:this.handleDialogUnpinning(n,a),this.generateIndexForDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(s,n)},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=e=>{this.pinnedOrders[a].length=0,e.reverse(),e.forEach((e=>{n[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))}));const t=this.getFolderDialogs(a,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;n[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},n={};e.order?s(e.order.map((e=>(0,fe.Z)(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),s(e.dialogs.map((e=>e.peerId)))}))}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processDialogForFilters(e)})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache(),this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]),t.length&&J.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tvoid 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(e<=1)return(0,le.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,le.Z)(t.orderIndex)}getFolderUnreadCount(e){const t=this.getFolder(e);return{foundUnmuted:0===e||!!t.dialogs.find((e=>(e.unread_count||e.pFlags.unread_mark)&&!this.appNotificationsManager.isPeerLocalMuted(e.peerId,!0))),unreadCount:t.unreadDialogsCount}}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,a){var s;let n;if(this.filtersStorage.testDialogForFilter(e,a)){const t=a.pinnedPeerIds.indexOf(e.peerId);n=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(a.pinned_peers.length-1-t),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)?this.generateIndexForDialog(e,!0):(0,me.Z)(e)}return ye(e,t,n)}getDialog(e,t,a=!0){const s=[];void 0===t?s.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):s.push(this.getFolderDialogs(t,!1));for(let t of s){let s=0,n=0;for(let i=t.length;st.peerId===e.peerId)),i=s[n],r=this.getDialogIndex(i,a),o=this.setDialogIndexInFilter(e,a,t);r!==o&&((!r&&o||n&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==n&&s.splice(n,1),o&&(0,oe.Z)(s,e,(e=>this.getDialogIndex(e,a)),-1))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],a=this.filtersStorage.getFilters();for(const s in a){const n=a[s];this.filtersStorage.testDialogForFilter(e,n)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}return()=>t.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=a-s,i=a&&!s||!a&&s?s?-1:1:0;this.modifyFolderUnreadCount(e,n,i)};this.modifyFolderUnreadCount(e,a?s:-s,s?a?1:-1:0)}modifyFolderUnreadCount(e,t,a){if(!t&&!a)return;const s=this.getFolder(e);t&&(s.unreadMessagesCount=Math.max(0,s.unreadMessagesCount+t)),a&&(s.unreadDialogsCount=Math.max(0,s.unreadDialogsCount+a)),void 0===s.dispatchUnreadTimeout&&(s.dispatchUnreadTimeout=F.Z.setTimeout((()=>{s.dispatchUnreadTimeout=void 0;const e=Object.assign({},s);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e)}),0))}generateIndexForDialog(e,t=!1,a){var s;let n,i=0;if(e.pFlags.pinned&&!t)i=this.generateDialogPinnedDate(e),n=!0;else{a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),i=(null==a?void 0:a.date)||i;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!i||e.date&&e.date>i)&&(i=e.date)}"draftMessage"===(null===(s=e.draft)||void 0===s?void 0:s._)&&e.draft.date>i&&(i=e.draft.date)}i||(i=(0,se.Z)(!0));const r=this.generateDialogIndex(i,n);if(t)return r;ye(e,(0,le.Z)(e.folder_id),r)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],a=t.indexOf(e.peerId);let s=a;return-1===a&&(s=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(s)}setDialogToState(e){const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;ee.peerId===i));if(-1!==o&&r.splice(o,1),this.dialogs[i]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(s){const e=this.dialogsOffsetDate[void 0];(!e||t(0,me.Z)(e,p)),-1)}dropDialog(e){const t=this.getDialog(e,void 0,!1),[a,s]=t;if(a){delete this.dialogs[e],this.getFolder(a.folder_id).dialogs.splice(s,1);const t=void 0!==(0,P.Z)(this.pinnedOrders[a.folder_id],e);this.processDialogForFilters(a),this.dialogsIndex.indexObject(e,""),t&&this.savePinnedOrders(),this.clearDialogFromState(a,!1)}return t}clearDialogFromState(e,t){const a=e.peerId;this.peersStorage.requestPeersForKey([],`topMessage_${a}`),this.peersStorage.releasePeer(a,"dialog"),this.storage.delete(a,t)}dropDialogWithEvent(e){const t=this.dropDialog(e);return t.length&&this.rootScope.dispatchEvent("dialog_drop",{peerId:e,dialog:t[0]}),t}dropDialogOnDeletion(e){this.dropDialogWithEvent(e),this.rootScope.dispatchEvent("peer_deleted",e)}applyDialogs(e){(0,re.Z)(e.dialogs,((t,a)=>{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach((e=>{var a,s,n;const i=(0,fe.Z)(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];o&&(!r||(null===(a=this.appMessagesManager.getMessageByPeer(i,o))||void 0===a?void 0:a.date)>(null===(s=this.appMessagesManager.getMessageByPeer(i,r))||void 0===s?void 0:s.date))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o),r||"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)?(this.saveDialog(e),t[i]=e):this.dropDialogWithEvent(i);const p=this.appMessagesManager.newUpdatesAfterReloadToHandle[i];if(void 0!==p){for(const e of p)p.delete(e),this.apiUpdatesManager.saveUpdate(e);p.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[i]}})),Object.keys(t).length&&this.rootScope.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}saveDialog(e,t,a,s){var n,i;void 0===t&&(t=null!==(n=e.folder_id)&&void 0!==n?n:0);const r=(0,fe.Z)(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const p=this.appPeersManager.isChannel(r)?r.toChatId():o.NM;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const f=this.getDialogOnly(r);let c,l;if(e.top_message){c=(0,ce.Z)(e.top_message);const t=(null==f?void 0:f.top_message)&&this.appMessagesManager.getMessageByPeer(r,f.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&f.top_message>=c&&(c=f.top_message),l=this.appMessagesManager.getMessageByPeer(r,c)}else c=this.appMessagesManager.generateTempMessageId(r),l={_:"message",id:c,mid:c,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([l],{isOutgoing:!0});if((null==l?void 0:l.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,l),!p&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=(0,fe.Z)(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=a,this.appMessagesManager.migratedToFrom[a]=r,e.migratedTo=a}}if(e.top_message=c,e.read_inbox_max_id=(0,ce.Z)(f&&!e.read_inbox_max_id?f.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,ce.Z)(f&&!e.read_outbox_max_id?f.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=f?f.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,l&&l.pFlags.is_outgoing){const t=l.pFlags.out;c>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(l.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete l.pFlags.unread}const g=this.appMessagesManager.getHistoryStorage(r),m=g.history.slice;if(m.length?m.isEnd(ie.D.Bottom)||(g.history.insertSlice([c]).setEnd(ie.D.Bottom),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})):(g.history.unshift(c),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})),g.maxId=c,g.readMaxId=e.read_inbox_max_id,g.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),p&&e.pts&&this.apiUpdatesManager.addChannelState(p,e.pts),this.generateIndexForDialog(e),f){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(f);pe(f,e),t()}this.pushDialog(e,null==l?void 0:l.date,a,s)}getDialogs(e="",t,a=20,s=0,n=!1){if(s>1){const i=[],r=this.appUsersManager.fillContacts();r.cached||i.push(r.promise);const o=this.filtersStorage.reloadMissingPeerIds(s);if(o&&i.push(o),i.length)return Promise.all(i).then((()=>this.getDialogs(e,t,a,s,n)))}const i=s>1||this.getOffsetDate(s)?_e:s;let r=this.getFolderDialogs(s,n);const o=this.getDialogIndexKeyByFilterId(s);if(e){if(!a||this.cachedResults.query!==e||this.cachedResults.folderId!==s){this.cachedResults.query=e,this.cachedResults.folderId=s;const t=this.dialogsIndex.search(e),a=[];for(const e in this.dialogs){const n=this.dialogs[e];t.has(n.peerId)&&n.folder_id===s&&a.push(n)}a.sort(((e,t)=>this.getDialogIndex(t,o)-this.getDialogIndex(e,o))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}r=this.cachedResults.dialogs}else this.cachedResults.query="";let p=0;if(t>0)for(let e=r.length;pthis.getDialogIndex(r[p],o));++p);const d=this.isDialogsLoaded(i),f=r.length>=p+a;if(e||d||f){const s=r.slice(p,p+a);return{dialogs:s,count:d?r.length:null,isTopEnd:r.length&&(s[0]&&s[0]===r[0]||this.getDialogIndex(r[0],o)=r.length}}return this.appMessagesManager.getTopMessages(a,i).then((e=>{if(n&&(r=this.getFolderDialogs(s,n)),p=0,t>0)for(let e=r.length;pthis.getDialogIndex(r[p],o));++p);const i=r.slice(p,p+a);return{dialogs:i,count:void 0===e.count?r.length:e.count,isTopEnd:r.length&&(i[0]&&i[0]===r[0]||this.getDialogIndex(r[0],o){e?(this.filters={},this.reloadedPeerIds=new Set):(this.reloadedPeerIds.clear(),this.clearFilters()),this.orderIndex=2},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=2,e.order.forEach(((e,t)=>{const a=this.filters[e];delete a.orderIndex,this.setOrderIndex(a)})),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)}}after(){return this.clear(!0),this.filters={},this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=(0,ve.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const a in t){const t=+a;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.appStateManager.getState().then((e=>{pe(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}))}testDialogForFilter(e,t){if(t.id<=1)return e.folder_id===t.id;const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&1===e.folder_id)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(a)&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return Me(this,void 0,void 0,(function*(){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}))}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(s&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a)){const t=[];for(const e in this.filters){const a=this.filters[e];++a.orderIndex,t.push(a)}e.orderIndex=2;const a=t.sort(((e,t)=>e.orderIndex-t.orderIndex)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,re.Z)(e.includePeerIds,((t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const a=this.getFilter(e),s=a&&a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=(0,fe.Z)(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=(0,fe.Z)(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return Me(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);return t.length&&!e?t.map((e=>this.filters[e])).sort(((e,t)=>e.orderIndex-t.orderIndex)):(yield this.apiManager.invokeApiSingle("messages.getDialogFilters")).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0){(0,Pe.Z)(e),Se.forEach((([t,a])=>{(0,Pe.Z)(e),e[a]=e[t].map((e=>(0,fe.Z)(e)))})),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const a=this.filters[e.id];return a?Object.assign(a,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):a||this.rootScope.dispatchEvent("filter_new",e),e}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var Ce=a(6690),we=a(2821);function ke(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class Ae{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,M.kg)("UPDATES",M.v9.Error|M.v9.Warn|M.v9.Log),this.debug=d.ZP,this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{(0,Pe.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,a=e.pendingSeqUpdates[t];if(!a)return!1;const s=a.updates;for(let e=0,t=s.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=this.apiManager.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get channel diff result",a),t.pts="pts"in a?a.pts:void 0,"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return this.debug&&this.log.debug("channel diff too long",a),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.debug&&this.log.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),this.debug&&this.log.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",a)}));return a||this.justAName(t,s,e),s}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a;let s;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":s=(0,fe.Z)(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(s=e.channel_id,!(s in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(s=e.channel_id)}const{pts:n,pts_count:i}=e,r=s?this.getChannelState(s,n):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(s?this.getChannelDifference(s):this.getDifference())}),6)}),r.syncPending.ptsAwaiting=!0,!1;if(n>r.pts)r.pts=n,o=!0,r.lastPtsUpdateTime=Date.now();else if(i)return!1;s&&t.date&&this.updatesState.date0){const a=t.seq,s=t.seqStart||a;if(s!==r.seq+1&&s>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[s]&&(r.pendingSeqUpdates[s]={seq:a,date:t.date,updates:[]}),r.pendingSeqUpdates[s].updates.push(e),r.syncPending||(r.syncPending={timeout:F.Z.setTimeout((()=>{r.syncPending=null,r.syncLoading||this.getDifference()}),6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"обновлён до версии"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${y.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,we.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,Ce.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}ke(Ae,[p.Z,z]);class De extends z{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(e=>{this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){let s=this.savedAvatarURLs[e];if(s&&s[a])return s[a];{s||(s=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},i={dcId:t.dc_id,location:n};"photo_big"===a&&(n.pFlags.big=!0,i.limitPart=524288);const r=this.apiFileManager.download(i);return s[a]=r.then((e=>s[a]=URL.createObjectURL(e)))}}}var Ue=a(144),Ee=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Te extends z{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(pe(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Ue.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}const Re=new Set(["all","web","webk"]),Fe=new Set;function xe(e){return e.find((e=>Re.has(e.platform)&&!Fe.has(e.reason)))}function Be(e){return!!xe(e)}var Ve=a(7120),Oe=a(2566);class Le extends z{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)e&&(this.peersStorage.isPeerNeeded(e.toPeerId(!0))||(this.storage.delete(e),delete this.chats[e]))},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=(0,fe.Z)(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{if(this.storage=a,t.length)for(let e=0,a=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s;if("chatEmpty"===e._)return;const n=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;"channel"===e._&&void 0===e.participants_count&&void 0!==n&&n.participants_count&&(e.participants_count=n.participants_count);let i=!1,r=!1;void 0===n?this.chats[e.id]=e:((null===(a=n.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(i=!0),n.title!==e.title&&(r=!0),pe(n,e),this.rootScope.dispatchEvent("chat_update",e.id));const o=e.id.toPeerId(!0);i&&this.rootScope.dispatchEvent("avatar_update",o),r&&this.rootScope.dispatchEvent("peer_title_edit",o),this.peersStorage.isPeerNeeded(o)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}hasRights(e,t,a,s){return(0,Ve.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,te.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return("channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return(0,ge.Z)(a)&&(t||!a.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t){return this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then((a=>(a&&(this.getChat(e).username=t),a)))}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,Oe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:this.appUsersManager.getSelf().id,peer:this.appPeersManager.getOutputPeer(s),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return this.apiManager.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}))).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}setChatAvailableReactions(e,t){return this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}isRestricted(e){const t=this.getChat(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Be(a))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();return e.messages.push(t),e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}}a(4762);var Ne,Ze=a(5953),qe=a(9005),Ge=a(6637),He=a(3591);!function(e){let t,s;function n(){if("h12"===e.timeFormat)try{const t=b({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(" ")[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function i(){const t=y.Z.langPackCode;return e.lastRequestedLangCode=t,Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([e,a,s])=>{const n=[];return o(e.default,n),o(a.default,n),p({_:"langPackDifference",from_version:0,lang_code:t,strings:n,version:0,local:!0,countries:s.default})}))}function r(t){e.requestedServerLanguage=!0;const s=m.managers;return Promise.all([s.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:y.Z.langPack}),s.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"android"}),a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),s.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function o(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function p(e){return e.appVersion=y.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(f(e),e)))}function f(a){if(a.lang_code===e.lastRequestedLangCode){try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==a.lang_code&&(m.dispatchEvent("language_change",a.lang_code),e.lastAppliedLangCode=a.lang_code,_.clear(),n()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function c(e,t,a={i:0}){let s=[],n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...c(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ge.Z)(i)){r=document.createElement("a");const e=(0,He.Z)(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r.textContent="";r.append(...c(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function l(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=c(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||(e.lastRequestedLangCode=t.lang_code),f(t),t):i())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,n(),a&&(_.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof v&&a.update()})))},e.loadLocalLangPack=i,e.loadLangPack=r,e.getStrings=function(e,t){return m.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:y.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=o,e.getLangPack=function(t){return e.lastRequestedLangCode=t,r(t).then((([e,t,a,s,n,i])=>{let r=[];[a,s].forEach((e=>{o(e.default,r)})),r=r.concat(e.strings);for(const e of t.strings)r.push(e);return e.strings=r,e.countries=n,p(e)}))},e.saveLangPack=p,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=f,e.superFormatter=c,e.format=l,e.weakMap=new WeakMap;class g{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class u extends g{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Ze.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...l(this.key,!1,this.args));else{const e=this.element[this.property],t=l(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,te.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=u;const _=new Map;function b(t={}){let a=JSON.stringify(t),s=_.get(a);return s||_.set(a,s=new Intl.DateTimeFormat(e.lastRequestedLangCode+"-u-hc-"+e.timeFormat,t)),s}e.amPmCache={am:"AM",pm:"PM"};class v extends g{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let a;if((0,Ze.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){let t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=b(this.options);a=(0,qe.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=v,e.i18n=function(e,t){return new u({key:e,args:t}).element},e.i18n_=function(e){return new u(e).element},e._i18n=function(e,t,a,s){return new u({element:e,key:t,args:a,property:s}).element}}(Ne||(Ne={}));const je=Ne;Ne.i18n,Ne.i18n_,Ne._i18n,d.GO.I18n=Ne;const We=["January","February","March","April","May","June","July","August","September","October","November","December"],ze=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Ke=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&Ke(t)===Ke(e)?n.weekday="short":(n.month="short",n.day="numeric"),new je.IntlDateElement({date:e,options:n}).element});const Je=2013,Qe=new RegExp("20[0-9]{1,2}"),$e=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),Ye=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Xe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),et=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),tt=[31,29,31,30,31,30,31,31,30,31,30,31];function at(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=Je&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:nt(i),minDate:i,maxDate:r})}}function st(e,t,a){if(pt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=Je;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:it(p),minDate:p,maxDate:d}):e.push({title:rt(p),minDate:p,maxDate:d})}}var s}function nt(e){const t=new Date(e);return We[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function it(e){const t=new Date(e);return We[t.getMonth()].slice(0,3)+" "+t.getDate()}function rt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function ot(e){const t=new Date(e);return ze[t.getDay()]}function pt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===ot(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:ot(p),minDate:p,maxDate:d})}let n;if(null===(n=Xe.exec(a)))if(null===(n=et.exec(a)))if(null===(n=Qe.exec(a))){if(null!==(n=$e.exec(a))){const e=n[1],a=n[2],s=dt(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void st(t,e-1,s);if(e>=Je)return void at(t,s,e)}}if(null!==(n=Ye.exec(a))){const e=n[1],a=dt(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void st(t,s-1,a);s>=Je&&at(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(pt(i-1,r)&&o>=Je&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:rt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=Je&&s<=12)return void at(t,s-1,i);i<=12&&st(t,s-1,i-1)}else s>=Je&&i<=12&&at(t,i-1,s)}};var ct=a(2491),lt=a(7562),gt=a(8801),mt=a(6658);const ht={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};let ut=0;class yt extends z{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(ft("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):We[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_")),hs()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)&&(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,gt.q)(s,(0,mt.Z)(e,a))}(e),0)),e.file_name||(e.file_name=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),a?Object.assign(a,e):e}getDoc(e){return(0,ge.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach((e=>{e.document=this.saveDoc(e.document)})),t}))}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ut,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings"}}).then((e=>((0,Pe.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,Pe.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return this.apiFileManager.requestFilePart(t,(0,lt.Z)(n),a,s)}}class _t extends z{constructor(){super(...arguments),this.drafts={},this.getAllDraftPromise=null}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=(0,fe.Z)(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))})))}saveDraft(e,t,a,s={}){const n=this.processApiDraft(a),i=this.getKey(e,t);return n?this.drafts[i]=n:delete this.drafts[i],h.Z.set({drafts:this.drafts}),s.notify&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:s.force}),n}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!(0,ge.Z)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!(0,te.Z)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,ce.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){return i=this,r=void 0,p=function*(){const i=this.getDraft(e,t);if(this.draftsAreEqual(i,a))return!0;let r,o={peer:this.appPeersManager.getInputPeerById(e),message:""};if(this.isEmptyDraft(a))r={_:"draftMessageEmpty"};else{(0,Pe.Z)(a);let e=a.message,t=a.entities;a.reply_to_msg_id&&(o.reply_to_msg_id=(0,de.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(o.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(o.no_webpage=a.pFlags.no_webpage),o.message=e}const p=r||a;return p.date=(0,se.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft(e,t,p,{notify:!0,force:n}),!(s&&!t)||this.apiManager.invokeApi("messages.saveDraft",o)},new((o=void 0)||(o=Promise))((function(e,t){function a(e){try{n(p.next(e))}catch(e){t(e)}}function s(e){try{n(p.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(a,s)}n((p=p.apply(i,r||[])).next())}));var i,r,o,p}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}}))}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft(e,t,n,{notify:!0,force:!0})}}var bt=a(946),vt=a(7746);const Pt={keywords:{},version:0,langCode:y.Z.langPackCode};class Mt extends z{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=y.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,ge.Z)(t)||(t={}),(0,bt.Z)(Pt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return je.lastRequestedLangCode!==y.Z.langPackCode&&e.push(this.getEmojiKeywords(je.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new ne.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.concat(Mt.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=this.appStateManager.getState().then((e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[]))}pushRecentEmoji(e){e=(0,vt.Z)(e),this.getRecentEmojis().then((t=>{(0,P.Z)(t,e),t.unshift(e),t.length>36&&(t.length=36),this.appStateManager.pushToState("recentEmoji",t),this.rootScope.dispatchEvent("emoji_recent",e)}))}}Mt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var St=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class It extends z{after(){this.log=(0,M.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const s=this.getCachedParticipants(e),n=(0,fe.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(pe(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,a))))}editParticipant(e,t,a){return St(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,fe.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return St(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&pe(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return St(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Ue.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return St(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return St(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:{_:"inputPeerSelf"},params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class Dt extends z{constructor(){super(...arguments),this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,oe.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appUsersManager.getUser(a).username+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,de.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){var n;const i=this.inlineResults[a];if(!i)return;this.pushPopularBot(t);const r=a.split("_"),o=r.shift(),p=r.join("_");if(s.viaBotId=t,s.queryId=o,s.resultId=p,i.send_message.reply_markup&&(s.replyMarkup=i.send_message.reply_markup),"botInlineMessageText"===i.send_message._)s.entities=i.send_message.entities,this.appMessagesManager.sendText(e,i.send_message.message,s);else{let t,a="";const r=i.send_message;switch(r._){case"botInlineMessageMediaAuto":if(a=r.message,"botInlineMediaResult"===i._){const{document:e,photo:a}=i;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard}}t||(t={_:"messageMediaPending",type:i.type,file_name:i.title||(null===(n=i.content)||void 0===n?void 0:n.url)||i.url,size:0,progress:{percent:30,total:0}}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Et{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,ce.Z)(e)+(t&Ut.o-1)}}var Tt=a(4421),Rt=a(7487);const Ft=new class{constructor(){this.disabled=v.Z.test||-1===y.Z.domains.indexOf(location.hostname)}setAuthorized(e){if(!this.disabled)return Rt.Z.get("tgme_sync").then((t=>{const a=(0,se.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>a)return;Rt.Z.set({tgme_sync:{canRedirect:e,ts:a}});const s=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(y.Z.version+" "+y.Z.suffix)}`,n=["//telegram.me/"+s,"//t.me/"+s].map((e=>{const t=document.createElement("script"),a=new Promise((e=>{t.onload=t.onerror=()=>{t.remove(),e()}}));return t.src=e,document.body.appendChild(t),a}));return Promise.all(n)}))}};d.GO&&(d.GO.telegramMeWebManager=Ft);const xt=Ft;var Bt=a(3624),Vt=a(7401);function Ot(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(Ot(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Lt=a(5701),Nt=a(7667),Zt=a(6241),qt=a(6535),Gt=a(6566),Ht=a(2202);const jt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=jt);const Wt=jt;var zt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Kt extends z{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Tt.Z(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,M.kg)("MESSAGES",M.v9.Error|M.v9.Debug|M.v9.Log|M.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Bt.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,this.rootScope.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const a in t){const s=t[a];s?(this.dialogsStorage.pushDialog(s),this.appPeersManager.isChannel(a.toPeerId())||(e=Math.max(e,s.top_message||0))):(this.reloadConversation(a.toPeerId()),delete t[a])}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{F.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId(),a=this.notificationsToHandle[t];this.getNotifyPeerSettings(t).then((({muted:e,peerTypeNotifySettings:t})=>{const s=a.topMessage;e&&!s.pFlags.mentioned||!s.pFlags.unread||s.pFlags.unread&&this.notifyAboutMessage(s,{fwdCount:a.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,a=this.pendingByRandomId[t];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a,o=(0,ce.Z)(e.id),p=this.getMessageFromStorage(r,o);p?([this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)})),this.finalizePendingMessageCallbacks(r,n,p)):this.pendingByMessageId[o]=t}},this.onUpdateNewMessage=e=>{var t;const a=e.message,s=this.getMessagePeer(a),n=this.getHistoryMessagesStorage(s),i=this.getDialogOnly(s),r="updateNewDiscussionMessage"===e._;this.saveMessages([a],{storage:this.createMessageStorage(s,"history")});const p=this.getThreadKey(a),d=p?+p.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[s]&&this.threadsStorage[s][d]){const e={_:"updateNewDiscussionMessage",message:a};this.onUpdateNewMessage(e)}if(!i&&!r){let a=!0;if(s.isAnyChat()&&(a=this.appChatsManager.isInChat(s.toChatId())),a){const a=null!==(t=this.newUpdatesAfterReloadToHandle[s])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[s]=new Set;if(a.has(e))return void this.log.error("here we go again",s);e.ignoreExisting=!0,a.add(e),this.scheduleHandleNewDialogs(s)}return}this.saveMessages([a],{storage:n}),this.checkPendingMessage(a);const f=this.getHistoryStorage(s,r?d:void 0);r||this.updateMessageRepliesIfNeeded(a);const c=e.ignoreExisting;if(f.history.findSlice(a.mid)){if(!c)return!1}else{const e=f.history.first;if(e.isEnd(ie.D.Bottom)){let t=0;for(const s=e.length;te[t]);++t);e.splice(t,0,a.mid)}else f.history.unshift(a.mid);null!==f.count&&f.count++}this.mergeReplyKeyboard(f,a)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:s});const l=a.fromId;if(l.isUser()&&!a.pFlags.out&&a.from_id){this.appUsersManager.forceUserOnline(l,a.date);const e={_:"sendMessageCancelAction"};let t;t=s.isUser()?{_:"updateUserTyping",action:e,user_id:l}:this.appPeersManager.isChannel(s)?{_:"updateChannelUserTyping",action:e,channel_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l),top_msg_id:d?(0,de.Z)(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l)},this.apiUpdatesManager.processLocalUpdate(t)}if(this.handleNewMessage(s,a.mid),r)return;const g=!a.pFlags.out&&a.pFlags.unread;if(i){if(g&&a.mid>i.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(i);++i.unread_count,a.pFlags.mentioned&&(++i.unread_mentions_count,this.modifyCachedMentions(s,a.mid,!0)),e()}a.mid>=i.top_message&&this.setDialogTopMessage(a,i)}if(g){const e=s;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:o.NM}),t.fromId!==l&&(t.fromId=l,t.fwdCount=0),a.fwd_from&&++t.fwdCount,t.topMessage=a,this.notificationsHandlePromise||(this.notificationsHandlePromise=F.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,ce.Z)(a),i=(0,fe.Z)(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;(0,fe.Z)(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,te.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=(0,fe.Z)(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),this.rootScope.dispatchEvent("dialogs_multiupdate",{[t]:a}),this.dialogsStorage.setDialogToState(a)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=(0,ce.Z)(t.id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s);this.saveMessages([t],{storage:n});const r=this.getMessageFromStorage(n,s);this.handleEditedMessage(i,r,n);const o=this.getDialogOnly(a),p=o&&o.top_message===s;if(t.clear_history)p&&this.rootScope.dispatchEvent("dialog_flush",{peerId:a,dialog:o});else{if("message"===(null==i?void 0:i._)&&!(0,te.Z)(i.reactions,r.reactions)){const e=r.reactions;return r.reactions=i.reactions,void this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(a),msg_id:t.id,reactions:e})}if(this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:a,mid:s,message:t}),p||t.grouped_id){const e={};e[a]=o,this.rootScope.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,ce.Z)(e.max_id||e.read_max_id),s=(0,ce.Z)(e.top_msg_id),n=t?t.toPeerId(!0):(0,fe.Z)(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getHistoryMessagesStorage(n),o=(0,Vt.Z)(r,"desc"),p=this.getDialogOnly(n),d=e.still_unread_count;let f=0,c=0,l=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const m=!s&&p&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);for(let e=0,t=o.length;ea)continue;const g=r.get(t);if(g.pFlags.out===i){if(!g.pFlags.unread)break;if(s){const e=g.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==s)continue}g.pFlags.unread&&(delete g.pFlags.unread,l||(l=!0),g.pFlags.out||s||!p||(void 0===d&&(f=--p.unread_count),g.pFlags.mentioned&&(c=--p.unread_mentions_count,this.modifyCachedMentions(n,g.mid,!1))),this.rootScope.dispatchEvent("notification_cancel","msg"+t))}}if(i?g.readOutboxMaxId=a:g.readMaxId=a,!s&&p){if(i?p.read_outbox_max_id=a:p.read_inbox_max_id=a,!i){let e;void 0!==d?e=d:f<0||!this.getReadMaxIdIfUnread(n)?e=0:f&&p.top_message>a&&(e=f),void 0!==e&&(p.unread_count=e),(c<0||!p.unread_count)&&(p.unread_mentions_count=0)}m&&m(),this.dialogsStorage.processDialogForFilters(p),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:p}),this.dialogsStorage.setDialogToState(p)}if(l&&this.rootScope.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.messages.map((e=>(0,ce.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);for(let e=0,t=a.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,ce.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,a=e.messages.map((e=>(0,ce.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);if(!s)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>(0,fe.Z)(e.peer)===s));const n=new Set;for(const e of a){const t=this.getMessageByPeer(s,e),a=this.getThreadKey(t);a&&this.threadsStorage[s]&&this.threadsStorage[s][+a.split("_")[1]]&&n.add(a)}const i=this.handleDeletedMessages(s,this.getHistoryMessagesStorage(s),a),r=Array.from(n).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)})),o=this.getHistoryStorage(s);[o].concat(r).forEach((e=>{for(const t of i.msgs)e.history.delete(t);i.count&&e.count&&(e.count=Math.max(0,e.count-i.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:s,msgs:i.msgs});const p=this.getDialogOnly(s);if(p){const e=i.unreadMentions||i.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);if(i.unread&&(p.unread_count=Math.max(0,p.unread_count-i.unread)),i.unreadMentions&&(p.unread_mentions_count=p.unread_count?Math.max(0,p.unread_mentions_count-i.unreadMentions):0),e&&(t(),this.rootScope.dispatchEvent("dialog_unread",{peerId:s,dialog:p})),i.msgs.has(p.top_message)){const e=o.history.first;if(e.isEnd(ie.D.Bottom)&&e.length){const t=e[0],a=this.getMessageByPeer(s,t);this.setDialogTopMessage(a,p)}else this.reloadConversation(s)}}},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!s.username||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{const t=e.views,a=e.channel_id.toPeerId(!0),s=(0,ce.Z)(e.id),n=this.getMessageByPeer(a,s);void 0!==(null==n?void 0:n.views)&&n.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,se.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):(0,fe.Z)(e.peer),s=e.messages.map((e=>(0,ce.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.wrapSingleMessage(a,e)))):Promise.resolve()).finally((()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s)n.get(e).pFlags.pinned=!0;else for(const e of s)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[a],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e;if("notifyPeer"===t._){const e=(0,fe.Z)(t.peer),s=this.getDialogOnly(e);s&&(s.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",s),this.dialogsStorage.setDialogToState(s))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,ce.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",{peerId:a,mid:t.mid})},this.onUpdateDeleteScheduledMessages=e=>{const t=(0,fe.Z)(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,ce.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>e.reaction===t.reaction));return e.pFlags.out&&(!a||t.count>a.count)||t.pFlags.chosen&&(!a||!a.pFlags.chosen)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{if(t)return;const s=this.getDialogOnly(e);if(s){if(!t){s.draft=a;let t=!1;a||(0,de.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog(s)):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);this.setDialogToStateIfMessageIsTop(s)}})),this.batchUpdatesDebounced=(0,Lt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n;const i=null!==(s=this.tempFinalizeCallbacks[e])&&void 0!==s?s:this.tempFinalizeCallbacks[e]={},r=null!==(n=i[t])&&void 0!==n?n:i[t]={deferred:(0,_.Z)()};return r.callback=a,r.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",(e=>this.editMessage(e,t,a)));let i=a.entities||[];t&&(t=(0,we.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,a={}){return zt(this,void 0,void 0,(function*(){if(!t.trim())return;a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const s=(yield this.apiManager.getConfig()).message_length_max;if(t.length>s){const n=Ot(t,s);t=n[0],n.length>1&&delete a.webPage;for(let t=1;t{this.sendText(e,n[t],a)}),t)}e=this.appPeersManager.getPeerMigratedTo(e)||e;let n=a.entities||[];a.viaBotId||(t=(0,we.Z)(t,n));let i=this.getInputEntities(n);i.length||(i=void 0);const r=this.generateOutgoingMessage(e,a);r.entities=n,r.message=t;const o=a.replyToMsgId?(0,de.Z)(a.replyToMsgId):void 0,p=this.appPeersManager.isChannel(e);a.webPage&&(r.media={_:"messageMediaWebPage",webpage:a.webPage});const d=e=>{e?r.error=!0:delete r.error,this.rootScope.dispatchEvent("messages_pending")};return r.send=()=>{d(!1);const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let f;return f=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:i,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n},s),this.pendingAfterMsgs[e]=s,f.then((e=>{if("updateShortSentMessage"===e._){const t=r.promise;delete r.promise;const s=(0,ve.Z)(r);ue(r,["promise"]),r.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":p?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),r.promise.resolve()}),(e=>{d(!0),r.promise.reject(e)})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(r,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),r.promise}))}sendFile(e,t,a={}){e=this.appPeersManager.getPeerMigratedTo(e)||e;const s=this.generateOutgoingMessage(e,a),n=a.replyToMsgId?(0,de.Z)(a.replyToMsgId):void 0;let r,o;const p="mime_type"in t?t.mime_type:t.type,d=t instanceof File?t.name:"",f=!(t instanceof File||t instanceof Blob);let c=a.caption||"";this.log("sendFile",t,p);const l=a.entities||[];c&&(c=(0,we.Z)(c,l));const g=[],m=i().IMAGE_MIME_TYPES_SUPPORTED.has(p);let h,u,y;if(f)r="document",o="";else if(0===p.indexOf("audio/")||["video/ogg"].indexOf(p)>=0){r="audio",o="audio."+("ogg"===p.split("/")[1]?"ogg":"mp3"),y="sendMessageUploadAudioAction",a.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:a.isVoiceMessage},waveform:a.waveform,duration:a.duration||0};g.push(e)}else if(a.isMedia)if(m){r="photo",o="photo."+p.split("/")[1],y="sendMessageUploadPhotoAction";const e={_:"photoSize",w:a.width,h:a.height,type:"full",location:null,size:t.size};h={_:"photo",id:""+s.id,sizes:[e],w:a.width,h:a.height};const n=this.thumbsStorage.getCacheContext(h,e.type);n.downloaded=t.size,n.url=a.objectURL||"",h=this.appPhotosManager.savePhoto(h)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(p)){r="video",o="video.mp4",y="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:a.isRoundMessage,supports_streaming:!0},duration:a.duration,w:a.width,h:a.height};g.push(e),a.noSound&&t.size>10240&&t.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",o="document."+p.split("/")[1],y="sendMessageUploadDocumentAction";else r="document",o="document."+p.split("/")[1],y="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:d||o}),-1!==["document","video","audio","voice"].indexOf(r)&&!f){const e=[];if(u={_:"document",id:""+s.id,duration:a.duration,attributes:g,w:a.width,h:a.height,thumbs:e,mime_type:p,size:t.size},a.objectURL){const e=this.thumbsStorage.getCacheContext(u);e.downloaded=t.size,e.url=a.objectURL}let n;if(m)g.push({_:"documentAttributeImageSize",w:a.width,h:a.height}),n={_:"photoSize",w:a.width,h:a.height,type:"full",size:t.size};else if("video"===r&&a.thumb){n={_:"photoSize",w:a.thumb.size.width,h:a.thumb.size.height,type:"local-thumb",size:a.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(u,n.type);e.downloaded=n.size,e.url=a.thumb.url}n&&e.push(n),u=this.appDocsManager.saveDoc(u)}this.log("sendFile",r,o,t.type,a);const b=(0,_.Z)(),v=f?void 0:{_:h?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:h,document:u};v&&(ue(v,["promise"]),v.promise=b),s.entities=l,s.message=c,s.media=f?{_:"messageMediaDocument",pFlags:{},document:t}:v;const P=f?void 0:(0,Ht.Z)(t);s.uploadingFileName=P,P&&(this.uploadFilePromises[P]=b);const M=e=>{e?s.error=!0:delete s.error,this.rootScope.dispatchEvent("messages_pending")};let S=!1,I=null;s.send=()=>{if(f){const{id:e,access_hash:a,file_reference:s}=t,n={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:a,file_reference:s}};b.resolve(n)}else if(t instanceof File||t instanceof Blob){const n=()=>{var n;let i;return S&&!s.error||(S=!1,I=this.apiFileManager.upload({file:t,fileName:P}),I.catch((t=>{S||(this.log("cancelling upload",v),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),b.reject(t))})),I.addNotifyListener((t=>{const a=Math.max(1,Math.floor(100*t.done/t.total));y&&this.setTyping(e,{_:y,progress:0|a}),b.notifyAll(t)})),b.notifyAll({done:0,total:t.size})),"video"===r&&a.objectURL&&(null===(n=a.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:a.thumb.blob})),I&&I.then((e=>zt(this,void 0,void 0,(function*(){let t;if(e.name=o,S=!0,t="photo"===r?{_:"inputMediaUploadedPhoto",file:e}:{_:"inputMediaUploadedDocument",file:e,mime_type:p,pFlags:{force_file:"sendMessageUploadDocumentAction"===y||void 0},attributes:g},i)try{const e=yield i;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(t)}))),(()=>{M(!0)})),b};a.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:a.isGroupedItem,isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft}),a.isGroupedItem||(b.then((t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),this.apiManager.invokeApi("messages.sendMedia",{background:a.background,peer:this.appPeersManager.getInputPeerById(e),media:t,message:c,random_id:s.random_id,reply_to_msg_id:n,schedule_date:a.scheduleDate,silent:a.silent,entities:l,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw M(!0),e}))))),b.then(s.promise.resolve,s.promise.reject));const C={message:s};return ue(C,["promise"]),C.promise=b,C}sendAlbum(e,t,a={}){return zt(this,void 0,void 0,(function*(){if(a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},a),a.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const s=a.replyToMsgId?(0,de.Z)(a.replyToMsgId):void 0;let n=a.caption||"",i=a.entities||[];n&&(n=(0,we.Z)(n,i)),this.log("sendAlbum",t,a);const r=""+ ++this.groupedTempId,o=t.map(((t,o)=>{const p=a.sendFileDetails[o],d=Object.assign({isGroupedItem:!0,isMedia:a.isMedia,scheduleDate:a.scheduleDate,silent:a.silent,replyToMsgId:s,threadId:a.threadId,sendAsPeerId:a.sendAsPeerId,groupId:r},p);return 0===o&&(d.caption=n,d.entities=i),this.sendFile(e,t,d).message}));a.clearDraft&&setTimeout((()=>{this.appDraftsManager.clearDraft(e,a.threadId)}),0);const p=(e,t)=>{t?e.error=!0:delete e.error,this.rootScope.dispatchEvent("messages_pending")},d=this.appPeersManager.getInputPeerById(e),f=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const n=(0,_.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:d,multi_media:t,reply_to_msg_id:s,schedule_date:a.scheduleDate,silent:a.silent,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{o.forEach((e=>p(e,!0))),n.reject(e)}))}),n},c=o.map((e=>e.send().then((e=>this.apiManager.invokeApi("messages.uploadMedia",{peer:d,media:e}))).then((t=>{let a;"messageMediaPhoto"===t._?a=wt(this.appPhotosManager.savePhoto(t.photo)):"messageMediaDocument"===t._&&(a=At(this.appDocsManager.saveDoc(t.document)));const s={_:"inputSingleMedia",media:a,random_id:e.random_id,message:n,entities:i};return n&&(n="",i=[]),s})).catch((t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),p(e,!0),t}))));return Promise.all(c).then((e=>f(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,de.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}n.media=r;let o=e=>{this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{o()})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),setTimeout((()=>{this.rootScope.dispatchEvent("scheduled_new",{peerId:s,mid:a})}),0);else{const i=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of i)e&&e.history.unshift(a);this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,peerId:s,mid:a})}),0)}const i=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return!t.isGroupedItem&&e.send&&setTimeout((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()}),0),i}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,se.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Ue.a)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return ue(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,_.Z)()),n}generateReplyHeader(e,t){const a={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&a.reply_to_msg_id!==t&&(a.reply_to_top_id=t),a}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(e.toChatId());(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(){return zt(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(_e);){const t=yield this.getTopMessages(100,_e);if(!e()||t.isEnd)break}}))}getConversations(e="",t,a,s=0,n){return this.dialogsStorage.getDialogs(e,t,a,s,n)}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),a||t===_e||this.dialogsStorage.resetPinnedOrder(t),a||(xt.setAuthorized(!0),this.appDraftsManager.addMissedDialogs()),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!a,p=!1;const f={},c=t===_e?0:t,l=t===_e;(0,re.Z)(r.dialogs,(e=>{void 0===e.folder_id&&(e.folder_id=c),this.dialogsStorage.saveDialog(e,void 0,!0,l),o||this.appPeersManager.isChannel(e.peerId||(0,fe.Z)(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(s&&(0,me.Z)(e)>s&&(this.scheduleHandleNewDialogs(e.peerId,e),p=!0),(0,de.Z)(e.read_inbox_max_id)||(0,de.Z)(e.read_outbox_max_id)||(f[e.peerId]=e,this.log.error("noIdsDialogs",e,i)))}));const g=Object.keys(f);if(g.length){const e=g.map((e=>e.toPeerId())),t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",f);for(let t=0;t=m||!r.dialogs.length;y&&this.dialogsStorage.setDialogsLoaded(t,!0),p?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,b=100===e?_:_.slice(0,e);return{isEnd:y&&b[b.length-1]===_[_.length-1],count:m,dialogs:b}}))}forwardMessages(e,t,a,s={}){return zt(this,void 0,void 0,(function*(){e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f;const c=this.getMessageByPeer(t,n),l=this.generateOutgoingMessage(e,s);o.push(l.id);const g=["entities","media"];s.dropAuthor||(l.fwd_from=this.generateForwardHeader(e,c),g.push("views","forwards"),(null===(i=l.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete l.from_id),s.dropCaptions&&c.media||g.push("message");const m=null===(p=c.reply_to)||void 0===p?void 0:p.reply_to_msg_id,h=a.indexOf(m);if(m&&-1!==h){const e=o[h];l.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{l[e]=c[e]}));const u=null===(d=l.media)||void 0===d?void 0:d.document;return u&&["round","voice"].includes(u.type)&&(l.pFlags.media_unread=!0),c.grouped_id&&(null!==(f=r[c.grouped_id])&&void 0!==f?f:r[c.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(l),l}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,de.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(S.Z)}))}generateEmptyMessage(e){}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&(0,fe.Z)(e.peer_id)||o.NM}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversation(e){let t;if(void 0!==e){const a=(0,fe.Z)(e);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,_.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise(((e,t)=>{setTimeout((()=>{const t=[],a={};for(const[e,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)t.push(s),a[e]=n;this.reloadConversationsPeers.clear(),this.apiManager.invokeApi("messages.getPeerDialogs",{peers:t}).then((e=>{this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const t=e.peerId;t&&(a[t].resolve(e),delete a[t])}))}),(e=>{})).finally((()=>{(()=>{for(const e in a)a[e].resolve(void 0)})(),e(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}),0)}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a){return this.apiManager.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:a,peer:e,max_id:0}).then((s=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:s.pts,pts_count:s.pts_count}}),!s.offset||this.doFlushHistory(e,t,a))))}flushHistory(e,t,a){return zt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,de.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(this.appPeersManager.getInputPeerById(e),t,a).then((()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));const a=this.needSingleMessages.get(e);if(a&&a.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}}))}))}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessage(e){var t;const a=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return a.promise?a.promise:a.maxId?Promise.resolve(a):a.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then((e=>{var t;return a.count=e.count,a.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,a})).finally((()=>{delete a.promise}))}getPinnedMessagesCount(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.count}getPinnedMessagesMaxId(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,de.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];let a,s,n,i=0;for(const[e,r]of t)if((0,Pe.Z)(r),r.message){if(++i>1)break;a=r.message,s=r.totalEntities,n=r.entities}return i>1&&(a=void 0,s=void 0,n=void 0),{message:a,entities:n,totalEntities:s}}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midc[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=(0,ce.Z)(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=(0,ce.Z)(e.reply_to.reply_to_top_id)));const l=d&&e.replies;l&&(l.max_id&&(l.max_id=(0,ce.Z)(l.max_id)),l.read_max_id&&(l.read_max_id=(0,ce.Z)(l.read_max_id)));const g=!!n;g||(e.date-=this.timeManager.getServerTimeOffset());const m=this.appUsersManager.getSelf().id.toPeerId(),h=d&&e.fwd_from;if(e.peerId=n,e.fromId=n===m?h?h.from_id?(0,fe.Z)(h.from_id):o.NM:m:e.pFlags.post||!e.from_id?n:(0,fe.Z)(e.from_id),h){h.saved_from_msg_id&&(h.saved_from_msg_id=(0,ce.Z)(h.saved_from_msg_id)),h.channel_post&&(h.channel_post=(0,ce.Z)(h.channel_post));const t=h.saved_from_peer||h.from_id,a=h.saved_from_msg_id||h.channel_post;if(t&&a){const s=(0,fe.Z)(t),n=(0,ce.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=(0,fe.Z)(h.from_id),g||(h.date-=this.timeManager.getServerTimeOffset())}const u={type:"message",peerId:n,messageId:f};if(d&&e.media){let a=!1;switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?a=!0:e.media.photo=this.appPhotosManager.savePhoto(e.media.photo,u),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":if(e.media.ttl_seconds)a=!0;else{const t=e.media.document;e.media.document=this.appDocsManager.saveDoc(t,u),e.media.document||"documentEmpty"===t._||(a=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(n,f,t.isScheduled);e.media.webpage=this.appWebPagesManager.saveWebPage(e.media.webpage,a,u);break}case"messageMediaInvoice":a=!0,e.media={_:"messageMediaUnsupported"};break;case"messageMediaUnsupported":a=!0}a&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities)}if(!d&&e.action){const t=e.action;let a,i;const o=e.fromId===this.appUsersManager.getSelf().id?"You":"";switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,u)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,u)),t._){case"messageActionChatEditPhoto":(null===(s=t.photo)||void 0===s?void 0:s.video_sizes)?t._=p?"messageActionChannelEditVideo":"messageActionChatEditVideo":p&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",p||(e+="_by"+o),t.type=e;break}case"messageActionChatEditTitle":p&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":p&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+o:"messageActionChatReturn"+o)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+o);break;case"messageActionChannelMigrateFrom":a=t.chat_id.toPeerId(!0),i=n;break;case"messageActionChatMigrateTo":a=n,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}a&&i&&!this.migratedFromTo[a]&&!this.migratedToFrom[i]&&this.migrateChecks(a,i)}return d&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),i.set(f,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return zt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(ie.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,vt.Z)(e.message,t);const a=(0,qt.Z)(e.message);e.totalEntities=(0,Zt.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,de.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Ue.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0})).then((()=>{const t=this.appUsersManager.getUser(e);return this.sendText(s,n+"@"+t.username)}))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e,t){var a;return zt(this,void 0,void 0,(function*(){if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!(null===(a=s.pFlags)||void 0===a?void 0:a.pinned)||void 0;if(n){const e=yield this.apiManager.getAppConfig(),a=1===t?this.rootScope.premium?e.dialogs_folder_pinned_limit_premium:e.dialogs_folder_pinned_limit_default:this.rootScope.premium?e.dialogs_pinned_limit_premium:e.dialogs_pinned_limit_default;if(this.dialogsStorage.getPinnedOrders(t).length>=a)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(e),pinned:n}).then((a=>{if(a){const a=n?{pinned:n}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(e),folder_id:t,pFlags:a})}}))}))}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());a&&a.migrated_to&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return zt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t)||this.getMessagePeer(e)!==this.appUsersManager.getSelf().id&&(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date<(0,se.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&!e.pFlags.is_outgoing}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;let n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,Pe.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0){return this.appPeersManager.isRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Gt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let g;if(!e||r||s||t||1===n||o||(g=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,g.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=this.appChatsManager.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}}))}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=(0,de.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,de.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid);return a.max_id=r.maxId=(0,ce.Z)(a.max_id)||0,a.read_inbox_max_id=r.readMaxId=(0,ce.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,ce.Z)(a.read_outbox_max_id)||0,this.threadsToReplies[i]=e+"_"+t,n}))}handleNewMessage(e,t){var a,s;(null!==(a=(s=this.newMessagesToHandle)[e])&&void 0!==a?a:s[e]=new Set).add(t),this.handleNewMessages()}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise((e=>{setTimeout((()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}),0)}))}deleteMessages(e,t,a){var s,n;return zt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,de.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;i=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(S.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(!s&&!a){const t=this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!s)return this.log("readHistory: isn't unread"),Promise.resolve()}const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,de.Z)(a),read_max_id:(0,de.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,de.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,de.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally((()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)})),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,a){const s=this.unreadMentions[e];s&&(a?s.first.isEnd(ie.D.Top)&&s.insertSlice([t]):s.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const a=this.getDialogOnly(e);!t.length&&(null==a?void 0:a.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const a=this.goToNextMentionPromises[e];if(a)return a;const s=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new ie.Z,n=s.length,i=s.first.isEnd(ie.D.Top);if(!n&&i)return this.fixUnreadMentionsCountIfNeeded(e,s),Promise.resolve();let r=Promise.resolve();return!i&&n<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then((()=>{const t=s.last,a=t&&t[t.length-1];if(a)return s.delete(a),a;this.fixUnreadMentionsCountIfNeeded(e,s)})).finally((()=>{delete this.goToNextMentionPromises[e]}))}loadNextMentions(e){const t=this.unreadMentions[e],a=t.first[0]||1;return this.getUnreadMentions(e,a,-50,50).then((e=>{this.mergeHistoryResult(t,e,1===a?0:a,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0){return this.apiManager.invokeApiSingle("messages.getUnreadMentions",{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,de.Z)(t),add_offset:a,limit:s,max_id:(0,de.Z)(n),min_id:(0,de.Z)(i)}).then((e=>((0,Pe.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),e)))}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map((e=>(0,de.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(a=this.threadsStorage[e][t])&&void 0!==a?a:this.threadsStorage[e][t]={count:null,history:new ie.Z}):null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={count:null,history:new ie.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e){return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(e,!0))]).then((([t,a])=>({muted:this.appNotificationsManager.isPeerLocalMuted(e,!0),peerTypeNotifySettings:a})))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if((null==e?void 0:e.reply_to)&&(null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;a=e.peerId+"_"+t}return a}updateMessage(e,t,a){return this.wrapSingleMessage(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.dispatchEvent(a,s),s}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,peerId:e.peerId,mid:e.mid,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e,t){const a={_:"inputPeerNotifySettings"};return a.mute_until=t,this.appNotificationsManager.updateNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)},a)}togglePeerMute(e,t){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted(e,!1)),this.mutePeer(e,t?o.rU:0)}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){if(this.appPeersManager.isRestricted(e))return!1;if(e.isAnyChat()){const s=this.appChatsManager.getChat(e.toChatId());return this.appChatsManager.hasRights(e.toChatId(),a,void 0,!!t)&&(!s.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){(0,Pe.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,"full");Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Nt.Z)(e,i);(0,gt.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,gt.P)((0,lt.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,de.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return zt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,re.Z)(s,((e,a,s)=>{t.reactions.some((t=>(0,fe.Z)(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:(0,fe.Z)(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,de.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return zt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,se.Z)(!0)-e.date(0,de.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length),n=e.toChatId();for(let e=0,i=t.length;e{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));n||(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),n.source)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,de.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,de.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!this.appChatsManager.isInChat(e.toChatId())}getNewHistory(e,t){var a;return zt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(ie.D.Bottom))return;delete s.maxId,n.unsetEnd(ie.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid));if(a&&(0,de.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(ie.D.Top),f&&l.setEnd(ie.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),this.appPeersManager.isChannel(e)&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise((e=>{setTimeout((()=>{const t=[];for(const[e,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,de.Z)(e)})));let i;i=e.isAnyChat()&&this.appPeersManager.isChannel(e)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(e.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,Pe.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:s})}));t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally((()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()}))}),0)}))}wrapSingleMessage(e,t,a=!1){const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,_.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?(0,fe.Z)(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then((t=>(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,t)))}setTyping(e,t,a){var s;let n=this.typings[e];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(s=null==n?void 0:n.action)||void 0===s?void 0:s._)!==t._)?((null==n?void 0:n.timeout)&&clearTimeout(n.timeout),n=this.typings[e]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t}).finally((()=>{n===this.typings[e]&&(n.timeout=F.Z.setTimeout((()=>{delete this.typings[e]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&this.referenceDatabase.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(!a){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_cancel","msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n);const r=this.newMessagesToHandle[e];r&&r.has(n)&&r.delete(n)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var Jt=a(6724);function Qt(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class $t extends z{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,se.Z)(!0);let t=o.rU;for(const a in this.peerSettings.notifyPeer){const s=this.peerSettings.notifyPeer[a];if(s instanceof Promise)continue;const n=s.mute_until;n&&(n<=e?(s.mute_until=0,this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:{_:"notifyPeer",peer:this.appPeersManager.getOutputPeer(a.toPeerId())},notify_settings:s})):n{const t="notifyPeer"===e.peer._&&(0,fe.Z)(e.peer.peer),a="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:a,peerId:t,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}})}getNotifySettings(e){let t,a=Qt(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=(0,fe.Z)(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:Qt(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}savePeerSettings({key:e,peerId:t,settings:a}){let s;t&&(e=t,s=this.peerSettings.notifyPeer),(s||this.peerSettings)[e]=a,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:a}),this.appStateManager.getState().then((t=>{const s=t.notifySettings;s[e]=a,this.appStateManager.pushToState("notifySettings",s)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,se.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings(e,t=!0){const a={_:"peerNotifySettings"},s=this.peerSettings.notifyPeer[e];if(!s||s instanceof Promise||Object.assign(a,s),t){const t=Qt(this.appPeersManager.getInputNotifyPeerById(e,!0)._),s=this.peerSettings[t];if(s&&!(s instanceof Promise))for(let e in s)void 0===a[e]&&(a[e]=s[e])}return a}isPeerLocalMuted(e,t=!0){if(e===this.appPeersManager.peerId)return!1;const a=this.getPeerLocalSettings(e,t);return this.isMuted(a)}}var Yt=a(617),Xt=a(7361);class ea extends z{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){if(this.isRestricted(e))return;const t=e.isUser()?this.appUsersManager.getUserPhoto(e.toUserId()):this.appChatsManager.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:void 0}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&(0,fe.Z)(t.migrated_to)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,Yt.Z)(e)}isAnyChat(e){return(0,Xt.Z)(e)}isRestricted(e){return e.isUser()?this.appUsersManager.isRestricted(e.toUserId()):this.appChatsManager.isRestricted(e.toChatId())}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?xe(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,ge.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ta extends z{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if("photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(ft("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.saveApiUsers(a.users);const s=a.photos.map(((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}}))}getPhoto(e){return(0,ge.Z)(e)?e:this.photos[e]}}class aa extends z{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,M.kg)("POLLS",M.v9.Error)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,this.rootScope.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach(((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=(0,we.Z)(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map((e=>a.answers[e].option)),n=e.mid,i=e.peerId,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,de.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,de.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,de.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class sa extends z{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:Qt(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=Qt(t._),t}))}),a.rules)))}getPrivacy(e){const t=Qt(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}}var na=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class ia extends z{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const a=e.user_id?e.user_id.toPeerId():(0,fe.Z)(e.from_id);if(this.appPeersManager.peerId===a||"speakingInGroupCallAction"===e.action._)return;const s=(0,fe.Z)(e),n=null!==(t=this.typingsInPeer[s])&&void 0!==t?t:this.typingsInPeer[s]=[];let i=n.find((e=>e.userId===a));const r=()=>{delete i.timeout;const e=n.indexOf(i);-1!==e&&n.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n}),n.length||delete this.typingsInPeer[s]};if(i&&void 0!==i.timeout&&clearTimeout(i.timeout),"sendMessageCancelAction"===e.action._){if(!i)return;return void r()}i||(i={userId:a},n.push(i)),i.action=e.action;const o=this.appUsersManager.hasUser(a);o?this.appUsersManager.forceUserOnline(a):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==i.timeout&&this.appUsersManager.hasUser(a)&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})})),i.timeout=F.Z.setTimeout(r,6e3),o&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})},this.onUpdatePeerBlocked=e=>{const t=(0,fe.Z)(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,this.rootScope.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t?this.usersFull[e]:this.apiManager.invokeApiSingleProcess({method:"users.getFullUser",params:{id:this.appUsersManager.getUserInput(e)},processResult:t=>{this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);return a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s})),this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return na(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=this.chatsFull[e];if(a&&!t){const t=this.appChatsManager.getChat(e);if(t.version===a.participants.version||t.pFlags.left)return a}return this.apiManager.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_chat,s=e.toPeerId(!0);return a&&a.chat_photo&&a.chat_photo.id&&(a.chat_photo=this.appPhotosManager.savePhoto(a.chat_photo,{type:"profilePhoto",peerId:s})),a.call&&this.appGroupCallsManager.saveGroupCall(a.call,e),this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.chatsFull[e]=a,this.rootScope.dispatchEvent("chat_full_update",e),a}})}getChatInviteLink(e,t){return na(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=this.appChatsManager.getChat(e);if(t&&t.pFlags&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){return void 0===this.chatsFull[e]||t?this.apiManager.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:this.appChatsManager.getChannelInput(e)},processResult:t=>{const a=e.toPeerId(!0);this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}}):this.chatsFull[e]}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ne.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.getUserSearchText(e.id)),s.set(e.id,e.rating)}));const n=Array.from(a.search(t));return n.sort(((e,t)=>s.get(t)-s.get(e))),n};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,de.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,Oe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(this.appPeersManager.peerId,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUserPhoto",user_id:s,date:(0,se.Z)(!0),photo:this.appUsersManager.getUser(s).photo,previous:!0})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return na(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}var ra=a(4064);function oa(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var pa=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const da=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],fa={type:"reactions"};class ca extends z{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>pa(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})])}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,Pe.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of da)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],fa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,W.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):oa([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=(null!==(s=t.available_reactions)&&void 0!==s?s:[]).map((t=>e.find((e=>e.reaction===t)))).filter(Boolean);return this.unshiftQuickReactionInner(n,a)}))}unshiftQuickReactionInner(e,t){const a=(0,ra.Z)(e,(e=>e.reaction===t.reaction));return a&&e.unshift(a),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return oa([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return oa([this.apiManager.getAppConfig(),this.getAvailableReactions()],(([e,t])=>t.find((t=>t.reaction===e.reactions_default))))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,W.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,de.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,de.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>pa(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getAppConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){const s=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(s))return;this.lastSendingTimes.set(s,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(s)}),333);const{peerId:n,mid:i}=e,r=this.appPeersManager.peerId;let o=a?e.reactions:(0,ve.Z)(e.reactions),p=o?o.results.findIndex((e=>e.pFlags.chosen)):-1,d=-1!==p&&o.results[p];if(d&&(--d.count,delete d.pFlags.chosen,t===d.reaction&&(t=void 0),d.count||o.results.splice(p,1),o.recent_reactions&&(0,ra.Z)(o.recent_reactions,(e=>(0,fe.Z)(e.peer_id)===r)),o.results.length||(o=void 0)),t){o||(o={_:"messageReactions",results:[],pFlags:{}},this.appPeersManager.isBroadcast(e.peerId)||(o.pFlags.can_see_list=!0));let a=o.results.findIndex((e=>e.reaction===t)),s=-1!==a&&o.results[a];if(s||(s={_:"reactionCount",count:0,reaction:t,pFlags:{}},a=o.results.push(s)-1),++s.count,s.pFlags.chosen=!0,!o.recent_reactions&&o.pFlags.can_see_list&&(o.recent_reactions=[]),o.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(r)};this.appPeersManager.isMegagroup(n)?(o.recent_reactions.unshift(e),o.recent_reactions=o.recent_reactions.slice(0,3)):(o.recent_reactions.push(e),o.recent_reactions=o.recent_reactions.slice(-3))}}const f=this.availableReactions;if(o&&(null==f?void 0:f.length)){const e=new Map;f.forEach(((t,a)=>{e.set(t.reaction,a)})),o.results.sort(((t,a)=>a.count-t.count||e.get(t.reaction)-e.get(a.reaction)))}if(a)return e.reactions=o,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:o,local:!0});const c=[n,i].join("-"),l=(0,de.Z)(i),g=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(n),msg_id:l,reaction:t}).then((e=>{(0,Pe.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:l,peer:this.appPeersManager.getOutputPeer(n),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(c)===g&&this.sendReaction(e,null==d?void 0:d.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(c)===g&&this.sendReactionPromises.delete(c)}));return this.sendReactionPromises.set(c,g),g}}var la=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ga="emoji",ma="emojiAnimations",ha=new Set([ga,ma]);class ua extends z{constructor(){super(...arguments),this.storage=new J.Z(K.Z,"stickerSets")}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=F.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)}})}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,re.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}getStickerSet(e,t={}){return la(this,void 0,void 0,(function*(){const a=e.id;return this.getStickerSetPromises[a]?this.getStickerSetPromises[a]:this.getStickerSetPromises[a]=new Promise((s=>la(this,void 0,void 0,(function*(){var n;if(!t.overwrite){const e=yield this.storage.get(a);if(e&&(null===(n=e.documents)||void 0===n?void 0:n.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),s(e),void delete this.getStickerSetPromises[a]}try{const n=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:n.set.id;this.saveStickerSet(n,i),s(n)}catch(e){s(null)}delete this.getStickerSetPromises[a]}))))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:ga},{saveById:!0}),this.getStickerSet({id:ma},{saveById:!0}),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,Pe.Z)(e),this.saveStickers(e.stickers),e)})}))}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?ma:ga,s=this.storage.getFromCache(a);if(!s||!s.documents)return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:t.doc,sound:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.apiFileManager.downloadMedia({media:t}),a?this.apiFileManager.downloadMedia({media:a}):void 0]).then((()=>({doc:t,sound:a})))}))}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),this.saveStickers(e.documents);const n=s.set.installed_date||ha.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find((e=>"photoSize"===e._)),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return e.id===ga?{_:"inputStickerSetAnimatedEmoji"}:e.id===ma?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return la(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,Pe.Z)(e),(0,re.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)})),e)})).sets}))}toggleStickerSet(e){return la(this,void 0,void 0,(function*(){if(e.installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}searchStickerSets(e,t=!0){return la(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,Pe.Z)(e),(0,re.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(let t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:e=>((0,Pe.Z)(e),(0,re.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,vt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,vt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.getDoc(e);(t.animated?r:o).push(t)}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach((t=>{t.sort(((t,a)=>e.indexOf(t)-e.indexOf(a)))}))}for(const e of a)p(e.packs);const d=[...new Set(r.concat(o,n))];return(0,re.Z)(d,((e,t,a)=>{3!==e.sticker||i().IS_WEBM_SUPPORTED||a.splice(t,1)})),d}))}pushRecentSticker(e){const t=(0,vt.Z)(e.stickerEmojiRaw);for(const a in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[a].then((s=>{const n=(0,ra.Z)(s,(t=>t.id===e.id));n?s.unshift(n):a.includes(t)&&s.unshift(e)}))}}var ya=a(467);function _a(e){return e&&e.toLowerCase()||""}var ba=a(8493);class va extends z{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];t.username&&delete this.usernames[_a(t.username)],this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,se.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserPhoto:e=>{var t,a;const s=e.user_id,n=this.users[s];if(n){if((null===(t=n.photo)||void 0===t?void 0:t.photo_id)===(null===(a=e.photo)||void 0===a?void 0:a.photo_id))return;this.forceUserOnline(s,e.date),"userProfilePhotoEmpty"===e.photo._?delete n.photo:n.photo=pe(n.photo,e.photo),this.setUserToStateIfNeeded(n),this.rootScope.dispatchEvent("user_update",s),this.rootScope.dispatchEvent("avatar_update",s.toPeerId())}else console.warn("No user by id:",s)},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{if(this.storage=a,t.length)for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,se.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,P.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,_.Z)();return this.apiManager.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(!0),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.users[t]:this.apiManager.invokeApi("contacts.resolveUsername",{username:e}).then((e=>this.processResolvedPeer(e)))}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,fe.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,P.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a){return this.getContacts(e,t,a).then((e=>e.map((e=>e.toPeerId(!1)))))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.getOutputPeer(e),blocked:t}),a)))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new ne.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=_a(t.username);delete this.usernames[e]}if(e.username){const t=_a(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var a,s;if("userEmpty"===e._)return;const n=e.id,i=this.users[n];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==i)return;if(this.setUserNameToCache(e,i),i&&void 0!==i.sortName&&i.first_name===e.first_name&&i.last_name===e.last_name)e.sortName=i.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,ya.ZP)(t,!1)}e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset()));let r=!1,o=!1;if(void 0===i)this.users[n]=e;else{e.first_name===i.first_name&&e.last_name===i.last_name&&e.username===i.username||(o=!0),(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(r=!0);const t=!!i.pFlags.contact,p=!!e.pFlags.contact;pe(i,e),this.rootScope.dispatchEvent("user_update",n),t!==p&&this.onContactUpdated(n,p,t)}r&&this.rootScope.dispatchEvent("avatar_update",e.id.toPeerId()),o&&this.rootScope.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,ge.Z)(e)?e:this.users[e]||{_:"userEmpty",id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e!==this.userId}hasUser(e,t){const a=this.users[e];return(0,ge.Z)(a)&&(t||!a.pFlags.min)}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,se.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let a=0;a(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,fe.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,qt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL((0,He.Z)(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,Ce.Z)(e.my_results.map((e=>(0,fe.Z)(e)))),results:e.results.map((e=>(0,fe.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:(0,se.Z)(!0)}:{_:"userStatusOnline",expires:(0,se.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}isRestricted(e){const t=this.getUser(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Be(a))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}canSendToUser(e){return(0,ba.Z)(this.getUser(e))}}const Pa=new Set(["photo","video","gif","document"]);class Ma extends z{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Pa.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:pe(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Sa=a(8576),Ia=a(2328);var Ca=a(4211),wa=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class ka extends z{constructor(){super(...arguments),this.cacheStorage=new Sa.Z("cachedFiles"),this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,M.kg)("AFM",M.v9.Error|M.v9.Log),this.tempId=0,this.queueId=0,this.debug=v.Z.debug,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5)}downloadRequest(e,t,a,s,n=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:this.rootScope.premium?72:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const s=(0,ra.Z)(t,(e=>0===e.queueId))||(0,ra.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb(),r=C.waitForChunk(e,1024*n*128);Promise.race([i,r]).then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e),r.resolve()}),(t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e),r.reject(t)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;ewa(this,void 0,void 0,(function*(){return r&&r(),this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>wa(this,void 0,void 0,(function*(){r&&r();const n=()=>wa(this,void 0,void 0,(function*(){return r&&r(),this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(n);throw e}))}));(0,Pe.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=R(i);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/1024/128}getLimitPart(e){let t=131072;for(;e/t>2e3;)t*=2;return t}refreshReference(e){const t=e.file_reference,a=R(t);let s=this.refreshReferencePromises[a];if(!s){const n=(0,_.Z)();s=this.refreshReferencePromises[a]={deferred:n,timeout:F.Z.setTimeout((()=>{this.log.error("Didn't refresh the reference:",e),n.reject("REFERENCE_IS_NOT_REFRESHED")}),6e4)},n.catch(S.Z).finally((()=>{clearTimeout(s.timeout)})),this.referenceDatabase.refreshReference(t).then(n.resolve,n.reject)}return s.deferred.then((t=>{if(a===R(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}download(e){var t;if(!Ia.Z.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:s,location:n}=e;let r;"application/x-tgwallpattern"===e.mimeType?(r=this.uncompressTGV,e.mimeType="image/svg+xml"):"image/webp"!==e.mimeType||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e.mimeType?(r=this.uncompressTGS,e.mimeType="application/json"):"audio/ogg"!==e.mimeType||i().IS_OPUS_SUPPORTED||(r=this.convertOpus,e.mimeType="audio/wav"):(r=this.convertWebp,e.mimeType="image/png");const o=(0,gt.P)(n,{fileName:e.fileName}),p=this.downloadPromises[o],d=this.getFileStorage();if(this.debug&&this.log("downloadFile",o,a,n,e.mimeType),p)return a?p.then((t=>t instanceof Blob&&t.sizethis.download(e))).catch((()=>this.download(e)))):t)):p;const f=(0,_.Z)(),c=e.mimeType||"image/jpeg";let l,g,m=!1,h=e=>{l=e,delete this.downloadPromises[o],f.reject(l),h=()=>{},!g||l&&"DOWNLOAD_CANCELED"===l.type||g.truncate()};const u=this.tempId++;d.getFile(o).then((t=>wa(this,void 0,void 0,(function*(){if(t.size{if(e.onlyCache)return void h(t);const i=e.limitPart||this.getLimitPart(a);d.getFileWriter(o,a||i,c).then((t=>{let p;g=t;let d,c=Promise.resolve();const l=e=>wa(this,void 0,void 0,(function*(){return r?yield r(e,o):e})),b="inputWebFileLocation"===n._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];p=0;do{d=(0,_.Z)(),v.push({offset:p,writeFilePromise:c,writeFileDeferred:d}),c=d,p+=i}while(pwa(this,void 0,void 0,(function*(){const{offset:p,writeFilePromise:d,writeFileDeferred:c}=v.shift();try{y();const g=yield b(s,n,p,i,u,e.queueId,y),h=g.bytes;v.length&&M(),this.debug&&this.log("downloadFile requestFilePart result:",o,g);const _=p+i>=a||!h.byteLength;if(h.byteLength){P+=h.byteLength;const e={done:P,offset:p,total:a,fileName:o};f.notify(e),yield d,y(),yield t.write(h,p)}if(_&&r){const e=t.getParts(),a=yield l(e);y(),t.replaceParts(a)}if(c.resolve(),_){m=!0;const e=a||h.byteLength;a||t.trim(e),f.resolve(t.finalize(e<20971520))}}catch(e){h(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)}))}));const y=()=>{if(l)throw l};return f.cancel=()=>{if(!l&&!m){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",h(e)}},f.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},this.downloadPromises[o]=f,f.catch(S.Z).finally((()=>{delete this.downloadPromises[o]})),f}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if("photoEmpty"===t._||s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ca.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.catch(S.Z).finally((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760;let n=!1,i=!1,r=0,o=262144;a>67108864?o=524288:a<102400&&(o=32768),t||(t=(0,Ht.Z)(e));const p=this.getDelta(o),d=Math.ceil(a/o),f=(0,Ue.a)();let c=0;const l={_:s?"inputFileBig":"inputFile",id:f,parts:d,name:t,md5_checksum:""},g=(0,_.Z)();if(d>4e3)return g.reject({type:"FILE_TOO_BIG"}),g;let m=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),g.reject(e),n=!0,m=()=>{}};const h=s?"upload.saveBigFilePart":"upload.saveFilePart",u=this.tempId++,y=this,b=function*(){for(let _=0;_{return(p=e.slice(_,_+o),function(e,t){return new Promise((t=>{const a=new FileReader;a.addEventListener("loadend",(e=>{t(e.target.result)})),a.readAsArrayBuffer(e)}))}(p)).then((e=>{if(n)throw{type:"UPLOAD_CANCELED"};return y.debug&&y.log("Upload file part, isBig:",s,b,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),y.apiManager.invokeApi(h,{file_id:f,file_part:b,file_total_parts:d,bytes:e},{fileUpload:!0}).then((()=>{if(n)return;++r;const e={done:r*o,offset:_,total:a,fileName:t};g.notify(e),r>=d&&(g.resolve(l),i=!0)}),m)}));var p}),p).catch(m)}}(),v=()=>{if(n)return;const e=b.next();e.done||n||e.value.then(v)};for(let e=0,t=Math.min(1/0,d);e{n||i||(n=!0,m({type:"UPLOAD_CANCELED"}))},g.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},g.finally((()=>{delete this.uploadPromises[t]})),this.uploadPromises[t]=g}}var Aa=a(1962),Da=a(3306);class Ua extends z{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i}=e,r=JSON.stringify(s);let o;return this.hashes[i]&&(o=this.hashes[i][r],o&&(s.hash=o.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return o.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),this.hashes[i][r]={hash:e,result:t}}return e.processResult?e.processResult(t):t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const g=this.invokeApi(n,o,p).then(i,r).finally((()=>{c.delete(f),c.size||delete d[n]}));return c.set(f,g),g}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=F.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(){return this.invokeApiCacheable("help.getConfig")}getAppConfig(e){if(this.appConfig&&!e)return this.appConfig;if(this.getAppConfigPromise&&!e)return this.getAppConfigPromise;const t=this.getAppConfigPromise=this.invokeApi("help.getAppConfig").then((e=>{var a,s;return this.getAppConfigPromise!==t?this.getAppConfigPromise:(this.appConfig=e,s=null!==(a=e.ignore_restriction_reasons)&&void 0!==a?a:[],Fe.clear(),s.forEach((e=>{Fe.add(e)})),e)}));return t}}var Ea=a(8453),Ta=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Ra extends Ua{constructor(){super(),this.log=(0,M.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=v.Z.transport,H.addEventListener("transport",(e=>{this.changeTransportType(e)}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n)n[a].forEach(((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ta(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield Rt.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(y.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ta(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}Rt.Z.set({user_auth:e}),this.rootScope.dispatchEvent("user_auth",e)}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,Rt.Z.set({dc:this.baseDcId})}logOut(){return Ta(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>Rt.Z.get(e)))),a=[];for(let e=0;eTa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,Ea.Z)(!1,!0),Aa.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));return setTimeout(s,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=r.length-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=t?r.splice(e,1)[0]:r.pop();return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>Rt.Z.get(e)))).then((([i,o])=>Ta(this,void 0,void 0,(function*(){let l,g;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Da.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Da.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);Rt.Z.set({[d]:R(a.authKey),[f]:R(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){g=e}const m=this.getTransportType(a);if(m!==n&&(p=this.generateNetworkerGetKey(e,m,a),c.destroy(),Z.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,m)),this.log("transport has been changed during authorization from",n,"to",m)),delete this.gettingNetworkers[p],g)throw this.log("get networker error",g,g.stack),g;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(S.Z,S.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&Z.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),Z.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,_.Z)();let{afterMessageId:n,prepareTempMessageId:i}=a;if(i&&s.then((()=>{delete this.afterMessageTempIds[i]})),d.GO){const n=Date.now(),i=F.Z.setInterval((()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(S.Z).finally((()=>{clearInterval(i)}))}let r,o,p=(new Error).stack||"empty stack";const f=()=>{if(n){const e=this.afterMessageTempIds[n];e&&(a.afterMessageId=e.messageId)}const p=o.wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:s}),p.catch((s=>{if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,r,e,t),401===s.code&&this.baseDcId===r)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(Rt.Z.delete("dc"),Rt.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&r!==this.baseDcId){if(void 0===this.cachedExportPromise[r]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:r},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:r,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[r]=e}return this.cachedExportPromise[r].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const n=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(n!==r)return a.dcId=n,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[n];return n=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type)return(0,b.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,b.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)throw s;return(0,b.Z)(1e3*e).then((()=>f()))}}{const n=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(n!==r)return a.dcId?a.dcId=n:this.setBaseDcId(n),this.invokeApi(e,t,a)}}))};let c;return c=(r=a.dcId||this.baseDcId)?this.getNetworker(r,a):this.getBaseDcId().then((e=>this.getNetworker(r=e,a))),c.then((e=>{o=e;const t=f();return o.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ta(this,void 0,void 0,(function*(){if(t?(0,ge.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class Fa{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appUsersManager.userId.toPeerId(),"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}ke(Fa,[p.Z,z]);const xa=Fa;class Ba{constructor(){this.thumbsCache={}}getCacheContext(e,t="full"){var a,s,n;const i=e._+e.id,r=null!==(a=(n=this.thumbsCache)[i])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t="full",a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t="full"){const a=e._+e.id,s=this.thumbsCache[a];s&&delete s[t]}}const Va={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],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:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],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:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-1460809483,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-551616469,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-1938625919,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{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:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],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"}],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"}],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"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"bot_attach_menu",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-468280483,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"},{name:"menu_button",type:"BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-362240487,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_scheduled",type:"flags.2?true"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:1370914559,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"string"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-381896846,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{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:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{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:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{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"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{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:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],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"}],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:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:-396644838,method:"messages.getUnreadReactions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-2099097129,method:"messages.readReactions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:451818415,method:"messages.toggleBotInAttachMenu",params:[{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:262163967,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"reply_to_msg_id",type:"flags.0?int"}],type:"WebViewResult"},{id:-768945848,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"}],type:"Bool"},{id:1790652275,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"}]},layer:140};var Oa=a(745),La=a.n(Oa),Na=a(4736),Za=a.n(Na);function qa(e){return e>>>0}function Ga(e,t){return e=qa(e),t=qa(t),Za()(e).shiftLeft(32).add(Za()(t)).toString(10)}const Ha=+Va.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ja=+Va.API.constructors.find((e=>"boolTrue"===e.predicate)).id,Wa=+Va.API.constructors.find((e=>"vector"===e.predicate)).id,za=+Va.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id;class Ka{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(ja,(t||"")+":bool"):this.writeInt(Ha,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);"string"!=typeof e&&(e=e?e.toString():"0");const{quotient:a,remainder:s}=Za()(e).divmod(4294967296),n=a.toJSNumber(),i=s.toJSNumber();this.writeInt(i,(t||"")+":long[low]"),this.writeInt(n,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",R(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",R(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",R(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?Va.MTProto:Va.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(let e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(Wa,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(let t in p)this.intView[p[t]]=e[t];return r.type}}class Ja{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),R(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=Ga(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ja||t!==Ha&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!s)throw new Error("Constructor not found for type: "+e)}else{const r=this.readInt(t+"[id]");if(r===za){const a=(i=this.fetchBytes(t+"[packed_string]"),La().inflate(i,void 0));return new Ja(a).fetchObject(e,t)}if(r===Wa)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,_.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=Date.now(),p=this.lastPingDelayDisconnectId=(0,Ue.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d),this.debug&&this.log.debug(`sendPingDelayDisconnect: ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}`);const f=F.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(f);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&this.log.debug(`sendPingDelayDisconnect: pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,b.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(f);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(this.log.error("sendPingDelayDisconnect: catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new Ka({mtproto:!0}),a=(0,Ue.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(T.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=F.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,es.Z)(this.authKey),this.serverSalt=(0,es.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?as.file:as.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,M.kg)(this.name,M.v9.Log|M.v9.Debug|M.v9.Error|M.v9.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=A(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,re.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new Ka({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return v.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new Ka({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return v.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new Ka(a);if(!this.connectionInited){const e=Va.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(Va.layer,"layer");const t=Va.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(y.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(y.Z.version+(y.Z.isMainDomain?" "+y.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(y.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===ns){const e=Va.API.methods.find((e=>"invokeAfterMsg"===e.method));ns=e?+e.id:0}ns?(s.storeInt(ns,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return v.Z.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof w&&(this.longPollInterval=F.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(T.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(T.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=F.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(T.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?T.Q.Closed:T.Q.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,_.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,ge.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(T.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=F.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===T.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return ts(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,Qa.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]}))}isStopped(){return this.networkerFactory.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>Za()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof w&&n&&!i){const e=new Ka({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof w&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof w||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new Ka({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach(((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return v.Z.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return ts(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new Ka({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+(0,Ue.d)(8)%5),n=A(new Uint8Array(s)),i=(0,Qa.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new Ka({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return ts(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof w))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw s;return e}),(e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new Ja(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,Xa.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+R(a));const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then((e=>this.getMsgKey(e,!1).then((t=>{if(!(0,Xa.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new Ja(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,Xa.Z)(n,this.sessionId)||this.prevSessionId&&(0,Xa.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+R(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new Ja(f,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,$a((s=Za()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;Rt.Z.set({["dc"+this.dcId+"_server_salt"]:R(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof w&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof w&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=F.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof w&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=Za()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),Rt.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;this.lastPingDelayDisconnectId===t&&this.pingDelayDisconnectDeferred.resolve("pong");break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class rs extends z{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||y.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,P.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new is(this,this.timeManager,e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}}const os=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,v.Z.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const t=new Ka;t.storeBytes((0,Da.Z)(e.modulus),"n"),t.storeBytes((0,Da.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[R(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new Ja(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return ds(this,void 0,void 0,(function*(){const t=new Ka({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",R(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));os.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,Xa.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",R(e.serverNonce),R(e.pq),e.fingerprints);const i=yield os.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return ds(this,void 0,void 0,(function*(){e.newNonce=A(new Uint8Array(32));const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new Ka({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=$a(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>ds(this,void 0,void 0,(function*(){for(;;){const t=A(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=ps(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=Ya(o),d=Za()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=$a(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new Ka({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let g;d.ZP&&this.log("Send req_DH_params",f);try{g=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const m=g.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",m),"server_DH_params_fail"!==m._&&"server_DH_params_ok"!==m._)throw new Error("[MT] Server_DH_Params response invalid: "+m._);if(!(0,Xa.Z)(e.nonce,m.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,Xa.Z)(e.serverNonce,m.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===m._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,Xa.Z)(t,m.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,m.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return ds(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new Ja(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,Xa.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,Xa.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,Xa.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=R(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=Ya(a),i=Za()(s,16);if(n.compare(Za().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(Za().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=Za()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return ds(this,void 0,void 0,(function*(){const t=(0,Da.Z)(e.g.toString(16));e.b=A(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new Ka({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new Ka({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,Xa.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,Xa.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),g=l.slice(0,8),m=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],g))).slice(-16);if(!(0,Xa.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=ps(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",m,c,a),e.authKeyId=m,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],g))).slice(-16);if(!(0,Xa.Z)(t,f.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([3],g))).slice(-16);if(!(0,Xa.Z)(t,f.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=H.pingTransports().then((({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)}))}auth(e){let t=this.cached[e];return t||(t=new Promise(((t,a)=>ds(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:A(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class cs extends z{after(){this.lastMessageId=[0,0],this.timeOffset=0,Rt.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Ue.d)(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,Ga(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(Rt.Z.set({server_time_offset:a}),this.timeOffset=a),s}}const ls=new class{constructor(){this.cryptoPortPromise=(0,_.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,W.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{if(this.cryptoPortAttached)return;this.cryptoPortAttached=!0;const n=a.ports[0];s.Z.attachPort(n),this.cryptoPortPromise.resolve()}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new X;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e){const t={appPeersManager:new ea,appChatsManager:new Le,appDocsManager:new yt,appPhotosManager:new ta,appPollsManager:new aa,appUsersManager:new va,appWebPagesManager:new Ma,appDraftsManager:new _t,appProfileManager:new ia,appNotificationsManager:new $t,apiUpdatesManager:new Ae,appAvatarsManager:new De,appGroupCallsManager:new It,appCallsManager:new Te,appReactionsManager:new ca,appMessagesManager:new Kt,appMessagesIdsManager:new Et,appPrivacyManager:new sa,appInlineBotsManager:new Dt,appStickersManager:new ua,referenceDatabase:new ae,appEmojiManager:new Mt,filtersStorage:new Ie,dialogsStorage:new be,apiManager:new Ra,cryptoWorker:s.Z,passwordManager:new ee,apiFileManager:new ka,peersStorage:new xa,thumbsStorage:new Ba,networkerFactory:new rs,rootScope:new l,authorizer:new fs,dcConfigurator:new Z,timeManager:new cs,appStoragesManager:e,appStateManager:u};for(const e in t){const a=t[e];a&&(a.setManagers&&(a.setManagers(t),delete a.setManagers),F.Z[e]=a)}const a=[];for(const e in t){const s=t[e];if(null==s?void 0:s.after){const e=s.after();a.push(e),delete s.after}}return Promise.all(a).then((()=>t))}(e);return u.userId&&t.apiManager.setUserAuth(u.userId),this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}},gs=ls;let ms=!0;function hs(){return ms}const us=(0,M.kg)("MTPROTO"),ys=new f.Z;ys.addMultipleEventsListeners({environment:e=>{r(e),H.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{us("got state",e,a),u.userId=i,u.newVersion=s,u.oldVersion=n,Object.keys(e).forEach((t=>{u.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,Ea.Z)(e,t),event:(e,t)=>{us("will redirect event",e,t),ys.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{ms=e},createObjectURL:e=>URL.createObjectURL(e)}),us("MTProto start"),gs.start(),gs.getManagers(),Wt.start(),function(e,t,a){const s=a=>{e.attachPort(a),t&&t(a)};a&&e.setOnPortDisconnect(a),"undefined"!=typeof SharedWorkerGlobalScope?F.Z.addEventListener("connect",(e=>s(e.source))):s(F.Z)}(ys,(e=>{Wt.addTab(e)}),(e=>{Wt.deleteTab(e)}))},1507:(e,t,a)=>{a.d(t,{IA:()=>i,NM:()=>s,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647},6875:(e,t,a)=>{a.d(t,{Z:()=>n});const s=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function n(e){for(let t=0;ts.has(e._)&&n!==t&&e._===a._&&e.offset-a.length===a.offset)),-1!==n){const t=e[n];a.length+=t.length,e.splice(n,1)}}while(-1!==n)}}},8859:(e,t,a)=>{a.d(t,{Z:()=>n});var s=a(2423);function n(e,t){return e.find((e=>(t._===e._||!s.tY.has(t._)&&!s.tY.has(e._))&&(t.offset>=e.offset&&t.length+t.offset<=e.length+e.offset)))}},2423:(e,t,a)=>{a.d(t,{$2:()=>d,E:()=>f,QB:()=>c,SC:()=>l,bu:()=>p,it:()=>o,kO:()=>m,tY:()=>g});var s=a(1229);const n="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-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",i="["+n+"0-9]",r="((?:https?|ftp)://|mailto:)?",o=r+"(?:"+i+"{1,64}(?::"+i+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+i+"["+n+"·0-9-]{0,64}(?:\\."+i+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",p=(new RegExp("^"+r.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+o+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_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-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),f=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,c=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,l={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},g=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let e in l)g.add(l[e]);const m=/^\+\d+$/},6241:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(8859),n=a(1346);function i(e,t){const a=t.filter((t=>!(0,s.Z)(e,t)));e.push(...a),(0,n.Z)(e);for(let t=0;t{function s(e){e.sort(((e,t)=>e.offset-t.offset||t.length-e.length))}a.d(t,{Z:()=>s})},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e}},o={};function p(e){var t=o[e];if(void 0!==t)return t.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,p),a.loaded=!0,a.exports}p.m=r,p.x=()=>{var e=p.O(void 0,[699,211,216,960,434,339],(()=>p(3821)));return p.O(e)},e=[],p.O=(t,a,s,n)=>{if(!a){var i=1/0;for(f=0;f=n)&&Object.keys(p.O).every((e=>p.O[e](a[o])))?a.splice(o--,1):(r=!1,n0&&e[f-1][2]>n;f--)e[f]=e[f-1];e[f]=[a,s,n]},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var a in t)p.o(t,a)&&!p.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},p.f={},p.e=e=>Promise.all(Object.keys(p.f).reduce(((t,a)=>(p.f[a](e,t),t)),[])),p.u=e=>960===e?"960.7ae964ab6031f51a0275.bundle.js":434===e?"434.e06fcbee4a8ac273c78c.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"15a67f69d99bd6da42da",104:"19c787168bced8f0f781",211:"a7ea0f3283af2967a6ae",216:"4397eec2983565f6f071",301:"eb31c208f76e9dc623ec",339:"702eead422c6af883b39",642:"f2d4e67ea15d5329cd0b",699:"f16d6f756c34f3914132"}[e]+".chunk.js",p.miniCssF=e=>{},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},p.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;p.g.importScripts&&(e=p.g.location+"");var t=p.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),p.p=e})(),t=p.u,a=p.e,s=new Map,n=new Map,p.u=function(e){return t(e)+(s.has(e)?"?"+s.get(e):"")},p.e=function(e){return a(e).catch((function(a){var i=n.has(e)?n.get(e):999999;if(i<1){var r=t(e);throw a.message="Loading chunk "+e+" failed after 999999 retries.\n("+r+")",a.request=r,a}return new Promise((function(t){setTimeout((function(){var a=Date.now();s.set(e,a),n.set(e,i-1),t(p.e(e))}),3e3)}))}))},(()=>{var e={678:1};p.f.i=(t,a)=>{e[t]||importScripts(p.p+p.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,n,i]=t;for(var r in n)p.o(n,r)&&(p.m[r]=n[r]);for(i&&i(p);s.length;)e[s.pop()]=1;a(t)}})(),i=p.x,p.x=()=>Promise.all([699,211,216,960,434,339].map(p.e,p)).then(i),p.x()})(); +//# sourceMappingURL=mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js.map b/public/mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js.map new file mode 100644 index 000000000..9988c83da --- /dev/null +++ b/public/mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mtproto.worker.e72cffdf2b7d9b2b317f.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,mCCMG,MAAMC,EAAgE,CAAC,GAAK,CAAC,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,IAAI,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,GAAG,GAAG,CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/lib/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts","webpack://tweb/./src/lib/mtproto/networkStats.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/transports/socketProxied.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/helpers/object/defineNotNumerableProperties.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/longFromInts.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,216,960,434,339].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport const EmojiVersions: {[version: string]: {[emoji: string]: number}} = {\"14\":{\"1f6dd\":4867,\"1f6de\":4916,\"1f6df\":4923,\"1f7f0\":62832,\"1f979\":183,\"1f9cc\":1557,\"1fa7b\":61332,\"1fa7c\":61330,\"1faa9\":51093,\"1faaa\":61364,\"1faab\":61189,\"1faac\":51085,\"1fab7\":2651,\"1fab8\":2631,\"1fab9\":2672,\"1faba\":2673,\"1fac3\":1520,\"1fac4\":1521,\"1fac5\":1505,\"1fad7\":3793,\"1fad8\":3707,\"1fad9\":3804,\"1fae0\":111,\"1fae1\":136,\"1fae2\":132,\"1fae3\":133,\"1fae4\":174,\"1fae5\":142,\"1fae6\":1385,\"1fae7\":61353,\"1faf0\":1341,\"1faf1\":1332,\"1faf2\":1333,\"1faf3\":1334,\"1faf4\":1335,\"1faf5\":1351,\"1faf6\":1360,\"1faf1-1f3fb-200d-1faf2-1f3fc\":0,\"1faf1-1f3fb-200d-1faf2-1f3fd\":0,\"1faf1-1f3fb-200d-1faf2-1f3fe\":0,\"1faf1-1f3fb-200d-1faf2-1f3ff\":0,\"1faf1-1f3fc-200d-1faf2-1f3fb\":0,\"1faf1-1f3fc-200d-1faf2-1f3fd\":0,\"1faf1-1f3fc-200d-1faf2-1f3fe\":0,\"1faf1-1f3fc-200d-1faf2-1f3ff\":0,\"1faf1-1f3fd-200d-1faf2-1f3fb\":0,\"1faf1-1f3fd-200d-1faf2-1f3fc\":0,\"1faf1-1f3fd-200d-1faf2-1f3fe\":0,\"1faf1-1f3fd-200d-1faf2-1f3ff\":0,\"1faf1-1f3fe-200d-1faf2-1f3fb\":0,\"1faf1-1f3fe-200d-1faf2-1f3fc\":0,\"1faf1-1f3fe-200d-1faf2-1f3fd\":0,\"1faf1-1f3fe-200d-1faf2-1f3ff\":0,\"1faf1-1f3ff-200d-1faf2-1f3fb\":0,\"1faf1-1f3ff-200d-1faf2-1f3fc\":0,\"1faf1-1f3ff-200d-1faf2-1f3fd\":0,\"1faf1-1f3ff-200d-1faf2-1f3fe\":0,\"1fac3-1f3fb\":0,\"1fac3-1f3fc\":0,\"1fac3-1f3fd\":0,\"1fac3-1f3fe\":0,\"1fac3-1f3ff\":0,\"1fac4-1f3fb\":0,\"1fac4-1f3fc\":0,\"1fac4-1f3fd\":0,\"1fac4-1f3fe\":0,\"1fac4-1f3ff\":0,\"1fac5-1f3fb\":0,\"1fac5-1f3fc\":0,\"1fac5-1f3fd\":0,\"1fac5-1f3fe\":0,\"1fac5-1f3ff\":0,\"1faf0-1f3fb\":0,\"1faf0-1f3fc\":0,\"1faf0-1f3fd\":0,\"1faf0-1f3fe\":0,\"1faf0-1f3ff\":0,\"1faf1-1f3fb\":0,\"1faf1-1f3fc\":0,\"1faf1-1f3fd\":0,\"1faf1-1f3fe\":0,\"1faf1-1f3ff\":0,\"1faf2-1f3fb\":0,\"1faf2-1f3fc\":0,\"1faf2-1f3fd\":0,\"1faf2-1f3fe\":0,\"1faf2-1f3ff\":0,\"1faf3-1f3fb\":0,\"1faf3-1f3fc\":0,\"1faf3-1f3fd\":0,\"1faf3-1f3fe\":0,\"1faf3-1f3ff\":0,\"1faf4-1f3fb\":0,\"1faf4-1f3fc\":0,\"1faf4-1f3fd\":0,\"1faf4-1f3fe\":0,\"1faf4-1f3ff\":0,\"1faf5-1f3fb\":0,\"1faf5-1f3fc\":0,\"1faf5-1f3fd\":0,\"1faf5-1f3fe\":0,\"1faf5-1f3ff\":0,\"1faf6-1f3fb\":0,\"1faf6-1f3fc\":0,\"1faf6-1f3fd\":0,\"1faf6-1f3fe\":0,\"1faf6-1f3ff\":0},\"\":{\"2049\":62835,\"2122\":62863,\"2139\":62888,\"2194\":62764,\"2195\":62763,\"2196\":62762,\"2197\":62756,\"2198\":62758,\"2199\":62760,\"2328\":61194,\"2600\":4990,\"2601\":4998,\"2602\":41013,\"2603\":41018,\"2604\":41020,\"2611\":62851,\"2614\":41014,\"2615\":3781,\"2618\":2667,\"2620\":1106,\"2622\":62753,\"2623\":62754,\"2626\":62783,\"2638\":62780,\"2639\":177,\"2648\":62788,\"2649\":62789,\"2650\":62796,\"2651\":62797,\"2652\":62798,\"2653\":62799,\"2660\":51095,\"2663\":51098,\"2665\":51096,\"2666\":51097,\"2668\":4865,\"2692\":61297,\"2693\":4922,\"2694\":61300,\"2696\":61311,\"2697\":61319,\"2699\":61309,\"2702\":61284,\"2705\":62850,\"2708\":4931,\"2709\":61245,\"2712\":61259,\"2714\":62852,\"2716\":62828,\"2721\":62779,\"2728\":51029,\"2733\":62858,\"2734\":62859,\"2744\":41017,\"2747\":62860,\"2753\":62836,\"2754\":62837,\"2755\":62838,\"2757\":62839,\"2763\":1137,\"2764\":1141,\"2795\":62829,\"2796\":62830,\"2797\":62831,\"2934\":62767,\"2935\":62768,\"3030\":62840,\"3297\":62912,\"3299\":62913,\"0023-20e3\":62864,\"002a-20e3\":62865,\"0030-20e3\":62866,\"0031-20e3\":62867,\"0032-20e3\":62868,\"0033-20e3\":62869,\"0034-20e3\":62870,\"0035-20e3\":62871,\"0036-20e3\":62872,\"0037-20e3\":62873,\"0038-20e3\":62874,\"0039-20e3\":62875,\"00a9\":62861,\"00ae\":62862,\"1f004\":51101,\"1f0cf\":51100,\"1f170\":62882,\"1f171\":62884,\"1f17e\":62893,\"1f17f\":62895,\"1f18e\":62883,\"1f191\":62885,\"1f192\":62886,\"1f193\":62887,\"1f194\":62889,\"1f195\":62891,\"1f196\":62892,\"1f197\":62894,\"1f198\":62896,\"1f199\":62897,\"1f19a\":62898,\"1f1e6-1f1e8\":71594,\"1f1e6-1f1e9\":71595,\"1f1e6-1f1ea\":71596,\"1f1e6-1f1eb\":71597,\"1f1e6-1f1ec\":71598,\"1f1e6-1f1ee\":71599,\"1f1e6-1f1f1\":71600,\"1f1e6-1f1f2\":71601,\"1f1e6-1f1f4\":71602,\"1f1e6-1f1f6\":71603,\"1f1e6-1f1f7\":71604,\"1f1e6-1f1f8\":71605,\"1f1e6-1f1f9\":71606,\"1f1e6-1f1fa\":71607,\"1f1e6-1f1fc\":71608,\"1f1e6-1f1fd\":71609,\"1f1e6-1f1ff\":71610,\"1f1e7-1f1e6\":71611,\"1f1e7-1f1e7\":71612,\"1f1e7-1f1e9\":71613,\"1f1e7-1f1ea\":71614,\"1f1e7-1f1eb\":71615,\"1f1e7-1f1ec\":71616,\"1f1e7-1f1ed\":71617,\"1f1e7-1f1ee\":71618,\"1f1e7-1f1ef\":71619,\"1f1e7-1f1f1\":71620,\"1f1e7-1f1f2\":71621,\"1f1e7-1f1f3\":71622,\"1f1e7-1f1f4\":71623,\"1f1e7-1f1f6\":71624,\"1f1e7-1f1f7\":71625,\"1f1e7-1f1f8\":71626,\"1f1e7-1f1f9\":71627,\"1f1e7-1f1fb\":71628,\"1f1e7-1f1fc\":71629,\"1f1e7-1f1fe\":71630,\"1f1e7-1f1ff\":71631,\"1f1e8-1f1e6\":71632,\"1f1e8-1f1e8\":71633,\"1f1e8-1f1e9\":71634,\"1f1e8-1f1eb\":71635,\"1f1e8-1f1ec\":71636,\"1f1e8-1f1ed\":71637,\"1f1e8-1f1ee\":71638,\"1f1e8-1f1f0\":71639,\"1f1e8-1f1f1\":71640,\"1f1e8-1f1f2\":71641,\"1f1e8-1f1f3\":71642,\"1f1e8-1f1f4\":71643,\"1f1e8-1f1f5\":71644,\"1f1e8-1f1f7\":71645,\"1f1e8-1f1fa\":71646,\"1f1e8-1f1fb\":71647,\"1f1e8-1f1fc\":71648,\"1f1e8-1f1fd\":71649,\"1f1e8-1f1fe\":71650,\"1f1e8-1f1ff\":71651,\"1f1e9-1f1ea\":71652,\"1f1e9-1f1ec\":71653,\"1f1e9-1f1ef\":71654,\"1f1e9-1f1f0\":71655,\"1f1e9-1f1f2\":71656,\"1f1e9-1f1f4\":71657,\"1f1e9-1f1ff\":71658,\"1f1ea-1f1e6\":71659,\"1f1ea-1f1e8\":71660,\"1f1ea-1f1ea\":71661,\"1f1ea-1f1ec\":71662,\"1f1ea-1f1ed\":71663,\"1f1ea-1f1f7\":71664,\"1f1ea-1f1f8\":71665,\"1f1ea-1f1f9\":71666,\"1f1ea-1f1fa\":71667,\"1f1eb-1f1ee\":71668,\"1f1eb-1f1ef\":71669,\"1f1eb-1f1f0\":71670,\"1f1eb-1f1f2\":71671,\"1f1eb-1f1f4\":71672,\"1f1eb-1f1f7\":71673,\"1f1ec-1f1e6\":71674,\"1f1ec-1f1e7\":71675,\"1f1ec-1f1e9\":71676,\"1f1ec-1f1ea\":71677,\"1f1ec-1f1eb\":71678,\"1f1ec-1f1ec\":71679,\"1f1ec-1f1ed\":71680,\"1f1ec-1f1ee\":71681,\"1f1ec-1f1f1\":71682,\"1f1ec-1f1f2\":71683,\"1f1ec-1f1f3\":71684,\"1f1ec-1f1f5\":71685,\"1f1ec-1f1f6\":71686,\"1f1ec-1f1f7\":71687,\"1f1ec-1f1f8\":71688,\"1f1ec-1f1f9\":71689,\"1f1ec-1f1fa\":71690,\"1f1ec-1f1fc\":71691,\"1f1ec-1f1fe\":71692,\"1f1ed-1f1f0\":71693,\"1f1ed-1f1f2\":71694,\"1f1ed-1f1f3\":71695,\"1f1ed-1f1f7\":71696,\"1f1ed-1f1f9\":71697,\"1f1ed-1f1fa\":71698,\"1f1ee-1f1e8\":71699,\"1f1ee-1f1e9\":71700,\"1f1ee-1f1ea\":71701,\"1f1ee-1f1f1\":71702,\"1f1ee-1f1f2\":71703,\"1f1ee-1f1f3\":71704,\"1f1ee-1f1f4\":71705,\"1f1ee-1f1f6\":71706,\"1f1ee-1f1f7\":71707,\"1f1ee-1f1f8\":71708,\"1f1ee-1f1f9\":71709,\"1f1ef-1f1ea\":71710,\"1f1ef-1f1f2\":71711,\"1f1ef-1f1f4\":71712,\"1f1ef-1f1f5\":71713,\"1f1f0-1f1ea\":71714,\"1f1f0-1f1ec\":71715,\"1f1f0-1f1ed\":71716,\"1f1f0-1f1ee\":71717,\"1f1f0-1f1f2\":71718,\"1f1f0-1f1f3\":71719,\"1f1f0-1f1f5\":71720,\"1f1f0-1f1f7\":71721,\"1f1f0-1f1fc\":71722,\"1f1f0-1f1fe\":71723,\"1f1f0-1f1ff\":71724,\"1f1f1-1f1e6\":71725,\"1f1f1-1f1e7\":71726,\"1f1f1-1f1e8\":71727,\"1f1f1-1f1ee\":71728,\"1f1f1-1f1f0\":71729,\"1f1f1-1f1f7\":71730,\"1f1f1-1f1f8\":71731,\"1f1f1-1f1f9\":71732,\"1f1f1-1f1fa\":71733,\"1f1f1-1f1fb\":71734,\"1f1f1-1f1fe\":71735,\"1f1f2-1f1e6\":71736,\"1f1f2-1f1e8\":71737,\"1f1f2-1f1e9\":71738,\"1f1f2-1f1ea\":71739,\"1f1f2-1f1eb\":71740,\"1f1f2-1f1ec\":71741,\"1f1f2-1f1ed\":71742,\"1f1f2-1f1f0\":71743,\"1f1f2-1f1f1\":71744,\"1f1f2-1f1f2\":71745,\"1f1f2-1f1f3\":71746,\"1f1f2-1f1f4\":71747,\"1f1f2-1f1f5\":71748,\"1f1f2-1f1f6\":71749,\"1f1f2-1f1f7\":71750,\"1f1f2-1f1f8\":71751,\"1f1f2-1f1f9\":71752,\"1f1f2-1f1fa\":71753,\"1f1f2-1f1fb\":71754,\"1f1f2-1f1fc\":71755,\"1f1f2-1f1fd\":71756,\"1f1f2-1f1fe\":71757,\"1f1f2-1f1ff\":71758,\"1f1f3-1f1e6\":71759,\"1f1f3-1f1e8\":71760,\"1f1f3-1f1ea\":71761,\"1f1f3-1f1eb\":71762,\"1f1f3-1f1ec\":71763,\"1f1f3-1f1ee\":71764,\"1f1f3-1f1f1\":71765,\"1f1f3-1f1f4\":71766,\"1f1f3-1f1f5\":71767,\"1f1f3-1f1f7\":71768,\"1f1f3-1f1fa\":71769,\"1f1f3-1f1ff\":71770,\"1f1f4-1f1f2\":71771,\"1f1f5-1f1e6\":71772,\"1f1f5-1f1ea\":71773,\"1f1f5-1f1eb\":71774,\"1f1f5-1f1ec\":71775,\"1f1f5-1f1ed\":71776,\"1f1f5-1f1f0\":71777,\"1f1f5-1f1f1\":71778,\"1f1f5-1f1f2\":71779,\"1f1f5-1f1f3\":71780,\"1f1f5-1f1f7\":71781,\"1f1f5-1f1f8\":71782,\"1f1f5-1f1f9\":71783,\"1f1f5-1f1fc\":71784,\"1f1f5-1f1fe\":71785,\"1f1f6-1f1e6\":71786,\"1f1f7-1f1ea\":71787,\"1f1f7-1f1f4\":71788,\"1f1f7-1f1f8\":71789,\"1f1f7-1f1fa\":71790,\"1f1f7-1f1fc\":71791,\"1f1f8-1f1e6\":71792,\"1f1f8-1f1e7\":71793,\"1f1f8-1f1e8\":71794,\"1f1f8-1f1e9\":71795,\"1f1f8-1f1ea\":71796,\"1f1f8-1f1ec\":71797,\"1f1f8-1f1ed\":71798,\"1f1f8-1f1ee\":71799,\"1f1f8-1f1ef\":71800,\"1f1f8-1f1f0\":71801,\"1f1f8-1f1f1\":71802,\"1f1f8-1f1f2\":71803,\"1f1f8-1f1f3\":71804,\"1f1f8-1f1f4\":71805,\"1f1f8-1f1f7\":71806,\"1f1f8-1f1f8\":71807,\"1f1f8-1f1f9\":71808,\"1f1f8-1f1fb\":71809,\"1f1f8-1f1fd\":71810,\"1f1f8-1f1fe\":71811,\"1f1f8-1f1ff\":71812,\"1f1f9-1f1e6\":71813,\"1f1f9-1f1e8\":71814,\"1f1f9-1f1e9\":71815,\"1f1f9-1f1eb\":71816,\"1f1f9-1f1ec\":71817,\"1f1f9-1f1ed\":71818,\"1f1f9-1f1ef\":71819,\"1f1f9-1f1f0\":71820,\"1f1f9-1f1f1\":71821,\"1f1f9-1f1f2\":71822,\"1f1f9-1f1f3\":71823,\"1f1f9-1f1f4\":71824,\"1f1f9-1f1f7\":71825,\"1f1f9-1f1f9\":71826,\"1f1f9-1f1fb\":71827,\"1f1f9-1f1fc\":71828,\"1f1f9-1f1ff\":71829,\"1f1fa-1f1e6\":71830,\"1f1fa-1f1ec\":71831,\"1f1fa-1f1f2\":71832,\"1f1fa-1f1f3\":71833,\"1f1fa-1f1f8\":71834,\"1f1fa-1f1fe\":71835,\"1f1fa-1f1ff\":71836,\"1f1fb-1f1e6\":71837,\"1f1fb-1f1e8\":71838,\"1f1fb-1f1ea\":71839,\"1f1fb-1f1ec\":71840,\"1f1fb-1f1ee\":71841,\"1f1fb-1f1f3\":71842,\"1f1fb-1f1fa\":71843,\"1f1fc-1f1eb\":71844,\"1f1fc-1f1f8\":71845,\"1f1fd-1f1f0\":71846,\"1f1fe-1f1ea\":71847,\"1f1fe-1f1f9\":71848,\"1f1ff-1f1e6\":71849,\"1f1ff-1f1f2\":71850,\"1f1ff-1f1fc\":71851,\"1f201\":62899,\"1f202\":62900,\"1f21a\":62906,\"1f22f\":62903,\"1f232\":62907,\"1f233\":62911,\"1f234\":62910,\"1f235\":62915,\"1f236\":62902,\"1f237\":62901,\"1f238\":62909,\"1f239\":62905,\"1f23a\":62914,\"1f250\":62904,\"1f251\":62908,\"1f300\":41010,\"1f301\":4857,\"1f302\":41012,\"1f303\":4858,\"1f304\":4860,\"1f305\":4861,\"1f306\":4862,\"1f307\":4863,\"1f308\":41011,\"1f309\":4864,\"1f30a\":41023,\"1f30b\":4815,\"1f30c\":4997,\"1f30d\":4806,\"1f30e\":4807,\"1f30f\":4808,\"1f310\":4809,\"1f311\":4977,\"1f312\":4978,\"1f313\":4979,\"1f314\":4980,\"1f315\":4981,\"1f316\":4982,\"1f317\":4983,\"1f318\":4984,\"1f319\":4985,\"1f31a\":4986,\"1f31b\":4987,\"1f31c\":4988,\"1f31d\":4991,\"1f31e\":4992,\"1f31f\":4995,\"1f320\":4996,\"1f321\":4989,\"1f324\":41001,\"1f325\":41002,\"1f326\":41003,\"1f327\":41004,\"1f328\":41005,\"1f329\":41006,\"1f32a\":41007,\"1f32b\":41008,\"1f32c\":41009,\"1f32d\":3725,\"1f32e\":3727,\"1f32f\":3728,\"1f330\":3708,\"1f331\":2659,\"1f332\":2661,\"1f333\":2662,\"1f334\":2663,\"1f335\":2664,\"1f336\":3698,\"1f337\":2658,\"1f338\":2649,\"1f339\":2653,\"1f33a\":2655,\"1f33b\":2656,\"1f33c\":2657,\"1f33d\":3697,\"1f33e\":2665,\"1f33f\":2666,\"1f340\":2668,\"1f341\":2669,\"1f342\":2670,\"1f343\":2671,\"1f344\":3705,\"1f345\":3690,\"1f346\":3694,\"1f347\":3674,\"1f348\":3675,\"1f349\":3676,\"1f34a\":3677,\"1f34b\":3678,\"1f34c\":3679,\"1f34d\":3680,\"1f34e\":3682,\"1f34f\":3683,\"1f350\":3684,\"1f351\":3685,\"1f352\":3686,\"1f353\":3687,\"1f354\":3722,\"1f355\":3724,\"1f356\":3718,\"1f357\":3719,\"1f358\":3744,\"1f359\":3745,\"1f35a\":3746,\"1f35b\":3747,\"1f35c\":3748,\"1f35d\":3749,\"1f35e\":3709,\"1f35f\":3723,\"1f360\":3750,\"1f361\":3756,\"1f362\":3751,\"1f363\":3752,\"1f364\":3753,\"1f365\":3754,\"1f366\":3765,\"1f367\":3766,\"1f368\":3767,\"1f369\":3768,\"1f36a\":3769,\"1f36b\":3774,\"1f36c\":3775,\"1f36d\":3776,\"1f36e\":3777,\"1f36f\":3778,\"1f370\":3771,\"1f371\":3743,\"1f372\":3735,\"1f373\":3733,\"1f374\":3801,\"1f375\":3783,\"1f376\":3784,\"1f377\":3786,\"1f378\":3787,\"1f379\":3788,\"1f37a\":3789,\"1f37b\":3790,\"1f37c\":3779,\"1f37d\":3800,\"1f37e\":3785,\"1f37f\":3739,\"1f380\":51040,\"1f381\":51041,\"1f382\":3770,\"1f383\":51024,\"1f384\":51025,\"1f385\":1527,\"1f386\":51026,\"1f387\":51027,\"1f388\":51030,\"1f389\":51031,\"1f38a\":51032,\"1f38b\":51033,\"1f38c\":71588,\"1f38d\":51034,\"1f38e\":51035,\"1f38f\":51036,\"1f390\":51037,\"1f391\":51038,\"1f392\":61134,\"1f393\":61147,\"1f396\":51045,\"1f397\":51042,\"1f399\":61167,\"1f39a\":61168,\"1f39b\":61169,\"1f39e\":61203,\"1f39f\":51043,\"1f3a0\":4866,\"1f3a1\":4868,\"1f3a2\":4869,\"1f3a3\":51072,\"1f3a4\":61170,\"1f3a5\":61202,\"1f3a6\":62819,\"1f3a7\":61171,\"1f3a8\":51105,\"1f3a9\":61146,\"1f3aa\":4871,\"1f3ab\":51044,\"1f3ac\":61205,\"1f3ad\":51103,\"1f3ae\":51086,\"1f3af\":51078,\"1f3b0\":51088,\"1f3b1\":51081,\"1f3b2\":51089,\"1f3b3\":51060,\"1f3b4\":51102,\"1f3b5\":61165,\"1f3b6\":61166,\"1f3b7\":61173,\"1f3b8\":61175,\"1f3b9\":61176,\"1f3ba\":61177,\"1f3bb\":61178,\"1f3bc\":61164,\"1f3bd\":51074,\"1f3be\":51058,\"1f3bf\":51075,\"1f3c0\":51054,\"1f3c1\":71586,\"1f3c2\":1600,\"1f3c3-200d-2640\":1584,\"1f3c3-200d-2642\":1583,\"1f3c3\":1582,\"1f3c4-200d-2640\":1606,\"1f3c4-200d-2642\":1605,\"1f3c4\":1604,\"1f3c5\":51047,\"1f3c6\":51046,\"1f3c7\":1598,\"1f3c8\":51056,\"1f3c9\":51057,\"1f3ca-200d-2640\":1612,\"1f3ca-200d-2642\":1611,\"1f3ca\":1610,\"1f3cb-200d-2640\":1618,\"1f3cb-200d-2642\":1617,\"1f3cb\":1616,\"1f3cc-200d-2640\":1603,\"1f3cc-200d-2642\":1602,\"1f3cc\":1601,\"1f3cd\":4902,\"1f3ce\":4901,\"1f3cf\":51061,\"1f3d0\":51055,\"1f3d1\":51062,\"1f3d2\":51063,\"1f3d3\":51065,\"1f3d4\":4813,\"1f3d5\":4817,\"1f3d6\":4818,\"1f3d7\":4824,\"1f3d8\":4829,\"1f3d9\":4859,\"1f3da\":4830,\"1f3db\":4823,\"1f3dc\":4819,\"1f3dd\":4820,\"1f3de\":4821,\"1f3df\":4822,\"1f3e0\":4831,\"1f3e1\":4832,\"1f3e2\":4833,\"1f3e3\":4834,\"1f3e4\":4835,\"1f3e5\":4836,\"1f3e6\":4837,\"1f3e7\":62729,\"1f3e8\":4838,\"1f3e9\":4839,\"1f3ea\":4840,\"1f3eb\":4841,\"1f3ec\":4842,\"1f3ed\":4843,\"1f3ee\":61216,\"1f3ef\":4844,\"1f3f0\":4845,\"1f3f3-200d-1f308\":71591,\"1f3f3-200d-26a7\":71592,\"1f3f3\":71590,\"1f3f4-200d-2620\":71593,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71852,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71853,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71854,\"1f3f4\":71589,\"1f3f5\":2652,\"1f3f7\":61234,\"1f3f8\":51066,\"1f3f9\":61303,\"1f3fa\":3805,\"1f3fb\":9525,\"1f3fc\":9526,\"1f3fd\":9527,\"1f3fe\":9528,\"1f3ff\":9529,\"1f400\":2576,\"1f401\":2575,\"1f402\":2556,\"1f403\":2557,\"1f404\":2558,\"1f405\":2547,\"1f406\":2548,\"1f407\":2579,\"1f408-200d-2b1b\":2544,\"1f408\":2543,\"1f409\":2618,\"1f40a\":2613,\"1f40b\":2622,\"1f40c\":2632,\"1f40d\":2616,\"1f40e\":2550,\"1f40f\":2563,\"1f410\":2565,\"1f411\":2564,\"1f412\":2531,\"1f413\":2596,\"1f414\":2595,\"1f415-200d-1f9ba\":2537,\"1f415\":2535,\"1f416\":2560,\"1f417\":2561,\"1f418\":2570,\"1f419\":2629,\"1f41a\":2630,\"1f41b\":2634,\"1f41c\":2635,\"1f41d\":2636,\"1f41e\":2638,\"1f41f\":2625,\"1f420\":2626,\"1f421\":2627,\"1f422\":2614,\"1f423\":2597,\"1f424\":2598,\"1f425\":2599,\"1f426\":2600,\"1f427\":2601,\"1f428\":2586,\"1f429\":2538,\"1f42a\":2566,\"1f42b\":2567,\"1f42c\":2623,\"1f42d\":2574,\"1f42e\":2555,\"1f42f\":2546,\"1f430\":2578,\"1f431\":2542,\"1f432\":2617,\"1f433\":2621,\"1f434\":2549,\"1f435\":2530,\"1f436\":2534,\"1f437\":2559,\"1f438\":2612,\"1f439\":2577,\"1f43a\":2539,\"1f43b-200d-2744\":2585,\"1f43b\":2584,\"1f43c\":2587,\"1f43d\":2562,\"1f43e\":2593,\"1f43f\":2580,\"1f440\":1381,\"1f441-200d-1f5e8\":1159,\"1f441\":1382,\"1f442\":1373,\"1f443\":1375,\"1f444\":1384,\"1f445\":1383,\"1f446\":1347,\"1f447\":1349,\"1f448\":1345,\"1f449\":1346,\"1f44a\":1355,\"1f44b\":1327,\"1f44c\":1336,\"1f44d\":1352,\"1f44e\":1353,\"1f44f\":1358,\"1f450\":1361,\"1f451\":61144,\"1f452\":61145,\"1f453\":61110,\"1f454\":61115,\"1f455\":61116,\"1f456\":61117,\"1f457\":61122,\"1f458\":61123,\"1f459\":61128,\"1f45a\":61129,\"1f45b\":61130,\"1f45c\":61131,\"1f45d\":61132,\"1f45e\":61136,\"1f45f\":61137,\"1f460\":61140,\"1f461\":61141,\"1f462\":61143,\"1f463\":1687,\"1f464\":1684,\"1f465\":1685,\"1f466\":1388,\"1f467\":1389,\"1f468-200d-1f33e\":1457,\"1f468-200d-1f373\":1460,\"1f468-200d-1f37c\":1524,\"1f468-200d-1f393\":1448,\"1f468-200d-1f3a4\":1478,\"1f468-200d-1f3a8\":1481,\"1f468-200d-1f3eb\":1451,\"1f468-200d-1f3ed\":1466,\"1f468-200d-1f466-200d-1f466\":1674,\"1f468-200d-1f466\":1673,\"1f468-200d-1f467-200d-1f466\":1676,\"1f468-200d-1f467-200d-1f467\":1677,\"1f468-200d-1f467\":1675,\"1f468-200d-1f468-200d-1f466\":1663,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1666,\"1f468-200d-1f468-200d-1f467\":1664,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1665,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1667,\"1f468-200d-1f469-200d-1f466\":1658,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1661,\"1f468-200d-1f469-200d-1f467\":1659,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1660,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1662,\"1f468-200d-1f4bb\":1475,\"1f468-200d-1f4bc\":1469,\"1f468-200d-1f527\":1463,\"1f468-200d-1f52c\":1472,\"1f468-200d-1f680\":1487,\"1f468-200d-1f692\":1490,\"1f468-200d-1f9af\":1574,\"1f468-200d-1f9b0\":1396,\"1f468-200d-1f9b1\":1397,\"1f468-200d-1f9b2\":1399,\"1f468-200d-1f9b3\":1398,\"1f468-200d-1f9bc\":1577,\"1f468-200d-1f9bd\":1580,\"1f468-200d-2695\":1445,\"1f468-200d-2696\":1454,\"1f468-200d-2708\":1484,\"1f468-200d-2764-200d-1f468\":1655,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1651,\"1f468\":1392,\"1f469-200d-1f33e\":1458,\"1f469-200d-1f373\":1461,\"1f469-200d-1f37c\":1523,\"1f469-200d-1f393\":1449,\"1f469-200d-1f3a4\":1479,\"1f469-200d-1f3a8\":1482,\"1f469-200d-1f3eb\":1452,\"1f469-200d-1f3ed\":1467,\"1f469-200d-1f466-200d-1f466\":1679,\"1f469-200d-1f466\":1678,\"1f469-200d-1f467-200d-1f466\":1681,\"1f469-200d-1f467-200d-1f467\":1682,\"1f469-200d-1f467\":1680,\"1f469-200d-1f469-200d-1f466\":1668,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1671,\"1f469-200d-1f469-200d-1f467\":1669,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1670,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1672,\"1f469-200d-1f4bb\":1476,\"1f469-200d-1f4bc\":1470,\"1f469-200d-1f527\":1464,\"1f469-200d-1f52c\":1473,\"1f469-200d-1f680\":1488,\"1f469-200d-1f692\":1491,\"1f469-200d-1f9af\":1575,\"1f469-200d-1f9b0\":1401,\"1f469-200d-1f9b1\":1403,\"1f469-200d-1f9b2\":1407,\"1f469-200d-1f9b3\":1405,\"1f469-200d-1f9bc\":1578,\"1f469-200d-1f9bd\":1581,\"1f469-200d-2695\":1446,\"1f469-200d-2696\":1455,\"1f469-200d-2708\":1485,\"1f469-200d-2764-200d-1f468\":1654,\"1f469-200d-2764-200d-1f469\":1656,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1650,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1652,\"1f469\":1400,\"1f46a\":1657,\"1f46b\":1647,\"1f46c\":1648,\"1f46d\":1646,\"1f46e-200d-2640\":1494,\"1f46e-200d-2642\":1493,\"1f46e\":1492,\"1f46f-200d-2640\":1590,\"1f46f-200d-2642\":1589,\"1f46f\":1588,\"1f470-200d-2640\":1518,\"1f470-200d-2642\":1517,\"1f470\":1516,\"1f471-200d-2640\":1409,\"1f471-200d-2642\":1410,\"1f471\":1391,\"1f472\":1511,\"1f473-200d-2640\":1510,\"1f473-200d-2642\":1509,\"1f473\":1508,\"1f474\":1412,\"1f475\":1413,\"1f476\":1386,\"1f477-200d-2640\":1504,\"1f477-200d-2642\":1503,\"1f477\":1502,\"1f478\":1507,\"1f479\":1109,\"1f47a\":1110,\"1f47b\":1111,\"1f47c\":1526,\"1f47d\":1112,\"1f47e\":1113,\"1f47f\":1104,\"1f480\":1105,\"1f481-200d-2640\":1428,\"1f481-200d-2642\":1427,\"1f481\":1426,\"1f482-200d-2640\":1500,\"1f482-200d-2642\":1499,\"1f482\":1498,\"1f483\":1585,\"1f484\":61152,\"1f485\":1366,\"1f486-200d-2640\":1560,\"1f486-200d-2642\":1559,\"1f486\":1558,\"1f487-200d-2640\":1563,\"1f487-200d-2642\":1562,\"1f487\":1561,\"1f488\":4870,\"1f489\":61326,\"1f48a\":61328,\"1f48b\":1127,\"1f48c\":1128,\"1f48d\":61153,\"1f48e\":61154,\"1f48f\":1649,\"1f490\":2648,\"1f491\":1653,\"1f492\":4846,\"1f493\":1133,\"1f494\":1138,\"1f495\":1135,\"1f496\":1131,\"1f497\":1132,\"1f498\":1129,\"1f499\":1145,\"1f49a\":1144,\"1f49b\":1143,\"1f49c\":1146,\"1f49d\":1130,\"1f49e\":1134,\"1f49f\":1136,\"1f4a0\":62946,\"1f4a1\":61214,\"1f4a2\":1151,\"1f4a3\":1157,\"1f4a4\":1163,\"1f4a5\":1152,\"1f4a6\":1154,\"1f4a7\":41022,\"1f4a8\":1155,\"1f4a9\":1107,\"1f4aa\":1368,\"1f4ab\":1153,\"1f4ac\":1158,\"1f4ad\":1162,\"1f4ae\":2650,\"1f4af\":1150,\"1f4b0\":61235,\"1f4b1\":62841,\"1f4b2\":62842,\"1f4b3\":61242,\"1f4b4\":61237,\"1f4b5\":61238,\"1f4b6\":61239,\"1f4b7\":61240,\"1f4b8\":61241,\"1f4b9\":61244,\"1f4ba\":4936,\"1f4bb\":61191,\"1f4bc\":61265,\"1f4bd\":61197,\"1f4be\":61198,\"1f4bf\":61199,\"1f4c0\":61200,\"1f4c1\":61266,\"1f4c2\":61267,\"1f4c3\":61227,\"1f4c4\":61229,\"1f4c5\":61269,\"1f4c6\":61270,\"1f4c7\":61273,\"1f4c8\":61274,\"1f4c9\":61275,\"1f4ca\":61276,\"1f4cb\":61277,\"1f4cc\":61278,\"1f4cd\":61279,\"1f4ce\":61280,\"1f4cf\":61282,\"1f4d0\":61283,\"1f4d1\":61232,\"1f4d2\":61226,\"1f4d3\":61225,\"1f4d4\":61218,\"1f4d5\":61219,\"1f4d6\":61220,\"1f4d7\":61221,\"1f4d8\":61222,\"1f4d9\":61223,\"1f4da\":61224,\"1f4db\":62847,\"1f4dc\":61228,\"1f4dd\":61264,\"1f4de\":61185,\"1f4df\":61186,\"1f4e0\":61187,\"1f4e1\":61325,\"1f4e2\":61159,\"1f4e3\":61160,\"1f4e4\":61249,\"1f4e5\":61250,\"1f4e6\":61251,\"1f4e7\":61246,\"1f4e8\":61247,\"1f4e9\":61248,\"1f4ea\":61253,\"1f4eb\":61252,\"1f4ec\":61254,\"1f4ed\":61255,\"1f4ee\":61256,\"1f4ef\":61161,\"1f4f0\":61230,\"1f4f1\":61182,\"1f4f2\":61183,\"1f4f3\":62823,\"1f4f4\":62824,\"1f4f5\":62751,\"1f4f6\":62822,\"1f4f7\":61207,\"1f4f8\":61208,\"1f4f9\":61209,\"1f4fa\":61206,\"1f4fb\":61172,\"1f4fc\":61210,\"1f4fd\":61204,\"1f4ff\":61151,\"1f500\":62801,\"1f501\":62802,\"1f502\":62803,\"1f503\":62769,\"1f504\":62770,\"1f505\":62820,\"1f506\":62821,\"1f507\":61155,\"1f508\":61156,\"1f509\":61157,\"1f50a\":61158,\"1f50b\":61188,\"1f50c\":61190,\"1f50d\":61211,\"1f50e\":61212,\"1f50f\":61290,\"1f510\":61291,\"1f511\":61292,\"1f512\":61288,\"1f513\":61289,\"1f514\":61162,\"1f515\":61163,\"1f516\":61233,\"1f517\":61313,\"1f518\":62947,\"1f519\":62771,\"1f51a\":62772,\"1f51b\":62773,\"1f51c\":62774,\"1f51d\":62775,\"1f51e\":62752,\"1f51f\":62876,\"1f520\":62877,\"1f521\":62878,\"1f522\":62879,\"1f523\":62880,\"1f524\":62881,\"1f525\":41021,\"1f526\":61215,\"1f527\":61306,\"1f528\":61294,\"1f529\":61308,\"1f52a\":3803,\"1f52b\":61301,\"1f52c\":61323,\"1f52d\":61324,\"1f52e\":51082,\"1f52f\":62787,\"1f530\":62848,\"1f531\":62846,\"1f532\":62949,\"1f533\":62948,\"1f534\":62916,\"1f535\":62920,\"1f536\":62940,\"1f537\":62941,\"1f538\":62942,\"1f539\":62943,\"1f53a\":62944,\"1f53b\":62945,\"1f53c\":62811,\"1f53d\":62813,\"1f549\":62778,\"1f54a\":2602,\"1f54b\":4854,\"1f54c\":4850,\"1f54d\":4852,\"1f54e\":62786,\"1f550\":4955,\"1f551\":4957,\"1f552\":4959,\"1f553\":4961,\"1f554\":4963,\"1f555\":4965,\"1f556\":4967,\"1f557\":4969,\"1f558\":4971,\"1f559\":4973,\"1f55a\":4975,\"1f55b\":4953,\"1f55c\":4956,\"1f55d\":4958,\"1f55e\":4960,\"1f55f\":4962,\"1f560\":4964,\"1f561\":4966,\"1f562\":4968,\"1f563\":4970,\"1f564\":4972,\"1f565\":4974,\"1f566\":4976,\"1f567\":4954,\"1f56f\":61213,\"1f570\":4952,\"1f573\":1156,\"1f574\":1587,\"1f575-200d-2640\":1497,\"1f575-200d-2642\":1496,\"1f575\":1495,\"1f576\":61111,\"1f577\":2641,\"1f578\":2642,\"1f579\":51087,\"1f57a\":1586,\"1f587\":61281,\"1f58a\":61261,\"1f58b\":61260,\"1f58c\":61262,\"1f58d\":61263,\"1f590\":1329,\"1f595\":1348,\"1f596\":1331,\"1f5a4\":1148,\"1f5a5\":61192,\"1f5a8\":61193,\"1f5b1\":61195,\"1f5b2\":61196,\"1f5bc\":51104,\"1f5c2\":61268,\"1f5c3\":61285,\"1f5c4\":61286,\"1f5d1\":61287,\"1f5d2\":61271,\"1f5d3\":61272,\"1f5dc\":61310,\"1f5dd\":61293,\"1f5de\":61231,\"1f5e1\":61299,\"1f5e3\":1683,\"1f5e8\":1160,\"1f5ef\":1161,\"1f5f3\":61257,\"1f5fa\":4810,\"1f5fb\":4816,\"1f5fc\":4847,\"1f5fd\":4848,\"1f5fe\":4811,\"1f5ff\":61362,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":114,\"1f608\":1103,\"1f609\":112,\"1f60a\":113,\"1f60b\":124,\"1f60c\":150,\"1f60d\":116,\"1f60e\":170,\"1f60f\":144,\"1f610\":139,\"1f611\":140,\"1f612\":145,\"1f613\":195,\"1f614\":151,\"1f615\":173,\"1f616\":192,\"1f617\":119,\"1f618\":118,\"1f619\":122,\"1f61a\":121,\"1f61b\":125,\"1f61c\":126,\"1f61d\":128,\"1f61e\":194,\"1f61f\":175,\"1f620\":1101,\"1f621\":1100,\"1f622\":189,\"1f623\":193,\"1f624\":199,\"1f625\":188,\"1f626\":184,\"1f627\":185,\"1f628\":186,\"1f629\":196,\"1f62a\":152,\"1f62b\":197,\"1f62c\":147,\"1f62d\":190,\"1f62e-200d-1f4a8\":148,\"1f62e\":178,\"1f62f\":179,\"1f630\":187,\"1f631\":191,\"1f632\":180,\"1f633\":181,\"1f634\":154,\"1f635-200d-1f4ab\":165,\"1f635\":164,\"1f636-200d-1f32b\":143,\"1f636\":141,\"1f637\":155,\"1f638\":1116,\"1f639\":1117,\"1f63a\":1115,\"1f63b\":1118,\"1f63c\":1119,\"1f63d\":1120,\"1f63e\":1123,\"1f63f\":1122,\"1f640\":1121,\"1f641\":176,\"1f642\":19,\"1f643\":110,\"1f644\":146,\"1f645-200d-2640\":1422,\"1f645-200d-2642\":1421,\"1f645\":1420,\"1f646-200d-2640\":1425,\"1f646-200d-2642\":1424,\"1f646\":1423,\"1f647-200d-2640\":1437,\"1f647-200d-2642\":1436,\"1f647\":1435,\"1f648\":1124,\"1f649\":1125,\"1f64a\":1126,\"1f64b-200d-2640\":1431,\"1f64b-200d-2642\":1430,\"1f64b\":1429,\"1f64c\":1359,\"1f64d-200d-2640\":1416,\"1f64d-200d-2642\":1415,\"1f64d\":1414,\"1f64e-200d-2640\":1419,\"1f64e-200d-2642\":1418,\"1f64e\":1417,\"1f64f\":1364,\"1f680\":4942,\"1f681\":4937,\"1f682\":4872,\"1f683\":4873,\"1f684\":4874,\"1f685\":4875,\"1f686\":4876,\"1f687\":4877,\"1f688\":4878,\"1f689\":4879,\"1f68a\":4880,\"1f68b\":4883,\"1f68c\":4884,\"1f68d\":4885,\"1f68e\":4886,\"1f68f\":4911,\"1f690\":4887,\"1f691\":4888,\"1f692\":4889,\"1f693\":4890,\"1f694\":4891,\"1f695\":4892,\"1f696\":4893,\"1f697\":4894,\"1f698\":4895,\"1f699\":4896,\"1f69a\":4898,\"1f69b\":4899,\"1f69c\":4900,\"1f69d\":4881,\"1f69e\":4882,\"1f69f\":4938,\"1f6a0\":4939,\"1f6a1\":4940,\"1f6a2\":4930,\"1f6a3-200d-2640\":1609,\"1f6a3-200d-2642\":1608,\"1f6a3\":1607,\"1f6a4\":4926,\"1f6a5\":4918,\"1f6a6\":4919,\"1f6a7\":4921,\"1f6a8\":4917,\"1f6a9\":71587,\"1f6aa\":61333,\"1f6ab\":62745,\"1f6ac\":61358,\"1f6ad\":62747,\"1f6ae\":62730,\"1f6af\":62748,\"1f6b0\":62731,\"1f6b1\":62749,\"1f6b2\":4907,\"1f6b3\":62746,\"1f6b4-200d-2640\":1621,\"1f6b4-200d-2642\":1620,\"1f6b4\":1619,\"1f6b5-200d-2640\":1624,\"1f6b5-200d-2642\":1623,\"1f6b5\":1622,\"1f6b6-200d-2640\":1566,\"1f6b6-200d-2642\":1565,\"1f6b6\":1564,\"1f6b7\":62750,\"1f6b8\":62743,\"1f6b9\":62733,\"1f6ba\":62734,\"1f6bb\":62735,\"1f6bc\":62736,\"1f6bd\":61340,\"1f6be\":62737,\"1f6bf\":61342,\"1f6c0\":1643,\"1f6c1\":61343,\"1f6c2\":62738,\"1f6c3\":62739,\"1f6c4\":62740,\"1f6c5\":62741,\"1f6cb\":61338,\"1f6cc\":1644,\"1f6cd\":61133,\"1f6ce\":4944,\"1f6cf\":61337,\"1f6d0\":62776,\"1f6d1\":4920,\"1f6d2\":61357,\"1f6d5\":4851,\"1f6d6\":4828,\"1f6d7\":61334,\"1f6e0\":61298,\"1f6e1\":61304,\"1f6e2\":4914,\"1f6e3\":4912,\"1f6e4\":4913,\"1f6e5\":4929,\"1f6e9\":4932,\"1f6eb\":4933,\"1f6ec\":4934,\"1f6f0\":4941,\"1f6f3\":4927,\"1f6f4\":4908,\"1f6f5\":4903,\"1f6f6\":4925,\"1f6f7\":51076,\"1f6f8\":4943,\"1f6f9\":4909,\"1f6fa\":4906,\"1f6fb\":4897,\"1f6fc\":4910,\"1f7e0\":62917,\"1f7e1\":62918,\"1f7e2\":62919,\"1f7e3\":62921,\"1f7e4\":62922,\"1f7e5\":62925,\"1f7e6\":62929,\"1f7e7\":62926,\"1f7e8\":62927,\"1f7e9\":62928,\"1f7ea\":62930,\"1f7eb\":62931,\"1f90c\":1337,\"1f90d\":1149,\"1f90e\":1147,\"1f90f\":1338,\"1f910\":137,\"1f911\":129,\"1f912\":156,\"1f913\":171,\"1f914\":135,\"1f915\":157,\"1f916\":1114,\"1f917\":130,\"1f918\":1343,\"1f919\":1344,\"1f91a\":1328,\"1f91b\":1356,\"1f91c\":1357,\"1f91d\":1363,\"1f91e\":1340,\"1f91f\":1342,\"1f920\":167,\"1f921\":1108,\"1f922\":158,\"1f923\":17,\"1f924\":153,\"1f925\":149,\"1f926-200d-2640\":1440,\"1f926-200d-2642\":1439,\"1f926\":1438,\"1f927\":160,\"1f928\":138,\"1f929\":117,\"1f92a\":127,\"1f92b\":134,\"1f92c\":1102,\"1f92d\":131,\"1f92e\":159,\"1f92f\":166,\"1f930\":1519,\"1f931\":1522,\"1f932\":1362,\"1f933\":1367,\"1f934\":1506,\"1f935-200d-2640\":1515,\"1f935-200d-2642\":1514,\"1f935\":1513,\"1f936\":1528,\"1f937-200d-2640\":1443,\"1f937-200d-2642\":1442,\"1f937\":1441,\"1f938-200d-2640\":1627,\"1f938-200d-2642\":1626,\"1f938\":1625,\"1f939-200d-2640\":1639,\"1f939-200d-2642\":1638,\"1f939\":1637,\"1f93a\":1597,\"1f93c-200d-2640\":1630,\"1f93c-200d-2642\":1629,\"1f93c\":1628,\"1f93d-200d-2640\":1633,\"1f93d-200d-2642\":1632,\"1f93d\":1631,\"1f93e-200d-2640\":1636,\"1f93e-200d-2642\":1635,\"1f93e\":1634,\"1f93f\":51073,\"1f940\":2654,\"1f941\":61180,\"1f942\":3791,\"1f943\":3792,\"1f944\":3802,\"1f945\":51069,\"1f947\":51048,\"1f948\":51049,\"1f949\":51050,\"1f94a\":51067,\"1f94b\":51068,\"1f94c\":51077,\"1f94d\":51064,\"1f94e\":51053,\"1f94f\":51059,\"1f950\":3710,\"1f951\":3693,\"1f952\":3700,\"1f953\":3721,\"1f954\":3695,\"1f955\":3696,\"1f956\":3711,\"1f957\":3738,\"1f958\":3734,\"1f959\":3730,\"1f95a\":3732,\"1f95b\":3780,\"1f95c\":3706,\"1f95d\":3689,\"1f95e\":3715,\"1f95f\":3757,\"1f960\":3758,\"1f961\":3759,\"1f962\":3799,\"1f963\":3737,\"1f964\":3794,\"1f965\":3692,\"1f966\":3702,\"1f967\":3773,\"1f968\":3713,\"1f969\":3720,\"1f96a\":3726,\"1f96b\":3742,\"1f96c\":3701,\"1f96d\":3681,\"1f96e\":3755,\"1f96f\":3714,\"1f970\":115,\"1f971\":198,\"1f972\":123,\"1f973\":168,\"1f974\":163,\"1f975\":161,\"1f976\":162,\"1f977\":1501,\"1f978\":169,\"1f97a\":182,\"1f97b\":61124,\"1f97c\":61113,\"1f97d\":61112,\"1f97e\":61138,\"1f97f\":61139,\"1f980\":3760,\"1f981\":2545,\"1f982\":2643,\"1f983\":2594,\"1f984\":2551,\"1f985\":2603,\"1f986\":2604,\"1f987\":2583,\"1f988\":2628,\"1f989\":2606,\"1f98a\":2540,\"1f98b\":2633,\"1f98c\":2553,\"1f98d\":2532,\"1f98e\":2615,\"1f98f\":2572,\"1f990\":3762,\"1f991\":3763,\"1f992\":2569,\"1f993\":2552,\"1f994\":2582,\"1f995\":2619,\"1f996\":2620,\"1f997\":2639,\"1f998\":2591,\"1f999\":2568,\"1f99a\":2610,\"1f99b\":2573,\"1f99c\":2611,\"1f99d\":2541,\"1f99e\":3761,\"1f99f\":2644,\"1f9a0\":2647,\"1f9a1\":2592,\"1f9a2\":2605,\"1f9a3\":2571,\"1f9a4\":2607,\"1f9a5\":2588,\"1f9a6\":2589,\"1f9a7\":2533,\"1f9a8\":2590,\"1f9a9\":2609,\"1f9aa\":3764,\"1f9ab\":2581,\"1f9ac\":2554,\"1f9ad\":2624,\"1f9ae\":2536,\"1f9af\":61312,\"1f9b4\":1380,\"1f9b5\":1371,\"1f9b6\":1372,\"1f9b7\":1379,\"1f9b8-200d-2640\":1532,\"1f9b8-200d-2642\":1531,\"1f9b8\":1530,\"1f9b9-200d-2640\":1535,\"1f9b9-200d-2642\":1534,\"1f9b9\":1533,\"1f9ba\":61114,\"1f9bb\":1374,\"1f9bc\":4905,\"1f9bd\":4904,\"1f9be\":1369,\"1f9bf\":1370,\"1f9c0\":3717,\"1f9c1\":3772,\"1f9c2\":3741,\"1f9c3\":3796,\"1f9c4\":3703,\"1f9c5\":3704,\"1f9c6\":3731,\"1f9c7\":3716,\"1f9c8\":3740,\"1f9c9\":3797,\"1f9ca\":3798,\"1f9cb\":3795,\"1f9cd-200d-2640\":1569,\"1f9cd-200d-2642\":1568,\"1f9cd\":1567,\"1f9ce-200d-2640\":1572,\"1f9ce-200d-2642\":1571,\"1f9ce\":1570,\"1f9cf-200d-2640\":1434,\"1f9cf-200d-2642\":1433,\"1f9cf\":1432,\"1f9d0\":172,\"1f9d1-200d-1f33e\":1456,\"1f9d1-200d-1f373\":1459,\"1f9d1-200d-1f37c\":1525,\"1f9d1-200d-1f384\":1529,\"1f9d1-200d-1f393\":1447,\"1f9d1-200d-1f3a4\":1477,\"1f9d1-200d-1f3a8\":1480,\"1f9d1-200d-1f3eb\":1450,\"1f9d1-200d-1f3ed\":1465,\"1f9d1-200d-1f4bb\":1474,\"1f9d1-200d-1f4bc\":1468,\"1f9d1-200d-1f527\":1462,\"1f9d1-200d-1f52c\":1471,\"1f9d1-200d-1f680\":1486,\"1f9d1-200d-1f692\":1489,\"1f9d1-200d-1f91d-200d-1f9d1\":1645,\"1f9d1-200d-1f9af\":1573,\"1f9d1-200d-1f9b0\":1402,\"1f9d1-200d-1f9b1\":1404,\"1f9d1-200d-1f9b2\":1408,\"1f9d1-200d-1f9b3\":1406,\"1f9d1-200d-1f9bc\":1576,\"1f9d1-200d-1f9bd\":1579,\"1f9d1-200d-2695\":1444,\"1f9d1-200d-2696\":1453,\"1f9d1-200d-2708\":1483,\"1f9d1\":1390,\"1f9d2\":1387,\"1f9d3\":1411,\"1f9d4-200d-2640\":1395,\"1f9d4-200d-2642\":1394,\"1f9d4\":1393,\"1f9d5\":1512,\"1f9d6-200d-2640\":1593,\"1f9d6-200d-2642\":1592,\"1f9d6\":1591,\"1f9d7-200d-2640\":1596,\"1f9d7-200d-2642\":1595,\"1f9d7\":1594,\"1f9d8-200d-2640\":1642,\"1f9d8-200d-2642\":1641,\"1f9d8\":1640,\"1f9d9-200d-2640\":1538,\"1f9d9-200d-2642\":1537,\"1f9d9\":1536,\"1f9da-200d-2640\":1541,\"1f9da-200d-2642\":1540,\"1f9da\":1539,\"1f9db-200d-2640\":1544,\"1f9db-200d-2642\":1543,\"1f9db\":1542,\"1f9dc-200d-2640\":1547,\"1f9dc-200d-2642\":1546,\"1f9dc\":1545,\"1f9dd-200d-2640\":1550,\"1f9dd-200d-2642\":1549,\"1f9dd\":1548,\"1f9de-200d-2640\":1553,\"1f9de-200d-2642\":1552,\"1f9de\":1551,\"1f9df-200d-2640\":1556,\"1f9df-200d-2642\":1555,\"1f9df\":1554,\"1f9e0\":1376,\"1f9e1\":1142,\"1f9e2\":61148,\"1f9e3\":61118,\"1f9e4\":61119,\"1f9e5\":61120,\"1f9e6\":61121,\"1f9e7\":51039,\"1f9e8\":51028,\"1f9e9\":51090,\"1f9ea\":61320,\"1f9eb\":61321,\"1f9ec\":61322,\"1f9ed\":4812,\"1f9ee\":61201,\"1f9ef\":61356,\"1f9f0\":61316,\"1f9f1\":4825,\"1f9f2\":61317,\"1f9f3\":4945,\"1f9f4\":61346,\"1f9f5\":51106,\"1f9f6\":51108,\"1f9f7\":61347,\"1f9f8\":51091,\"1f9f9\":61348,\"1f9fa\":61349,\"1f9fb\":61350,\"1f9fc\":61352,\"1f9fd\":61355,\"1f9fe\":61243,\"1f9ff\":51084,\"1fa70\":61142,\"1fa71\":61125,\"1fa72\":61126,\"1fa73\":61127,\"1fa74\":61135,\"1fa78\":61327,\"1fa79\":61329,\"1fa7a\":61331,\"1fa80\":51079,\"1fa81\":51080,\"1fa82\":4935,\"1fa83\":61302,\"1fa84\":51083,\"1fa85\":51092,\"1fa86\":51094,\"1fa90\":4993,\"1fa91\":61339,\"1fa92\":61345,\"1fa93\":61295,\"1fa94\":61217,\"1fa95\":61179,\"1fa96\":61149,\"1fa97\":61174,\"1fa98\":61181,\"1fa99\":61236,\"1fa9a\":61305,\"1fa9b\":61307,\"1fa9c\":61318,\"1fa9d\":61315,\"1fa9e\":61335,\"1fa9f\":61336,\"1faa0\":61341,\"1faa1\":51107,\"1faa2\":51109,\"1faa3\":61351,\"1faa4\":61344,\"1faa5\":61354,\"1faa6\":61360,\"1faa7\":61363,\"1faa8\":4826,\"1fab0\":2645,\"1fab1\":2646,\"1fab2\":2637,\"1fab3\":2640,\"1fab4\":2660,\"1fab5\":4827,\"1fab6\":2608,\"1fac0\":1377,\"1fac1\":1378,\"1fac2\":1686,\"1fad0\":3688,\"1fad1\":3699,\"1fad2\":3691,\"1fad3\":3712,\"1fad4\":3729,\"1fad5\":3736,\"1fad6\":3782,\"203c\":62834,\"21a9\":62765,\"21aa\":62766,\"231a\":4948,\"231b\":4946,\"23cf\":62818,\"23e9\":62805,\"23ea\":62809,\"23eb\":62812,\"23ec\":62814,\"23ed\":62806,\"23ee\":62810,\"23ef\":62807,\"23f0\":4949,\"23f1\":4950,\"23f2\":4951,\"23f3\":4947,\"23f8\":62815,\"23f9\":62816,\"23fa\":62817,\"24c2\":62890,\"25aa\":62938,\"25ab\":62939,\"25b6\":62804,\"25c0\":62808,\"25fb\":62935,\"25fc\":62934,\"25fd\":62937,\"25fe\":62936,\"260e\":61184,\"261d\":1350,\"262a\":62784,\"262e\":62785,\"262f\":62781,\"263a\":120,\"264a\":62790,\"264b\":62791,\"264c\":62792,\"264d\":62793,\"264e\":62794,\"264f\":62795,\"265f\":51099,\"267b\":62844,\"267e\":62833,\"267f\":62732,\"269b\":62777,\"269c\":62845,\"26a0\":62742,\"26a1\":41016,\"26a7\":62827,\"26aa\":62924,\"26ab\":62923,\"26b0\":61359,\"26b1\":61361,\"26bd\":51051,\"26be\":51052,\"26c4\":41019,\"26c5\":4999,\"26c8\":41000,\"26ce\":62800,\"26cf\":61296,\"26d1\":61150,\"26d3\":61314,\"26d4\":62744,\"26e9\":4853,\"26ea\":4849,\"26f0\":4814,\"26f1\":41015,\"26f2\":4855,\"26f3\":51070,\"26f4\":4928,\"26f5\":4924,\"26f7\":1599,\"26f8\":51071,\"26f9-200d-2640\":1615,\"26f9-200d-2642\":1614,\"26f9\":1613,\"26fa\":4856,\"26fd\":4915,\"270a\":1354,\"270b\":1330,\"270c\":1339,\"270d\":1365,\"270f\":61258,\"271d\":62782,\"274c\":62853,\"274e\":62854,\"2764-200d-1f525\":1139,\"2764-200d-1fa79\":1140,\"27a1\":62757,\"27b0\":62855,\"27bf\":62856,\"2b05\":62761,\"2b06\":62755,\"2b07\":62759,\"2b1b\":62932,\"2b1c\":62933,\"2b50\":4994,\"2b55\":62849,\"303d\":62857,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f469-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe\":0,\"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f48f-1f3fb\":0,\"1f48f-1f3fc\":0,\"1f48f-1f3fd\":0,\"1f48f-1f3fe\":0,\"1f48f-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe\":0,\"1f491-1f3fb\":0,\"1f491-1f3fc\":0,\"1f491-1f3fd\":0,\"1f491-1f3fe\":0,\"1f491-1f3ff\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91d-1f3fb\":0,\"1f91d-1f3fc\":0,\"1f91d-1f3fd\":0,\"1f91d-1f3fe\":0,\"1f91d-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb-200d-2640\":0,\"1f9d4-1f3fc-200d-2640\":0,\"1f9d4-1f3fd-200d-2640\":0,\"1f9d4-1f3fe-200d-2640\":0,\"1f9d4-1f3ff-200d-2640\":0,\"1f9d4-1f3fb-200d-2642\":0,\"1f9d4-1f3fc-200d-2642\":0,\"1f9d4-1f3fd-200d-2642\":0,\"1f9d4-1f3fe-200d-2642\":0,\"1f9d4-1f3ff-200d-2642\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from \"../config/latinizeMap\";\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n й: 'q',\n ц: 'w',\n у: 'e',\n к: 'r',\n е: 't',\n н: 'y',\n г: 'u',\n ш: 'i',\n щ: 'o',\n з: 'p',\n х: '[',\n ъ: ']',\n ф: 'a',\n ы: 's',\n в: 'd',\n а: 'f',\n п: 'g',\n р: 'h',\n о: 'j',\n л: 'k',\n д: 'l',\n ж: ';',\n э: '\\'',\n я: 'z',\n ч: 'x',\n с: 'c',\n м: 'v',\n и: 'b',\n т: 'n',\n ь: 'm',\n б: ',',\n ю: '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode, \r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], \r\n log?: string, \r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","import type ENVIRONMENT from \".\";\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall } from \"../layer\";\nimport type { AppMessagesManager, Dialog, MessagesStorageKey, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type { AppManagers } from \"./appManagers/managers\";\nimport type { State } from \"../config/state\";\nimport type { Progress } from \"./appManagers/appDownloadManager\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport MTProtoMessagePort from \"./mtproto/mtprotoMessagePort\";\nimport { IS_WORKER } from \"../helpers/context\";\nimport { CallId } from \"./appManagers/appCallsManager\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number},\n 'history_update': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n //'history_request': void,\n \n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n \n 'language_change': string,\n \n 'theme_change': void,\n\n 'media_play': void,\n \n 'emoji_recent': string,\n \n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': string,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId = NULL_PEER_ID;\n private connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n \n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { State } from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n \n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n \n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n \n this.storage.set({\n [key]: value\n }, onlyLocal);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from \"./getDeepProperty\";\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport noop from \"../../helpers/noop\";\r\nimport { DcId } from \"../../types\";\r\n\r\nexport class NetworkStats {\r\n public sent: number;\r\n public received: number;\r\n public awaitingChunks: Map}[]>;\r\n\r\n constructor() {\r\n this.sent = this.received = 0;\r\n this.awaitingChunks = new Map();\r\n }\r\n\r\n public addSent(dcId: DcId, length: number) {\r\n this.sent += length;\r\n }\r\n\r\n public addReceived(dcId: DcId, length: number) {\r\n this.received += length;\r\n\r\n const awaitingChunks = this.awaitingChunks.get(dcId);\r\n const awaitingLength = awaitingChunks?.length;\r\n if(awaitingLength) {\r\n for(let i = 0; i < awaitingLength; ++i) {\r\n const awaiting = awaitingChunks[i];\r\n if(length >= awaiting.length) {\r\n awaiting.deferred.resolve();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public waitForChunk(dcId: DcId, length: number) {\r\n const deferred = deferredPromise();\r\n let awaitingChunks = this.awaitingChunks.get(dcId);\r\n if(!awaitingChunks) {\r\n this.awaitingChunks.set(dcId, awaitingChunks = []);\r\n }\r\n\r\n const awaiting = {length, deferred};\r\n deferred.catch(noop).finally(() => {\r\n indexOfAndSplice(awaitingChunks, awaiting);\r\n });\r\n\r\n awaitingChunks.push(awaiting);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst networkStats = new NetworkStats();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkStats = networkStats);\r\nexport default networkStats;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport { DcId } from '../../../types';\nimport { logger, LogTypes } from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\nimport networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void, \n reject: any, \n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n \n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n \n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200', \n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n }); \n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return arr;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport randomize from \"../../../helpers/array/randomize\";\r\nimport cryptoMessagePort from \"../../crypto/cryptoMessagePort\";\r\nimport { Codec } from \"./codec\";\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private id: number;\r\n private idPromise: Promise;\r\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\r\n\r\n // private cryptoEncKey: CryptoKey;\r\n // private cryptoDecKey: CryptoKey;\r\n // private cryptoKey: CryptoKey;\r\n\r\n // private encIv: Uint8Array;\r\n // private decIv: Uint8Array;\r\n\r\n // private decIvCounter: Counter;\r\n\r\n public async init(codec: Codec) {\r\n if(this.idPromise !== undefined) {\r\n this.release();\r\n }\r\n\r\n const initPayload = new Uint8Array(64);\r\n randomize(initPayload);\r\n \r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n randomize(initPayload);\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n \r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\r\n encKey,\r\n encIv,\r\n decKey,\r\n decIv\r\n });\r\n\r\n this.process = async(data, operation) => {\r\n await idPromise;\r\n return this._process(data, operation);\r\n };\r\n\r\n this.id = await idPromise;\r\n \r\n this.process = this._process;\r\n \r\n // this.decIvCounter = new Counter(this.decIv);\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n // this.cryptoDecKey = await subtle.importKey(\r\n // 'raw',\r\n // decKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt']\r\n // );\r\n\r\n // this.cryptoKey = await subtle.importKey(\r\n // 'raw',\r\n // encKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt', 'decrypt']\r\n // );\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = await this.encode(initPayload.slice());\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n\r\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\r\n return cryptoMessagePort.invoke('invoke', {\r\n method: 'aes-ctr-process',\r\n args: [{id: this.id, data, operation}],\r\n }, undefined, undefined, [data.buffer]) as Promise;\r\n };\r\n\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.process(payload, 'encrypt');\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.process(payload, 'decrypt');\r\n }\r\n\r\n public async release() {\r\n const idPromise = this.idPromise;\r\n if(idPromise === undefined) {\r\n return;\r\n }\r\n\r\n this.id = undefined;\r\n this.idPromise = undefined;\r\n\r\n const id = await idPromise;\r\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\r\n }\r\n\r\n public destroy() {\r\n this.release();\r\n }\r\n\r\n // public encode(payload: Uint8Array) {\r\n // let res = this.encNew.encrypt(payload);\r\n // let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n // return bytes;\r\n // }\r\n\r\n // public async decode(payload: Uint8Array) {\r\n // const counter = this.decIvCounter.counter.slice();\r\n // this.decIvCounter.increment();\r\n\r\n // const n: ArrayBuffer = await subtle.encrypt({\r\n // name: 'AES-CTR',\r\n // counter: counter,\r\n // length: 64\r\n // },\r\n // this.cryptoDecKey,\r\n // payload\r\n // );\r\n\r\n // const decoded = this.decNew.update(payload);\r\n \r\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\r\n\r\n // return decoded;\r\n // }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { bytesFromHex, addPadding } from \"../../bin_utils\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass AbridgedPacketCodec implements Codec {\r\n public tag = 0xef;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n public encodePacket(data: Uint8Array) {\r\n const len = data.byteLength >> 2;\r\n let header: Uint8Array;\r\n if(len < 127) {\r\n header = new Uint8Array([len]);\r\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\r\n //header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\r\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\r\n //console.log('got nobody cause im braindead', header, len);\r\n }\r\n \r\n return header.concat(data);\r\n //return new Uint8Array([...header, ...data]);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n let length = data[0];\r\n if(length >= 127) { // 0x7f\r\n length = data[1] | (data[2] << 8) | (data[3] << 16);\r\n\r\n return data.slice(4, length << 2 + 1); // need +1\r\n }\r\n \r\n return data.slice(1, length << 2 + 1); // need +1\r\n }\r\n}\r\n\r\nexport default new AbridgedPacketCodec();\r\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\nimport bytesToHex from \"../../../helpers/bytes/bytesToHex\";\nimport networkStats from \"../networkStats\";\nimport ctx from \"../../../environment/ctx\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n //this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n \n const {body, bodySent} = pending;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n //delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { notifyAll } from \"../../../helpers/context\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\nimport { MTConnection } from \"./transport\";\n\nlet socketId = 0;\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\n type: 'socketProxy',\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\n};\n\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\n type: 'setup',\n payload: {\n dcId: number,\n url: string,\n logSuffix: string\n },\n id: number\n};\n\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\n type: 'send',\n payload: Uint8Array,\n id: number\n};\n\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\n type: 'close',\n id: number\n};\n\n \nexport default class SocketProxied extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private id: number;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n this.id = ++socketId;\n socketsProxied.set(this.id, this);\n\n const task: SocketProxyTask = {\n type: 'socketProxy',\n payload: {\n type: 'setup', \n payload: {\n dcId, \n url,\n logSuffix\n },\n id: this.id\n }\n };\n\n notifyAll(task);\n }\n\n public send(payload: Uint8Array) {\n const task: SocketProxyTask = {\n type: 'socketProxy', \n payload: {\n type: 'send',\n payload,\n id: this.id\n }\n };\n\n notifyAll(task);\n }\n\n public close() {\n const task: SocketProxyTask = {\n type: 'socketProxy',\n payload: {\n type: 'close',\n id: this.id\n }\n };\n\n notifyAll(task);\n }\n}\nexport const socketsProxied: Map = new Map();\n\n \n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport { IS_WEB_WORKER } from '../../helpers/context';\nimport { DcId } from '../../types';\nimport { getEnvironment } from '../../environment/utils';\n\n \nimport SocketProxied from './transports/socketProxied';\n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test\n ? [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ]\n : [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string, premium?: boolean) => {\n const path = connectionType !== 'client' ? 'apiws' + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n \n \n oooohLetMeLive = (getEnvironment().IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(let dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId, \n connectionType: ConnectionType = 'client', \n transportType: TransportType = Modes.transport, \n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n const suffix = connectionType === 'client' ? '' : '-1';\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix, premium);\n \n \n \n \n \n \n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n \n if(reuse) {\n transports.push(transport);\n }\n \n return transport;\n }\n \n return transports[0];\n }\n \n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../config/app\";\nimport deferredPromise from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport pause from \"../../../helpers/schedulers/pause\";\nimport { TransportType, DcConfigurator } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n private dcConfigurator: DcConfigurator;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n // setTimeout(() => {\n // this.waitForWebSocket();\n // }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n \n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, { CancellablePromise } from \"../../../../helpers/cancellablePromise\";\r\nimport type { StoragesResults } from \"./loadStorages\";\r\n\r\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\r\nexport default RESET_STORAGES_PROMISE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { CryptoMessagePort } from \"../crypto/cryptoMessagePort\";\nimport type { ApiFileManager } from \"../mtproto/apiFileManager\";\nimport type { ApiManager } from \"../mtproto/apiManager\";\nimport type { Authorizer } from \"../mtproto/authorizer\";\nimport type { DcConfigurator } from \"../mtproto/dcConfigurator\";\nimport type { NetworkerFactory } from \"../mtproto/networkerFactory\";\nimport type { PasswordManager } from \"../mtproto/passwordManager\";\nimport type { ReferenceDatabase } from \"../mtproto/referenceDatabase\";\nimport type { TimeManager } from \"../mtproto/timeManager\";\nimport type { RootScope } from \"../rootScope\";\nimport type DialogsStorage from \"../storages/dialogs\";\nimport type FiltersStorage from \"../storages/filters\";\nimport type PeersStorage from \"../storages/peers\";\nimport type ThumbsStorage from \"../storages/thumbs\";\nimport type { ApiUpdatesManager } from \"./apiUpdatesManager\";\nimport type { AppAvatarsManager } from \"./appAvatarsManager\";\nimport type { AppCallsManager } from \"./appCallsManager\";\nimport type { AppChatsManager } from \"./appChatsManager\";\nimport type { AppDocsManager } from \"./appDocsManager\";\nimport type { AppDraftsManager } from \"./appDraftsManager\";\nimport type { AppEmojiManager } from \"./appEmojiManager\";\nimport type { AppGroupCallsManager } from \"./appGroupCallsManager\";\nimport type { AppInlineBotsManager } from \"./appInlineBotsManager\";\nimport type { AppMessagesIdsManager } from \"./appMessagesIdsManager\";\nimport type { AppMessagesManager } from \"./appMessagesManager\";\nimport type { AppNotificationsManager } from \"./appNotificationsManager\";\nimport type { AppPeersManager } from \"./appPeersManager\";\nimport type { AppPhotosManager } from \"./appPhotosManager\";\nimport type { AppPollsManager } from \"./appPollsManager\";\nimport type { AppPrivacyManager } from \"./appPrivacyManager\";\nimport type { AppProfileManager } from \"./appProfileManager\";\nimport type { AppReactionsManager } from \"./appReactionsManager\";\nimport type { AppStateManager } from \"./appStateManager\";\nimport type { AppStickersManager } from \"./appStickersManager\";\nimport type { AppStoragesManager } from \"./appStoragesManager\";\nimport type { AppUsersManager } from \"./appUsersManager\";\nimport type { AppWebPagesManager } from \"./appWebPagesManager\";\nimport type { AppManagers } from \"./managers\";\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n\n public clear: (init?: boolean) => void;\n \n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n\n protected after(): Promise | void {\n\n }\n\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type{ Chat } from \"../../../../layer\";\r\nimport type{ Dialog } from \"../../appMessagesManager\";\r\nimport type{ User } from \"../../appUsersManager\";\r\nimport type { StoragesStorages } from \"./createStorages\";\r\nimport { recordPromiseBound } from \"../../../../helpers/recordPromise\";\r\nimport { Awaited } from \"../../../../types\";\r\nimport { logger } from \"../../../logger\";\r\nimport RESET_STORAGES_PROMISE from \"./resetStoragesPromise\";\r\n\r\nexport type StoragesResults = Awaited>;\r\n\r\nasync function loadStoragesInner(storages: StoragesStorages) {\r\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\r\n const storagesKeys = Object.keys(storages) as Array;\r\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\r\n const promise = storages[key].getAll();\r\n return recordPromise(promise, 'storage ' + (key as any as string));\r\n });\r\n \r\n const storagesResults: {\r\n users: User[],\r\n chats: Chat[],\r\n dialogs: Dialog[]\r\n } = {} as any;\r\n const arr = await Promise.all(storagesPromises);\r\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\r\n storagesResults[storagesKeys[i]] = arr[i] as any;\r\n }\r\n\r\n arr.splice(0, storagesKeys.length);\r\n\r\n const resetStorages = await RESET_STORAGES_PROMISE;\r\n if(resetStorages.size) {\r\n for(const key of resetStorages) {\r\n storagesResults[key].length = 0;\r\n }\r\n\r\n resetStorages.clear();\r\n }\r\n\r\n return storagesResults;\r\n}\r\n\r\nlet promise: ReturnType;\r\nexport default function loadStorages(storages: StoragesStorages) {\r\n return promise ??= loadStoragesInner(storages);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { logger } from \"../logger\";\nimport { AppManager } from \"./manager\";\nimport createStorages from \"./utils/storages/createStorages\";\nimport loadStorages from \"./utils/storages/loadStorages\";\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\n };\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat } from \"../../../../layer\";\r\nimport type { Dialog } from \"../../appMessagesManager\";\r\nimport type { User } from \"../../appUsersManager\";\r\nimport DATABASE_STATE from \"../../../../config/databases/state\";\r\nimport AppStorage from \"../../../storage\";\r\n\r\nexport type StoragesStorages = {\r\n users: AppStorage, typeof DATABASE_STATE>,\r\n chats: AppStorage, typeof DATABASE_STATE>,\r\n dialogs: AppStorage, typeof DATABASE_STATE>\r\n};\r\n\r\nexport default function createStorages() {\r\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\r\n const storages: StoragesStorages = {} as any;\r\n for(const name of names) {\r\n // @ts-ignore\r\n storages[name] = new AppStorage(DATABASE_STATE, name);\r\n }\r\n\r\n return storages;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport randomize from '../../helpers/array/randomize';\r\nimport { AppManager } from '../appManagers/manager';\r\n\r\nexport class PasswordManager extends AppManager {\r\n public getState(): Promise {\r\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then((state) => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return this.apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then((auth) => {\r\n if(auth._ === 'auth.authorization') {\r\n this.apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return this.apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../../layer\";\nimport { logger } from \"../logger\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport { AppManager } from \"../appManagers/manager\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n // constructor() {\n // super();\n\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n // const originalPayload = task.payload;\n\n // assumeType(task);\n // task.originalPayload = originalPayload;\n\n // this.refreshReference(originalPayload).then((bytes) => {\n // task.payload = bytes;\n // }, (err) => {\n // task.error = err;\n // }).then(() => apiManager.postMessage(task));\n // });\n // }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = this.appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n //if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n //}\n }\n \n return wasObject;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message, MessageAction, MessageMedia } from \"../../../../layer\";\nimport getPeerId from \"../peers/getPeerId\";\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id,\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\n}\n","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n //const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach((name) => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from \"../../appMessagesManager\";\nimport type getDialogIndexKey from \"./getDialogIndexKey\";\n\nexport default function setDialogIndex(\n dialog: Dialog, \n indexKey: ReturnType,\n index: number\n) {\n return dialog[indexKey] = index;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessageAction, MessageMedia, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport tsNow from \"../../helpers/tsNow\";\nimport SearchIndex from \"../searchIndex\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\nimport AppStorage from \"../storage\";\nimport type DATABASE_STATE from \"../../config/databases/state\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport getServerMessageId from \"../appManagers/utils/messageId/getServerMessageId\";\nimport getPeerId from \"../appManagers/utils/peers/getPeerId\";\nimport generateMessageId from \"../appManagers/utils/messageId/generateMessageId\";\nimport { AppManager } from \"../appManagers/manager\";\nimport getDialogIndexKey from \"../appManagers/utils/dialogs/getDialogIndexKey\";\nimport isObject from \"../../helpers/object/isObject\";\nimport getDialogIndex from \"../appManagers/utils/dialogs/getDialogIndex\";\nimport getPeerIdsFromMessage from \"../appManagers/utils/messages/getPeerIdsFromMessage\";\nimport { AppStoragesManager } from \"../appManagers/appStoragesManager\";\nimport defineNotNumerableProperties from \"../../helpers/object/defineNotNumerableProperties\";\nimport setDialogIndex from \"../appManagers/utils/dialogs/setDialogIndex\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: LOCAL_FOLDER_ID = undefined;\nexport type LOCAL_FOLDER_ID = 0 | 1;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processDialogForFilters(dialog);\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n\n if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(!dialog) {\n continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n };\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n let folder = this.folders[id];\n if(!folder) {\n folder = this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0};\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n }\n\n return folder;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter((dialog) => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Dialog;\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(filterId <= 1) return getDialogIndexKey(filterId as LOCAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.orderIndex);\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find((dialog) => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !this.appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n return {foundUnmuted, unreadCount: folder.unreadDialogsCount};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n /* if(filter.id <= 1) {\n index = getDialogIndex(dialog, getDialogIndexKey(filter.id));\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = getDialogIndex(dialog);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n public getDialogIndex(peerId: PeerId | Dialog, indexKey: ReturnType) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOnly(peerId);\n return getDialogIndex(dialog, indexKey);\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.timeManager.getServerTimeOffset();\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex((d) => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message)?.date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey(dialog.folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex((d) => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n const indexKey = getDialogIndexKey(folder_id);\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage)?.date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage)?.date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || dialog.draft?._ === 'draftMessage') {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' \n // || chat._ === 'chatForbidden' \n || (chat as Chat.chat).pFlags.left \n // || (chat as any).pFlags.kicked\n ) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // Because we saved message without dialog present\n if(message && message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog(dialog, message?.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId: number = 0, skipMigrated = false): {\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n } | Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId: LOCAL_FOLDER_ID = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId as LOCAL_FOLDER_ID;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages(limit, realFolderId).then((result) => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id as LOCAL_FOLDER_ID;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice((p) => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map((d) => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n handleOrder(update.order.map((peer) => getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { DialogFilter, Update } from \"../../layer\";\nimport { Modify } from \"../../types\";\nimport type { Dialog } from '../appManagers/appMessagesManager';\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport copy from \"../../helpers/object/copy\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport getPeerId from \"../appManagers/utils/peers/getPeerId\";\nimport { AppManager } from \"../appManagers/manager\";\nimport assumeType from \"../../helpers/assumeType\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\nconst START_ORDER_INDEX = 2;\n\n// const LOCAL_FILTER: MyDialogFilter = {\n// _: 'dialogFilter',\n// id: 0,\n// title: '',\n// exclude_peers: [],\n// include_peers: [],\n// pinned_peers: [],\n// excludePeerIds: [],\n// includePeerIds: [],\n// pinnedPeerIds: [],\n// pFlags: {}\n// };\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n this.filters = {};\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then((filters) => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find((filter) => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n\n return this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n\n // delete this.filters[0];\n // delete this.filters[1];\n // this.getLocalFilter(0);\n // this.getLocalFilter(1);\n });\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= {...copy(LOCAL_FILTER), id};\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\n };\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n if(filter.id <= 1) {\n return dialog.folder_id === filter.id;\n }\n\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n return filters.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n // if(filter._ === 'dialogFilterDefault') {\n // return;\n // // filter = this.getLocalFilter(0);\n // // delete filter.orderIndex;\n // }\n\n assumeType(filter);\n convertment.forEach(([from, to]) => {\n assumeType(filter);\n filter[to] = filter[from].map((peer) => getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n\n return filter;\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as MyDialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\r\n // const callbacks: Array<(...args: any[]) => any> = [];\r\n\r\n constructors.forEach((baseCtor) => {\r\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\r\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\r\n /* if(name === '_constructor') {\r\n callbacks.push(value.value);\r\n return;\r\n } else */if(name === 'constructor') {\r\n return;\r\n }\r\n\r\n Object.defineProperty(\r\n derivedCtor.prototype,\r\n name,\r\n value\r\n );\r\n });\r\n });\r\n\r\n // if(callbacks.length) {\r\n // function c(...args: any[]): any {\r\n // callbacks.forEach((cb, idx) => {\r\n // // @ts-ignore\r\n // cb.apply(this, args[idx] || []);\r\n // });\r\n // };\r\n\r\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\r\n // configurable: true,\r\n // enumerable: true,\r\n // value: c,\r\n // writable: true\r\n // });\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport { ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport { AppManager } from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getPeerId from './utils/peers/getPeerId';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n constructor() {\n this._constructor(false);\n }\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n this.appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = this.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n this.dispatchEvent(update._, update as any);\n }\n \n public attach(langCode?: string) {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n \n text = pre + text;\n \n const entities: MessageEntity[] = [];\n const message = parseMarkdown(text, entities);\n \n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n \n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n \n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport { ApiUpdatesManager };\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { AppManager } from \"./manager\";\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n \n protected after() {\n this.rootScope.addEventListener('avatar_update', (peerId) => {\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId), \n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return saved[size] = promise.then((blob) => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else {\n return saved[size];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { getEnvironment } from \"../../environment/utils\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall } from \"../../layer\";\nimport { AppManager } from \"./manager\";\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n \n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n \n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n \n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n \n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n \n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n","import { RestrictionReason } from \"../layer\";\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, SponsoredMessage, Update, Updates } from \"../../layer\";\nimport { isRestricted } from \"../../helpers/restrictions\";\nimport { AppManager } from \"./manager\";\nimport getPeerId from \"./utils/peers/getPeerId\";\nimport hasRights from \"./utils/chats/hasRights\";\nimport getParticipantPeerId from \"./utils/chats/getParticipantPeerId\";\nimport { AppStoragesManager } from \"./appStoragesManager\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n this.apiManager.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n };\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n this.rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n // || (chat as any).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\n\n return this.apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return this.apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return this.apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: this.appUsersManager.getSelf().id,\n peer: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return this.apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then((channelId) => {\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: Array) {\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public isRestricted(chatId: ChatId) {\n const chat: Chat.channel = this.getChat(chatId);\n const restrictionReasons = chat.restriction_reason;\n\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs', \n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n return this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300}).then((sponsoredMessages) => {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"../config/state\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport deepEqual from \"../helpers/object/deepEqual\";\nimport safeAssign from \"../helpers/object/safeAssign\";\nimport capitalizeFirstLetter from \"../helpers/string/capitalizeFirstLetter\";\nimport matchUrlProtocol from \"./richTextProcessor/matchUrlProtocol\";\nimport wrapUrl from \"./richTextProcessor/wrapUrl\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n const managers = rootScope.managers;\n\t\treturn Promise.all([\n\t\t\tmanagers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tmanagers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tmanagers.apiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach((l) => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach((country) => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n cachedDateTimeFormats.clear();\n updateAmPm();\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach((element) => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'];\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n let json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n cachedDateTimeFormats.set(json, dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, options));\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n let hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key \n * @param wasObject \n * @param newObject \n */\n export default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { AccountWallPapers, Document, MessagesSavedGifs, PhotoSize, WallPaper } from '../../layer';\nimport { ReferenceContext } from '../mtproto/referenceDatabase';\nimport { getFullDate } from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport { AppManager } from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport { getEnvironment } from '../../environment/utils';\nimport { isServiceWorkerOnline } from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport type { ThumbCache } from '../storages/thumbs';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n this.referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n return;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n \n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\n wallPapers.forEach((wallPaper) => {\n wallPaper.document = this.saveDoc(wallPaper.document);\n });\n\n return wallPapers;\n });\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: 'full',\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file,\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings',\n \n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n return this.apiFileManager.requestFilePart(dcId, getDocumentInput(doc), offset, limit);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { FileURLType, getFileURL } from \"../../../../helpers/fileName\";\r\nimport { Document, PhotoSize } from \"../../../../layer\";\r\nimport getDocumentDownloadOptions from \"./getDocumentDownloadOptions\";\r\n\r\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\r\n let type: FileURLType;\r\n if(download) {\r\n type = 'download';\r\n } else if(thumb) {\r\n type = 'thumb';\r\n } else if(doc.supportsStreaming) {\r\n type = 'stream';\r\n } else {\r\n type = 'document';\r\n }\r\n\r\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPeerId from \"./utils/peers/getPeerId\";\r\nimport generateMessageId from \"./utils/messageId/generateMessageId\";\r\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager extends AppManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerId = getPeerId(update.peer);\r\n this.saveDraft(peerId, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n\r\n /* return */stateStorage.get('drafts').then((drafts) => {\r\n this.drafts = drafts || {};\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n this.appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = this.apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n private draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = this.appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return this.apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport isObject from \"../../helpers/object/isObject\";\nimport validateInitObject from \"../../helpers/object/validateInitObject\";\nimport I18n from \"../langPack\";\nimport fixEmoji from \"../richTextProcessor/fixEmoji\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport { AppManager } from \"./manager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager extends AppManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then((popEmojis) => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n private indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = this.appStateManager.getState().then((state) => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = fixEmoji(emoji);\n this.getRecentEmojis().then((recent) => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n this.appStateManager.pushToState('recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport type GroupCallConnectionInstance from \"../calls/groupCallConnectionInstance\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport { logger } from \"../logger\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { AppManager } from \"./manager\";\nimport getPeerId from \"./utils/peers/getPeerId\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n \n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n \n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n this.apiUpdatesManager.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\n this.apiUpdatesManager.processUpdateMessage(updates);\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n this.appUsersManager.saveApiUsers(groupCall.users);\n this.appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n // public generateSelfParticipant(): GroupCallParticipant {\n // const mainSources = this.currentGroupCall.connections.main.sources;\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n // return {\n // _: 'groupCallParticipant',\n // pFlags: {\n // can_self_unmute: true,\n // self: true\n // },\n // source: mainSources.audio.source,\n // video: this.generateSelfVideo(mainSources.video),\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n // date: tsNow(true),\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { InputPhoto } from \"../../../../layer\";\nimport { MyPhoto } from \"../../appPhotosManager\";\n\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { InputMedia } from \"../../../../layer\";\nimport { MyPhoto } from \"../../appPhotosManager\";\nimport getPhotoInput from \"./getPhotoInput\";\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Document, InputMedia } from \"../../../../layer\";\r\n\r\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\r\n return {\r\n _: 'inputMediaDocument',\r\n id: {\r\n _: 'inputDocument',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference\r\n },\r\n ttl_seconds: 0\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport type { MyTopPeer } from \"./appUsersManager\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPhotoMediaInput from \"./utils/photos/getPhotoMediaInput\";\r\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\r\nimport generateQId from \"./utils/inlineBots/generateQId\";\r\nimport getDocumentMediaInput from \"./utils/docs/getDocumentMediaInput\";\r\n\r\nexport class AppInlineBotsManager extends AppManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\r\n bot: this.appUsersManager.getUserInput(botId),\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = this.appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = this.appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n this.appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n return this.appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = this.appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = getDocumentMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MESSAGE_ID_INCREMENT } from \"./utils/messageId\";\r\nimport generateMessageId from \"./utils/messageId/generateMessageId\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private tempNum = 0;\r\n\r\n public generateTempMessageId(messageId: number) {\r\n const num = ++this.tempNum;\r\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';//'\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n let overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n \n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { TabState } from \"../mtproto/mtprotoworker\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport MTProtoMessagePort from \"../mtproto/mtprotoMessagePort\";\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n \n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LazyLoadQueueBase from \"../../components/lazyLoadQueueBase\";\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { randomLong } from \"../../helpers/random\";\nimport { Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile } from \"../../layer\";\nimport { ArgumentTypes, InvokeApiOptions } from \"../../types\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { GLOBAL_FOLDER_ID, LOCAL_FOLDER_ID } from \"../storages/dialogs\";\nimport { ChatRights } from \"./appChatsManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { MyPhoto } from \"./appPhotosManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport DEBUG from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport copy from \"../../helpers/object/copy\";\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport splitStringByLength from \"../../helpers/string/splitStringByLength\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport { AppManager } from \"./manager\";\nimport type { MediaSize } from \"../../helpers/mediaSize\";\nimport getPhotoMediaInput from \"./utils/photos/getPhotoMediaInput\";\nimport getPhotoDownloadOptions from \"./utils/photos/getPhotoDownloadOptions\";\nimport fixEmoji from \"../richTextProcessor/fixEmoji\";\nimport mergeEntities from \"../richTextProcessor/mergeEntities\";\nimport parseEntities from \"../richTextProcessor/parseEntities\";\nimport parseMarkdown from \"../richTextProcessor/parseMarkdown\";\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\nimport generateMessageId from \"./utils/messageId/generateMessageId\";\nimport getPeerId from \"./utils/peers/getPeerId\";\nimport filterMessagesByInputFilter from \"./utils/messages/filterMessagesByInputFilter\";\nimport ctx from \"../../environment/ctx\";\nimport { getEnvironment } from \"../../environment/utils\";\nimport getDialogIndex from \"./utils/dialogs/getDialogIndex\";\nimport defineNotNumerableProperties from \"../../helpers/object/defineNotNumerableProperties\";\nimport getDocumentMediaInput from \"./utils/docs/getDocumentMediaInput\";\nimport getDocumentInputFileName from \"./utils/docs/getDocumentInputFileName\";\nimport getFileNameForUpload from \"../../helpers/getFileNameForUpload\";\nimport type { Progress } from \"./appDownloadManager\";\nimport noop from \"../../helpers/noop\";\nimport appTabsManager from \"./appTabsManager\";\nimport MTProtoMessagePort from \"../mtproto/mtprotoMessagePort\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n private pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n \n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear(init);\n this.filtersStorage && this.filtersStorage.clear(init);\n };\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public async sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true,\n sendAsPeerId: PeerId,\n }> = {}) {\n if(!text.trim()) {\n return;\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n //entities = mergeEntities(entities, parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n //this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n //this.log('sendText sent', message.mid);\n //if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n //assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n defineNotNumerableProperties(message, ['promise']);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(error);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n \n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n }\n \n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media;\n \n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n \n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n \n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach((message) => toggleError(message, true));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then((messageMedia) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n return Promise.all(promises).then((inputs) => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true,\n sequential: boolean\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n this.rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, peerId, mid: messageId});\n }, 0);\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage,\n sequential: options.sequential\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0/* 3000 */);\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n sendAsPeerId: PeerId, \n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true\n };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n \n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && this.appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = getPeerId(dialog.peer);\n const mid = generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach((dialog) => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: LOCAL_FOLDER_ID, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return this.apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId: LOCAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), (dialog) => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map((key) => key.toPeerId());\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId, \n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach((message) => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach((message) => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n sequential: true\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n \n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n \n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n \n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage(peerId, 'history'));\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n \n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n // fullfillLeft();\n // resolve();\n }, (err) => {\n // fullfillLeft();\n // resolve();\n // reject(err);\n }).finally(() => {\n fullfillLeft();\n resolve();\n \n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return this.apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(this.appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(this.appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach((s) => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then((result) => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public getPinnedMessagesCount(peerId: PeerId) {\n return this.pinnedMessages[peerId]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId) {\n return this.pinnedMessages[peerId]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n //this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n assumeType(m);\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return storage.get(minMid) as Message.message;\n }\n\n public getMidsByAlbum(grouped_id: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], sort);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(!message || message._ === 'messageEmpty') {\n return;\n }\n\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = this.createMessageStorage(peerId, 'grouped'));\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n \n //storage.generateIndex(message);\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from as MessageFwdHeader;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : getPeerId(message.from_id);\n }\n\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = getPeerId(peer);\n const savedFromMid = generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n if(isMessage && message.media) {\n let unsupported = false;\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n message.media.photo = this.appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = this.appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = message.media.document;\n message.media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!message.media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = this.appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n unsupported = true;\n message.media = {_: 'messageMediaUnsupported'};\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n\n if(unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n this.appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed'\n ? 'missed'\n : 'cancelled'\n )\n );\n break;\n }\n \n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n\n return message;\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = this.appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n //this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const appConfig = await this.apiManager.getAppConfig();\n const max = filterId === 1 ? \n (this.rootScope.premium ? appConfig.dialogs_folder_pinned_limit_premium : appConfig.dialogs_folder_pinned_limit_default) : \n (this.rootScope.premium ? appConfig.dialogs_pinned_limit_premium : appConfig.dialogs_pinned_limit_default);\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: this.appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.message)?.pFlags?.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(!message || \n message._ !== 'message' || \n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peer_id._ !== 'peerChannel' && \n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) && \n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.pFlags.out \n || this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if(!message) {\n return false;\n }\n\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : this.appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise {\n if(this.appPeersManager.isRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(this.appPeersManager.isRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n this.appUsersManager.saveApiUsers(searchResult.users);\n this.appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n (this.newMessagesToHandle[peerId] ??= new Set()).add(mid);\n // if(!this.newMessagesHandleTimeout) {\n // this.newMessagesHandleTimeout = ctx.setTimeout(this.handleNewMessages, 0);\n // }\n this.handleNewMessages();\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n this.rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!this.appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n this.rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n \n return Promise.all(promises).then(noop);\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId)) {\n if(!force && !threadId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return this.apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId)\n }).then((messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId) {\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted(peerId, true),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(message) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getHistoryMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n // }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = ctx.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message?._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions || \n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n \n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n this.rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage, storage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n this.appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n this.rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(message) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = generateMessageId(update.available_min_id);\n const messages = history.filter((mid) => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n \n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getHistoryMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map((threadKey) => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach((historyStorage) => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n \n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map((id) => generateMessageId(id)); \n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid) as Message.message;\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice((_mid) => _mid === mid);\n const message = storage.get(mid) as Message.message;\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(!storage) {\n return;\n }\n\n const mid = generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(oldMessage) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage?.reply_to && threadMessage.peerId?.isAnyChat()) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n this.rootScope.dispatchEvent('history_update', {storageKey: pendingData.storage.key, peerId: message.peerId, mid: message.mid, message, sequential: pendingData.sequential});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, muteUntil: number) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n return this.appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: this.appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isRestricted(peerId)) {\n return false;\n }\n \n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(tempMessage) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type && \n oldDoc.type !== 'sticker' && \n oldDoc.mime_type !== 'image/gif' && \n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message, \n limit?: number, \n reaction?: string, \n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n \n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: string}[] = messageReactionsList.reactions.map((reaction) => ({peerId: getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\n \n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' || \n message.pFlags.is_outgoing || \n !message.pFlags.out || \n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat: Chat.chat | Chat.channel = this.appChatsManager.getChat(message.peerId.toChatId());\n const appConfig = await this.apiManager.getAppConfig(); \n return chat.participants_count <= appConfig.chat_read_mark_size_threshold && \n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage(peerId, 'scheduled'));\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n \n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n const wasMaxId = historyStorage.maxId;\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(this.appPeersManager.isChannel(peerId)) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = this.appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false) {\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\n if(\n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === this.appPeersManager.peerId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(!message) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E, \n callback: C, \n key: string, \n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => _reactionCount.reaction === reactionCount.reaction);\n return (\n message.pFlags.out && (\n !previousReactionCount || \n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.pFlags.chosen && (\n !previousReactionCount || \n !previousReactionCount.pFlags.chosen\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getFileNameByLocation } from \"../../../../helpers/fileName\";\r\nimport { Document } from \"../../../../layer\";\r\nimport getDocumentInput from \"./getDocumentInput\";\r\n\r\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\r\n return getFileNameByLocation(getDocumentInput(doc, thumbSize), {fileName: doc.file_name});\r\n}\r\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport { MUTE_UNTIL } from \"../mtproto/mtproto_config\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPeerId from \"./utils/peers/getPeerId\";\r\nimport ctx from \"../../environment/ctx\";\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager extends AppManager {\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n \r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n private notifyContactsSignUp: Promise;\r\n\r\n protected after() {\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n this.rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then((settings) => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return this.apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then((value) => {\r\n if(value) {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // public getNotifyExceptions() {\r\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n // .then((updates) => {\r\n // apiUpdatesManager.processUpdateMessage(updates);\r\n // });\r\n // }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then((value) => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n this.apiUpdatesManager.saveUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: this.appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n this.appStateManager.getState().then((state) => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n this.appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n private getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n private getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = this.appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === this.appPeersManager.peerId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { getRestrictionReason } from \"../../helpers/restrictions\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPeerId from \"./utils/peers/getPeerId\";\r\nimport isUser from \"./utils/peers/isUser\";\r\nimport isAnyChat from \"./utils/peers/isAnyChat\";\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager extends AppManager {\r\n public get peerId() {\r\n return this.appUsersManager.userId.toPeerId();\r\n }\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() \r\n ? this.appUsersManager.getUserPhoto(peerId.toUserId())\r\n : this.appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(this.appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return this.appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return this.appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? this.appUsersManager.getUser(peerId.toUserId())\r\n : this.appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return isUser(peerId);\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return isAnyChat(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? this.appUsersManager.isRestricted(peerId.toUserId()) : this.appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return this.appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return this.appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = this.appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === this.peerId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = this.appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceArrayInObject from \"../../helpers/object/safeReplaceArrayInObject\";\nimport { AppManager } from \"./manager\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport copy from \"../../helpers/object/copy\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport parseMarkdown from \"../richTextProcessor/parseMarkdown\";\r\nimport { AppManager } from \"./manager\";\r\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\r\n\r\nexport class AppPollsManager extends AppManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map((index) => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid),\r\n options\r\n }).then((updates) => {\r\n this.log('sendVote updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return this.apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid)\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return this.apiManager.invokeApi('messages.getPollVotes', {\r\n peer: this.appPeersManager.getInputPeerById(message.peerId),\r\n id: getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n this.appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return this.appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey } from \"../../layer\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\nimport { AppManager } from \"./manager\";\r\n\r\nexport class AppPrivacyManager extends AppManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n this.rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return this.apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map((inputRule) => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { MyTopPeer } from \"./appUsersManager\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates } from \"../../layer\";\nimport SearchIndex from \"../searchIndex\";\nimport { AppManager } from \"./manager\";\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\nimport getPeerId from \"./utils/peers/getPeerId\";\nimport getPhotoInput from \"./utils/photos/getPhotoInput\";\nimport getParticipantPeerId from \"./utils/chats/getParticipantPeerId\";\nimport ctx from \"../../environment/ctx\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager extends AppManager {\n //private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto && \n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n //appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = this.appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return fullChat as ChatFull;\n }\n }\n \n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: chatFull.notify_settings\n });\n \n this.chatsFull[id] = chatFull;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n // chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex((p) => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n if(this.chatsFull[id] !== undefined && !override) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: this.appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel: Chat.channel | Chat.channelForbidden = this.appChatsManager.getChat(id);\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [{\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach((peer) => {\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then((results) => {\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n private invalidateChannelParticipants(id: ChatId) {\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n \n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n \n return this.getProfile(this.appPeersManager.peerId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(), \n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: this.appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(this.appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find((t) => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice((t) => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = getPeerId(update.peer_id);\n if(this.appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Awaited } from '../types';\n\nexport default function callbackifyAll(\n values: T, \n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): PromiseLike | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\nimport assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport callbackifyAll from \"../../helpers/callbackifyAll\";\nimport copy from \"../../helpers/object/copy\";\nimport { AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Update, Updates } from \"../../layer\";\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { AppManager } from \"./manager\";\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\nimport getPeerId from \"./utils/peers/getPeerId\";\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n \n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? [];\n\n const filteredChatAvailableReactions = chatAvailableReactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }).filter(Boolean);\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction.availableReaction[], quickReaction: AvailableReaction.availableReaction) {\n const availableReaction = findAndSplice(availableReactions, availableReaction => availableReaction.reaction === quickReaction.reaction);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction.availableReaction[] | PromiseLike, \n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getAppConfig(),\n this.getAvailableReactions()\n ], ([appConfig, availableReactions]) => {\n return availableReactions.find((reaction) => reaction.reaction === appConfig.reactions_default);\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: string, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: string) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getAppConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public sendReaction(message: Message.message, reaction?: string, onlyLocal?: boolean) {\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n let chosenReactionIdx = reactions ? reactions.results.findIndex((reactionCount) => reactionCount.pFlags.chosen) : -1;\n let chosenReaction = chosenReactionIdx !== -1 && reactions.results[chosenReactionIdx];\n if(chosenReaction) { // clear current reaction\n --chosenReaction.count;\n delete chosenReaction.pFlags.chosen;\n\n if(reaction === chosenReaction.reaction) {\n reaction = undefined;\n }\n\n if(!chosenReaction.count) {\n reactions.results.splice(chosenReactionIdx, 1);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n }\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(!this.appPeersManager.isBroadcast(message.peerId)) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionCount.reaction === reaction);\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction,\n pFlags: {}\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.pFlags.chosen = true;\n\n if(!reactions.recent_reactions && reactions.pFlags.can_see_list) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const userReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId)) {\n reactions.recent_reactions.push(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n return (b.count - a.count) || (indexes.get(a.reaction) - indexes.get(b.reaction));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction\n }).then((updates) => {\n assumeType(updates);\n \n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReaction?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n \n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from './appDocsManager';\nimport { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport { AppManager } from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport { getEnvironment } from '../../environment/utils';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager extends AppManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n \n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n }\n });\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\n return;\n }\n }\n\n try {\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n \n const doc = this.appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg',\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const id = isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet || !stickerSet.documents) return;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n \n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a.doc,\n sound: a.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n \n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.apiFileManager.downloadMedia({media: doc}),\n sound ? this.apiFileManager.downloadMedia({media: sound}) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find((thumb) => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets', \n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find((c) => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers', \n processResult: (allStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n }\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then((allStickers) => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers', \n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if(sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, _doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport filterUnique from \"../../helpers/array/filterUnique\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport tsNow from \"../../helpers/tsNow\";\nimport isObject from \"../../helpers/object/isObject\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport { isRestricted } from \"../../helpers/restrictions\";\nimport { Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus } from \"../../layer\";\nimport parseEntities from \"../richTextProcessor/parseEntities\";\nimport wrapUrl from \"../richTextProcessor/wrapUrl\";\nimport SearchIndex from \"../searchIndex\";\nimport { AppManager } from \"./manager\";\nimport getPeerId from \"./utils/peers/getPeerId\";\nimport canSendToUser from \"./utils/users/canSendToUser\";\nimport { AppStoragesManager } from \"./appStoragesManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n this.rootScope.dispatchEvent('user_update', userId);\n this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser({\n ...user, \n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n \n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(Array.isArray(contactsList)) {\n // contactsList.forEach((userId) => {\n // this.pushContact(userId);\n // });\n\n // if(contactsList.length) {\n // this.contactsFillPromise = deferredPromise();\n // this.contactsFillPromise.resolve(this.contactsList);\n // }\n // }\n\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n };\n\n public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n\n this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified(true);\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const userId = this.usernames[username];\n if(userId) {\n return this.users[userId];\n }\n\n return this.apiManager.invokeApi('contacts.resolveUsername', {username}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer);\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then((_contactsList) => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n return userIds.map((userId) => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n this.rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {_: 'userEmpty', id, pFlags: {deleted: true}, access_hash: ''} as any as User;\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n private updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n this.rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then((userIds) => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return this.apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return this.apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number, \n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return this.apiManager.invokeApi('contacts.getLocated', {\n geo_point, \n background\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then((results) => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public isRestricted(userId: UserId) {\n const user: MTUser.user = this.getUser(userId);\n const restrictionReasons = user.restriction_reason;\n\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport { WebPage } from \"../../layer\";\r\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\r\nimport { AppManager } from \"./manager\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager extends AppManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n // delete apiWebPage.description\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n this.rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getCachedWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n\r\n public getWebPage(url: string) {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n },\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ReferenceBytes } from \"./referenceDatabase\";\r\nimport Modes from \"../../config/modes\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport fileManager from \"../fileManager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\nimport readBlobAsArrayBuffer from \"../../helpers/blob/readBlobAsArrayBuffer\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\r\nimport fixFirefoxSvg from \"../../helpers/fixFirefoxSvg\";\r\nimport { AppManager } from \"../appManagers/manager\";\r\nimport { getEnvironment } from \"../../environment/utils\";\r\nimport MTProtoMessagePort from \"./mtprotoMessagePort\";\r\nimport getFileNameForUpload from \"../../helpers/getFileNameForUpload\";\r\nimport type { Progress } from \"../appManagers/appDownloadManager\";\r\nimport getDownloadMediaDetails from \"../appManagers/utils/download/getDownloadMediaDetails\";\r\nimport networkStats from \"./networkStats\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n // getFileMethod: Parameters[1]\r\n};\r\n\r\nexport type DownloadMediaOptions = {\r\n media: Photo | Document.document,\r\n thumb?: PhotoSize,\r\n queueId?: number,\r\n onlyCache?: boolean\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// };\r\n\r\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// originalPayload: ReferenceBytes\r\n// };\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\n\r\nconst REGULAR_DOWNLOAD_DELTA = 36;\r\nconst PREMIUM_DOWNLOAD_DELTA = 72;\r\n\r\nexport class ApiFileManager extends AppManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private downloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n protected after() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : (this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = findAndSplice(downloadPull, d => d.queueId === 0) || findAndSplice(downloadPull, d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n\r\n const promise = data.cb();\r\n const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * 1024 * 128);\r\n Promise.race([\r\n promise,\r\n networkPromise\r\n ]).then(() => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n networkPromise.resolve();\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n \r\n networkPromise.reject(error);\r\n }).finally(() => {\r\n promise.then(data.deferred.resolve, data.deferred.reject);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return this.apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = this.apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes = 128 * 1024;\r\n\r\n while((size / bytes) > 2000) {\r\n bytes *= 2;\r\n }\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n const buffer = bytes.slice().buffer;\r\n if(getEnvironment().IS_FIREFOX) {\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\r\n return fixFirefoxSvg(text as string);\r\n }).then((text) => {\r\n const textEncoder = new TextEncoder();\r\n return textEncoder.encode(text);\r\n });\r\n }\r\n\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertWebp', {fileName, bytes});\r\n };\r\n\r\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertOpus', {fileName, bytes});\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n this.referenceDatabase.refreshReference(reference).then(deferred.resolve, deferred.reject);\r\n // const task = {type: 'refreshReference', payload: reference};\r\n // notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then((reference) => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public isDownloading(fileName: string) {\r\n return !!this.downloadPromises[fileName];\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloadPromises[fileName];\r\n }\r\n\r\n public getUpload(fileName: string) {\r\n return this.uploadPromises[fileName];\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadPromise {\r\n if(!fileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n options.mimeType = 'image/svg+xml';\r\n } else if(options.mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n } else if(options.mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\r\n process = this.convertOpus;\r\n options.mimeType = 'audio/wav';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.downloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob) => {\r\n if(blob instanceof Blob && blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.delete(fileName).then(() => {\r\n return this.download(options);\r\n }).catch(() => {\r\n return this.download(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred: DownloadPromise = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.downloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n if(!options.onlyCache) {\r\n await this.delete(fileName);\r\n }\r\n\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch((err) => {\r\n if(options.onlyCache) {\r\n errorHandler(err);\r\n return;\r\n }\r\n\r\n //this.log('not cached', fileName);\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, size || limit, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = (offset + limit) >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n const progress: Progress = {done, offset, total: size, fileName};\r\n deferred.notify(progress);\r\n //}\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await fileWriter.write(bytes, offset);\r\n }\r\n\r\n if(isFinal && process) {\r\n const bytes = fileWriter.getParts();\r\n const processedResult = await processDownloaded(bytes);\r\n checkCancel();\r\n\r\n fileWriter.replaceParts(processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n const realSize = size || bytes.byteLength;\r\n if(!size) {\r\n fileWriter.trim(realSize);\r\n }\r\n\r\n deferred.resolve(fileWriter.finalize(realSize < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: Progress) => {\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n };\r\n\r\n this.downloadPromises[fileName] = deferred;\r\n\r\n deferred.catch(noop).finally(() => {\r\n delete this.downloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\r\n let {media, thumb} = options;\r\n const isPhoto = media._ === 'photo';\r\n if(media._ === 'photoEmpty' || (isPhoto && !thumb)) {\r\n return Promise.reject('preloadPhoto photoEmpty!');\r\n }\r\n\r\n // get original instance with correct file_reference instead of using copies\r\n const isDocument = media._ === 'document';\r\n if(isDocument) media = this.appDocsManager.getDoc(media.id);\r\n else if(isPhoto) media = this.appPhotosManager.getPhoto(media.id);\r\n\r\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\r\n\r\n let promise = this.getDownload(fileName);\r\n if(!promise) {\r\n promise = this.download(downloadOptions);\r\n \r\n if(isDocument) {\r\n this.rootScope.dispatchEvent('document_downloading', media.id);\r\n promise.catch(noop).finally(() => {\r\n this.rootScope.dispatchEvent('document_downloaded', media.id);\r\n });\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\r\n const {media, thumb} = options;\r\n\r\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\r\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\r\n return Promise.resolve(cacheContext.url);\r\n }\r\n\r\n return this.downloadMedia(options).then((blob) => {\r\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\r\n const url = URL.createObjectURL(blob);\r\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\r\n }\r\n\r\n return cacheContext.url;\r\n });\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions) {\r\n return this.downloadMedia(options).then(noop);\r\n }\r\n\r\n private delete(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.downloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n fileName ||= getFileNameForUpload(file);\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferred = deferredPromise();\r\n if(totalParts > 4000) {\r\n deferred.reject({type: 'FILE_TOO_BIG'});\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then((buffer) => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return self.apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then(() => {\r\n if(canceled) {\r\n return;\r\n }\r\n\r\n ++doneParts;\r\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\r\n deferred.notify(progress);\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: Progress) => {\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.uploadPromises[fileName];\r\n });\r\n\r\n return this.uploadPromises[fileName] = deferred;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from \"../../environment/ctx\";\nimport { ignoreRestrictionReasons } from \"../../helpers/restrictions\";\nimport { MethodDeclMap, User } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport { AppManager } from \"../appManagers/manager\";\nimport { ApiError } from \"./apiManager\";\nimport { MTAppConfig } from \"./appConfig\";\nimport { UserAuth } from \"./mtproto_config\";\nimport { MTMessage } from \"./networker\";\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private appConfig: MTAppConfig;\n private getAppConfigPromise: Promise;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T, \n processResult?: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: Omit, \n options?: InvokeApiOptions & {cacheKey?: string}\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise> {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = ctx.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n // this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n public getConfig() {\n return this.invokeApiCacheable('help.getConfig');\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) return this.appConfig;\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n const promise: Promise = this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then((config: MTAppConfig) => {\n if(this.getAppConfigPromise !== promise) {\n return this.getAppConfigPromise;\n }\n \n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n return config;\n });\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \n \n \n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type { UserAuth } from './mtproto_config';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, { MTMessage } from './networker';\n//import { telegramMeWebService } from './mtproto';\nimport { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\nimport { logger } from '../logger';\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\nimport type { MethodDeclMap } from '../../layer';\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\n//import { clamp } from '../../helpers/number';\nimport App from '../../config/app';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport IDBStorage, { IDB } from '../idb';\nimport CryptoWorker from \"../crypto/cryptoMessagePort\";\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport { getEnvironment } from '../../environment/utils';\nimport AppStorage from '../storage';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\nnetworker.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: [\"6888292542796810828\"]\n}, {\n notContentRelated: true\n}).then((res) => {\n console.log('status', res);\n}); */\n\n//console.error('apiManager included!');\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\n\nexport type ApiError = Partial<{\n code: number,\n type: string,\n description: string,\n originalError: any,\n stack: string,\n handled: boolean,\n input: string,\n message: ApiError\n}>;\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n \n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n \n //public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n }\n\n //private lol = false;\n \n // constructor() {\n //MtpSingleInstanceService.start();\n \n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n \n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n \n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n \n //this.telegramMeNotify(true);\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n \n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n \n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n \n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n \n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n //this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n //return;\n \n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n \n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n //const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n \n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = networkers.length - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n \n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n \n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n \n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n \n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n \n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n \n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n \n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n \n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n \n const checkPromise: Promise = networker.isFileNetworker ? \n Promise.resolve(true) : \n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n \n if(canRelease) {\n networker.onDrain = () => {\n this.log('networker drain', networker.dcId);\n\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n };\n\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n \n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n ///////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n //this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n \n if(error.code === 406) {\n error.handled = true;\n }\n \n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n \n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n \n let dcId: DcId;\n \n let cachedNetworker: MTPNetworker;\n let stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n //if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n \n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n //this.telegramMeNotify(false);\n }\n \n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n \n this.cachedExportPromise[dcId] = promise;\n }\n \n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n \n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n \n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\n throw error;\n }\n \n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n \n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN') {\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n \n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport applyMixins from \"../../helpers/applyMixins\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { AppManager } from \"../appManagers/manager\";\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appUsersManager.userId.toPeerId(), 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n \n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from \"../appManagers/appDocsManager\";\nimport type { MyPhoto } from \"../appManagers/appPhotosManager\";\n\nexport type ThumbCache = {\n downloaded: number, \n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = 'full';\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const key = media._ + media.id;\n const cache = this.thumbsCache[key] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: MyPhoto | MyDocument, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: MyPhoto | MyDocument, thumbSize: string = thumbFullSize) {\n const key = media._ + media.id;\n const cache = this.thumbsCache[key];\n if(cache) {\n delete cache[thumbSize];\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"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\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"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\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1460809483,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-551616469,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1938625919,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"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\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"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\"}],\"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\"}],\"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\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-468280483,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"},{\"name\":\"menu_button\",\"type\":\"BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-362240487,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":1370914559,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-381896846,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"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\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"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\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"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\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"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\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"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\"}],\"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\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-396644838,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-2099097129,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":451818415,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":262163967,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"WebViewResult\"},{\"id\":-768945848,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"Bool\"},{\"id\":1790652275,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"}]},\"layer\":140} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from \"big-integer\";\nimport intToUint from \"../number/intToUint\";\n\nexport default function longFromInts(high: number, low: number): string {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low)).toString(10);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport longFromInts from '../../helpers/long/longFromInts';\n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n const {quotient, remainder} = bigInt(sLong).divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find((m) => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find((c) => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find((c) => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","import randomize from \"../array/randomize\";\nimport bufferConcats from \"./bufferConcats\";\n\nexport default function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","import bigInt from 'big-integer';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLDeserialization, TLSerialization } from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport { NetworkerFactory } from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport { getEnvironment } from '../../environment/utils';\nimport { TimeManager } from './timeManager';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingDelayDisconnectId: string;\n \n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n \n private sendPing = () => {\n // return;\n \n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n \n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n \n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n \n this.debug && this.log.debug(`sendPingDelayDisconnect: ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && this.log.debug(`sendPingDelayDisconnect: pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n \n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n this.log.error('sendPingDelayDisconnect: catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n \n this.sentMessages[message.msg_id] = Object.assign(\n message, \n options, \n promise ? {deferred: promise} : undefined\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n \n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n \n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n // if(this.debug) {\n // this.log.debug('Rpc response', message.result, sentMessage);\n // }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n this.pingDelayDisconnectDeferred.resolve('pong');\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from \"big-integer\";\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport { bigIntToBytes } from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n \n return bytes;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport { AppManager } from \"../appManagers/manager\";\r\n\r\nexport class NetworkerFactory extends AppManager {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n\r\n public onConnectionStatusChange(status: ConnectionStatusChange) {\r\n this.rootScope.dispatchEvent('connection_status_change', status);\r\n // ({type: 'connectionStatusChange', payload: status});\r\n }\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport cryptoWorker from '../crypto/cryptoMessagePort';\r\nimport Modes from \"../../config/modes\";\r\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from \"./transports/controller\";\n \n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\n\nimport CryptoWorker from \"../crypto/cryptoMessagePort\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport DEBUG from \"../../config/debug\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\nimport addPadding from \"../../helpers/bytes/addPadding\";\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\nimport { bigIntFromBytes } from \"../../helpers/bigInt/bigIntConversion\";\nimport bigInt from \"big-integer\";\nimport randomize from \"../../helpers/array/randomize\";\nimport { AppManager } from \"../appManagers/manager\";\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n \n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = randomize(new Uint8Array(256));\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: randomize(new Uint8Array(16))\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport longFromInts from '../../helpers/long/longFromInts';\nimport { AppManager } from '../appManagers/manager';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n \n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport callbackify from \"../../helpers/callbackify\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport cryptoMessagePort from \"../crypto/cryptoMessagePort\";\r\nimport MTProtoMessagePort from \"../mtproto/mtprotoMessagePort\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport { AppStoragesManager } from \"./appStoragesManager\";\r\nimport createManagers from \"./createManagers\";\r\n\r\ntype Managers = Awaited>;\r\n\r\nexport class AppManagersManager {\r\n private managers: Managers | Promise;\r\n private cryptoPortAttached: boolean;\r\n private cryptoPortPromise: CancellablePromise;\r\n\r\n constructor() {\r\n this.cryptoPortPromise = deferredPromise();\r\n this.cryptoPortPromise.then(() => {\r\n this.cryptoPortPromise = undefined;\r\n });\r\n }\r\n\r\n public start() {\r\n const port = MTProtoMessagePort.getInstance();\r\n\r\n port.addEventListener('manager', ({name, method, args}) => {\r\n return callbackify(this.getManagers(), (managers) => {\r\n // @ts-ignore\r\n const manager = managers[name];\r\n return manager[method].apply(manager, args);\r\n });\r\n });\r\n\r\n port.addEventListener('cryptoPort', (payload, source, event) => {\r\n if(this.cryptoPortAttached) {\r\n return;\r\n }\r\n \r\n this.cryptoPortAttached = true;\r\n const port = event.ports[0];\r\n cryptoMessagePort.attachPort(port);\r\n this.cryptoPortPromise.resolve();\r\n });\r\n }\r\n\r\n public async createManagers() {\r\n const appStoragesManager = new AppStoragesManager();\r\n \r\n await Promise.all([\r\n // new Promise(() => {}),\r\n appStoragesManager.loadStorages(),\r\n this.cryptoPortPromise\r\n ]);\r\n\r\n const managers = await createManagers(appStoragesManager);\r\n\r\n // костыль\r\n if(appStateManager.userId) {\r\n managers.apiManager.setUserAuth(appStateManager.userId);\r\n }\r\n \r\n return this.managers = managers;\r\n }\r\n\r\n public getManagers() {\r\n return this.managers ??= this.createManagers();\r\n }\r\n}\r\n\r\nconst appManagersManager = new AppManagersManager();\r\nexport default appManagersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PasswordManager } from \"../mtproto/passwordManager\";\nimport { ReferenceDatabase } from \"../mtproto/referenceDatabase\";\nimport DialogsStorage from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\nimport { ApiUpdatesManager } from \"./apiUpdatesManager\";\nimport { AppAvatarsManager } from \"./appAvatarsManager\";\nimport { AppCallsManager } from \"./appCallsManager\";\nimport { AppChatsManager } from \"./appChatsManager\";\nimport { AppDocsManager } from \"./appDocsManager\";\nimport { AppDraftsManager } from \"./appDraftsManager\";\nimport { AppEmojiManager } from \"./appEmojiManager\";\nimport { AppGroupCallsManager } from \"./appGroupCallsManager\";\nimport { AppInlineBotsManager } from \"./appInlineBotsManager\";\nimport { AppMessagesIdsManager } from \"./appMessagesIdsManager\";\nimport { AppMessagesManager } from \"./appMessagesManager\";\nimport { AppNotificationsManager } from \"./appNotificationsManager\";\nimport { AppPeersManager } from \"./appPeersManager\";\nimport { AppPhotosManager } from \"./appPhotosManager\";\nimport { AppPollsManager } from \"./appPollsManager\";\nimport { AppPrivacyManager } from \"./appPrivacyManager\";\nimport { AppProfileManager } from \"./appProfileManager\";\nimport { AppReactionsManager } from \"./appReactionsManager\";\nimport { AppStickersManager } from \"./appStickersManager\";\nimport { AppUsersManager } from \"./appUsersManager\";\nimport { AppWebPagesManager } from \"./appWebPagesManager\";\nimport { ApiFileManager } from \"../mtproto/apiFileManager\";\nimport { ApiManager } from \"../mtproto/apiManager\";\nimport ctx from \"../../environment/ctx\";\nimport PeersStorage from \"../storages/peers\";\nimport ThumbsStorage from \"../storages/thumbs\";\nimport { NetworkerFactory } from \"../mtproto/networkerFactory\";\nimport { RootScope } from \"../rootScope\";\nimport { Authorizer } from \"../mtproto/authorizer\";\nimport { DcConfigurator } from \"../mtproto/dcConfigurator\";\nimport { TimeManager } from \"../mtproto/timeManager\";\nimport { AppStoragesManager } from \"./appStoragesManager\";\nimport cryptoMessagePort from \"../crypto/cryptoMessagePort\";\nimport appStateManager from \"./appStateManager\";\n\nexport default function createManagers(appStoragesManager: AppStoragesManager) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n \n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array | void>[] = [];\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if((manager as any)?.after) {\n const result = (manager as any).after();\n promises.push(result);\n delete (manager as any).after;\n }\n }\n\n return Promise.all(promises).then(() => managers);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from \"../crypto/cryptoMessagePort\";\nimport { setEnvironment } from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport { logger } from '../logger';\nimport { State } from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nconst log = logger('MTPROTO');\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n \n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n \n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n },\n\n // socketProxy: (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n \n // const socketProxied = socketsProxied.get(id);\n // if(socketTask.type === 'message') {\n // socketProxied.dispatchEvent('message', socketTask.payload);\n // } else if(socketTask.type === 'open') {\n // socketProxied.dispatchEvent('open');\n // } else if(socketTask.type === 'close') {\n // socketProxied.dispatchEvent('close');\n // socketsProxied.delete(id);\n // }\n // },\n});\n\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from \"../environment/ctx\";\r\nimport SuperMessagePort from \"../lib/mtproto/superMessagePort\";\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort, \r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (s: any) => {\r\n messagePort.attachPort(s);\r\n onConnect && onConnect(s);\r\n };\r\n\r\n onDisconnect && messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source));\r\n } else {\r\n attachPort(ctx);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PASS_CONFLICTING_ENTITIES } from \".\";\nimport { MessageEntity } from \"../../layer\";\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find((currentEntity) => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport { MessageEntity } from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\nimport findConflictingEntity from \"./findConflictingEntity\";\nimport sortEntities from \"./sortEntities\";\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","import { MessageEntity } from \"../../layer\";\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,216,960,434,339], () => (__webpack_require__(3821)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 960) return \"960.7ae964ab6031f51a0275.bundle.js\";\n\tif (chunkId === 434) return \"434.e06fcbee4a8ac273c78c.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"15a67f69d99bd6da42da\",\"104\":\"19c787168bced8f0f781\",\"211\":\"a7ea0f3283af2967a6ae\",\"216\":\"4397eec2983565f6f071\",\"301\":\"eb31c208f76e9dc623ec\",\"339\":\"702eead422c6af883b39\",\"642\":\"f2d4e67ea15d5329cd0b\",\"699\":\"f16d6f756c34f3914132\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","forEach","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","clear","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","toPeerId","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","dispatchEventSingle","state","stateStorage","getState","setByKey","key","object","splitted","split","o","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","networkStats","sent","received","awaitingChunks","Map","addSent","dcId","addReceived","awaitingLength","awaiting","waitForChunk","catch","noop","finally","indexOfAndSplice","HTTP","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","byteLength","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","ws","connect","removeEventListener","undefined","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","encodeBody","toEncode","encoded","releasingPending","socketId","SocketProxied","socketsProxied","task","TEST_SUFFIX","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","suffix","path","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","MTTransportController","opened","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","after","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","Set","_context","deepEqual","add","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","wrapSingleMessage","peerId","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","hex","newHex","newContext","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","user_id","recentVoters","recent_voters","userId","recentReactions","recent_reactions","reaction","getPeerId","peer_id","action","userIds","users","inviter_id","chatIds","channel_id","chat_id","chatId","recentRepliers","recent_repliers","reply","defineNotNumerableProperties","props","writable","configurable","out","defineProperties","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","folders","pinnedOrders","allDialogsLoaded","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","folderId","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","newPinned","getFolderDialogs","dialogsResult","applyDialogs","d","rootScope","appUsersManager","getSelf","peerText","appPeersManager","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","getDialogIndexKeyByFilterId","chat","appChatsManager","getChat","dropDialogOnDeletion","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","appStateManager","appStoragesManager","getCache","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","isDialogsLoaded","loaded","resetPinnedOrder","getPinnedOrders","getOffsetDate","offsetDate","Math","min","getFolder","folder","unreadMessagesCount","unreadDialogsCount","skipMigrated","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","filtersStorage","getFilter","orderIndex","getFolderUnreadCount","foundUnmuted","unread_count","unread_mark","appNotificationsManager","isPeerLocalMuted","unreadCount","setDialogIndexInFilter","testDialogForFilter","pinnedIndex","pinnedPeerIds","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","getDialogIndex","getDialog","skipped","isObject","date","isPinned","tsNow","timeManager","getServerTimeOffset","filters","getFilters","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","prepareDialogUnreadCountModifying","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","max","dispatchUnreadTimeout","_folder","justReturn","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","foundIndex","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","ignoreOffsetDate","saveGlobalOffset","pos","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","clearDialogFromState","foundDialog","wasPinned","keepLocal","releasePeer","dropDialogWithEvent","dropped","forEachReverse","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","updates","newUpdatesAfterReloadToHandle","saveUpdate","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","isEnd","insertSlice","setEnd","mergeReplyKeyboard","unshift","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","getDialogs","offsetIndex","limit","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","has","sort","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","FiltersStorage","reloadedPeerIds","clearFilters","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","updateDialogFilter","updateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","updateDialogFilterOrder","excludePeerIds","includes","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","assumeType","to","oldFilter","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","self","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","getChannelInput","lastPtsUpdateTime","fwdHeader","reason","hasUser","post","hasChat","isUser","popPts","popSeq","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","platforms","ignore","getRestrictionReason","reasons","isRestricted","AppChatsManager","isPeerNeeded","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedPhoto","changedTitle","title","getChatTyped","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatPhoto","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","enabled","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","available_reactions","restrictionReasons","restriction_reason","restricted","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","I18n","pluralRules","cacheLangPackPromise","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lastRequestedLangCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","v","langPack","appVersion","applyLangPack","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","textContent","arg","pushNextArgument","plain","select","item","Node","getCacheLangPack","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","window","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","docId","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","getWallPapers","invokeApiHashable","accountWallpapers","wallPapers","wallpapers","wallPaper","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","downloaded","getGifs","gifs","requestDocPart","requestFilePart","getDocumentInput","AppDraftsManager","drafts","getAllDraftPromise","updateDraftMessage","threadId","notify","getKey","getDraft","getAllDrafts","apiDraft","processApiDraft","force","draftsAreEqual","draft1","draft2","reply_to_msg_id","no_webpage","isEmptyDraft","syncDraft","localDraft","saveOnServer","serverDraft","draftObj","getInputEntities","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","recent","getRecentEmojis","indexEmojis","searchEmojis","emojis","reduce","acc","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","pushRecentEmoji","emoji","fixEmoji","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","ids","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","botId","bot","geo_point","stopTime","botResults","queryId","query_id","appDocsManager","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","content","progress","percent","total","sendOther","AppMessagesIdsManager","tempNum","num","telegramMeWebManager","disabled","hostname","setAuthorized","canRedirect","sessionStorage","curValue","ts","tgme_sync","script","onload","src","appendChild","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewMessages","handleNewDialogs","newMaxSeenId","incrementMaxSeenId","handleNotifications","_peerId","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","pendingData","tempId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","ignoreExisting","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","forceUserOnline","top_msg_id","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","replyTo","reply_to_top_id","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","onUpdateChannelReload","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","verified","phone","onUpdatePinnedMessages","missingMessages","werePinned","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","chosen","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","send_as","silent","wrapMessageEntities","beforeMessageSending","sequential","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","percents","floor","done","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","files","sendFileDetails","groupId","invoke","multiMedia","multi_media","messageMedia","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","channelFull","appProfileManager","getCachedFullChat","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","originalMessage","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","fillConversations","getConversations","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","getDialogByPeerId","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","m","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","totalEntities","foundMessages","getGroupsFirstMessage","minMid","getMidsByAlbum","getMidsByMessage","filterMessages","verify","appMessagesIdsManager","saveMessage","isMessage","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","start_param","editPeerFolders","appConfig","getAppConfig","dialogs_folder_pinned_limit_premium","dialogs_folder_pinned_limit_default","dialogs_pinned_limit_premium","dialogs_pinned_limit_default","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","getSearchStorage","getSearchCounters","canCache","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","some","readPeerId","reactionsCount","readParticipants","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","unsetEnd","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","newMaxId","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","requestPromises","getMessagesResult","fetchMessageReplyTo","replyToPeerId","reply_to_peer_id","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedId","groupedStorage","albums","peerMessagesToHandle","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","default_send_as","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","checkMuteUntilThrottled","throttle","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","notifySettings","getPeerMuted","getPeerLocalSettings","respectType","n","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserPhoto","getUserString","getPeerUsername","getRestrictionReasonText","ignorePeerId","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","closed","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","AppProfileManager","usersFull","chatsFull","onUpdateUserTyping","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","chatFull","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","getProfile","usersUserFull","full_user","profile_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","getChannelFull","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","previous","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","callbackify","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","filteredChatAvailableReactions","unshiftQuickReactionInner","findAndSplice","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","chosenReactionIdx","chosenReaction","can_see_list","reactionCountIdx","userReaction","promiseKey","editMessageUpdateIdx","editMessageUpdate","EMOJI_SET_LOCAL_ID","EMOJI_ANIMATIONS_SET_LOCAL_ID","LOCAL_IDS_SET","AppStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","updateNewStickerSet","stickerSet","saveStickerSet","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","getStickerSet","cachedSet","documents","refreshTime","useCache","getStickerSetInput","saveById","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","stickers","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","sets","covered","videos","toggleStickerSet","archived","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","allStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","pushRecentSticker","docEmoticon","_doc","cleanUsername","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserPhoto","updateUserName","setUserNameToCache","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","oldUser","oldSearchUsername","searchUsername","fullName","wasContact","newContact","onContactUpdated","isUserOnlineVisible","isRegularUser","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","pathname","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","showPhone","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","description","pendingSet","getWebPage","ApiFileManager","cacheStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","downloadRequest","cb","activeDelta","downloadPull","downloadCheck","downloadLimit","networkPromise","race","setQueueId","getFileStorage","cancelDownload","canceled","cancel","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","inputFileLocation","isDownloading","getDownload","getUpload","fileManager","IS_OPUS_SUPPORTED","cachedPromise","fileStorage","cacheFileWriter","resolved","errorHandler","_error","truncate","getFile","getFileWriter","fileWriter","writeFileDeferred","writeFilePromise","processDownloaded","delayed","superpuper","isFinal","write","getParts","processedResult","replaceParts","realSize","Infinity","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","it","reader","FileReader","readBlobAs","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","cacheKey","oldPromise","getAppConfigPromise","ignore_restriction_reasons","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","getTransportType","iterateNetworkers","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","networkerFactory","authorizer","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onDrain","isFileNetworker","canRelease","removeNetworker","setDrainTimeout","updatesProcessor","startTime","interval","cachedNetworker","isStopped","clearInterval","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","ThumbsStorage","thumbsCache","thumbFullSize","intToUint","longFromInts","high","low","shiftLeft","boolFalse","predicate","boolTrue","vector","gzipPacked","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","flagsOffsets","param","condType","fieldBit","storeObject","paramName","substr","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","longDec","isSafeInteger","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","escape","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","bigIntFromBytes","base","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","bigInt","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","prepared","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","pow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","abs","server_time_offset","appManagersManager","cryptoPortPromise","getManagers","manager","apply","cryptoPortAttached","ports","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","appEmojiManager","passwordManager","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","messagePort","onConnect","onDisconnect","attachPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","CAN_COMBINE_ENTITIES","combineSameEntities","nextEntityIdx","_i","nextEntity","findConflictingEntity","currentEntities","newEntity","currentEntity","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","newEntities","filtered","sortEntities","encodeEmoji","emojiText","unicodeSurrogates","points","char","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","every","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","scripts","getElementsByTagName","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.big-integer.a7ea0f3283af2967a6ae.chunk.js b/public/npm.big-integer.a7ea0f3283af2967a6ae.chunk.js new file mode 100644 index 000000000..776939818 --- /dev/null +++ b/public/npm.big-integer.a7ea0f3283af2967a6ae.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[211],{4736:(t,e,r)=>{var o;t=r.nmd(t);var n=function(t){"use strict";var e=1e7,r=9007199254740992,o=v(r),i="0123456789abcdefghijklmnopqrstuvwxyz",u="function"==typeof BigInt;function p(t,e,r,o){return void 0===t?p[0]:void 0===e||10==+e&&!r?Q(t):$(t,e,r,o)}function a(t,e){this.value=t,this.sign=e,this.isSmall=!1}function s(t){this.value=t,this.sign=t<0,this.isSmall=!0}function l(t){this.value=t}function f(t){return-r0?Math.floor(t):Math.ceil(t)}function m(t,r){var o,n,i=t.length,u=r.length,p=new Array(i),a=0,s=e;for(n=0;n=s?1:0,p[n]=o-a*s;for(;n0&&p.push(a),p}function d(t,e){return t.length>=e.length?m(t,e):m(e,t)}function w(t,r){var o,n,i=t.length,u=new Array(i),p=e;for(n=0;n0;)u[n++]=r%p,r=Math.floor(r/p);return u}function b(t,r){var o,n,i=t.length,u=r.length,p=new Array(i),a=0,s=e;for(o=0;o0;)u[n++]=a%p,a=Math.floor(a/p);return u}function N(t,e){for(var r=[];e-- >0;)r.push(0);return r.concat(t)}function E(t,e){var r=Math.max(t.length,e.length);if(r<=30)return q(t,e);r=Math.ceil(r/2);var o=t.slice(r),n=t.slice(0,r),i=e.slice(r),u=e.slice(0,r),p=E(n,u),a=E(o,i),s=E(d(n,o),d(u,i)),l=d(d(p,N(b(b(s,p),a),r)),N(a,2*r));return y(l),l}function I(t,r,o){return new a(t=0;--r)n=(i=1e7*n+t[r])-(o=g(i/e))*e,p[r]=0|o;return[p,0|n]}function A(t,r){var o,n=Q(r);if(u)return[new l(t.value/n.value),new l(t.value%n.value)];var i,f=t.value,m=n.value;if(0===m)throw new Error("Cannot divide by zero");if(t.isSmall)return n.isSmall?[new s(g(f/m)),new s(f%m)]:[p[0],t];if(n.isSmall){if(1===m)return[t,p[0]];if(-1==m)return[t.negate(),p[0]];var d=Math.abs(m);if(d=0;n--){for(o=v-1,d[n+f]!==g&&(o=Math.floor((d[n+f]*v+d[n+f-1])/g)),i=0,u=0,a=w.length,p=0;ps&&(i=(i+1)*v),o=Math.ceil(i/u);do{if(P(p=M(r,o),f)<=0)break;o--}while(o);l.push(o),f=b(f,p)}return l.reverse(),[h(l),h(f)]}(f,m),i=o[0];var q=t.sign!==n.sign,N=o[1],E=t.sign;return"number"==typeof i?(q&&(i=-i),i=new s(i)):i=new a(i,q),"number"==typeof N?(E&&(N=-N),N=new s(N)):N=new a(N,E),[i,N]}function P(t,e){if(t.length!==e.length)return t.length>e.length?1:-1;for(var r=t.length-1;r>=0;r--)if(t[r]!==e[r])return t[r]>e[r]?1:-1;return 0}function Z(t){var e=t.abs();return!e.isUnit()&&(!!(e.equals(2)||e.equals(3)||e.equals(5))||!(e.isEven()||e.isDivisibleBy(3)||e.isDivisibleBy(5))&&(!!e.lesser(49)||void 0))}function x(t,e){for(var r,o,i,u=t.prev(),p=u,a=0;p.isEven();)p=p.divide(2),a++;t:for(o=0;o=0?o=b(t,e):(o=b(e,t),r=!r),"number"==typeof(o=h(o))?(r&&(o=-o),new s(o)):new a(o,r)}(r,o,this.sign)},a.prototype.minus=a.prototype.subtract,s.prototype.subtract=function(t){var e=Q(t),r=this.value;if(r<0!==e.sign)return this.add(e.negate());var o=e.value;return e.isSmall?new s(r-o):S(o,Math.abs(r),r>=0)},s.prototype.minus=s.prototype.subtract,l.prototype.subtract=function(t){return new l(this.value-Q(t).value)},l.prototype.minus=l.prototype.subtract,a.prototype.negate=function(){return new a(this.value,!this.sign)},s.prototype.negate=function(){var t=this.sign,e=new s(-this.value);return e.sign=!t,e},l.prototype.negate=function(){return new l(-this.value)},a.prototype.abs=function(){return new a(this.value,!1)},s.prototype.abs=function(){return new s(Math.abs(this.value))},l.prototype.abs=function(){return new l(this.value>=0?this.value:-this.value)},a.prototype.multiply=function(t){var r,o,n,i=Q(t),u=this.value,s=i.value,l=this.sign!==i.sign;if(i.isSmall){if(0===s)return p[0];if(1===s)return this;if(-1===s)return this.negate();if((r=Math.abs(s))0?E(u,s):q(u,s),l)},a.prototype.times=a.prototype.multiply,s.prototype._multiplyBySmall=function(t){return f(t.value*this.value)?new s(t.value*this.value):I(Math.abs(t.value),v(Math.abs(this.value)),this.sign!==t.sign)},a.prototype._multiplyBySmall=function(t){return 0===t.value?p[0]:1===t.value?this:-1===t.value?this.negate():I(Math.abs(t.value),this.value,this.sign!==t.sign)},s.prototype.multiply=function(t){return Q(t)._multiplyBySmall(this)},s.prototype.times=s.prototype.multiply,l.prototype.multiply=function(t){return new l(this.value*Q(t).value)},l.prototype.times=l.prototype.multiply,a.prototype.square=function(){return new a(O(this.value),!1)},s.prototype.square=function(){var t=this.value*this.value;return f(t)?new s(t):new a(O(v(Math.abs(this.value))),!1)},l.prototype.square=function(t){return new l(this.value*this.value)},a.prototype.divmod=function(t){var e=A(this,t);return{quotient:e[0],remainder:e[1]}},l.prototype.divmod=s.prototype.divmod=a.prototype.divmod,a.prototype.divide=function(t){return A(this,t)[0]},l.prototype.over=l.prototype.divide=function(t){return new l(this.value/Q(t).value)},s.prototype.over=s.prototype.divide=a.prototype.over=a.prototype.divide,a.prototype.mod=function(t){return A(this,t)[1]},l.prototype.mod=l.prototype.remainder=function(t){return new l(this.value%Q(t).value)},s.prototype.remainder=s.prototype.mod=a.prototype.remainder=a.prototype.mod,a.prototype.pow=function(t){var e,r,o,n=Q(t),i=this.value,u=n.value;if(0===u)return p[1];if(0===i)return p[0];if(1===i)return p[1];if(-1===i)return n.isEven()?p[1]:p[-1];if(n.sign)return p[0];if(!n.isSmall)throw new Error("The exponent "+n.toString()+" is too large.");if(this.isSmall&&f(e=Math.pow(i,u)))return new s(g(e));for(r=this,o=p[1];!0&u&&(o=o.times(r),--u),0!==u;)u/=2,r=r.square();return o},s.prototype.pow=a.prototype.pow,l.prototype.pow=function(t){var e=Q(t),r=this.value,o=e.value,n=BigInt(0),i=BigInt(1),u=BigInt(2);if(o===n)return p[1];if(r===n)return p[0];if(r===i)return p[1];if(r===BigInt(-1))return e.isEven()?p[1]:p[-1];if(e.isNegative())return new l(n);for(var a=this,s=p[1];(o&i)===i&&(s=s.times(a),--o),o!==n;)o/=u,a=a.square();return s},a.prototype.modPow=function(t,e){if(t=Q(t),(e=Q(e)).isZero())throw new Error("Cannot take modPow with modulus 0");var r=p[1],o=this.mod(e);for(t.isNegative()&&(t=t.multiply(p[-1]),o=o.modInv(e));t.isPositive();){if(o.isZero())return p[0];t.isOdd()&&(r=r.multiply(o).mod(e)),t=t.divide(2),o=o.square().mod(e)}return r},l.prototype.modPow=s.prototype.modPow=a.prototype.modPow,a.prototype.compareAbs=function(t){var e=Q(t),r=this.value,o=e.value;return e.isSmall?1:P(r,o)},s.prototype.compareAbs=function(t){var e=Q(t),r=Math.abs(this.value),o=e.value;return e.isSmall?r===(o=Math.abs(o))?0:r>o?1:-1:-1},l.prototype.compareAbs=function(t){var e=this.value,r=Q(t).value;return(e=e>=0?e:-e)===(r=r>=0?r:-r)?0:e>r?1:-1},a.prototype.compare=function(t){if(t===1/0)return-1;if(t===-1/0)return 1;var e=Q(t),r=this.value,o=e.value;return this.sign!==e.sign?e.sign?1:-1:e.isSmall?this.sign?-1:1:P(r,o)*(this.sign?-1:1)},a.prototype.compareTo=a.prototype.compare,s.prototype.compare=function(t){if(t===1/0)return-1;if(t===-1/0)return 1;var e=Q(t),r=this.value,o=e.value;return e.isSmall?r==o?0:r>o?1:-1:r<0!==e.sign?r<0?-1:1:r<0?1:-1},s.prototype.compareTo=s.prototype.compare,l.prototype.compare=function(t){if(t===1/0)return-1;if(t===-1/0)return 1;var e=this.value,r=Q(t).value;return e===r?0:e>r?1:-1},l.prototype.compareTo=l.prototype.compare,a.prototype.equals=function(t){return 0===this.compare(t)},l.prototype.eq=l.prototype.equals=s.prototype.eq=s.prototype.equals=a.prototype.eq=a.prototype.equals,a.prototype.notEquals=function(t){return 0!==this.compare(t)},l.prototype.neq=l.prototype.notEquals=s.prototype.neq=s.prototype.notEquals=a.prototype.neq=a.prototype.notEquals,a.prototype.greater=function(t){return this.compare(t)>0},l.prototype.gt=l.prototype.greater=s.prototype.gt=s.prototype.greater=a.prototype.gt=a.prototype.greater,a.prototype.lesser=function(t){return this.compare(t)<0},l.prototype.lt=l.prototype.lesser=s.prototype.lt=s.prototype.lesser=a.prototype.lt=a.prototype.lesser,a.prototype.greaterOrEquals=function(t){return this.compare(t)>=0},l.prototype.geq=l.prototype.greaterOrEquals=s.prototype.geq=s.prototype.greaterOrEquals=a.prototype.geq=a.prototype.greaterOrEquals,a.prototype.lesserOrEquals=function(t){return this.compare(t)<=0},l.prototype.leq=l.prototype.lesserOrEquals=s.prototype.leq=s.prototype.lesserOrEquals=a.prototype.leq=a.prototype.lesserOrEquals,a.prototype.isEven=function(){return 0==(1&this.value[0])},s.prototype.isEven=function(){return 0==(1&this.value)},l.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)},a.prototype.isOdd=function(){return 1==(1&this.value[0])},s.prototype.isOdd=function(){return 1==(1&this.value)},l.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)},a.prototype.isPositive=function(){return!this.sign},s.prototype.isPositive=function(){return this.value>0},l.prototype.isPositive=s.prototype.isPositive,a.prototype.isNegative=function(){return this.sign},s.prototype.isNegative=function(){return this.value<0},l.prototype.isNegative=s.prototype.isNegative,a.prototype.isUnit=function(){return!1},s.prototype.isUnit=function(){return 1===Math.abs(this.value)},l.prototype.isUnit=function(){return this.abs().value===BigInt(1)},a.prototype.isZero=function(){return!1},s.prototype.isZero=function(){return 0===this.value},l.prototype.isZero=function(){return this.value===BigInt(0)},a.prototype.isDivisibleBy=function(t){var e=Q(t);return!e.isZero()&&(!!e.isUnit()||(0===e.compareAbs(2)?this.isEven():this.mod(e).isZero()))},l.prototype.isDivisibleBy=s.prototype.isDivisibleBy=a.prototype.isDivisibleBy,a.prototype.isPrime=function(e){var r=Z(this);if(r!==t)return r;var o=this.abs(),i=o.bitLength();if(i<=64)return x(o,[2,3,5,7,11,13,17,19,23,29,31,37]);for(var u=Math.log(2)*i.toJSNumber(),p=Math.ceil(!0===e?2*Math.pow(u,2):u),a=[],s=0;s-r?new s(t-1):new a(o,!0)},l.prototype.prev=function(){return new l(this.value-BigInt(1))};for(var J=[1];2*J[J.length-1]<=e;)J.push(2*J[J.length-1]);var L=J.length,U=J[L-1];function k(t){return Math.abs(t)<=e}function C(t,e,r){e=Q(e);for(var o=t.isNegative(),i=e.isNegative(),u=o?t.not():t,p=i?e.not():e,a=0,s=0,l=null,f=null,v=[];!u.isZero()||!p.isZero();)a=(l=A(u,U))[1].toJSNumber(),o&&(a=U-1-a),s=(f=A(p,U))[1].toJSNumber(),i&&(s=U-1-s),u=l[0],p=f[0],v.push(r(a,s));for(var h=0!==r(o?1:0,i?1:0)?n(-1):n(0),y=v.length-1;y>=0;y-=1)h=h.multiply(U).add(n(v[y]));return h}a.prototype.shiftLeft=function(t){var e=Q(t).toJSNumber();if(!k(e))throw new Error(String(e)+" is too large for shifting.");if(e<0)return this.shiftRight(-e);var r=this;if(r.isZero())return r;for(;e>=L;)r=r.multiply(U),e-=L-1;return r.multiply(J[e])},l.prototype.shiftLeft=s.prototype.shiftLeft=a.prototype.shiftLeft,a.prototype.shiftRight=function(t){var e,r=Q(t).toJSNumber();if(!k(r))throw new Error(String(r)+" is too large for shifting.");if(r<0)return this.shiftLeft(-r);for(var o=this;r>=L;){if(o.isZero()||o.isNegative()&&o.isUnit())return o;o=(e=A(o,U))[1].isNegative()?e[0].prev():e[0],r-=L-1}return(e=A(o,J[r]))[1].isNegative()?e[0].prev():e[0]},l.prototype.shiftRight=s.prototype.shiftRight=a.prototype.shiftRight,a.prototype.not=function(){return this.negate().prev()},l.prototype.not=s.prototype.not=a.prototype.not,a.prototype.and=function(t){return C(this,t,(function(t,e){return t&e}))},l.prototype.and=s.prototype.and=a.prototype.and,a.prototype.or=function(t){return C(this,t,(function(t,e){return t|e}))},l.prototype.or=s.prototype.or=a.prototype.or,a.prototype.xor=function(t){return C(this,t,(function(t,e){return t^e}))},l.prototype.xor=s.prototype.xor=a.prototype.xor;var T=1<<30;function j(t){var r=t.value,o="number"==typeof r?r|T:"bigint"==typeof r?r|BigInt(T):r[0]+r[1]*e|1073758208;return o&-o}function D(t,e){if(e.compareTo(t)<=0){var r=D(t,e.square(e)),o=r.p,i=r.e,u=o.multiply(e);return u.compareTo(t)<=0?{p:u,e:2*i+1}:{p:o,e:2*i}}return{p:n(1),e:0}}function z(t,e){return t=Q(t),e=Q(e),t.greater(e)?t:e}function R(t,e){return t=Q(t),e=Q(e),t.lesser(e)?t:e}function _(t,e){if(t=Q(t).abs(),e=Q(e).abs(),t.equals(e))return t;if(t.isZero())return e;if(e.isZero())return t;for(var r,o,n=p[1];t.isEven()&&e.isEven();)r=R(j(t),j(e)),t=t.divide(r),e=e.divide(r),n=n.multiply(r);for(;t.isEven();)t=t.divide(j(t));do{for(;e.isEven();)e=e.divide(j(e));t.greater(e)&&(o=e,e=t,t=o),e=e.subtract(t)}while(!e.isZero());return n.isUnit()?t:t.multiply(n)}a.prototype.bitLength=function(){var t=this;return t.compareTo(n(0))<0&&(t=t.negate().subtract(n(1))),0===t.compareTo(n(0))?n(0):n(D(t,n(2)).e).add(n(1))},l.prototype.bitLength=s.prototype.bitLength=a.prototype.bitLength;var $=function(t,e,r,o){r=r||i,t=String(t),o||(t=t.toLowerCase(),r=r.toLowerCase());var n,u=t.length,p=Math.abs(e),a={};for(n=0;n=p){if("1"===f&&1===p)continue;throw new Error(f+" is not a valid digit in base "+e+".")}e=Q(e);var s=[],l="-"===t[0];for(n=l?1:0;n"!==t[n]&&n=0;o--)n=n.add(t[o].times(i)),i=i.times(e);return r?n.negate():n}function G(t,e){if((e=n(e)).isZero()){if(t.isZero())return{value:[0],isNegative:!1};throw new Error("Cannot convert nonzero numbers to base 0.")}if(e.equals(-1)){if(t.isZero())return{value:[0],isNegative:!1};if(t.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-t.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:!1};var r=Array.apply(null,Array(t.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);return r.unshift([1]),{value:[].concat.apply([],r),isNegative:!1}}var o=!1;if(t.isNegative()&&e.isPositive()&&(o=!0,t=t.abs()),e.isUnit())return t.isZero()?{value:[0],isNegative:!1}:{value:Array.apply(null,Array(t.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:o};for(var i,u=[],p=t;p.isNegative()||p.compareAbs(e)>=0;){i=p.divmod(e),p=i.quotient;var a=i.remainder;a.isNegative()&&(a=e.minus(a).abs(),p=p.next()),u.push(a.toJSNumber())}return u.push(p.toJSNumber()),{value:u.reverse(),isNegative:o}}function H(t,e,r){var o=G(t,e);return(o.isNegative?"-":"")+o.value.map((function(t){return function(t,e){return t<(e=e||i).length?e[t]:"<"+t+">"}(t,r)})).join("")}function K(t){if(f(+t)){var e=+t;if(e===g(e))return u?new l(BigInt(e)):new s(e);throw new Error("Invalid integer: "+t)}var r="-"===t[0];r&&(t=t.slice(1));var o=t.split(/e/i);if(o.length>2)throw new Error("Invalid integer: "+o.join("e"));if(2===o.length){var n=o[1];if("+"===n[0]&&(n=n.slice(1)),(n=+n)!==g(n)||!f(n))throw new Error("Invalid integer: "+n+" is not a valid exponent.");var i=o[0],p=i.indexOf(".");if(p>=0&&(n-=i.length-p-1,i=i.slice(0,p)+i.slice(p+1)),n<0)throw new Error("Cannot include negative exponent part for integers");t=i+=new Array(n+1).join("0")}if(!/^([0-9][0-9]*)$/.test(t))throw new Error("Invalid integer: "+t);if(u)return new l(BigInt(r?"-"+t:t));for(var v=[],h=t.length,c=h-7;h>0;)v.push(+t.slice(c,h)),(c-=7)<0&&(c=0),h-=7;return y(v),new a(v,r)}function Q(t){return"number"==typeof t?function(t){if(u)return new l(BigInt(t));if(f(t)){if(t!==g(t))throw new Error(t+" is not an integer.");return new s(t)}return K(t.toString())}(t):"string"==typeof t?K(t):"bigint"==typeof t?new l(t):t}a.prototype.toArray=function(t){return G(this,t)},s.prototype.toArray=function(t){return G(this,t)},l.prototype.toArray=function(t){return G(this,t)},a.prototype.toString=function(e,r){if(e===t&&(e=10),10!==e)return H(this,e,r);for(var o,n=this.value,i=n.length,u=String(n[--i]);--i>=0;)o=String(n[i]),u+="0000000".slice(o.length)+o;return(this.sign?"-":"")+u},s.prototype.toString=function(e,r){return e===t&&(e=10),10!=e?H(this,e,r):String(this.value)},l.prototype.toString=s.prototype.toString,l.prototype.toJSON=a.prototype.toJSON=s.prototype.toJSON=function(){return this.toString()},a.prototype.valueOf=function(){return parseInt(this.toString(),10)},a.prototype.toJSNumber=a.prototype.valueOf,s.prototype.valueOf=function(){return this.value},s.prototype.toJSNumber=s.prototype.valueOf,l.prototype.valueOf=l.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};for(var V=0;V<1e3;V++)p[V]=Q(V),V>0&&(p[-V]=Q(-V));return p.one=p[1],p.zero=p[0],p.minusOne=p[-1],p.max=z,p.min=R,p.gcd=_,p.lcm=function(t,e){return t=Q(t).abs(),e=Q(e).abs(),t.divide(_(t,e)).multiply(e)},p.isInstance=function(t){return t instanceof a||t instanceof s||t instanceof l},p.randBetween=function(t,r,o){t=Q(t),r=Q(r);var n=o||Math.random,i=R(t,r),u=z(t,r).subtract(i).add(1);if(u.isSmall)return i.add(Math.floor(n()*u));for(var a=G(u,e).value,s=[],l=!0,f=0;f 0) return Math.floor(n);\r\n return Math.ceil(n);\r\n }\r\n\r\n function add(a, b) { // assumes a and b are arrays with a.length >= b.length\r\n var l_a = a.length,\r\n l_b = b.length,\r\n r = new Array(l_a),\r\n carry = 0,\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l_b; i++) {\r\n sum = a[i] + b[i] + carry;\r\n carry = sum >= base ? 1 : 0;\r\n r[i] = sum - carry * base;\r\n }\r\n while (i < l_a) {\r\n sum = a[i] + carry;\r\n carry = sum === base ? 1 : 0;\r\n r[i++] = sum - carry * base;\r\n }\r\n if (carry > 0) r.push(carry);\r\n return r;\r\n }\r\n\r\n function addAny(a, b) {\r\n if (a.length >= b.length) return add(a, b);\r\n return add(b, a);\r\n }\r\n\r\n function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l; i++) {\r\n sum = a[i] - base + carry;\r\n carry = Math.floor(sum / base);\r\n r[i] = sum - carry * base;\r\n carry += 1;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall) {\r\n return new BigInteger(addSmall(a, Math.abs(b)), this.sign);\r\n }\r\n return new BigInteger(addAny(a, b), this.sign);\r\n };\r\n BigInteger.prototype.plus = BigInteger.prototype.add;\r\n\r\n SmallInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n if (isPrecise(a + b)) return new SmallInteger(a + b);\r\n b = smallToArray(Math.abs(b));\r\n }\r\n return new BigInteger(addSmall(b, Math.abs(a)), a < 0);\r\n };\r\n SmallInteger.prototype.plus = SmallInteger.prototype.add;\r\n\r\n NativeBigInt.prototype.add = function (v) {\r\n return new NativeBigInt(this.value + parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.plus = NativeBigInt.prototype.add;\r\n\r\n function subtract(a, b) { // assumes a and b are arrays with a >= b\r\n var a_l = a.length,\r\n b_l = b.length,\r\n r = new Array(a_l),\r\n borrow = 0,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < b_l; i++) {\r\n difference = a[i] - borrow - b[i];\r\n if (difference < 0) {\r\n difference += base;\r\n borrow = 1;\r\n } else borrow = 0;\r\n r[i] = difference;\r\n }\r\n for (i = b_l; i < a_l; i++) {\r\n difference = a[i] - borrow;\r\n if (difference < 0) difference += base;\r\n else {\r\n r[i++] = difference;\r\n break;\r\n }\r\n r[i] = difference;\r\n }\r\n for (; i < a_l; i++) {\r\n r[i] = a[i];\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function subtractAny(a, b, sign) {\r\n var value;\r\n if (compareAbs(a, b) >= 0) {\r\n value = subtract(a, b);\r\n } else {\r\n value = subtract(b, a);\r\n sign = !sign;\r\n }\r\n value = arrayToSmall(value);\r\n if (typeof value === \"number\") {\r\n if (sign) value = -value;\r\n return new SmallInteger(value);\r\n }\r\n return new BigInteger(value, sign);\r\n }\r\n\r\n function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n carry = -b,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < l; i++) {\r\n difference = a[i] + carry;\r\n carry = Math.floor(difference / base);\r\n difference %= base;\r\n r[i] = difference < 0 ? difference + base : difference;\r\n }\r\n r = arrayToSmall(r);\r\n if (typeof r === \"number\") {\r\n if (sign) r = -r;\r\n return new SmallInteger(r);\r\n } return new BigInteger(r, sign);\r\n }\r\n\r\n BigInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall)\r\n return subtractSmall(a, Math.abs(b), this.sign);\r\n return subtractAny(a, b, this.sign);\r\n };\r\n BigInteger.prototype.minus = BigInteger.prototype.subtract;\r\n\r\n SmallInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n return new SmallInteger(a - b);\r\n }\r\n return subtractSmall(b, Math.abs(a), a >= 0);\r\n };\r\n SmallInteger.prototype.minus = SmallInteger.prototype.subtract;\r\n\r\n NativeBigInt.prototype.subtract = function (v) {\r\n return new NativeBigInt(this.value - parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;\r\n\r\n BigInteger.prototype.negate = function () {\r\n return new BigInteger(this.value, !this.sign);\r\n };\r\n SmallInteger.prototype.negate = function () {\r\n var sign = this.sign;\r\n var small = new SmallInteger(-this.value);\r\n small.sign = !sign;\r\n return small;\r\n };\r\n NativeBigInt.prototype.negate = function () {\r\n return new NativeBigInt(-this.value);\r\n }\r\n\r\n BigInteger.prototype.abs = function () {\r\n return new BigInteger(this.value, false);\r\n };\r\n SmallInteger.prototype.abs = function () {\r\n return new SmallInteger(Math.abs(this.value));\r\n };\r\n NativeBigInt.prototype.abs = function () {\r\n return new NativeBigInt(this.value >= 0 ? this.value : -this.value);\r\n }\r\n\r\n\r\n function multiplyLong(a, b) {\r\n var a_l = a.length,\r\n b_l = b.length,\r\n l = a_l + b_l,\r\n r = createArray(l),\r\n base = BASE,\r\n product, carry, i, a_i, b_j;\r\n for (i = 0; i < a_l; ++i) {\r\n a_i = a[i];\r\n for (var j = 0; j < b_l; ++j) {\r\n b_j = b[j];\r\n product = a_i * b_j + r[i + j];\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n r[i + j + 1] += carry;\r\n }\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n carry = 0,\r\n product, i;\r\n for (i = 0; i < l; i++) {\r\n product = a[i] * b + carry;\r\n carry = Math.floor(product / base);\r\n r[i] = product - carry * base;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n function shiftLeft(x, n) {\r\n var r = [];\r\n while (n-- > 0) r.push(0);\r\n return r.concat(x);\r\n }\r\n\r\n function multiplyKaratsuba(x, y) {\r\n var n = Math.max(x.length, y.length);\r\n\r\n if (n <= 30) return multiplyLong(x, y);\r\n n = Math.ceil(n / 2);\r\n\r\n var b = x.slice(n),\r\n a = x.slice(0, n),\r\n d = y.slice(n),\r\n c = y.slice(0, n);\r\n\r\n var ac = multiplyKaratsuba(a, c),\r\n bd = multiplyKaratsuba(b, d),\r\n abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));\r\n\r\n var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));\r\n trim(product);\r\n return product;\r\n }\r\n\r\n // The following function is derived from a surface fit of a graph plotting the performance difference\r\n // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.\r\n function useKaratsuba(l1, l2) {\r\n return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;\r\n }\r\n\r\n BigInteger.prototype.multiply = function (v) {\r\n var n = parseValue(v),\r\n a = this.value, b = n.value,\r\n sign = this.sign !== n.sign,\r\n abs;\r\n if (n.isSmall) {\r\n if (b === 0) return Integer[0];\r\n if (b === 1) return this;\r\n if (b === -1) return this.negate();\r\n abs = Math.abs(b);\r\n if (abs < BASE) {\r\n return new BigInteger(multiplySmall(a, abs), sign);\r\n }\r\n b = smallToArray(abs);\r\n }\r\n if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes\r\n return new BigInteger(multiplyKaratsuba(a, b), sign);\r\n return new BigInteger(multiplyLong(a, b), sign);\r\n };\r\n\r\n BigInteger.prototype.times = BigInteger.prototype.multiply;\r\n\r\n function multiplySmallAndArray(a, b, sign) { // a >= 0\r\n if (a < BASE) {\r\n return new BigInteger(multiplySmall(b, a), sign);\r\n }\r\n return new BigInteger(multiplyLong(b, smallToArray(a)), sign);\r\n }\r\n SmallInteger.prototype._multiplyBySmall = function (a) {\r\n if (isPrecise(a.value * this.value)) {\r\n return new SmallInteger(a.value * this.value);\r\n }\r\n return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);\r\n };\r\n BigInteger.prototype._multiplyBySmall = function (a) {\r\n if (a.value === 0) return Integer[0];\r\n if (a.value === 1) return this;\r\n if (a.value === -1) return this.negate();\r\n return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);\r\n };\r\n SmallInteger.prototype.multiply = function (v) {\r\n return parseValue(v)._multiplyBySmall(this);\r\n };\r\n SmallInteger.prototype.times = SmallInteger.prototype.multiply;\r\n\r\n NativeBigInt.prototype.multiply = function (v) {\r\n return new NativeBigInt(this.value * parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;\r\n\r\n function square(a) {\r\n //console.assert(2 * BASE * BASE < MAX_INT);\r\n var l = a.length,\r\n r = createArray(l + l),\r\n base = BASE,\r\n product, carry, i, a_i, a_j;\r\n for (i = 0; i < l; i++) {\r\n a_i = a[i];\r\n carry = 0 - a_i * a_i;\r\n for (var j = i; j < l; j++) {\r\n a_j = a[j];\r\n product = 2 * (a_i * a_j) + r[i + j] + carry;\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n }\r\n r[i + l] = carry;\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.square = function () {\r\n return new BigInteger(square(this.value), false);\r\n };\r\n\r\n SmallInteger.prototype.square = function () {\r\n var value = this.value * this.value;\r\n if (isPrecise(value)) return new SmallInteger(value);\r\n return new BigInteger(square(smallToArray(Math.abs(this.value))), false);\r\n };\r\n\r\n NativeBigInt.prototype.square = function (v) {\r\n return new NativeBigInt(this.value * this.value);\r\n }\r\n\r\n function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n base = BASE,\r\n result = createArray(b.length),\r\n divisorMostSignificantDigit = b[b_l - 1],\r\n // normalization\r\n lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),\r\n remainder = multiplySmall(a, lambda),\r\n divisor = multiplySmall(b, lambda),\r\n quotientDigit, shift, carry, borrow, i, l, q;\r\n if (remainder.length <= a_l) remainder.push(0);\r\n divisor.push(0);\r\n divisorMostSignificantDigit = divisor[b_l - 1];\r\n for (shift = a_l - b_l; shift >= 0; shift--) {\r\n quotientDigit = base - 1;\r\n if (remainder[shift + b_l] !== divisorMostSignificantDigit) {\r\n quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);\r\n }\r\n // quotientDigit <= base - 1\r\n carry = 0;\r\n borrow = 0;\r\n l = divisor.length;\r\n for (i = 0; i < l; i++) {\r\n carry += quotientDigit * divisor[i];\r\n q = Math.floor(carry / base);\r\n borrow += remainder[shift + i] - (carry - q * base);\r\n carry = q;\r\n if (borrow < 0) {\r\n remainder[shift + i] = borrow + base;\r\n borrow = -1;\r\n } else {\r\n remainder[shift + i] = borrow;\r\n borrow = 0;\r\n }\r\n }\r\n while (borrow !== 0) {\r\n quotientDigit -= 1;\r\n carry = 0;\r\n for (i = 0; i < l; i++) {\r\n carry += remainder[shift + i] - base + divisor[i];\r\n if (carry < 0) {\r\n remainder[shift + i] = carry + base;\r\n carry = 0;\r\n } else {\r\n remainder[shift + i] = carry;\r\n carry = 1;\r\n }\r\n }\r\n borrow += carry;\r\n }\r\n result[shift] = quotientDigit;\r\n }\r\n // denormalization\r\n remainder = divModSmall(remainder, lambda)[0];\r\n return [arrayToSmall(result), arrayToSmall(remainder)];\r\n }\r\n\r\n function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/\r\n // Performs faster than divMod1 on larger input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n result = [],\r\n part = [],\r\n base = BASE,\r\n guess, xlen, highx, highy, check;\r\n while (a_l) {\r\n part.unshift(a[--a_l]);\r\n trim(part);\r\n if (compareAbs(part, b) < 0) {\r\n result.push(0);\r\n continue;\r\n }\r\n xlen = part.length;\r\n highx = part[xlen - 1] * base + part[xlen - 2];\r\n highy = b[b_l - 1] * base + b[b_l - 2];\r\n if (xlen > b_l) {\r\n highx = (highx + 1) * base;\r\n }\r\n guess = Math.ceil(highx / highy);\r\n do {\r\n check = multiplySmall(b, guess);\r\n if (compareAbs(check, part) <= 0) break;\r\n guess--;\r\n } while (guess);\r\n result.push(guess);\r\n part = subtract(part, check);\r\n }\r\n result.reverse();\r\n return [arrayToSmall(result), arrayToSmall(part)];\r\n }\r\n\r\n function divModSmall(value, lambda) {\r\n var length = value.length,\r\n quotient = createArray(length),\r\n base = BASE,\r\n i, q, remainder, divisor;\r\n remainder = 0;\r\n for (i = length - 1; i >= 0; --i) {\r\n divisor = remainder * base + value[i];\r\n q = truncate(divisor / lambda);\r\n remainder = divisor - q * lambda;\r\n quotient[i] = q | 0;\r\n }\r\n return [quotient, remainder | 0];\r\n }\r\n\r\n function divModAny(self, v) {\r\n var value, n = parseValue(v);\r\n if (supportsNativeBigInt) {\r\n return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];\r\n }\r\n var a = self.value, b = n.value;\r\n var quotient;\r\n if (b === 0) throw new Error(\"Cannot divide by zero\");\r\n if (self.isSmall) {\r\n if (n.isSmall) {\r\n return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];\r\n }\r\n return [Integer[0], self];\r\n }\r\n if (n.isSmall) {\r\n if (b === 1) return [self, Integer[0]];\r\n if (b == -1) return [self.negate(), Integer[0]];\r\n var abs = Math.abs(b);\r\n if (abs < BASE) {\r\n value = divModSmall(a, abs);\r\n quotient = arrayToSmall(value[0]);\r\n var remainder = value[1];\r\n if (self.sign) remainder = -remainder;\r\n if (typeof quotient === \"number\") {\r\n if (self.sign !== n.sign) quotient = -quotient;\r\n return [new SmallInteger(quotient), new SmallInteger(remainder)];\r\n }\r\n return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];\r\n }\r\n b = smallToArray(abs);\r\n }\r\n var comparison = compareAbs(a, b);\r\n if (comparison === -1) return [Integer[0], self];\r\n if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];\r\n\r\n // divMod1 is faster on smaller input sizes\r\n if (a.length + b.length <= 200)\r\n value = divMod1(a, b);\r\n else value = divMod2(a, b);\r\n\r\n quotient = value[0];\r\n var qSign = self.sign !== n.sign,\r\n mod = value[1],\r\n mSign = self.sign;\r\n if (typeof quotient === \"number\") {\r\n if (qSign) quotient = -quotient;\r\n quotient = new SmallInteger(quotient);\r\n } else quotient = new BigInteger(quotient, qSign);\r\n if (typeof mod === \"number\") {\r\n if (mSign) mod = -mod;\r\n mod = new SmallInteger(mod);\r\n } else mod = new BigInteger(mod, mSign);\r\n return [quotient, mod];\r\n }\r\n\r\n BigInteger.prototype.divmod = function (v) {\r\n var result = divModAny(this, v);\r\n return {\r\n quotient: result[0],\r\n remainder: result[1]\r\n };\r\n };\r\n NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;\r\n\r\n\r\n BigInteger.prototype.divide = function (v) {\r\n return divModAny(this, v)[0];\r\n };\r\n NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {\r\n return new NativeBigInt(this.value / parseValue(v).value);\r\n };\r\n SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;\r\n\r\n BigInteger.prototype.mod = function (v) {\r\n return divModAny(this, v)[1];\r\n };\r\n NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {\r\n return new NativeBigInt(this.value % parseValue(v).value);\r\n };\r\n SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;\r\n\r\n BigInteger.prototype.pow = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value,\r\n value, x, y;\r\n if (b === 0) return Integer[1];\r\n if (a === 0) return Integer[0];\r\n if (a === 1) return Integer[1];\r\n if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.sign) {\r\n return Integer[0];\r\n }\r\n if (!n.isSmall) throw new Error(\"The exponent \" + n.toString() + \" is too large.\");\r\n if (this.isSmall) {\r\n if (isPrecise(value = Math.pow(a, b)))\r\n return new SmallInteger(truncate(value));\r\n }\r\n x = this;\r\n y = Integer[1];\r\n while (true) {\r\n if (b & 1 === 1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === 0) break;\r\n b /= 2;\r\n x = x.square();\r\n }\r\n return y;\r\n };\r\n SmallInteger.prototype.pow = BigInteger.prototype.pow;\r\n\r\n NativeBigInt.prototype.pow = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value, b = n.value;\r\n var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);\r\n if (b === _0) return Integer[1];\r\n if (a === _0) return Integer[0];\r\n if (a === _1) return Integer[1];\r\n if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.isNegative()) return new NativeBigInt(_0);\r\n var x = this;\r\n var y = Integer[1];\r\n while (true) {\r\n if ((b & _1) === _1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === _0) break;\r\n b /= _2;\r\n x = x.square();\r\n }\r\n return y;\r\n }\r\n\r\n BigInteger.prototype.modPow = function (exp, mod) {\r\n exp = parseValue(exp);\r\n mod = parseValue(mod);\r\n if (mod.isZero()) throw new Error(\"Cannot take modPow with modulus 0\");\r\n var r = Integer[1],\r\n base = this.mod(mod);\r\n if (exp.isNegative()) {\r\n exp = exp.multiply(Integer[-1]);\r\n base = base.modInv(mod);\r\n }\r\n while (exp.isPositive()) {\r\n if (base.isZero()) return Integer[0];\r\n if (exp.isOdd()) r = r.multiply(base).mod(mod);\r\n exp = exp.divide(2);\r\n base = base.square().mod(mod);\r\n }\r\n return r;\r\n };\r\n NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;\r\n\r\n function compareAbs(a, b) {\r\n if (a.length !== b.length) {\r\n return a.length > b.length ? 1 : -1;\r\n }\r\n for (var i = a.length - 1; i >= 0; i--) {\r\n if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n\r\n BigInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) return 1;\r\n return compareAbs(a, b);\r\n };\r\n SmallInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = Math.abs(this.value),\r\n b = n.value;\r\n if (n.isSmall) {\r\n b = Math.abs(b);\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n return -1;\r\n };\r\n NativeBigInt.prototype.compareAbs = function (v) {\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n a = a >= 0 ? a : -a;\r\n b = b >= 0 ? b : -b;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n\r\n BigInteger.prototype.compare = function (v) {\r\n // See discussion about comparison with Infinity:\r\n // https://github.com/peterolson/BigInteger.js/issues/61\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (this.sign !== n.sign) {\r\n return n.sign ? 1 : -1;\r\n }\r\n if (n.isSmall) {\r\n return this.sign ? -1 : 1;\r\n }\r\n return compareAbs(a, b) * (this.sign ? -1 : 1);\r\n };\r\n BigInteger.prototype.compareTo = BigInteger.prototype.compare;\r\n\r\n SmallInteger.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) {\r\n return a == b ? 0 : a > b ? 1 : -1;\r\n }\r\n if (a < 0 !== n.sign) {\r\n return a < 0 ? -1 : 1;\r\n }\r\n return a < 0 ? 1 : -1;\r\n };\r\n SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;\r\n\r\n NativeBigInt.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;\r\n\r\n BigInteger.prototype.equals = function (v) {\r\n return this.compare(v) === 0;\r\n };\r\n NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;\r\n\r\n BigInteger.prototype.notEquals = function (v) {\r\n return this.compare(v) !== 0;\r\n };\r\n NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;\r\n\r\n BigInteger.prototype.greater = function (v) {\r\n return this.compare(v) > 0;\r\n };\r\n NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;\r\n\r\n BigInteger.prototype.lesser = function (v) {\r\n return this.compare(v) < 0;\r\n };\r\n NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;\r\n\r\n BigInteger.prototype.greaterOrEquals = function (v) {\r\n return this.compare(v) >= 0;\r\n };\r\n NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;\r\n\r\n BigInteger.prototype.lesserOrEquals = function (v) {\r\n return this.compare(v) <= 0;\r\n };\r\n NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;\r\n\r\n BigInteger.prototype.isEven = function () {\r\n return (this.value[0] & 1) === 0;\r\n };\r\n SmallInteger.prototype.isEven = function () {\r\n return (this.value & 1) === 0;\r\n };\r\n NativeBigInt.prototype.isEven = function () {\r\n return (this.value & BigInt(1)) === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isOdd = function () {\r\n return (this.value[0] & 1) === 1;\r\n };\r\n SmallInteger.prototype.isOdd = function () {\r\n return (this.value & 1) === 1;\r\n };\r\n NativeBigInt.prototype.isOdd = function () {\r\n return (this.value & BigInt(1)) === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isPositive = function () {\r\n return !this.sign;\r\n };\r\n SmallInteger.prototype.isPositive = function () {\r\n return this.value > 0;\r\n };\r\n NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;\r\n\r\n BigInteger.prototype.isNegative = function () {\r\n return this.sign;\r\n };\r\n SmallInteger.prototype.isNegative = function () {\r\n return this.value < 0;\r\n };\r\n NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;\r\n\r\n BigInteger.prototype.isUnit = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isUnit = function () {\r\n return Math.abs(this.value) === 1;\r\n };\r\n NativeBigInt.prototype.isUnit = function () {\r\n return this.abs().value === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isZero = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isZero = function () {\r\n return this.value === 0;\r\n };\r\n NativeBigInt.prototype.isZero = function () {\r\n return this.value === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isDivisibleBy = function (v) {\r\n var n = parseValue(v);\r\n if (n.isZero()) return false;\r\n if (n.isUnit()) return true;\r\n if (n.compareAbs(2) === 0) return this.isEven();\r\n return this.mod(n).isZero();\r\n };\r\n NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;\r\n\r\n function isBasicPrime(v) {\r\n var n = v.abs();\r\n if (n.isUnit()) return false;\r\n if (n.equals(2) || n.equals(3) || n.equals(5)) return true;\r\n if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;\r\n if (n.lesser(49)) return true;\r\n // we don't know if it's prime: let the other functions figure it out\r\n }\r\n\r\n function millerRabinTest(n, a) {\r\n var nPrev = n.prev(),\r\n b = nPrev,\r\n r = 0,\r\n d, t, i, x;\r\n while (b.isEven()) b = b.divide(2), r++;\r\n next: for (i = 0; i < a.length; i++) {\r\n if (n.lesser(a[i])) continue;\r\n x = bigInt(a[i]).modPow(b, n);\r\n if (x.isUnit() || x.equals(nPrev)) continue;\r\n for (d = r - 1; d != 0; d--) {\r\n x = x.square().mod(n);\r\n if (x.isUnit()) return false;\r\n if (x.equals(nPrev)) continue next;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Set \"strict\" to true to force GRH-supported lower bound of 2*log(N)^2\r\n BigInteger.prototype.isPrime = function (strict) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var bits = n.bitLength();\r\n if (bits <= 64)\r\n return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\r\n var logN = Math.log(2) * bits.toJSNumber();\r\n var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt(i + 2));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;\r\n\r\n BigInteger.prototype.isProbablePrime = function (iterations, rng) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var t = iterations === undefined ? 5 : iterations;\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt.randBetween(2, n.minus(2), rng));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;\r\n\r\n BigInteger.prototype.modInv = function (n) {\r\n var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;\r\n while (!newR.isZero()) {\r\n q = r.divide(newR);\r\n lastT = t;\r\n lastR = r;\r\n t = newT;\r\n r = newR;\r\n newT = lastT.subtract(q.multiply(newT));\r\n newR = lastR.subtract(q.multiply(newR));\r\n }\r\n if (!r.isUnit()) throw new Error(this.toString() + \" and \" + n.toString() + \" are not co-prime\");\r\n if (t.compare(0) === -1) {\r\n t = t.add(n);\r\n }\r\n if (this.isNegative()) {\r\n return t.negate();\r\n }\r\n return t;\r\n };\r\n\r\n NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;\r\n\r\n BigInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return subtractSmall(value, 1, this.sign);\r\n }\r\n return new BigInteger(addSmall(value, 1), this.sign);\r\n };\r\n SmallInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (value + 1 < MAX_INT) return new SmallInteger(value + 1);\r\n return new BigInteger(MAX_INT_ARR, false);\r\n };\r\n NativeBigInt.prototype.next = function () {\r\n return new NativeBigInt(this.value + BigInt(1));\r\n }\r\n\r\n BigInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return new BigInteger(addSmall(value, 1), true);\r\n }\r\n return subtractSmall(value, 1, this.sign);\r\n };\r\n SmallInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);\r\n return new BigInteger(MAX_INT_ARR, true);\r\n };\r\n NativeBigInt.prototype.prev = function () {\r\n return new NativeBigInt(this.value - BigInt(1));\r\n }\r\n\r\n var powersOfTwo = [1];\r\n while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);\r\n var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];\r\n\r\n function shift_isSmall(n) {\r\n return Math.abs(n) <= BASE;\r\n }\r\n\r\n BigInteger.prototype.shiftLeft = function (v) {\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftRight(-n);\r\n var result = this;\r\n if (result.isZero()) return result;\r\n while (n >= powers2Length) {\r\n result = result.multiply(highestPower2);\r\n n -= powers2Length - 1;\r\n }\r\n return result.multiply(powersOfTwo[n]);\r\n };\r\n NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;\r\n\r\n BigInteger.prototype.shiftRight = function (v) {\r\n var remQuo;\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftLeft(-n);\r\n var result = this;\r\n while (n >= powers2Length) {\r\n if (result.isZero() || (result.isNegative() && result.isUnit())) return result;\r\n remQuo = divModAny(result, highestPower2);\r\n result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n n -= powers2Length - 1;\r\n }\r\n remQuo = divModAny(result, powersOfTwo[n]);\r\n return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n };\r\n NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;\r\n\r\n function bitwise(x, y, fn) {\r\n y = parseValue(y);\r\n var xSign = x.isNegative(), ySign = y.isNegative();\r\n var xRem = xSign ? x.not() : x,\r\n yRem = ySign ? y.not() : y;\r\n var xDigit = 0, yDigit = 0;\r\n var xDivMod = null, yDivMod = null;\r\n var result = [];\r\n while (!xRem.isZero() || !yRem.isZero()) {\r\n xDivMod = divModAny(xRem, highestPower2);\r\n xDigit = xDivMod[1].toJSNumber();\r\n if (xSign) {\r\n xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers\r\n }\r\n\r\n yDivMod = divModAny(yRem, highestPower2);\r\n yDigit = yDivMod[1].toJSNumber();\r\n if (ySign) {\r\n yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers\r\n }\r\n\r\n xRem = xDivMod[0];\r\n yRem = yDivMod[0];\r\n result.push(fn(xDigit, yDigit));\r\n }\r\n var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);\r\n for (var i = result.length - 1; i >= 0; i -= 1) {\r\n sum = sum.multiply(highestPower2).add(bigInt(result[i]));\r\n }\r\n return sum;\r\n }\r\n\r\n BigInteger.prototype.not = function () {\r\n return this.negate().prev();\r\n };\r\n NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;\r\n\r\n BigInteger.prototype.and = function (n) {\r\n return bitwise(this, n, function (a, b) { return a & b; });\r\n };\r\n NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;\r\n\r\n BigInteger.prototype.or = function (n) {\r\n return bitwise(this, n, function (a, b) { return a | b; });\r\n };\r\n NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;\r\n\r\n BigInteger.prototype.xor = function (n) {\r\n return bitwise(this, n, function (a, b) { return a ^ b; });\r\n };\r\n NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;\r\n\r\n var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;\r\n function roughLOB(n) { // get lowestOneBit (rough)\r\n // SmallInteger: return Min(lowestOneBit(n), 1 << 30)\r\n // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]\r\n var v = n.value,\r\n x = typeof v === \"number\" ? v | LOBMASK_I :\r\n typeof v === \"bigint\" ? v | BigInt(LOBMASK_I) :\r\n v[0] + v[1] * BASE | LOBMASK_BI;\r\n return x & -x;\r\n }\r\n\r\n function integerLogarithm(value, base) {\r\n if (base.compareTo(value) <= 0) {\r\n var tmp = integerLogarithm(value, base.square(base));\r\n var p = tmp.p;\r\n var e = tmp.e;\r\n var t = p.multiply(base);\r\n return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };\r\n }\r\n return { p: bigInt(1), e: 0 };\r\n }\r\n\r\n BigInteger.prototype.bitLength = function () {\r\n var n = this;\r\n if (n.compareTo(bigInt(0)) < 0) {\r\n n = n.negate().subtract(bigInt(1));\r\n }\r\n if (n.compareTo(bigInt(0)) === 0) {\r\n return bigInt(0);\r\n }\r\n return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));\r\n }\r\n NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;\r\n\r\n function max(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.greater(b) ? a : b;\r\n }\r\n function min(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.lesser(b) ? a : b;\r\n }\r\n function gcd(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n if (a.equals(b)) return a;\r\n if (a.isZero()) return b;\r\n if (b.isZero()) return a;\r\n var c = Integer[1], d, t;\r\n while (a.isEven() && b.isEven()) {\r\n d = min(roughLOB(a), roughLOB(b));\r\n a = a.divide(d);\r\n b = b.divide(d);\r\n c = c.multiply(d);\r\n }\r\n while (a.isEven()) {\r\n a = a.divide(roughLOB(a));\r\n }\r\n do {\r\n while (b.isEven()) {\r\n b = b.divide(roughLOB(b));\r\n }\r\n if (a.greater(b)) {\r\n t = b; b = a; a = t;\r\n }\r\n b = b.subtract(a);\r\n } while (!b.isZero());\r\n return c.isUnit() ? a : a.multiply(c);\r\n }\r\n function lcm(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n return a.divide(gcd(a, b)).multiply(b);\r\n }\r\n function randBetween(a, b, rng) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n var usedRNG = rng || Math.random;\r\n var low = min(a, b), high = max(a, b);\r\n var range = high.subtract(low).add(1);\r\n if (range.isSmall) return low.add(Math.floor(usedRNG() * range));\r\n var digits = toBase(range, BASE).value;\r\n var result = [], restricted = true;\r\n for (var i = 0; i < digits.length; i++) {\r\n var top = restricted ? digits[i] + (i + 1 < digits.length ? digits[i + 1] / BASE : 0) : BASE;\r\n var digit = truncate(usedRNG() * top);\r\n result.push(digit);\r\n if (digit < digits[i]) restricted = false;\r\n }\r\n return low.add(Integer.fromArray(result, BASE, false));\r\n }\r\n\r\n var parseBase = function (text, base, alphabet, caseSensitive) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n text = String(text);\r\n if (!caseSensitive) {\r\n text = text.toLowerCase();\r\n alphabet = alphabet.toLowerCase();\r\n }\r\n var length = text.length;\r\n var i;\r\n var absBase = Math.abs(base);\r\n var alphabetValues = {};\r\n for (i = 0; i < alphabet.length; i++) {\r\n alphabetValues[alphabet[i]] = i;\r\n }\r\n for (i = 0; i < length; i++) {\r\n var c = text[i];\r\n if (c === \"-\") continue;\r\n if (c in alphabetValues) {\r\n if (alphabetValues[c] >= absBase) {\r\n if (c === \"1\" && absBase === 1) continue;\r\n throw new Error(c + \" is not a valid digit in base \" + base + \".\");\r\n }\r\n }\r\n }\r\n base = parseValue(base);\r\n var digits = [];\r\n var isNegative = text[0] === \"-\";\r\n for (i = isNegative ? 1 : 0; i < text.length; i++) {\r\n var c = text[i];\r\n if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));\r\n else if (c === \"<\") {\r\n var start = i;\r\n do { i++; } while (text[i] !== \">\" && i < text.length);\r\n digits.push(parseValue(text.slice(start + 1, i)));\r\n }\r\n else throw new Error(c + \" is not a valid character\");\r\n }\r\n return parseBaseFromArray(digits, base, isNegative);\r\n };\r\n\r\n function parseBaseFromArray(digits, base, isNegative) {\r\n var val = Integer[0], pow = Integer[1], i;\r\n for (i = digits.length - 1; i >= 0; i--) {\r\n val = val.add(digits[i].times(pow));\r\n pow = pow.times(base);\r\n }\r\n return isNegative ? val.negate() : val;\r\n }\r\n\r\n function stringify(digit, alphabet) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n if (digit < alphabet.length) {\r\n return alphabet[digit];\r\n }\r\n return \"<\" + digit + \">\";\r\n }\r\n\r\n function toBase(n, base) {\r\n base = bigInt(base);\r\n if (base.isZero()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n throw new Error(\"Cannot convert nonzero numbers to base 0.\");\r\n }\r\n if (base.equals(-1)) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n if (n.isNegative())\r\n return {\r\n value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))\r\n .map(Array.prototype.valueOf, [1, 0])\r\n ),\r\n isNegative: false\r\n };\r\n\r\n var arr = Array.apply(null, Array(n.toJSNumber() - 1))\r\n .map(Array.prototype.valueOf, [0, 1]);\r\n arr.unshift([1]);\r\n return {\r\n value: [].concat.apply([], arr),\r\n isNegative: false\r\n };\r\n }\r\n\r\n var neg = false;\r\n if (n.isNegative() && base.isPositive()) {\r\n neg = true;\r\n n = n.abs();\r\n }\r\n if (base.isUnit()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n\r\n return {\r\n value: Array.apply(null, Array(n.toJSNumber()))\r\n .map(Number.prototype.valueOf, 1),\r\n isNegative: neg\r\n };\r\n }\r\n var out = [];\r\n var left = n, divmod;\r\n while (left.isNegative() || left.compareAbs(base) >= 0) {\r\n divmod = left.divmod(base);\r\n left = divmod.quotient;\r\n var digit = divmod.remainder;\r\n if (digit.isNegative()) {\r\n digit = base.minus(digit).abs();\r\n left = left.next();\r\n }\r\n out.push(digit.toJSNumber());\r\n }\r\n out.push(left.toJSNumber());\r\n return { value: out.reverse(), isNegative: neg };\r\n }\r\n\r\n function toBaseString(n, base, alphabet) {\r\n var arr = toBase(n, base);\r\n return (arr.isNegative ? \"-\" : \"\") + arr.value.map(function (x) {\r\n return stringify(x, alphabet);\r\n }).join('');\r\n }\r\n\r\n BigInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n SmallInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n NativeBigInt.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n BigInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix !== 10) return toBaseString(this, radix, alphabet);\r\n var v = this.value, l = v.length, str = String(v[--l]), zeros = \"0000000\", digit;\r\n while (--l >= 0) {\r\n digit = String(v[l]);\r\n str += zeros.slice(digit.length) + digit;\r\n }\r\n var sign = this.sign ? \"-\" : \"\";\r\n return sign + str;\r\n };\r\n\r\n SmallInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix != 10) return toBaseString(this, radix, alphabet);\r\n return String(this.value);\r\n };\r\n\r\n NativeBigInt.prototype.toString = SmallInteger.prototype.toString;\r\n\r\n NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }\r\n\r\n BigInteger.prototype.valueOf = function () {\r\n return parseInt(this.toString(), 10);\r\n };\r\n BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;\r\n\r\n SmallInteger.prototype.valueOf = function () {\r\n return this.value;\r\n };\r\n SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;\r\n NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {\r\n return parseInt(this.toString(), 10);\r\n }\r\n\r\n function parseStringValue(v) {\r\n if (isPrecise(+v)) {\r\n var x = +v;\r\n if (x === truncate(x))\r\n return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);\r\n throw new Error(\"Invalid integer: \" + v);\r\n }\r\n var sign = v[0] === \"-\";\r\n if (sign) v = v.slice(1);\r\n var split = v.split(/e/i);\r\n if (split.length > 2) throw new Error(\"Invalid integer: \" + split.join(\"e\"));\r\n if (split.length === 2) {\r\n var exp = split[1];\r\n if (exp[0] === \"+\") exp = exp.slice(1);\r\n exp = +exp;\r\n if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error(\"Invalid integer: \" + exp + \" is not a valid exponent.\");\r\n var text = split[0];\r\n var decimalPlace = text.indexOf(\".\");\r\n if (decimalPlace >= 0) {\r\n exp -= text.length - decimalPlace - 1;\r\n text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);\r\n }\r\n if (exp < 0) throw new Error(\"Cannot include negative exponent part for integers\");\r\n text += (new Array(exp + 1)).join(\"0\");\r\n v = text;\r\n }\r\n var isValid = /^([0-9][0-9]*)$/.test(v);\r\n if (!isValid) throw new Error(\"Invalid integer: \" + v);\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(sign ? \"-\" + v : v));\r\n }\r\n var r = [], max = v.length, l = LOG_BASE, min = max - l;\r\n while (max > 0) {\r\n r.push(+v.slice(min, max));\r\n min -= l;\r\n if (min < 0) min = 0;\r\n max -= l;\r\n }\r\n trim(r);\r\n return new BigInteger(r, sign);\r\n }\r\n\r\n function parseNumberValue(v) {\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(v));\r\n }\r\n if (isPrecise(v)) {\r\n if (v !== truncate(v)) throw new Error(v + \" is not an integer.\");\r\n return new SmallInteger(v);\r\n }\r\n return parseStringValue(v.toString());\r\n }\r\n\r\n function parseValue(v) {\r\n if (typeof v === \"number\") {\r\n return parseNumberValue(v);\r\n }\r\n if (typeof v === \"string\") {\r\n return parseStringValue(v);\r\n }\r\n if (typeof v === \"bigint\") {\r\n return new NativeBigInt(v);\r\n }\r\n return v;\r\n }\r\n // Pre-define numbers in range [-999,999]\r\n for (var i = 0; i < 1000; i++) {\r\n Integer[i] = parseValue(i);\r\n if (i > 0) Integer[-i] = parseValue(-i);\r\n }\r\n // Backwards compatibility\r\n Integer.one = Integer[1];\r\n Integer.zero = Integer[0];\r\n Integer.minusOne = Integer[-1];\r\n Integer.max = max;\r\n Integer.min = min;\r\n Integer.gcd = gcd;\r\n Integer.lcm = lcm;\r\n Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };\r\n Integer.randBetween = randBetween;\r\n\r\n Integer.fromArray = function (digits, base, isNegative) {\r\n return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);\r\n };\r\n\r\n return Integer;\r\n})();\r\n\r\n// Node.js check\r\nif (typeof module !== \"undefined\" && module.hasOwnProperty(\"exports\")) {\r\n module.exports = bigInt;\r\n}\r\n\r\n//amd check\r\nif (typeof define === \"function\" && define.amd) {\r\n define( function () {\r\n return bigInt;\r\n });\r\n}\r\n"],"names":["BASE","MAX_INT","MAX_INT_ARR","smallToArray","DEFAULT_ALPHABET","supportsNativeBigInt","BigInt","Integer","v","radix","alphabet","caseSensitive","parseValue","parseBase","BigInteger","value","sign","this","isSmall","SmallInteger","NativeBigInt","isPrecise","n","Math","floor","arrayToSmall","arr","trim","length","compareAbs","i","createArray","x","Array","truncate","ceil","add","a","b","sum","l_a","l_b","r","carry","base","push","addAny","addSmall","l","subtract","difference","a_l","b_l","borrow","subtractSmall","multiplyLong","product","a_i","j","multiplySmall","shiftLeft","concat","multiplyKaratsuba","y","max","slice","d","c","ac","bd","abcd","multiplySmallAndArray","square","divModSmall","lambda","q","remainder","divisor","quotient","divModAny","self","Error","negate","abs","comparison","quotientDigit","shift","result","divisorMostSignificantDigit","divMod1","guess","xlen","highx","highy","check","part","unshift","reverse","divMod2","qSign","mod","mSign","isBasicPrime","isUnit","equals","isEven","isDivisibleBy","lesser","millerRabinTest","nPrev","prev","divide","next","bigInt","modPow","prototype","Object","create","plus","subtractAny","minus","small","multiply","l1","l2","times","_multiplyBySmall","divmod","over","pow","toString","_0","_1","_2","isNegative","exp","isZero","modInv","isPositive","isOdd","compare","Infinity","compareTo","eq","notEquals","neq","greater","gt","lt","greaterOrEquals","geq","lesserOrEquals","leq","isPrime","strict","undefined","bits","bitLength","logN","log","toJSNumber","t","isProbablePrime","iterations","rng","randBetween","lastT","lastR","zero","newT","one","newR","powersOfTwo","powers2Length","highestPower2","shift_isSmall","bitwise","fn","xSign","ySign","xRem","not","yRem","xDigit","yDigit","xDivMod","yDivMod","String","shiftRight","remQuo","and","or","xor","LOBMASK_I","roughLOB","integerLogarithm","tmp","p","e","min","gcd","text","toLowerCase","absBase","alphabetValues","digits","start","parseBaseFromArray","val","toBase","apply","map","valueOf","neg","Number","out","left","digit","toBaseString","stringify","join","parseStringValue","split","decimalPlace","indexOf","test","parseNumberValue","toArray","str","toJSON","parseInt","minusOne","lcm","isInstance","usedRNG","random","low","range","restricted","top","fromArray","module","hasOwnProperty","exports"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.fast-png.f6db8063094ac9670661.chunk.js b/public/npm.fast-png.f6db8063094ac9670661.chunk.js new file mode 100644 index 000000000..87f824312 --- /dev/null +++ b/public/npm.fast-png.f6db8063094ac9670661.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[866],{2553:(t,e,r)=>{r.d(e,{cv:()=>g});var i=r(5666),n=r(7885);const h=[137,80,78,71,13,10,26,10],s=[];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)1&e?e=3988292384^e>>>1:e>>>=1;s[t]=e}const o=4294967295;var c,a,w,E,N,A,d,l;(l=c||(c={}))[l.UNKNOWN=-1]="UNKNOWN",l[l.GREYSCALE=0]="GREYSCALE",l[l.TRUECOLOUR=2]="TRUECOLOUR",l[l.INDEXED_COLOUR=3]="INDEXED_COLOUR",l[l.GREYSCALE_ALPHA=4]="GREYSCALE_ALPHA",l[l.TRUECOLOUR_ALPHA=6]="TRUECOLOUR_ALPHA",(d=a||(a={}))[d.UNKNOWN=-1]="UNKNOWN",d[d.DEFLATE=0]="DEFLATE",(A=w||(w={}))[A.UNKNOWN=-1]="UNKNOWN",A[A.ADAPTIVE=0]="ADAPTIVE",(N=E||(E={}))[N.UNKNOWN=-1]="UNKNOWN",N[N.NO_INTERLACE=0]="NO_INTERLACE",N[N.ADAM7=1]="ADAM7",new Uint8Array(0);const u=new Uint16Array([255]);new Uint8Array(u.buffer)[0];const U={level:3};class p extends i.l{constructor(t,e={}){super(),this._colorType=c.UNKNOWN,this._zlibOptions=Object.assign({},U,e.zlib),this._png=this._checkData(t),this.setBigEndian()}encode(){return this.encodeSignature(),this.encodeIHDR(),this.encodeData(),this.encodeIEND(),this.toArray()}encodeSignature(){this.writeBytes(h)}encodeIHDR(){this.writeUint32(13),this.writeChars("IHDR"),this.writeUint32(this._png.width),this.writeUint32(this._png.height),this.writeByte(this._png.depth),this.writeByte(this._colorType),this.writeByte(a.DEFLATE),this.writeByte(w.ADAPTIVE),this.writeByte(E.NO_INTERLACE),this.writeCrc(17)}encodeIEND(){this.writeUint32(0),this.writeChars("IEND"),this.writeCrc(4)}encodeIDAT(t){this.writeUint32(t.length),this.writeChars("IDAT"),this.writeBytes(t),this.writeCrc(t.length+4)}encodeData(){const{width:t,height:e,channels:r,depth:h,data:s}=this._png,o=r*t,c=(new i.l).setBigEndian();let a=0;for(let t=0;t>>8;return i}(0,t,e)^o)>>>0}(new Uint8Array(this.buffer,this.byteOffset+this.offset-t,t),t))}}function O(t,e){if(Number.isInteger(t)&&t>0)return t;throw new TypeError(`${e} must be a positive integer`)}function f(t,e,r,i){for(let n=0;n>> 1);\n }\n else {\n c = c >>> 1;\n }\n }\n crcTable[n] = c;\n}\nconst initialCrc = 0xffffffff;\nfunction updateCrc(currentCrc, data, length) {\n let c = currentCrc;\n for (let n = 0; n < length; n++) {\n c = crcTable[(c ^ data[n]) & 0xff] ^ (c >>> 8);\n }\n return c;\n}\nexport function crc(data, length) {\n return (updateCrc(initialCrc, data, length) ^ initialCrc) >>> 0;\n}\n//# sourceMappingURL=common.js.map","export var ColorType;\n(function (ColorType) {\n ColorType[ColorType[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n ColorType[ColorType[\"GREYSCALE\"] = 0] = \"GREYSCALE\";\n ColorType[ColorType[\"TRUECOLOUR\"] = 2] = \"TRUECOLOUR\";\n ColorType[ColorType[\"INDEXED_COLOUR\"] = 3] = \"INDEXED_COLOUR\";\n ColorType[ColorType[\"GREYSCALE_ALPHA\"] = 4] = \"GREYSCALE_ALPHA\";\n ColorType[ColorType[\"TRUECOLOUR_ALPHA\"] = 6] = \"TRUECOLOUR_ALPHA\";\n})(ColorType || (ColorType = {}));\nexport var CompressionMethod;\n(function (CompressionMethod) {\n CompressionMethod[CompressionMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n CompressionMethod[CompressionMethod[\"DEFLATE\"] = 0] = \"DEFLATE\";\n})(CompressionMethod || (CompressionMethod = {}));\nexport var FilterMethod;\n(function (FilterMethod) {\n FilterMethod[FilterMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n FilterMethod[FilterMethod[\"ADAPTIVE\"] = 0] = \"ADAPTIVE\";\n})(FilterMethod || (FilterMethod = {}));\nexport var InterlaceMethod;\n(function (InterlaceMethod) {\n InterlaceMethod[InterlaceMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n InterlaceMethod[InterlaceMethod[\"NO_INTERLACE\"] = 0] = \"NO_INTERLACE\";\n InterlaceMethod[InterlaceMethod[\"ADAM7\"] = 1] = \"ADAM7\";\n})(InterlaceMethod || (InterlaceMethod = {}));\n//# sourceMappingURL=internalTypes.js.map","import { IOBuffer } from 'iobuffer';\nimport { inflate, Inflate as Inflator } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst empty = new Uint8Array(0);\nconst NULL = '\\0';\nconst uint16 = new Uint16Array([0x00ff]);\nconst uint8 = new Uint8Array(uint16.buffer);\nconst osIsLittleEndian = uint8[0] === 0xff;\nexport default class PngDecoder extends IOBuffer {\n constructor(data, options = {}) {\n super(data);\n const { checkCrc = false } = options;\n this._checkCrc = checkCrc;\n this._inflator = new Inflator();\n this._png = {\n width: -1,\n height: -1,\n channels: -1,\n data: new Uint8Array(0),\n depth: 1,\n text: {},\n };\n this._end = false;\n this._hasPalette = false;\n this._palette = [];\n this._compressionMethod = CompressionMethod.UNKNOWN;\n this._filterMethod = FilterMethod.UNKNOWN;\n this._interlaceMethod = InterlaceMethod.UNKNOWN;\n this._colorType = -1;\n // PNG is always big endian\n // https://www.w3.org/TR/PNG/#7Integers-and-byte-order\n this.setBigEndian();\n }\n decode() {\n this.decodeSignature();\n while (!this._end) {\n this.decodeChunk();\n }\n this.decodeImage();\n return this._png;\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n decodeSignature() {\n for (let i = 0; i < pngSignature.length; i++) {\n if (this.readUint8() !== pngSignature[i]) {\n throw new Error(`wrong PNG signature. Byte at ${i} should be ${pngSignature[i]}.`);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#5Chunk-layout\n decodeChunk() {\n const length = this.readUint32();\n const type = this.readChars(4);\n const offset = this.offset;\n switch (type) {\n // 11.2 Critical chunks\n case 'IHDR': // 11.2.2 IHDR Image header\n this.decodeIHDR();\n break;\n case 'PLTE': // 11.2.3 PLTE Palette\n this.decodePLTE(length);\n break;\n case 'IDAT': // 11.2.4 IDAT Image data\n this.decodeIDAT(length);\n break;\n case 'IEND': // 11.2.5 IEND Image trailer\n this._end = true;\n break;\n // 11.3 Ancillary chunks\n case 'tRNS': // 11.3.2.1 tRNS Transparency\n this.decodetRNS(length);\n break;\n case 'iCCP': // 11.3.3.3 iCCP Embedded ICC profile\n this.decodeiCCP(length);\n break;\n case 'tEXt': // 11.3.4.3 tEXt Textual data\n this.decodetEXt(length);\n break;\n case 'pHYs': // 11.3.5.3 pHYs Physical pixel dimensions\n this.decodepHYs();\n break;\n default:\n this.skip(length);\n break;\n }\n if (this.offset - offset !== length) {\n throw new Error(`Length mismatch while decoding chunk ${type}`);\n }\n if (this._checkCrc) {\n const expectedCrc = this.readUint32();\n const crcLength = length + 4; // includes type\n const actualCrc = crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - crcLength - 4, crcLength), crcLength); // \"- 4\" because we already advanced by reading the CRC\n if (actualCrc !== expectedCrc) {\n throw new Error(`CRC mismatch for chunk ${type}. Expected ${expectedCrc}, found ${actualCrc}`);\n }\n }\n else {\n this.skip(4);\n }\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n decodeIHDR() {\n const image = this._png;\n image.width = this.readUint32();\n image.height = this.readUint32();\n image.depth = checkBitDepth(this.readUint8());\n const colorType = this.readUint8();\n this._colorType = colorType;\n let channels;\n switch (colorType) {\n case ColorType.GREYSCALE:\n channels = 1;\n break;\n case ColorType.TRUECOLOUR:\n channels = 3;\n break;\n case ColorType.INDEXED_COLOUR:\n channels = 1;\n break;\n case ColorType.GREYSCALE_ALPHA:\n channels = 2;\n break;\n case ColorType.TRUECOLOUR_ALPHA:\n channels = 4;\n break;\n default:\n throw new Error(`Unknown color type: ${colorType}`);\n }\n this._png.channels = channels;\n this._compressionMethod = this.readUint8();\n if (this._compressionMethod !== CompressionMethod.DEFLATE) {\n throw new Error(`Unsupported compression method: ${this._compressionMethod}`);\n }\n this._filterMethod = this.readUint8();\n this._interlaceMethod = this.readUint8();\n }\n // https://www.w3.org/TR/PNG/#11PLTE\n decodePLTE(length) {\n if (length % 3 !== 0) {\n throw new RangeError(`PLTE field length must be a multiple of 3. Got ${length}`);\n }\n const l = length / 3;\n this._hasPalette = true;\n const palette = [];\n this._palette = palette;\n for (let i = 0; i < l; i++) {\n palette.push([this.readUint8(), this.readUint8(), this.readUint8()]);\n }\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n decodeIDAT(length) {\n this._inflator.push(new Uint8Array(this.buffer, this.offset + this.byteOffset, length));\n this.skip(length);\n }\n // https://www.w3.org/TR/PNG/#11tRNS\n decodetRNS(length) {\n // TODO: support other color types.\n if (this._colorType === 3) {\n if (length > this._palette.length) {\n throw new Error(`tRNS chunk contains more alpha values than there are palette colors (${length} vs ${this._palette.length})`);\n }\n let i = 0;\n for (; i < length; i++) {\n const alpha = this.readByte();\n this._palette[i].push(alpha);\n }\n for (; i < this._palette.length; i++) {\n this._palette[i].push(255);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#11iCCP\n decodeiCCP(length) {\n let name = '';\n let char;\n while ((char = this.readChar()) !== NULL) {\n name += char;\n }\n const compressionMethod = this.readUint8();\n if (compressionMethod !== CompressionMethod.DEFLATE) {\n throw new Error(`Unsupported iCCP compression method: ${compressionMethod}`);\n }\n const compressedProfile = this.readBytes(length - name.length - 2);\n this._png.iccEmbeddedProfile = {\n name: name,\n profile: inflate(compressedProfile),\n };\n }\n // https://www.w3.org/TR/PNG/#11tEXt\n decodetEXt(length) {\n let keyword = '';\n let char;\n while ((char = this.readChar()) !== NULL) {\n keyword += char;\n }\n this._png.text[keyword] = this.readChars(length - keyword.length - 1);\n }\n // https://www.w3.org/TR/PNG/#11pHYs\n decodepHYs() {\n const ppuX = this.readUint32();\n const ppuY = this.readUint32();\n const unitSpecifier = this.readByte();\n this._png.resolution = { x: ppuX, y: ppuY, unit: unitSpecifier };\n }\n decodeImage() {\n if (this._inflator.err) {\n throw new Error(`Error while decompressing the data: ${this._inflator.err}`);\n }\n const data = this._inflator.result;\n if (this._filterMethod !== FilterMethod.ADAPTIVE) {\n throw new Error(`Filter method ${this._filterMethod} not supported`);\n }\n if (this._interlaceMethod === InterlaceMethod.NO_INTERLACE) {\n this.decodeInterlaceNull(data);\n }\n else {\n throw new Error(`Interlace method ${this._interlaceMethod} not supported`);\n }\n }\n decodeInterlaceNull(data) {\n const height = this._png.height;\n const bytesPerPixel = (this._png.channels * this._png.depth) / 8;\n const bytesPerLine = this._png.width * bytesPerPixel;\n const newData = new Uint8Array(this._png.height * bytesPerLine);\n let prevLine = empty;\n let offset = 0;\n let currentLine;\n let newLine;\n for (let i = 0; i < height; i++) {\n currentLine = data.subarray(offset + 1, offset + 1 + bytesPerLine);\n newLine = newData.subarray(i * bytesPerLine, (i + 1) * bytesPerLine);\n switch (data[offset]) {\n case 0:\n unfilterNone(currentLine, newLine, bytesPerLine);\n break;\n case 1:\n unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel);\n break;\n case 2:\n unfilterUp(currentLine, newLine, prevLine, bytesPerLine);\n break;\n case 3:\n unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n case 4:\n unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n default:\n throw new Error(`Unsupported filter: ${data[offset]}`);\n }\n prevLine = newLine;\n offset += bytesPerLine + 1;\n }\n if (this._hasPalette) {\n this._png.palette = this._palette;\n }\n if (this._png.depth === 16) {\n const uint16Data = new Uint16Array(newData.buffer);\n if (osIsLittleEndian) {\n for (let k = 0; k < uint16Data.length; k++) {\n // PNG is always big endian. Swap the bytes.\n uint16Data[k] = swap16(uint16Data[k]);\n }\n }\n this._png.data = uint16Data;\n }\n else {\n this._png.data = newData;\n }\n }\n}\nfunction unfilterNone(currentLine, newLine, bytesPerLine) {\n for (let i = 0; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n}\nfunction unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n for (; i < bytesPerPixel; i++) {\n // just copy first bytes\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n}\nfunction unfilterUp(currentLine, newLine, prevLine, bytesPerLine) {\n let i = 0;\n if (prevLine.length === 0) {\n // just copy bytes for first line\n for (; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n }\n else {\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n }\n}\nfunction unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + (newLine[i - bytesPerPixel] >> 1)) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + (prevLine[i] >> 1)) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] + ((newLine[i - bytesPerPixel] + prevLine[i]) >> 1)) &\n 0xff;\n }\n }\n}\nfunction unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] +\n paethPredictor(newLine[i - bytesPerPixel], prevLine[i], prevLine[i - bytesPerPixel])) &\n 0xff;\n }\n }\n}\nfunction paethPredictor(a, b, c) {\n const p = a + b - c;\n const pa = Math.abs(p - a);\n const pb = Math.abs(p - b);\n const pc = Math.abs(p - c);\n if (pa <= pb && pa <= pc)\n return a;\n else if (pb <= pc)\n return b;\n else\n return c;\n}\nfunction swap16(val) {\n return ((val & 0xff) << 8) | ((val >> 8) & 0xff);\n}\nfunction checkBitDepth(value) {\n if (value !== 1 &&\n value !== 2 &&\n value !== 4 &&\n value !== 8 &&\n value !== 16) {\n throw new Error(`invalid bit depth: ${value}`);\n }\n return value;\n}\n//# sourceMappingURL=PngDecoder.js.map","import { IOBuffer } from 'iobuffer';\nimport { deflate } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst defaultZlibOptions = {\n level: 3,\n};\nexport default class PngEncoder extends IOBuffer {\n constructor(data, options = {}) {\n super();\n this._colorType = ColorType.UNKNOWN;\n this._zlibOptions = Object.assign({}, defaultZlibOptions, options.zlib);\n this._png = this._checkData(data);\n this.setBigEndian();\n }\n encode() {\n this.encodeSignature();\n this.encodeIHDR();\n this.encodeData();\n this.encodeIEND();\n return this.toArray();\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n encodeSignature() {\n this.writeBytes(pngSignature);\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n encodeIHDR() {\n this.writeUint32(13);\n this.writeChars('IHDR');\n this.writeUint32(this._png.width);\n this.writeUint32(this._png.height);\n this.writeByte(this._png.depth);\n this.writeByte(this._colorType);\n this.writeByte(CompressionMethod.DEFLATE);\n this.writeByte(FilterMethod.ADAPTIVE);\n this.writeByte(InterlaceMethod.NO_INTERLACE);\n this.writeCrc(17);\n }\n // https://www.w3.org/TR/PNG/#11IEND\n encodeIEND() {\n this.writeUint32(0);\n this.writeChars('IEND');\n this.writeCrc(4);\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n encodeIDAT(data) {\n this.writeUint32(data.length);\n this.writeChars('IDAT');\n this.writeBytes(data);\n this.writeCrc(data.length + 4);\n }\n encodeData() {\n const { width, height, channels, depth, data } = this._png;\n const slotsPerLine = channels * width;\n const newData = new IOBuffer().setBigEndian();\n let offset = 0;\n for (let i = 0; i < height; i++) {\n newData.writeByte(0); // no filter\n /* istanbul ignore else */\n if (depth === 8) {\n offset = writeDataBytes(data, newData, slotsPerLine, offset);\n }\n else if (depth === 16) {\n offset = writeDataUint16(data, newData, slotsPerLine, offset);\n }\n else {\n throw new Error('unreachable');\n }\n }\n const buffer = newData.toArray();\n const compressed = deflate(buffer, this._zlibOptions);\n this.encodeIDAT(compressed);\n }\n _checkData(data) {\n const { colorType, channels, depth } = getColorType(data);\n const png = {\n width: checkInteger(data.width, 'width'),\n height: checkInteger(data.height, 'height'),\n channels: channels,\n data: data.data,\n depth: depth,\n text: {},\n };\n this._colorType = colorType;\n const expectedSize = png.width * png.height * channels;\n if (png.data.length !== expectedSize) {\n throw new RangeError(`wrong data size. Found ${png.data.length}, expected ${expectedSize}`);\n }\n return png;\n }\n writeCrc(length) {\n this.writeUint32(crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - length, length), length));\n }\n}\nfunction checkInteger(value, name) {\n if (Number.isInteger(value) && value > 0) {\n return value;\n }\n throw new TypeError(`${name} must be a positive integer`);\n}\nfunction getColorType(data) {\n const { channels = 4, depth = 8 } = data;\n if (channels !== 4 && channels !== 3 && channels !== 2 && channels !== 1) {\n throw new RangeError(`unsupported number of channels: ${channels}`);\n }\n if (depth !== 8 && depth !== 16) {\n throw new RangeError(`unsupported bit depth: ${depth}`);\n }\n const returnValue = { channels, depth, colorType: ColorType.UNKNOWN };\n switch (channels) {\n case 4:\n returnValue.colorType = ColorType.TRUECOLOUR_ALPHA;\n break;\n case 3:\n returnValue.colorType = ColorType.TRUECOLOUR;\n break;\n case 1:\n returnValue.colorType = ColorType.GREYSCALE;\n break;\n case 2:\n returnValue.colorType = ColorType.GREYSCALE_ALPHA;\n break;\n default:\n throw new Error('unsupported number of channels');\n }\n return returnValue;\n}\nfunction writeDataBytes(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeByte(data[offset++]);\n }\n return offset;\n}\nfunction writeDataUint16(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeUint16(data[offset++]);\n }\n return offset;\n}\n//# sourceMappingURL=PngEncoder.js.map","export var ResolutionUnitSpecifier;\n(function (ResolutionUnitSpecifier) {\n /**\n * Unit is unknown\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n /**\n * Unit is the metre\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"METRE\"] = 1] = \"METRE\";\n})(ResolutionUnitSpecifier || (ResolutionUnitSpecifier = {}));\n//# sourceMappingURL=types.js.map","import PngDecoder from './PngDecoder';\nimport PngEncoder from './PngEncoder';\nexport * from './types';\nfunction decodePng(data, options) {\n const decoder = new PngDecoder(data, options);\n return decoder.decode();\n}\nfunction encodePng(png, options) {\n const encoder = new PngEncoder(png, options);\n return encoder.encode();\n}\nexport { decodePng as decode, encodePng as encode };\n//# sourceMappingURL=index.js.map"],"names":["crcTable","n","c","k","initialCrc","InterlaceMethod","FilterMethod","CompressionMethod","ColorType","Uint8Array","uint16","Uint16Array","buffer","defaultZlibOptions","level","PngEncoder","constructor","data","options","super","this","_colorType","_zlibOptions","Object","assign","zlib","_png","_checkData","setBigEndian","encode","encodeSignature","encodeIHDR","encodeData","encodeIEND","toArray","writeBytes","writeUint32","writeChars","width","height","writeByte","depth","writeCrc","encodeIDAT","length","channels","slotsPerLine","newData","offset","i","writeDataBytes","Error","writeDataUint16","compressed","colorType","RangeError","returnValue","getColorType","png","checkInteger","text","expectedSize","currentCrc","updateCrc","byteOffset","value","name","Number","isInteger","TypeError","j","writeUint16","ResolutionUnitSpecifier","encodePng"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.iobuffer.ae3638de6414621ea67b.chunk.js b/public/npm.iobuffer.ae3638de6414621ea67b.chunk.js new file mode 100644 index 000000000..46e5ffaea --- /dev/null +++ b/public/npm.iobuffer.ae3638de6414621ea67b.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[158],{5666:(t,e,i)=>{i.d(e,{l:()=>n}),i(7396);const s=new TextDecoder("utf-8"),r=new TextEncoder;class n{constructor(t=8192,e={}){let i=!1;"number"==typeof t?t=new ArrayBuffer(t):(i=!0,this.lastWrittenByte=t.byteLength);const s=e.offset?e.offset>>>0:0,r=t.byteLength-s;let a=s;(ArrayBuffer.isView(t)||t instanceof n)&&(t.byteLength!==t.buffer.byteLength&&(a=t.byteOffset+s),t=t.buffer),this.lastWrittenByte=i?r:0,this.buffer=t,this.length=r,this.byteLength=r,this.byteOffset=a,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,a,r),this._mark=0,this._marks=[]}available(t=1){return this.offset+t<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(t=1){return this.offset+=t,this}seek(t){return this.offset=t,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){const t=this._marks.pop();if(void 0===t)throw new Error("Mark stack empty");return this.seek(t),this}rewind(){return this.offset=0,this}ensureAvailable(t=1){if(!this.available(t)){const e=2*(this.offset+t),i=new Uint8Array(e);i.set(new Uint8Array(this.buffer)),this.buffer=i.buffer,this.length=this.byteLength=e,this._data=new DataView(this.buffer)}return this}readBoolean(){return 0!==this.readUint8()}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(t=1){const e=new Uint8Array(t);for(let i=0;ithis.lastWrittenByte&&(this.lastWrittenByte=this.offset)}}},7396:function(){!function(t){if(t.TextEncoder&&t.TextDecoder)return!1;function e(t="utf-8"){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${t}') is invalid.`)}function i(t="utf-8",e={fatal:!1}){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${t}') is invalid.`);if(e.fatal)throw new Error("Failed to construct 'TextDecoder': the 'fatal' option is unsupported.")}Object.defineProperty(e.prototype,"encoding",{value:"utf-8"}),e.prototype.encode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to encode: the 'stream' option is unsupported.");let i=0;const s=t.length;let r=0,n=Math.max(32,s+(s>>1)+7),a=new Uint8Array(n>>3<<3);for(;i=55296&&e<=56319){if(i=55296&&e<=56319)continue}if(r+4>a.length){n+=8,n*=1+i/t.length*2,n=n>>3<<3;const e=new Uint8Array(n);e.set(a),a=e}if(0!=(4294967168&e)){if(0==(4294965248&e))a[r++]=e>>6&31|192;else if(0==(4294901760&e))a[r++]=e>>12&15|224,a[r++]=e>>6&63|128;else{if(0!=(4292870144&e))continue;a[r++]=e>>18&7|240,a[r++]=e>>12&63|128,a[r++]=e>>6&63|128}a[r++]=63&e|128}else a[r++]=e}return a.slice(0,r)},Object.defineProperty(i.prototype,"encoding",{value:"utf-8"}),Object.defineProperty(i.prototype,"fatal",{value:!1}),Object.defineProperty(i.prototype,"ignoreBOM",{value:!1}),i.prototype.decode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to decode: the 'stream' option is unsupported.");const i=new Uint8Array(t);let s=0;const r=i.length,n=[];for(;s65535&&(e-=65536,n.push(e>>>10&1023|55296),e=56320|1023&e),n.push(e)}}return String.fromCharCode.apply(null,n)},t.TextEncoder=e,t.TextDecoder=i}("undefined"!=typeof window?window:"undefined"!=typeof self?self:this)}}]); +//# sourceMappingURL=npm.iobuffer.ae3638de6414621ea67b.chunk.js.map \ No newline at end of file diff --git a/public/npm.iobuffer.ae3638de6414621ea67b.chunk.js.map b/public/npm.iobuffer.ae3638de6414621ea67b.chunk.js.map new file mode 100644 index 000000000..35a479fcf --- /dev/null +++ b/public/npm.iobuffer.ae3638de6414621ea67b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"npm.iobuffer.ae3638de6414621ea67b.chunk.js","mappings":"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","sources":["webpack://tweb/./node_modules/iobuffer/lib-esm/utf8.browser.js","webpack://tweb/./node_modules/iobuffer/lib-esm/IOBuffer.js","webpack://tweb/./node_modules/iobuffer/lib-esm/text-encoding-polyfill.js"],"sourcesContent":["// eslint-disable-next-line import/no-unassigned-import\nimport './text-encoding-polyfill';\nconst decoder = new TextDecoder('utf-8');\nexport function decode(bytes) {\n return decoder.decode(bytes);\n}\nconst encoder = new TextEncoder();\nexport function encode(str) {\n return encoder.encode(str);\n}\n//# sourceMappingURL=utf8.browser.js.map","import { decode, encode } from './utf8';\nconst defaultByteLength = 1024 * 8;\nexport class IOBuffer {\n /**\n * @param data - The data to construct the IOBuffer with.\n * If data is a number, it will be the new buffer's length
\n * If data is `undefined`, the buffer will be initialized with a default length of 8Kb
\n * If data is an ArrayBuffer, SharedArrayBuffer, an ArrayBufferView (Typed Array), an IOBuffer instance,\n * or a Node.js Buffer, a view will be created over the underlying ArrayBuffer.\n * @param options\n */\n constructor(data = defaultByteLength, options = {}) {\n let dataIsGiven = false;\n if (typeof data === 'number') {\n data = new ArrayBuffer(data);\n }\n else {\n dataIsGiven = true;\n this.lastWrittenByte = data.byteLength;\n }\n const offset = options.offset ? options.offset >>> 0 : 0;\n const byteLength = data.byteLength - offset;\n let dvOffset = offset;\n if (ArrayBuffer.isView(data) || data instanceof IOBuffer) {\n if (data.byteLength !== data.buffer.byteLength) {\n dvOffset = data.byteOffset + offset;\n }\n data = data.buffer;\n }\n if (dataIsGiven) {\n this.lastWrittenByte = byteLength;\n }\n else {\n this.lastWrittenByte = 0;\n }\n this.buffer = data;\n this.length = byteLength;\n this.byteLength = byteLength;\n this.byteOffset = dvOffset;\n this.offset = 0;\n this.littleEndian = true;\n this._data = new DataView(this.buffer, dvOffset, byteLength);\n this._mark = 0;\n this._marks = [];\n }\n /**\n * Checks if the memory allocated to the buffer is sufficient to store more\n * bytes after the offset.\n * @param byteLength - The needed memory in bytes.\n * @returns `true` if there is sufficient space and `false` otherwise.\n */\n available(byteLength = 1) {\n return this.offset + byteLength <= this.length;\n }\n /**\n * Check if little-endian mode is used for reading and writing multi-byte\n * values.\n * @returns `true` if little-endian mode is used, `false` otherwise.\n */\n isLittleEndian() {\n return this.littleEndian;\n }\n /**\n * Set little-endian mode for reading and writing multi-byte values.\n */\n setLittleEndian() {\n this.littleEndian = true;\n return this;\n }\n /**\n * Check if big-endian mode is used for reading and writing multi-byte values.\n * @returns `true` if big-endian mode is used, `false` otherwise.\n */\n isBigEndian() {\n return !this.littleEndian;\n }\n /**\n * Switches to big-endian mode for reading and writing multi-byte values.\n */\n setBigEndian() {\n this.littleEndian = false;\n return this;\n }\n /**\n * Move the pointer n bytes forward.\n * @param n - Number of bytes to skip.\n */\n skip(n = 1) {\n this.offset += n;\n return this;\n }\n /**\n * Move the pointer to the given offset.\n * @param offset\n */\n seek(offset) {\n this.offset = offset;\n return this;\n }\n /**\n * Store the current pointer offset.\n * @see {@link IOBuffer#reset}\n */\n mark() {\n this._mark = this.offset;\n return this;\n }\n /**\n * Move the pointer back to the last pointer offset set by mark.\n * @see {@link IOBuffer#mark}\n */\n reset() {\n this.offset = this._mark;\n return this;\n }\n /**\n * Push the current pointer offset to the mark stack.\n * @see {@link IOBuffer#popMark}\n */\n pushMark() {\n this._marks.push(this.offset);\n return this;\n }\n /**\n * Pop the last pointer offset from the mark stack, and set the current\n * pointer offset to the popped value.\n * @see {@link IOBuffer#pushMark}\n */\n popMark() {\n const offset = this._marks.pop();\n if (offset === undefined) {\n throw new Error('Mark stack empty');\n }\n this.seek(offset);\n return this;\n }\n /**\n * Move the pointer offset back to 0.\n */\n rewind() {\n this.offset = 0;\n return this;\n }\n /**\n * Make sure the buffer has sufficient memory to write a given byteLength at\n * the current pointer offset.\n * If the buffer's memory is insufficient, this method will create a new\n * buffer (a copy) with a length that is twice (byteLength + current offset).\n * @param byteLength\n */\n ensureAvailable(byteLength = 1) {\n if (!this.available(byteLength)) {\n const lengthNeeded = this.offset + byteLength;\n const newLength = lengthNeeded * 2;\n const newArray = new Uint8Array(newLength);\n newArray.set(new Uint8Array(this.buffer));\n this.buffer = newArray.buffer;\n this.length = this.byteLength = newLength;\n this._data = new DataView(this.buffer);\n }\n return this;\n }\n /**\n * Read a byte and return false if the byte's value is 0, or true otherwise.\n * Moves pointer forward by one byte.\n */\n readBoolean() {\n return this.readUint8() !== 0;\n }\n /**\n * Read a signed 8-bit integer and move pointer forward by 1 byte.\n */\n readInt8() {\n return this._data.getInt8(this.offset++);\n }\n /**\n * Read an unsigned 8-bit integer and move pointer forward by 1 byte.\n */\n readUint8() {\n return this._data.getUint8(this.offset++);\n }\n /**\n * Alias for {@link IOBuffer#readUint8}.\n */\n readByte() {\n return this.readUint8();\n }\n /**\n * Read `n` bytes and move pointer forward by `n` bytes.\n */\n readBytes(n = 1) {\n const bytes = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n bytes[i] = this.readByte();\n }\n return bytes;\n }\n /**\n * Read a 16-bit signed integer and move pointer forward by 2 bytes.\n */\n readInt16() {\n const value = this._data.getInt16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 16-bit unsigned integer and move pointer forward by 2 bytes.\n */\n readUint16() {\n const value = this._data.getUint16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 32-bit signed integer and move pointer forward by 4 bytes.\n */\n readInt32() {\n const value = this._data.getInt32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit unsigned integer and move pointer forward by 4 bytes.\n */\n readUint32() {\n const value = this._data.getUint32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit floating number and move pointer forward by 4 bytes.\n */\n readFloat32() {\n const value = this._data.getFloat32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 64-bit floating number and move pointer forward by 8 bytes.\n */\n readFloat64() {\n const value = this._data.getFloat64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 64-bit signed integer number and move pointer forward by 8 bytes.\n */\n readBigInt64() {\n const value = this._data.getBigInt64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 64-bit unsigned integer number and move pointer forward by 8 bytes.\n */\n readBigUint64() {\n const value = this._data.getBigUint64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 1-byte ASCII character and move pointer forward by 1 byte.\n */\n readChar() {\n return String.fromCharCode(this.readInt8());\n }\n /**\n * Read `n` 1-byte ASCII characters and move pointer forward by `n` bytes.\n */\n readChars(n = 1) {\n let result = '';\n for (let i = 0; i < n; i++) {\n result += this.readChar();\n }\n return result;\n }\n /**\n * Read the next `n` bytes, return a UTF-8 decoded string and move pointer\n * forward by `n` bytes.\n */\n readUtf8(n = 1) {\n return decode(this.readBytes(n));\n }\n /**\n * Write 0xff if the passed value is truthy, 0x00 otherwise and move pointer\n * forward by 1 byte.\n */\n writeBoolean(value) {\n this.writeUint8(value ? 0xff : 0x00);\n return this;\n }\n /**\n * Write `value` as an 8-bit signed integer and move pointer forward by 1 byte.\n */\n writeInt8(value) {\n this.ensureAvailable(1);\n this._data.setInt8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as an 8-bit unsigned integer and move pointer forward by 1\n * byte.\n */\n writeUint8(value) {\n this.ensureAvailable(1);\n this._data.setUint8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * An alias for {@link IOBuffer#writeUint8}.\n */\n writeByte(value) {\n return this.writeUint8(value);\n }\n /**\n * Write all elements of `bytes` as uint8 values and move pointer forward by\n * `bytes.length` bytes.\n */\n writeBytes(bytes) {\n this.ensureAvailable(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n this._data.setUint8(this.offset++, bytes[i]);\n }\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit signed integer and move pointer forward by 2\n * bytes.\n */\n writeInt16(value) {\n this.ensureAvailable(2);\n this._data.setInt16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit unsigned integer and move pointer forward by 2\n * bytes.\n */\n writeUint16(value) {\n this.ensureAvailable(2);\n this._data.setUint16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit signed integer and move pointer forward by 4\n * bytes.\n */\n writeInt32(value) {\n this.ensureAvailable(4);\n this._data.setInt32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit unsigned integer and move pointer forward by 4\n * bytes.\n */\n writeUint32(value) {\n this.ensureAvailable(4);\n this._data.setUint32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit floating number and move pointer forward by 4\n * bytes.\n */\n writeFloat32(value) {\n this.ensureAvailable(4);\n this._data.setFloat32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit floating number and move pointer forward by 8\n * bytes.\n */\n writeFloat64(value) {\n this.ensureAvailable(8);\n this._data.setFloat64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit signed bigint and move pointer forward by 8\n * bytes.\n */\n writeBigInt64(value) {\n this.ensureAvailable(8);\n this._data.setBigInt64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit unsigned bigint and move pointer forward by 8\n * bytes.\n */\n writeBigUint64(value) {\n this.ensureAvailable(8);\n this._data.setBigUint64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write the charCode of `str`'s first character as an 8-bit unsigned integer\n * and move pointer forward by 1 byte.\n */\n writeChar(str) {\n return this.writeUint8(str.charCodeAt(0));\n }\n /**\n * Write the charCodes of all `str`'s characters as 8-bit unsigned integers\n * and move pointer forward by `str.length` bytes.\n */\n writeChars(str) {\n for (let i = 0; i < str.length; i++) {\n this.writeUint8(str.charCodeAt(i));\n }\n return this;\n }\n /**\n * UTF-8 encode and write `str` to the current pointer offset and move pointer\n * forward according to the encoded length.\n */\n writeUtf8(str) {\n return this.writeBytes(encode(str));\n }\n /**\n * Export a Uint8Array view of the internal buffer.\n * The view starts at the byte offset and its length\n * is calculated to stop at the last written byte or the original length.\n */\n toArray() {\n return new Uint8Array(this.buffer, this.byteOffset, this.lastWrittenByte);\n }\n /**\n * Update the last written byte offset\n * @private\n */\n _updateLastWrittenByte() {\n if (this.offset > this.lastWrittenByte) {\n this.lastWrittenByte = this.offset;\n }\n }\n}\n//# sourceMappingURL=IOBuffer.js.map","\"use strict\";\n/*\n * Copyright 2017 Sam Thorogood. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n(function (scope) {\n 'use strict';\n // fail early\n if (scope['TextEncoder'] && scope['TextDecoder']) {\n return false;\n }\n /**\n * @constructor\n * @param {string=} utfLabel\n */\n function FastTextEncoder(utfLabel = 'utf-8') {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n }\n Object.defineProperty(FastTextEncoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n /**\n * @param {string} string\n * @param {{stream: boolean}=} options\n * @return {!Uint8Array}\n */\n FastTextEncoder.prototype.encode = function (string, options = { stream: false }) {\n if (options.stream) {\n throw new Error(`Failed to encode: the 'stream' option is unsupported.`);\n }\n let pos = 0;\n const len = string.length;\n const out = [];\n let at = 0; // output position\n let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size\n let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset\n while (pos < len) {\n let value = string.charCodeAt(pos++);\n if (value >= 0xd800 && value <= 0xdbff) {\n // high surrogate\n if (pos < len) {\n const extra = string.charCodeAt(pos);\n if ((extra & 0xfc00) === 0xdc00) {\n ++pos;\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n }\n if (value >= 0xd800 && value <= 0xdbff) {\n continue; // drop lone surrogate\n }\n }\n // expand the buffer if we couldn't write 4 bytes\n if (at + 4 > target.length) {\n tlen += 8; // minimum extra\n tlen *= 1.0 + (pos / string.length) * 2; // take 2x the remaining\n tlen = (tlen >> 3) << 3; // 8 byte offset\n const update = new Uint8Array(tlen);\n update.set(target);\n target = update;\n }\n if ((value & 0xffffff80) === 0) {\n // 1-byte\n target[at++] = value; // ASCII\n continue;\n }\n else if ((value & 0xfffff800) === 0) {\n // 2-byte\n target[at++] = ((value >> 6) & 0x1f) | 0xc0;\n }\n else if ((value & 0xffff0000) === 0) {\n // 3-byte\n target[at++] = ((value >> 12) & 0x0f) | 0xe0;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else if ((value & 0xffe00000) === 0) {\n // 4-byte\n target[at++] = ((value >> 18) & 0x07) | 0xf0;\n target[at++] = ((value >> 12) & 0x3f) | 0x80;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else {\n // FIXME: do we care\n continue;\n }\n target[at++] = (value & 0x3f) | 0x80;\n }\n return target.slice(0, at);\n };\n /**\n * @constructor\n * @param {string=} utfLabel\n * @param {{fatal: boolean}=} options\n */\n function FastTextDecoder(utfLabel = 'utf-8', options = { fatal: false }) {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n if (options.fatal) {\n throw new Error(`Failed to construct 'TextDecoder': the 'fatal' option is unsupported.`);\n }\n }\n Object.defineProperty(FastTextDecoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n Object.defineProperty(FastTextDecoder.prototype, 'fatal', { value: false });\n Object.defineProperty(FastTextDecoder.prototype, 'ignoreBOM', {\n value: false,\n });\n /**\n * @param {(!ArrayBuffer|!ArrayBufferView)} buffer\n * @param {{stream: boolean}=} options\n */\n FastTextDecoder.prototype.decode = function (buffer, options = { stream: false }) {\n if (options['stream']) {\n throw new Error(`Failed to decode: the 'stream' option is unsupported.`);\n }\n const bytes = new Uint8Array(buffer);\n let pos = 0;\n const len = bytes.length;\n const out = [];\n while (pos < len) {\n const byte1 = bytes[pos++];\n if (byte1 === 0) {\n break; // NULL\n }\n if ((byte1 & 0x80) === 0) {\n // 1-byte\n out.push(byte1);\n }\n else if ((byte1 & 0xe0) === 0xc0) {\n // 2-byte\n const byte2 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 6) | byte2);\n }\n else if ((byte1 & 0xf0) === 0xe0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3);\n }\n else if ((byte1 & 0xf8) === 0xf0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n const byte4 = bytes[pos++] & 0x3f;\n // this can be > 0xffff, so possibly generate surrogates\n let codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\n if (codepoint > 0xffff) {\n // codepoint &= ~0x10000;\n codepoint -= 0x10000;\n out.push(((codepoint >>> 10) & 0x3ff) | 0xd800);\n codepoint = 0xdc00 | (codepoint & 0x3ff);\n }\n out.push(codepoint);\n }\n else {\n // FIXME: we're ignoring this\n }\n }\n return String.fromCharCode.apply(null, out);\n };\n scope['TextEncoder'] = FastTextEncoder;\n scope['TextDecoder'] = FastTextDecoder;\n})(typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : this);\n//# sourceMappingURL=text-encoding-polyfill.js.map"],"names":["decoder","TextDecoder","encoder","TextEncoder","IOBuffer","constructor","data","options","dataIsGiven","ArrayBuffer","this","lastWrittenByte","byteLength","offset","dvOffset","isView","buffer","byteOffset","length","littleEndian","_data","DataView","_mark","_marks","available","isLittleEndian","setLittleEndian","isBigEndian","setBigEndian","skip","n","seek","mark","reset","pushMark","push","popMark","pop","undefined","Error","rewind","ensureAvailable","newLength","newArray","Uint8Array","set","readBoolean","readUint8","readInt8","getInt8","getUint8","readByte","readBytes","bytes","i","readInt16","value","getInt16","readUint16","getUint16","readInt32","getInt32","readUint32","getUint32","readFloat32","getFloat32","readFloat64","getFloat64","readBigInt64","getBigInt64","readBigUint64","getBigUint64","readChar","String","fromCharCode","readChars","result","readUtf8","decode","writeBoolean","writeUint8","writeInt8","setInt8","_updateLastWrittenByte","setUint8","writeByte","writeBytes","writeInt16","setInt16","writeUint16","setUint16","writeInt32","setInt32","writeUint32","setUint32","writeFloat32","setFloat32","writeFloat64","setFloat64","writeBigInt64","setBigInt64","writeBigUint64","setBigUint64","writeChar","str","charCodeAt","writeChars","writeUtf8","encode","toArray","scope","FastTextEncoder","utfLabel","RangeError","FastTextDecoder","fatal","Object","defineProperty","prototype","string","stream","pos","len","at","tlen","Math","max","target","extra","update","slice","out","byte1","byte2","byte3","codepoint","apply","window","self"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.pako.f16d6f756c34f3914132.chunk.js b/public/npm.pako.f16d6f756c34f3914132.chunk.js new file mode 100644 index 000000000..76659a006 --- /dev/null +++ b/public/npm.pako.f16d6f756c34f3914132.chunk.js @@ -0,0 +1,3 @@ +/*! For license information please see npm.pako.f16d6f756c34f3914132.chunk.js.LICENSE.txt */ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[699],{745:function(t,e){!function(t){"use strict";var e=(t,e,a,i)=>{let n=65535&t|0,r=t>>>16&65535|0,s=0;for(;0!==a;){s=a>2e3?2e3:a,a-=s;do{n=n+e[i++]|0,r=r+n|0}while(--s);n%=65521,r%=65521}return n|r<<16|0};const a=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var i=(t,e,i,n)=>{const r=a,s=n+i;t^=-1;for(let a=n;a>>8^r[255&(t^e[a])];return-1^t},n=function(t,e){let a,i,n,r,s,o,l,h,d,_,c,f,u,w,b,m,g,k,p,v,y,x,A,E;const z=t.state;a=t.next_in,A=t.input,i=a+(t.avail_in-5),n=t.next_out,E=t.output,r=n-(e-t.avail_out),s=n+(t.avail_out-257),o=z.dmax,l=z.wsize,h=z.whave,d=z.wnext,_=z.window,c=z.hold,f=z.bits,u=z.lencode,w=z.distcode,b=(1<>>24,c>>>=k,f-=k,k=g>>>16&255,0===k)E[n++]=65535&g;else{if(!(16&k)){if(0==(64&k)){g=u[(65535&g)+(c&(1<>>=k,f-=k),f<15&&(c+=A[a++]<>>24,c>>>=k,f-=k,k=g>>>16&255,!(16&k)){if(0==(64&k)){g=w[(65535&g)+(c&(1<o){t.msg="invalid distance too far back",z.mode=30;break t}if(c>>>=k,f-=k,k=n-r,v>k){if(k=v-k,k>h&&z.sane){t.msg="invalid distance too far back",z.mode=30;break t}if(y=0,x=_,0===d){if(y+=l-k,k2;)E[n++]=x[y++],E[n++]=x[y++],E[n++]=x[y++],p-=3;p&&(E[n++]=x[y++],p>1&&(E[n++]=x[y++]))}else{y=n-v;do{E[n++]=E[y++],E[n++]=E[y++],E[n++]=E[y++],p-=3}while(p>2);p&&(E[n++]=E[y++],p>1&&(E[n++]=E[y++]))}break}}break}}while(a>3,a-=p,f-=p<<3,c&=(1<{const c=_.bits;let f,u,w,b,m,g,k=0,p=0,v=0,y=0,x=0,A=0,E=0,z=0,R=0,Z=0,U=null,S=0;const T=new Uint16Array(16),O=new Uint16Array(16);let D,B,N,F=null,L=0;for(k=0;k<=15;k++)T[k]=0;for(p=0;p=1&&0===T[y];y--);if(x>y&&(x=y),0===y)return n[h++]=20971520,n[h++]=20971520,_.bits=1,0;for(v=1;v0&&(0===t||1!==y))return-1;for(O[1]=0,k=1;k<15;k++)O[k+1]=O[k]+T[k];for(p=0;p852||2===t&&R>592)return 1;for(;;){D=k-E,d[p]g?(B=F[L+d[p]],N=U[S+d[p]]):(B=96,N=0),f=1<>E)+u]=D<<24|B<<16|N|0}while(0!==u);for(f=1<>=1;if(0!==f?(Z&=f-1,Z+=f):Z=0,p++,0==--T[k]){if(k===y)break;k=e[a+d[p]]}if(k>x&&(Z&b)!==w){for(0===E&&(E=x),m+=v,A=k-E,z=1<852||2===t&&R>592)return 1;w=Z&b,n[w]=x<<24|A<<16|m-h|0}}return 0!==Z&&(n[m+Z]=k-E<<24|64<<16|0),_.bits=x,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:_,Z_BLOCK:c,Z_TREES:f,Z_OK:u,Z_STREAM_END:w,Z_NEED_DICT:b,Z_STREAM_ERROR:m,Z_DATA_ERROR:g,Z_MEM_ERROR:k,Z_BUF_ERROR:p,Z_DEFLATED:v}=d,y=12,x=30,A=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function E(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const z=t=>{if(!t||!t.state)return m;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,u},R=t=>{if(!t||!t.state)return m;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,z(t)},Z=(t,e)=>{let a;if(!t||!t.state)return m;const i=t.state;return e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?m:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=a,i.wbits=e,R(t))},U=(t,e)=>{if(!t)return m;const a=new E;t.state=a,a.window=null;const i=Z(t,e);return i!==u&&(t.state=null),i};let S,T,O=!0;const D=t=>{if(O){S=new Int32Array(512),T=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(h(1,t.lens,0,288,S,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;h(2,t.lens,0,32,T,0,t.work,{bits:5}),O=!1}t.lencode=S,t.lenbits=9,t.distcode=T,t.distbits=5},B=(t,e,a,i)=>{let n;const r=t.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(e.subarray(a-r.wsize,a),0),r.wnext=0,r.whave=r.wsize):(n=r.wsize-r.wnext,n>i&&(n=i),r.window.set(e.subarray(a-i,a-i+n),r.wnext),(i-=n)?(r.window.set(e.subarray(a-i,a),0),r.wnext=i,r.whave=r.wsize):(r.wnext+=n,r.wnext===r.wsize&&(r.wnext=0),r.whave{let r,s,o,l,d,E,z,R,Z,U,S,T,O,N,F,L,C,I,M,H,j,K,P=0;const Y=new Uint8Array(4);let X,G;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return m;r=t.state,r.mode===y&&(r.mode=13),d=t.next_out,o=t.output,z=t.avail_out,l=t.next_in,s=t.input,E=t.avail_in,R=r.hold,Z=r.bits,U=E,S=z,K=u;t:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;Z<16;){if(0===E)break t;E--,R+=s[l++]<>>8&255,r.check=i(r.check,Y,2,0),R=0,Z=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&R)<<8)+(R>>8))%31){t.msg="incorrect header check",r.mode=x;break}if((15&R)!==v){t.msg="unknown compression method",r.mode=x;break}if(R>>>=4,Z-=4,j=8+(15&R),0===r.wbits)r.wbits=j;else if(j>r.wbits){t.msg="invalid window size",r.mode=x;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&R,Y[1]=R>>>8&255,r.check=i(r.check,Y,2,0)),R=0,Z=0,r.mode=3;case 3:for(;Z<32;){if(0===E)break t;E--,R+=s[l++]<>>8&255,Y[2]=R>>>16&255,Y[3]=R>>>24&255,r.check=i(r.check,Y,4,0)),R=0,Z=0,r.mode=4;case 4:for(;Z<16;){if(0===E)break t;E--,R+=s[l++]<>8),512&r.flags&&(Y[0]=255&R,Y[1]=R>>>8&255,r.check=i(r.check,Y,2,0)),R=0,Z=0,r.mode=5;case 5:if(1024&r.flags){for(;Z<16;){if(0===E)break t;E--,R+=s[l++]<>>8&255,r.check=i(r.check,Y,2,0)),R=0,Z=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(T=r.length,T>E&&(T=E),T&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+T),j)),512&r.flags&&(r.check=i(r.check,s,T,l)),E-=T,l+=T,r.length-=T),r.length))break t;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===E)break t;T=0;do{j=s[l+T++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&T>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=y;break;case 10:for(;Z<32;){if(0===E)break t;E--,R+=s[l++]<>>=7&Z,Z-=7&Z,r.mode=27;break}for(;Z<3;){if(0===E)break t;E--,R+=s[l++]<>>=1,Z-=1,3&R){case 0:r.mode=14;break;case 1:if(D(r),r.mode=20,a===f){R>>>=2,Z-=2;break t}break;case 2:r.mode=17;break;case 3:t.msg="invalid block type",r.mode=x}R>>>=2,Z-=2;break;case 14:for(R>>>=7&Z,Z-=7&Z;Z<32;){if(0===E)break t;E--,R+=s[l++]<>>16^65535)){t.msg="invalid stored block lengths",r.mode=x;break}if(r.length=65535&R,R=0,Z=0,r.mode=15,a===f)break t;case 15:r.mode=16;case 16:if(T=r.length,T){if(T>E&&(T=E),T>z&&(T=z),0===T)break t;o.set(s.subarray(l,l+T),d),E-=T,l+=T,z-=T,d+=T,r.length-=T;break}r.mode=y;break;case 17:for(;Z<14;){if(0===E)break t;E--,R+=s[l++]<>>=5,Z-=5,r.ndist=1+(31&R),R>>>=5,Z-=5,r.ncode=4+(15&R),R>>>=4,Z-=4,r.nlen>286||r.ndist>30){t.msg="too many length or distance symbols",r.mode=x;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,Z-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,X={bits:r.lenbits},K=h(0,r.lens,0,19,r.lencode,0,r.work,X),r.lenbits=X.bits,K){t.msg="invalid code lengths set",r.mode=x;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,L=P>>>16&255,C=65535&P,!(F<=Z);){if(0===E)break t;E--,R+=s[l++]<>>=F,Z-=F,r.lens[r.have++]=C;else{if(16===C){for(G=F+2;Z>>=F,Z-=F,0===r.have){t.msg="invalid bit length repeat",r.mode=x;break}j=r.lens[r.have-1],T=3+(3&R),R>>>=2,Z-=2}else if(17===C){for(G=F+3;Z>>=F,Z-=F,j=0,T=3+(7&R),R>>>=3,Z-=3}else{for(G=F+7;Z>>=F,Z-=F,j=0,T=11+(127&R),R>>>=7,Z-=7}if(r.have+T>r.nlen+r.ndist){t.msg="invalid bit length repeat",r.mode=x;break}for(;T--;)r.lens[r.have++]=j}}if(r.mode===x)break;if(0===r.lens[256]){t.msg="invalid code -- missing end-of-block",r.mode=x;break}if(r.lenbits=9,X={bits:r.lenbits},K=h(1,r.lens,0,r.nlen,r.lencode,0,r.work,X),r.lenbits=X.bits,K){t.msg="invalid literal/lengths set",r.mode=x;break}if(r.distbits=6,r.distcode=r.distdyn,X={bits:r.distbits},K=h(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,X),r.distbits=X.bits,K){t.msg="invalid distances set",r.mode=x;break}if(r.mode=20,a===f)break t;case 20:r.mode=21;case 21:if(E>=6&&z>=258){t.next_out=d,t.avail_out=z,t.next_in=l,t.avail_in=E,r.hold=R,r.bits=Z,n(t,S),d=t.next_out,o=t.output,z=t.avail_out,l=t.next_in,s=t.input,E=t.avail_in,R=r.hold,Z=r.bits,r.mode===y&&(r.back=-1);break}for(r.back=0;P=r.lencode[R&(1<>>24,L=P>>>16&255,C=65535&P,!(F<=Z);){if(0===E)break t;E--,R+=s[l++]<>I)],F=P>>>24,L=P>>>16&255,C=65535&P,!(I+F<=Z);){if(0===E)break t;E--,R+=s[l++]<>>=I,Z-=I,r.back+=I}if(R>>>=F,Z-=F,r.back+=F,r.length=C,0===L){r.mode=26;break}if(32&L){r.back=-1,r.mode=y;break}if(64&L){t.msg="invalid literal/length code",r.mode=x;break}r.extra=15&L,r.mode=22;case 22:if(r.extra){for(G=r.extra;Z>>=r.extra,Z-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[R&(1<>>24,L=P>>>16&255,C=65535&P,!(F<=Z);){if(0===E)break t;E--,R+=s[l++]<>I)],F=P>>>24,L=P>>>16&255,C=65535&P,!(I+F<=Z);){if(0===E)break t;E--,R+=s[l++]<>>=I,Z-=I,r.back+=I}if(R>>>=F,Z-=F,r.back+=F,64&L){t.msg="invalid distance code",r.mode=x;break}r.offset=C,r.extra=15&L,r.mode=24;case 24:if(r.extra){for(G=r.extra;Z>>=r.extra,Z-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg="invalid distance too far back",r.mode=x;break}r.mode=25;case 25:if(0===z)break t;if(T=S-z,r.offset>T){if(T=r.offset-T,T>r.whave&&r.sane){t.msg="invalid distance too far back",r.mode=x;break}T>r.wnext?(T-=r.wnext,O=r.wsize-T):O=r.wnext-T,T>r.length&&(T=r.length),N=r.window}else N=o,O=d-r.offset,T=r.length;T>z&&(T=z),z-=T,r.length-=T;do{o[d++]=N[O++]}while(--T);0===r.length&&(r.mode=21);break;case 26:if(0===z)break t;o[d++]=r.length,z--,r.mode=21;break;case 27:if(r.wrap){for(;Z<32;){if(0===E)break t;E--,R|=s[l++]<{if(!t||!t.state)return m;let e=t.state;return e.window&&(e.window=null),t.state=null,u},I=(t,e)=>{if(!t||!t.state)return m;const a=t.state;return 0==(2&a.wrap)?m:(a.head=e,e.done=!1,u)},M=(t,a)=>{const i=a.length;let n,r,s;return t&&t.state?(n=t.state,0!==n.wrap&&11!==n.mode?m:11===n.mode&&(r=1,r=e(r,a,i,0),r!==n.check)?g:(s=B(t,a,i,i),s?(n.mode=31,k):(n.havedict=1,u))):m};const H=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);let j=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){j=!1}const K=new Uint8Array(256);for(let t=0;t<256;t++)K[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;K[254]=K[254]=1;var P=(t,e)=>{const a=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));let i,n;const r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(e&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:e<65536?r[n++]=e:(e-=65536,r[n++]=55296|e>>10&1023,r[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&j)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let i=0;i{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+K[t[a]]>e?a:e},X={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},W=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const q=Object.prototype.toString,{Z_NO_FLUSH:J,Z_FINISH:Q,Z_OK:V,Z_STREAM_END:$,Z_NEED_DICT:tt,Z_STREAM_ERROR:et,Z_DATA_ERROR:at,Z_MEM_ERROR:it}=d;function nt(t){this.options=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)H(a,e)&&(t[e]=a[e])}}return t}({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let a=F(this.strm,e.windowBits);if(a!==V)throw new Error(X[a]);if(this.header=new W,I(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=(t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,i,n,r,s=t.length,o=0;for(n=0;n>>6,e[r++]=128|63&a):a<65536?(e[r++]=224|a>>>12,e[r++]=128|a>>>6&63,e[r++]=128|63&a):(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63,e[r++]=128|a>>>6&63,e[r++]=128|63&a);return e})(e.dictionary):"[object ArrayBuffer]"===q.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=M(this.strm,e.dictionary),a!==V)))throw new Error(X[a])}function rt(t,e){const a=new nt(e);if(a.push(t),a.err)throw a.msg||X[a.err];return a.result}nt.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize,n=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=e===~~e?e:!0===e?Q:J,"[object ArrayBuffer]"===q.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),r=L(a,s),r===tt&&n&&(r=M(a,n),r===V?r=L(a,s):r===at&&(r=tt));a.avail_in>0&&r===$&&a.state.wrap>0&&0!==t[a.next_in];)N(a),r=L(a,s);switch(r){case et:case at:case tt:case it:return this.onEnd(r),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||r===$))if("string"===this.options.to){let t=Y(a.output,a.next_out),e=a.next_out-t,n=P(a.output,t);a.next_out=e,a.avail_out=i-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(n)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(r!==V||0!==o){if(r===$)return r=C(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},nt.prototype.onData=function(t){this.chunks.push(t)},nt.prototype.onEnd=function(t){t===V&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(t=>{let e=0;for(let a=0,i=t.length;a{"use strict";function i(t){let e=t.length;for(;--e>=0;)t[e]=0}a.d(e,{Wt:()=>da});const n=new Uint8Array([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]),r=new Uint8Array([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]),s=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),o=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),l=new Array(576);i(l);const h=new Array(60);i(h);const d=new Array(512);i(d);const _=new Array(256);i(_);const c=new Array(29);i(c);const f=new Array(30);function u(t,e,a,i,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=i,this.max_length=n,this.has_stree=t&&t.length}let w,b,m;function g(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}i(f);const k=t=>t<256?d[t]:d[256+(t>>>7)],p=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},v=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{v(t,a[2*e],a[2*e+1])},x=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},A=(t,e,a)=>{const i=new Array(16);let n,r,s=0;for(n=1;n<=15;n++)i[n]=s=s+a[n-1]<<1;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=x(i[e]++,e))}},E=t=>{let e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0},z=t=>{t.bi_valid>8?p(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},R=(t,e,a,i)=>{const n=2*e,r=2*a;return t[n]{const i=t.heap[a];let n=a<<1;for(;n<=t.heap_len&&(n{let i,s,o,l,h=0;if(0!==t.last_lit)do{i=t.pending_buf[t.d_buf+2*h]<<8|t.pending_buf[t.d_buf+2*h+1],s=t.pending_buf[t.l_buf+h],h++,0===i?y(t,s,e):(o=_[s],y(t,o+256+1,e),l=n[o],0!==l&&(s-=c[o],v(t,s,l)),i--,o=k(i),y(t,o,a),l=r[o],0!==l&&(i-=f[o],v(t,i,l)))}while(h{const a=e.dyn_tree,i=e.stat_desc.static_tree,n=e.stat_desc.has_stree,r=e.stat_desc.elems;let s,o,l,h=-1;for(t.heap_len=0,t.heap_max=573,s=0;s>1;s>=1;s--)Z(t,a,s);l=r;do{s=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Z(t,a,1),o=t.heap[1],t.heap[--t.heap_max]=s,t.heap[--t.heap_max]=o,a[2*l]=a[2*s]+a[2*o],t.depth[l]=(t.depth[s]>=t.depth[o]?t.depth[s]:t.depth[o])+1,a[2*s+1]=a[2*o+1]=l,t.heap[1]=l++,Z(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,i=e.max_code,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,s=e.stat_desc.extra_bits,o=e.stat_desc.extra_base,l=e.stat_desc.max_length;let h,d,_,c,f,u,w=0;for(c=0;c<=15;c++)t.bl_count[c]=0;for(a[2*t.heap[t.heap_max]+1]=0,h=t.heap_max+1;h<573;h++)d=t.heap[h],c=a[2*a[2*d+1]+1]+1,c>l&&(c=l,w++),a[2*d+1]=c,d>i||(t.bl_count[c]++,f=0,d>=o&&(f=s[d-o]),u=a[2*d],t.opt_len+=u*(c+f),r&&(t.static_len+=u*(n[2*d+1]+f)));if(0!==w){do{for(c=l-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[l]--,w-=2}while(w>0);for(c=l;0!==c;c--)for(d=t.bl_count[c];0!==d;)_=t.heap[--h],_>i||(a[2*_+1]!==c&&(t.opt_len+=(c-a[2*_+1])*a[2*_],a[2*_+1]=c),d--)}})(t,e),A(a,h,t.bl_count)},T=(t,e,a)=>{let i,n,r=-1,s=e[1],o=0,l=7,h=4;for(0===s&&(l=138,h=3),e[2*(a+1)+1]=65535,i=0;i<=a;i++)n=s,s=e[2*(i+1)+1],++o{let i,n,r=-1,s=e[1],o=0,l=7,h=4;for(0===s&&(l=138,h=3),i=0;i<=a;i++)if(n=s,s=e[2*(i+1)+1],!(++o{v(t,0+(i?1:0),3),((t,e,a,i)=>{z(t),p(t,a),p(t,~a),t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a})(t,e,a)};var N={_tr_init:t=>{D||((()=>{let t,e,a,i,o;const g=new Array(16);for(a=0,i=0;i<28;i++)for(c[i]=a,t=0;t<1<>=7;i<30;i++)for(f[i]=o<<7,t=0;t<1<{let n,r,s=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),S(t,t.l_desc),S(t,t.d_desc),s=(t=>{let e;for(T(t,t.dyn_ltree,t.l_desc.max_code),T(t,t.dyn_dtree,t.d_desc.max_code),S(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*o[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),n=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=n&&(n=r)):n=r=a+5,a+4<=n&&-1!==e?B(t,e,a,i):4===t.strategy||r===n?(v(t,2+(i?1:0),3),U(t,l,h)):(v(t,4+(i?1:0),3),((t,e,a,i)=>{let n;for(v(t,e-257,5),v(t,a-1,5),v(t,i-4,4),n=0;n(t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(_[a]+256+1)]++,t.dyn_dtree[2*k(e)]++),t.last_lit===t.lit_bufsize-1),_tr_align:t=>{v(t,2,3),y(t,256,l),(t=>{16===t.bi_valid?(p(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}},F=(t,e,a,i)=>{let n=65535&t|0,r=t>>>16&65535|0,s=0;for(;0!==a;){s=a>2e3?2e3:a,a-=s;do{n=n+e[i++]|0,r=r+n|0}while(--s);n%=65521,r%=65521}return n|r<<16|0};const L=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var C=(t,e,a,i)=>{const n=L,r=i+a;t^=-1;for(let a=i;a>>8^n[255&(t^e[a])];return-1^t},I={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},M={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:H,_tr_stored_block:j,_tr_flush_block:K,_tr_tally:P,_tr_align:Y}=N,{Z_NO_FLUSH:X,Z_PARTIAL_FLUSH:G,Z_FULL_FLUSH:W,Z_FINISH:q,Z_BLOCK:J,Z_OK:Q,Z_STREAM_END:V,Z_STREAM_ERROR:$,Z_DATA_ERROR:tt,Z_BUF_ERROR:et,Z_DEFAULT_COMPRESSION:at,Z_FILTERED:it,Z_HUFFMAN_ONLY:nt,Z_RLE:rt,Z_FIXED:st,Z_DEFAULT_STRATEGY:ot,Z_UNKNOWN:lt,Z_DEFLATED:ht}=M,dt=258,_t=262,ct=103,ft=113,ut=666,wt=(t,e)=>(t.msg=I[e],e),bt=t=>(t<<1)-(t>4?9:0),mt=t=>{let e=t.length;for(;--e>=0;)t[e]=0};let gt=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},pt=(t,e)=>{K(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,kt(t.strm)},vt=(t,e)=>{t.pending_buf[t.pending++]=e},yt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},xt=(t,e,a,i)=>{let n=t.avail_in;return n>i&&(n=i),0===n?0:(t.avail_in-=n,e.set(t.input.subarray(t.next_in,t.next_in+n),a),1===t.state.wrap?t.adler=F(t.adler,e,n,a):2===t.state.wrap&&(t.adler=C(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)},At=(t,e)=>{let a,i,n=t.max_chain_length,r=t.strstart,s=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-_t?t.strstart-(t.w_size-_t):0,h=t.window,d=t.w_mask,_=t.prev,c=t.strstart+dt;let f=h[r+s-1],u=h[r+s];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,h[a+s]===u&&h[a+s-1]===f&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&rs){if(t.match_start=e,s=i,i>=o)break;f=h[r+s-1],u=h[r+s]}}}while((e=_[e&d])>l&&0!=--n);return s<=t.lookahead?s:t.lookahead},Et=t=>{const e=t.w_size;let a,i,n,r,s;do{if(r=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-_t)){t.window.set(t.window.subarray(e,e+e),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,i=t.hash_size,a=i;do{n=t.head[--a],t.head[a]=n>=e?n-e:0}while(--i);i=e,a=i;do{n=t.prev[--a],t.prev[a]=n>=e?n-e:0}while(--i);r+=e}if(0===t.strm.avail_in)break;if(i=xt(t.strm,t.window,t.strstart+t.lookahead,r),t.lookahead+=i,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=gt(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=gt(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<_t&&0!==t.strm.avail_in)},zt=(t,e)=>{let a,i;for(;;){if(t.lookahead<_t){if(Et(t),t.lookahead<_t&&e===X)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=gt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-_t&&(t.match_length=At(t,a)),t.match_length>=3)if(i=P(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=gt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=gt(t,t.ins_h,t.window[t.strstart+1]);else i=P(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(i&&(pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===q?(pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(pt(t,!1),0===t.strm.avail_out)?1:2},Rt=(t,e)=>{let a,i,n;for(;;){if(t.lookahead<_t){if(Et(t),t.lookahead<_t&&e===X)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=gt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-3,i=P(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=gt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,i&&(pt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(i=P(t,0,t.window[t.strstart-1]),i&&pt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(i=P(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===q?(pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(pt(t,!1),0===t.strm.avail_out)?1:2};function Zt(t,e,a,i,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=i,this.func=n}const Ut=[new Zt(0,0,0,0,((t,e)=>{let a=65535;for(a>t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(Et(t),0===t.lookahead&&e===X)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;const i=t.block_start+a;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,pt(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-_t&&(pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===q?(pt(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(pt(t,!1),t.strm.avail_out),1)})),new Zt(4,4,8,4,zt),new Zt(4,5,16,8,zt),new Zt(4,6,32,32,zt),new Zt(4,4,16,16,Rt),new Zt(8,16,32,32,Rt),new Zt(8,16,128,128,Rt),new Zt(8,32,128,256,Rt),new Zt(32,128,258,1024,Rt),new Zt(32,258,258,4096,Rt)];function St(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ht,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),mt(this.dyn_ltree),mt(this.dyn_dtree),mt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),mt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),mt(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Tt=t=>{if(!t||!t.state)return wt(t,$);t.total_in=t.total_out=0,t.data_type=lt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?42:ft,t.adler=2===e.wrap?0:1,e.last_flush=X,H(e),Q},Ot=t=>{const e=Tt(t);var a;return e===Q&&((a=t.state).window_size=2*a.w_size,mt(a.head),a.max_lazy_match=Ut[a.level].max_lazy,a.good_match=Ut[a.level].good_length,a.nice_match=Ut[a.level].nice_length,a.max_chain_length=Ut[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},Dt=(t,e,a,i,n,r)=>{if(!t)return $;let s=1;if(e===at&&(e=6),i<0?(s=0,i=-i):i>15&&(s=2,i-=16),n<1||n>9||a!==ht||i<8||i>15||e<0||e>9||r<0||r>st)return wt(t,$);8===i&&(i=9);const o=new St;return t.state=o,o.strm=t,o.wrap=s,o.gzhead=null,o.w_bits=i,o.w_size=1<t&&t.state?2!==t.state.wrap?$:(t.state.gzhead=e,Q):$,Ft=(t,e)=>{let a,i;if(!t||!t.state||e>J||e<0)return t?wt(t,$):$;const n=t.state;if(!t.output||!t.input&&0!==t.avail_in||n.status===ut&&e!==q)return wt(t,0===t.avail_out?et:$);n.strm=t;const r=n.last_flush;if(n.last_flush=e,42===n.status)if(2===n.wrap)t.adler=0,vt(n,31),vt(n,139),vt(n,8),n.gzhead?(vt(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),vt(n,255&n.gzhead.time),vt(n,n.gzhead.time>>8&255),vt(n,n.gzhead.time>>16&255),vt(n,n.gzhead.time>>24&255),vt(n,9===n.level?2:n.strategy>=nt||n.level<2?4:0),vt(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(vt(n,255&n.gzhead.extra.length),vt(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(t.adler=C(t.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(vt(n,0),vt(n,0),vt(n,0),vt(n,0),vt(n,0),vt(n,9===n.level?2:n.strategy>=nt||n.level<2?4:0),vt(n,3),n.status=ft);else{let e=ht+(n.w_bits-8<<4)<<8,a=-1;a=n.strategy>=nt||n.level<2?0:n.level<6?1:6===n.level?2:3,e|=a<<6,0!==n.strstart&&(e|=32),e+=31-e%31,n.status=ft,yt(n,e),0!==n.strstart&&(yt(n,t.adler>>>16),yt(n,65535&t.adler)),t.adler=1}if(69===n.status)if(n.gzhead.extra){for(a=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>a&&(t.adler=C(t.adler,n.pending_buf,n.pending-a,a)),kt(t),a=n.pending,n.pending!==n.pending_buf_size));)vt(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>a&&(t.adler=C(t.adler,n.pending_buf,n.pending-a,a)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){a=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>a&&(t.adler=C(t.adler,n.pending_buf,n.pending-a,a)),kt(t),a=n.pending,n.pending===n.pending_buf_size)){i=1;break}i=n.gzindexa&&(t.adler=C(t.adler,n.pending_buf,n.pending-a,a)),0===i&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){a=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>a&&(t.adler=C(t.adler,n.pending_buf,n.pending-a,a)),kt(t),a=n.pending,n.pending===n.pending_buf_size)){i=1;break}i=n.gzindexa&&(t.adler=C(t.adler,n.pending_buf,n.pending-a,a)),0===i&&(n.status=ct)}else n.status=ct;if(n.status===ct&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&kt(t),n.pending+2<=n.pending_buf_size&&(vt(n,255&t.adler),vt(n,t.adler>>8&255),t.adler=0,n.status=ft)):n.status=ft),0!==n.pending){if(kt(t),0===t.avail_out)return n.last_flush=-1,Q}else if(0===t.avail_in&&bt(e)<=bt(r)&&e!==q)return wt(t,et);if(n.status===ut&&0!==t.avail_in)return wt(t,et);if(0!==t.avail_in||0!==n.lookahead||e!==X&&n.status!==ut){let a=n.strategy===nt?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Et(t),0===t.lookahead)){if(e===X)return 1;break}if(t.match_length=0,a=P(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===q?(pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(pt(t,!1),0===t.strm.avail_out)?1:2})(n,e):n.strategy===rt?((t,e)=>{let a,i,n,r;const s=t.window;for(;;){if(t.lookahead<=dt){if(Et(t),t.lookahead<=dt&&e===X)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(n=t.strstart-1,i=s[n],i===s[++n]&&i===s[++n]&&i===s[++n])){r=t.strstart+dt;do{}while(i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&nt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=P(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=P(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===q?(pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(pt(t,!1),0===t.strm.avail_out)?1:2})(n,e):Ut[n.level].func(n,e);if(3!==a&&4!==a||(n.status=ut),1===a||3===a)return 0===t.avail_out&&(n.last_flush=-1),Q;if(2===a&&(e===G?Y(n):e!==J&&(j(n,0,0,!1),e===W&&(mt(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),kt(t),0===t.avail_out))return n.last_flush=-1,Q}return e!==q?Q:n.wrap<=0?V:(2===n.wrap?(vt(n,255&t.adler),vt(n,t.adler>>8&255),vt(n,t.adler>>16&255),vt(n,t.adler>>24&255),vt(n,255&t.total_in),vt(n,t.total_in>>8&255),vt(n,t.total_in>>16&255),vt(n,t.total_in>>24&255)):(yt(n,t.adler>>>16),yt(n,65535&t.adler)),kt(t),n.wrap>0&&(n.wrap=-n.wrap),0!==n.pending?Q:V)},Lt=t=>{if(!t||!t.state)return $;const e=t.state.status;return 42!==e&&69!==e&&73!==e&&91!==e&&e!==ct&&e!==ft&&e!==ut?wt(t,$):(t.state=null,e===ft?wt(t,tt):Q)},Ct=(t,e)=>{let a=e.length;if(!t||!t.state)return $;const i=t.state,n=i.wrap;if(2===n||1===n&&42!==i.status||i.lookahead)return $;if(1===n&&(t.adler=F(t.adler,e,a,0)),i.wrap=0,a>=i.w_size){0===n&&(mt(i.head),i.strstart=0,i.block_start=0,i.insert=0);let t=new Uint8Array(i.w_size);t.set(e.subarray(a-i.w_size,a),0),e=t,a=i.w_size}const r=t.avail_in,s=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Et(i);i.lookahead>=3;){let t=i.strstart,e=i.lookahead-2;do{i.ins_h=gt(i,i.ins_h,i.window[t+3-1]),i.prev[t&i.w_mask]=i.head[i.ins_h],i.head[i.ins_h]=t,t++}while(--e);i.strstart=t,i.lookahead=2,Et(i)}return i.strstart+=i.lookahead,i.block_start=i.strstart,i.insert=i.lookahead,i.lookahead=0,i.match_length=i.prev_length=2,i.match_available=0,t.next_in=s,t.input=o,t.avail_in=r,i.wrap=n,Q};const It=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Mt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)It(a,e)&&(t[e]=a[e])}}return t},Ht=t=>{let e=0;for(let a=0,i=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Kt[254]=Kt[254]=1;var Pt=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,i,n,r,s=t.length,o=0;for(n=0;n>>6,e[r++]=128|63&a):a<65536?(e[r++]=224|a>>>12,e[r++]=128|a>>>6&63,e[r++]=128|63&a):(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63,e[r++]=128|a>>>6&63,e[r++]=128|63&a);return e},Yt=(t,e)=>{const a=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));let i,n;const r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(e&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:e<65536?r[n++]=e:(e-=65536,r[n++]=55296|e>>10&1023,r[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&jt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let i=0;i{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+Kt[t[a]]>e?a:e},Gt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const Wt=Object.prototype.toString,{Z_NO_FLUSH:qt,Z_SYNC_FLUSH:Jt,Z_FULL_FLUSH:Qt,Z_FINISH:Vt,Z_OK:$t,Z_STREAM_END:te,Z_DEFAULT_COMPRESSION:ee,Z_DEFAULT_STRATEGY:ae,Z_DEFLATED:ie}=M;function ne(t){this.options=Mt({level:ee,method:ie,chunkSize:16384,windowBits:15,memLevel:8,strategy:ae},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Gt,this.strm.avail_out=0;let a=Bt(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==$t)throw new Error(I[a]);if(e.header&&Nt(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Pt(e.dictionary):"[object ArrayBuffer]"===Wt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=Ct(this.strm,t),a!==$t)throw new Error(I[a]);this._dict_set=!0}}function re(t,e){const a=new ne(e);if(a.push(t,!0),a.err)throw a.msg||I[a.err];return a.result}ne.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize;let n,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?Vt:qt,"string"==typeof t?a.input=Pt(t):"[object ArrayBuffer]"===Wt.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),(r===Jt||r===Qt)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(n=Ft(a,r),n===te)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),n=Lt(this.strm),this.onEnd(n),this.ended=!0,n===$t;if(0!==a.avail_out){if(r>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},ne.prototype.onData=function(t){this.chunks.push(t)},ne.prototype.onEnd=function(t){t===$t&&(this.result=Ht(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var se={Deflate:ne,deflate:re,deflateRaw:function(t,e){return(e=e||{}).raw=!0,re(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,re(t,e)},constants:M},oe=function(t,e){let a,i,n,r,s,o,l,h,d,_,c,f,u,w,b,m,g,k,p,v,y,x,A,E;const z=t.state;a=t.next_in,A=t.input,i=a+(t.avail_in-5),n=t.next_out,E=t.output,r=n-(e-t.avail_out),s=n+(t.avail_out-257),o=z.dmax,l=z.wsize,h=z.whave,d=z.wnext,_=z.window,c=z.hold,f=z.bits,u=z.lencode,w=z.distcode,b=(1<>>24,c>>>=k,f-=k,k=g>>>16&255,0===k)E[n++]=65535&g;else{if(!(16&k)){if(0==(64&k)){g=u[(65535&g)+(c&(1<>>=k,f-=k),f<15&&(c+=A[a++]<>>24,c>>>=k,f-=k,k=g>>>16&255,!(16&k)){if(0==(64&k)){g=w[(65535&g)+(c&(1<o){t.msg="invalid distance too far back",z.mode=30;break t}if(c>>>=k,f-=k,k=n-r,v>k){if(k=v-k,k>h&&z.sane){t.msg="invalid distance too far back",z.mode=30;break t}if(y=0,x=_,0===d){if(y+=l-k,k2;)E[n++]=x[y++],E[n++]=x[y++],E[n++]=x[y++],p-=3;p&&(E[n++]=x[y++],p>1&&(E[n++]=x[y++]))}else{y=n-v;do{E[n++]=E[y++],E[n++]=E[y++],E[n++]=E[y++],p-=3}while(p>2);p&&(E[n++]=E[y++],p>1&&(E[n++]=E[y++]))}break}}break}}while(a>3,a-=p,f-=p<<3,c&=(1<{const l=o.bits;let h,d,_,c,f,u,w=0,b=0,m=0,g=0,k=0,p=0,v=0,y=0,x=0,A=0,E=null,z=0;const R=new Uint16Array(16),Z=new Uint16Array(16);let U,S,T,O=null,D=0;for(w=0;w<=15;w++)R[w]=0;for(b=0;b=1&&0===R[g];g--);if(k>g&&(k=g),0===g)return n[r++]=20971520,n[r++]=20971520,o.bits=1,0;for(m=1;m0&&(0===t||1!==g))return-1;for(Z[1]=0,w=1;w<15;w++)Z[w+1]=Z[w]+R[w];for(b=0;b852||2===t&&x>592)return 1;for(;;){U=w-v,s[b]u?(S=O[D+s[b]],T=E[z+s[b]]):(S=96,T=0),h=1<>v)+d]=U<<24|S<<16|T|0}while(0!==d);for(h=1<>=1;if(0!==h?(A&=h-1,A+=h):A=0,b++,0==--R[w]){if(w===g)break;w=e[a+s[b]]}if(w>k&&(A&c)!==_){for(0===v&&(v=k),f+=m,p=w-v,y=1<852||2===t&&x>592)return 1;_=A&c,n[_]=k<<24|p<<16|f-r|0}}return 0!==A&&(n[f+A]=w-v<<24|64<<16|0),o.bits=k,0};const{Z_FINISH:fe,Z_BLOCK:ue,Z_TREES:we,Z_OK:be,Z_STREAM_END:me,Z_NEED_DICT:ge,Z_STREAM_ERROR:ke,Z_DATA_ERROR:pe,Z_MEM_ERROR:ve,Z_BUF_ERROR:ye,Z_DEFLATED:xe}=M,Ae=12,Ee=30,ze=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Re(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Ze=t=>{if(!t||!t.state)return ke;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,be},Ue=t=>{if(!t||!t.state)return ke;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Ze(t)},Se=(t,e)=>{let a;if(!t||!t.state)return ke;const i=t.state;return e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?ke:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=a,i.wbits=e,Ue(t))},Te=(t,e)=>{if(!t)return ke;const a=new Re;t.state=a,a.window=null;const i=Se(t,e);return i!==be&&(t.state=null),i};let Oe,De,Be=!0;const Ne=t=>{if(Be){Oe=new Int32Array(512),De=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(ce(1,t.lens,0,288,Oe,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;ce(2,t.lens,0,32,De,0,t.work,{bits:5}),Be=!1}t.lencode=Oe,t.lenbits=9,t.distcode=De,t.distbits=5},Fe=(t,e,a,i)=>{let n;const r=t.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(e.subarray(a-r.wsize,a),0),r.wnext=0,r.whave=r.wsize):(n=r.wsize-r.wnext,n>i&&(n=i),r.window.set(e.subarray(a-i,a-i+n),r.wnext),(i-=n)?(r.window.set(e.subarray(a-i,a),0),r.wnext=i,r.whave=r.wsize):(r.wnext+=n,r.wnext===r.wsize&&(r.wnext=0),r.whave{let a,i,n,r,s,o,l,h,d,_,c,f,u,w,b,m,g,k,p,v,y,x,A=0;const E=new Uint8Array(4);let z,R;const Z=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return ke;a=t.state,a.mode===Ae&&(a.mode=13),s=t.next_out,n=t.output,l=t.avail_out,r=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,_=o,c=l,x=be;t:for(;;)switch(a.mode){case 1:if(0===a.wrap){a.mode=13;break}for(;d<16;){if(0===o)break t;o--,h+=i[r++]<>>8&255,a.check=C(a.check,E,2,0),h=0,d=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",a.mode=Ee;break}if((15&h)!==xe){t.msg="unknown compression method",a.mode=Ee;break}if(h>>>=4,d-=4,y=8+(15&h),0===a.wbits)a.wbits=y;else if(y>a.wbits){t.msg="invalid window size",a.mode=Ee;break}a.dmax=1<>8&1),512&a.flags&&(E[0]=255&h,E[1]=h>>>8&255,a.check=C(a.check,E,2,0)),h=0,d=0,a.mode=3;case 3:for(;d<32;){if(0===o)break t;o--,h+=i[r++]<>>8&255,E[2]=h>>>16&255,E[3]=h>>>24&255,a.check=C(a.check,E,4,0)),h=0,d=0,a.mode=4;case 4:for(;d<16;){if(0===o)break t;o--,h+=i[r++]<>8),512&a.flags&&(E[0]=255&h,E[1]=h>>>8&255,a.check=C(a.check,E,2,0)),h=0,d=0,a.mode=5;case 5:if(1024&a.flags){for(;d<16;){if(0===o)break t;o--,h+=i[r++]<>>8&255,a.check=C(a.check,E,2,0)),h=0,d=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(f=a.length,f>o&&(f=o),f&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(i.subarray(r,r+f),y)),512&a.flags&&(a.check=C(a.check,i,f,r)),o-=f,r+=f,a.length-=f),a.length))break t;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===o)break t;f=0;do{y=i[r+f++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&f>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=Ae;break;case 10:for(;d<32;){if(0===o)break t;o--,h+=i[r++]<>>=7&d,d-=7&d,a.mode=27;break}for(;d<3;){if(0===o)break t;o--,h+=i[r++]<>>=1,d-=1,3&h){case 0:a.mode=14;break;case 1:if(Ne(a),a.mode=20,e===we){h>>>=2,d-=2;break t}break;case 2:a.mode=17;break;case 3:t.msg="invalid block type",a.mode=Ee}h>>>=2,d-=2;break;case 14:for(h>>>=7&d,d-=7&d;d<32;){if(0===o)break t;o--,h+=i[r++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=Ee;break}if(a.length=65535&h,h=0,d=0,a.mode=15,e===we)break t;case 15:a.mode=16;case 16:if(f=a.length,f){if(f>o&&(f=o),f>l&&(f=l),0===f)break t;n.set(i.subarray(r,r+f),s),o-=f,r+=f,l-=f,s+=f,a.length-=f;break}a.mode=Ae;break;case 17:for(;d<14;){if(0===o)break t;o--,h+=i[r++]<>>=5,d-=5,a.ndist=1+(31&h),h>>>=5,d-=5,a.ncode=4+(15&h),h>>>=4,d-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=Ee;break}a.have=0,a.mode=18;case 18:for(;a.have>>=3,d-=3}for(;a.have<19;)a.lens[Z[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,z={bits:a.lenbits},x=ce(0,a.lens,0,19,a.lencode,0,a.work,z),a.lenbits=z.bits,x){t.msg="invalid code lengths set",a.mode=Ee;break}a.have=0,a.mode=19;case 19:for(;a.have>>24,m=A>>>16&255,g=65535&A,!(b<=d);){if(0===o)break t;o--,h+=i[r++]<>>=b,d-=b,a.lens[a.have++]=g;else{if(16===g){for(R=b+2;d>>=b,d-=b,0===a.have){t.msg="invalid bit length repeat",a.mode=Ee;break}y=a.lens[a.have-1],f=3+(3&h),h>>>=2,d-=2}else if(17===g){for(R=b+3;d>>=b,d-=b,y=0,f=3+(7&h),h>>>=3,d-=3}else{for(R=b+7;d>>=b,d-=b,y=0,f=11+(127&h),h>>>=7,d-=7}if(a.have+f>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=Ee;break}for(;f--;)a.lens[a.have++]=y}}if(a.mode===Ee)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=Ee;break}if(a.lenbits=9,z={bits:a.lenbits},x=ce(1,a.lens,0,a.nlen,a.lencode,0,a.work,z),a.lenbits=z.bits,x){t.msg="invalid literal/lengths set",a.mode=Ee;break}if(a.distbits=6,a.distcode=a.distdyn,z={bits:a.distbits},x=ce(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,z),a.distbits=z.bits,x){t.msg="invalid distances set",a.mode=Ee;break}if(a.mode=20,e===we)break t;case 20:a.mode=21;case 21:if(o>=6&&l>=258){t.next_out=s,t.avail_out=l,t.next_in=r,t.avail_in=o,a.hold=h,a.bits=d,oe(t,c),s=t.next_out,n=t.output,l=t.avail_out,r=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,a.mode===Ae&&(a.back=-1);break}for(a.back=0;A=a.lencode[h&(1<>>24,m=A>>>16&255,g=65535&A,!(b<=d);){if(0===o)break t;o--,h+=i[r++]<>k)],b=A>>>24,m=A>>>16&255,g=65535&A,!(k+b<=d);){if(0===o)break t;o--,h+=i[r++]<>>=k,d-=k,a.back+=k}if(h>>>=b,d-=b,a.back+=b,a.length=g,0===m){a.mode=26;break}if(32&m){a.back=-1,a.mode=Ae;break}if(64&m){t.msg="invalid literal/length code",a.mode=Ee;break}a.extra=15&m,a.mode=22;case 22:if(a.extra){for(R=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;A=a.distcode[h&(1<>>24,m=A>>>16&255,g=65535&A,!(b<=d);){if(0===o)break t;o--,h+=i[r++]<>k)],b=A>>>24,m=A>>>16&255,g=65535&A,!(k+b<=d);){if(0===o)break t;o--,h+=i[r++]<>>=k,d-=k,a.back+=k}if(h>>>=b,d-=b,a.back+=b,64&m){t.msg="invalid distance code",a.mode=Ee;break}a.offset=g,a.extra=15&m,a.mode=24;case 24:if(a.extra){for(R=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=Ee;break}a.mode=25;case 25:if(0===l)break t;if(f=c-l,a.offset>f){if(f=a.offset-f,f>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=Ee;break}f>a.wnext?(f-=a.wnext,u=a.wsize-f):u=a.wnext-f,f>a.length&&(f=a.length),w=a.window}else w=n,u=s-a.offset,f=a.length;f>l&&(f=l),l-=f,a.length-=f;do{n[s++]=w[u++]}while(--f);0===a.length&&(a.mode=21);break;case 26:if(0===l)break t;n[s++]=a.length,l--,a.mode=21;break;case 27:if(a.wrap){for(;d<32;){if(0===o)break t;o--,h|=i[r++]<{if(!t||!t.state)return ke;let e=t.state;return e.window&&(e.window=null),t.state=null,be},He=(t,e)=>{if(!t||!t.state)return ke;const a=t.state;return 0==(2&a.wrap)?ke:(a.head=e,e.done=!1,be)},je=(t,e)=>{const a=e.length;let i,n,r;return t&&t.state?(i=t.state,0!==i.wrap&&11!==i.mode?ke:11===i.mode&&(n=1,n=F(n,e,a,0),n!==i.check)?pe:(r=Fe(t,e,a,a),r?(i.mode=31,ve):(i.havedict=1,be))):ke},Ke=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Pe=Object.prototype.toString,{Z_NO_FLUSH:Ye,Z_FINISH:Xe,Z_OK:Ge,Z_STREAM_END:We,Z_NEED_DICT:qe,Z_STREAM_ERROR:Je,Z_DATA_ERROR:Qe,Z_MEM_ERROR:Ve}=M;function $e(t){this.options=Mt({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Gt,this.strm.avail_out=0;let a=Ce(this.strm,e.windowBits);if(a!==Ge)throw new Error(I[a]);if(this.header=new Ke,He(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=Pt(e.dictionary):"[object ArrayBuffer]"===Pe.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=je(this.strm,e.dictionary),a!==Ge)))throw new Error(I[a])}function ta(t,e){const a=new $e(e);if(a.push(t),a.err)throw a.msg||I[a.err];return a.result}$e.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize,n=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=e===~~e?e:!0===e?Xe:Ye,"[object ArrayBuffer]"===Pe.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),r=Ie(a,s),r===qe&&n&&(r=je(a,n),r===Ge?r=Ie(a,s):r===Qe&&(r=qe));a.avail_in>0&&r===We&&a.state.wrap>0&&0!==t[a.next_in];)Le(a),r=Ie(a,s);switch(r){case Je:case Qe:case qe:case Ve:return this.onEnd(r),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||r===We))if("string"===this.options.to){let t=Xt(a.output,a.next_out),e=a.next_out-t,n=Yt(a.output,t);a.next_out=e,a.avail_out=i-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(n)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(r!==Ge||0!==o){if(r===We)return r=Me(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},$e.prototype.onData=function(t){this.chunks.push(t)},$e.prototype.onEnd=function(t){t===Ge&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Ht(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ea={Inflate:$e,inflate:ta,inflateRaw:function(t,e){return(e=e||{}).raw=!0,ta(t,e)},ungzip:ta,constants:M};const{Deflate:aa,deflate:ia,deflateRaw:na,gzip:ra}=se,{Inflate:sa,inflate:oa,inflateRaw:la,ungzip:ha}=ea;var da=ia}}]); +//# sourceMappingURL=npm.pako.f16d6f756c34f3914132.chunk.js.map \ No newline at end of file diff --git a/public/npm.pako.f16d6f756c34f3914132.chunk.js.LICENSE.txt b/public/npm.pako.f16d6f756c34f3914132.chunk.js.LICENSE.txt new file mode 100644 index 000000000..c935087f6 --- /dev/null +++ b/public/npm.pako.f16d6f756c34f3914132.chunk.js.LICENSE.txt @@ -0,0 +1 @@ +/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */ diff --git a/public/npm.pako.f16d6f756c34f3914132.chunk.js.map b/public/npm.pako.f16d6f756c34f3914132.chunk.js.map new file mode 100644 index 000000000..6a93b7dbc --- /dev/null +++ b/public/npm.pako.f16d6f756c34f3914132.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"npm.pako.f16d6f756c34f3914132.chunk.js","mappings":"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","sources":["webpack://tweb/./node_modules/pako/dist/pako_inflate.min.js","webpack://tweb/./node_modules/pako/dist/pako.esm.mjs"],"sourcesContent":["/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,o=0;for(;0!==i;){o=i>2e3?2e3:i,i-=o;do{a=a+t[n++]|0,r=r+a|0}while(--o);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,o=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,o,s,l,d,f,c,h,u,w,b,k,m,_,g,p,v,x,y,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),o=a+(e.avail_out-257),s=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,c=A.window,h=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,h>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(h&(1<>>=g,u-=g),u<15&&(h+=E[i++]<>>24,h>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(h&(1<s){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(h>>>=g,u-=g,g=a-r,v>g){if(g=v-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(x=0,y=c,0===f){if(x+=l-g,g2;)R[a++]=y[x++],R[a++]=y[x++],R[a++]=y[x++],p-=3;p&&(R[a++]=y[x++],p>1&&(R[a++]=y[x++]))}else{x=a-v;do{R[a++]=R[x++],R[a++]=R[x++],R[a++]=R[x++],p-=3}while(p>2);p&&(R[a++]=R[x++],p>1&&(R[a++]=R[x++]))}break}}break}}while(i>3,i-=p,u-=p<<3,h&=(1<{const u=h.bits;let w,b,k,m,_,g,p=0,v=0,x=0,y=0,E=0,R=0,A=0,Z=0,S=0,T=0,O=null,U=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(p=0;p<=r;p++)D[p]=0;for(v=0;v=1&&0===D[y];y--);if(E>y&&(E=y),0===y)return a[f++]=20971520,a[f++]=20971520,h.bits=1,0;for(x=1;x0&&(0===e||1!==y))return-1;for(I[1]=0,p=1;p852||2===e&&S>592)return 1;for(;;){B=p-A,c[v]g?(N=z[F+c[v]],C=O[U+c[v]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(T&=w-1,T+=w):T=0,v++,0==--D[p]){if(p===y)break;p=t[i+c[v]]}if(p>E&&(T&m)!==k){for(0===A&&(A=E),_+=x,R=p-A,Z=1<852||2===e&&S>592)return 1;k=T&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==T&&(a[_+T]=p-A<<24|64<<16|0),h.bits=E,0},c={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:h,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:p,Z_BUF_ERROR:v,Z_DEFLATED:x}=c,y=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},T=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},O=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=T(e,t);return n!==b&&(e.state=null),n};let U,D,I=!0;const B=e=>{if(I){U=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,U,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=U,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveO(e,15),inflateInit2:O,inflate:(e,i)=>{let r,o,s,l,d,c,A,Z,S,T,O,U,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===y&&(r.mode=13),d=e.next_out,s=e.output,A=e.avail_out,l=e.next_in,o=e.input,c=e.avail_in,Z=r.hold,S=r.bits,T=c,O=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===c)break e;c--,Z+=o[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==x){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===c)break e;c--,Z+=o[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===c)break e;c--,Z+=o[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===c)break e;c--,Z+=o[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(U=r.length,U>c&&(U=c),U&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(o.subarray(l,l+U),j)),512&r.flags&&(r.check=n(r.check,o,U,l)),c-=U,l+=U,r.length-=U),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===c)break e;U=0;do{j=o[l+U++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&U>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=y;break;case 10:for(;S<32;){if(0===c)break e;c--,Z+=o[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===c)break e;c--,Z+=o[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===c)break e;c--,Z+=o[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(U=r.length,U){if(U>c&&(U=c),U>A&&(U=A),0===U)break e;s.set(o.subarray(l,l+U),d),c-=U,l+=U,A-=U,d+=U,r.length-=U;break}r.mode=y;break;case 17:for(;S<14;){if(0===c)break e;c--,Z+=o[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===c)break e;c--,Z+=o[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],U=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,U=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,U=11+(127&Z),Z>>>=7,S-=7}if(r.have+U>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;U--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(c>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=c,r.hold=Z,r.bits=S,a(e,O),d=e.next_out,s=e.output,A=e.avail_out,l=e.next_in,o=e.input,c=e.avail_in,Z=r.hold,S=r.bits,r.mode===y&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===c)break e;c--,Z+=o[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===c)break e;c--,Z+=o[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=y;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===c)break e;c--,Z+=o[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===c)break e;c--,Z+=o[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(U=O-A,r.offset>U){if(U=r.offset-U,U>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}U>r.wnext?(U-=r.wnext,D=r.wsize-U):D=r.wnext-U,U>r.length&&(U=r.length),I=r.window}else I=s,D=d-r.offset,U=r.length;U>A&&(U=A),A-=U,r.length-=U;do{s[d++]=I[D++]}while(--U);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;s[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===c)break e;c--,Z|=o[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,o;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(o=N(e,i,n,n),o?(a.mode=31,p):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{if(\"function\"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,n,a,r,o=e.length,s=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{const i=t||e.length;if(\"function\"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,a;const r=new Array(2*i);for(a=0,n=0;n4)r[a++]=65533,n+=o-1;else{for(t&=2===o?31:3===o?15:7;o>1&&n1?r[a++]=65533:t<65536?r[a++]=t:(t-=65536,r[a++]=55296|t>>10&1023,r[a++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=c;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,o,s;if(this.ended)return!1;for(o=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,o),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,o):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,o);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(s=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==s){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,oe=ae,se=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=c,fe={Inflate:re,inflate:oe,inflateRaw:se,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=oe,e.inflateRaw=se,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n","\n/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED$1 = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN$1 = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1 = 30;\n/* number of distance codes */\n\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([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]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([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\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) =>\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS$1; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES$1; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES$1; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nconst copy_block = (s, buf, len, header) =>\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n s.pending_buf.set(s.window.subarray(buf, buf + len), s.pending);\n s.pending += len;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) =>\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let lx = 0; /* running index in l_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE$1;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) =>\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let black_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS$1; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN$1) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block$1(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) =>\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //let out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n};\n\nvar _tr_init_1 = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1 = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_UNKNOWN,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES = 30;\n/* number of distance codes */\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42;\nconst EXTRA_STATE = 69;\nconst NAME_STATE = 73;\nconst COMMENT_STATE = 91;\nconst HCRC_STATE = 103;\nconst BUSY_STATE = 113;\nconst FINISH_STATE = 666;\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n let max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n const max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n};\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nconst deflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH$2;\n _tr_init(s);\n return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK$3) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$2; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR$2; }\n strm.state.gzhead = head;\n return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR$2;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION$1) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\nconst deflate$2 = (strm, flush) => {\n\n let beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK$1 || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n }\n\n s.strm = strm; /* just in case */\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK$3;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH$3) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n let bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK$3;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align(s);\n }\n else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH$1) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK$3;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH$3) { return Z_OK$3; }\n if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR$2;\n }\n\n const status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR$2;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_STRATEGY,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY\n }, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1$2.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1$2.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1$2.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$2) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1$2.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$2;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$2) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate$1(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 30; /* got a data error -- remain here until reset */\nconst TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n// let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS$1) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 1; /* i: waiting for magic header */\nconst FLAGS = 2; /* i: waiting for method and flags (gzip) */\nconst TIME = 3; /* i: waiting for modification time (gzip) */\nconst OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 5; /* i: waiting for extra length (gzip) */\nconst EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nconst NAME = 7; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 8; /* i: waiting for end of comment (gzip) */\nconst HCRC = 9; /* i: waiting for header crc (gzip) */\nconst DICTID = 10; /* i: waiting for dictionary check value */\nconst DICT = 11; /* waiting for inflateSetDictionary() call */\nconst TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 14; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 17; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 18; /* i: waiting for code length code lengths */\nconst CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 20; /* i: same as LEN below, but only first time in */\nconst LEN = 21; /* i: waiting for length/lit/eob code */\nconst LENEXT = 22; /* i: waiting for length extra bits */\nconst DIST = 23; /* i: waiting for distance code */\nconst DISTEXT = 24; /* i: waiting for distance extra bits */\nconst MATCH = 25; /* o: waiting for output space to copy string */\nconst LIT = 26; /* o: waiting for output space to write literal */\nconst CHECK = 27; /* i: waiting for 32-bit check value */\nconst LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 29; /* finished check, done -- remain here until reset */\nconst BAD = 30; /* got a data error -- remain here until reset */\nconst MEM = 31; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$2.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$2.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$2.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1$2.inflateReset(strm);\n status = inflate_1$2.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$2.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate$1(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip };\n"],"names":["e","t","i","n","a","r","o","Uint32Array","s","l","d","f","c","h","u","w","b","k","m","_","g","p","v","x","y","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","bits","lencode","distcode","lenbits","distbits","mode","msg","sane","Uint16Array","Uint8Array","Z","S","T","O","U","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","this","last","wrap","havedict","flags","check","total","head","wbits","length","offset","extra","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","j","K","P","Y","G","X","W","done","text","time","xflags","os","extra_len","name","String","fromCharCode","comment","hcrc","data_type","Object","prototype","hasOwnProperty","call","apply","TextDecoder","decode","Array","toString","q","J","Q","V","$","ee","te","ie","ne","options","slice","arguments","shift","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","Error","header","dictionary","TextEncoder","encode","charCodeAt","ae","push","result","onEnd","onData","join","re","oe","se","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","defineProperty","value","exports","zero$1","buf","len","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES$1","_dist_code","_length_code","MAX_MATCH$1","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","pending_buf","pending","send_bits","bi_valid","bi_buf","send_code","tree","bi_reverse","code","res","gen_codes","bl_count","next_code","MAX_BITS$1","init_block","LITERALS$1","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","last_lit","matches","bi_windup","smaller","depth","_n2","_m2","pqdownheap","heap","heap_len","compress_block","ltree","dtree","lc","lx","d_buf","l_buf","build_tree","desc","stree","node","heap_max","base","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","count","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block$1","stored_len","copy_block","trees","_tr_init","LENGTH_CODES$1","L_CODES$1","tr_static_init","l_desc","d_desc","bl_desc","_tr_stored_block","_tr_flush_block","opt_lenb","static_lenb","max_blindex","level","black_mask","detect_data_type","BL_CODES$1","build_bl_tree","strategy","lcodes","dcodes","blcodes","rank","send_all_trees","_tr_tally","lit_bufsize","_tr_align","STATIC_TREES","bi_flush","adler32_1","pos","s1","s2","crcTable","table","makeTable","crc32_1","crc","end","messages","constants$2","Z_NO_FLUSH$2","Z_FULL_FLUSH$1","Z_FINISH$3","Z_BLOCK$1","Z_OK$3","Z_STREAM_END$3","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_BUF_ERROR$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$2","MAX_MATCH","MIN_LOOKAHEAD","HCRC_STATE","BUSY_STATE","FINISH_STATE","errorCode","zero","HASH","prev","data","hash_shift","hash_mask","flush_pending","pending_out","flush_block_only","block_start","strstart","put_byte","putShortMSB","read_buf","start","size","longest_match","cur_match","match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","str","window_size","hash_size","insert","ins_h","deflate_fast","flush","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","max_block_size","pending_buf_size","max_start","DeflateState","status","gzhead","gzindex","method","last_flush","w_bits","hash_bits","HEAP_SIZE","MAX_BITS","deflateResetKeep","deflateReset","ret","deflateInit2","memLevel","deflate_1$2","beg","val","old_flush","level_flags","bstate","deflate_huff","deflate_rle","dictLength","tmpDict","avail","_has","obj","key","common","sources","source","chunk","STR_APPLY_UIA_OK","__","_utf8len","strings","c2","m_pos","str_len","buf_len","max","out","utf16buf","c_len","buf2binstring","zstream","toString$1","Z_NO_FLUSH$1","Z_FINISH$2","Z_OK$2","Z_STREAM_END$2","Z_DEFLATED$1","Deflate$1","opt","gzip","dict","_dict_set","deflate$1","deflator","flush_mode","_flush_mode","deflate_1$1","Deflate","deflate","deflateRaw","inffast","_in","_out","s_window","lcode","dcode","lmask","dmask","here","op","from","from_source","top","dolen","dodist","lbase","lext","dbase","dext","inftrees","type","lens_index","codes","table_index","opts","incr","fill","low","mask","sym","min","root","curr","drop","left","used","huff","base_index","MAXBITS","offs","here_bits","here_op","here_val","extra_index","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_NEED_DICT$1","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_MEM_ERROR$1","TYPE","BAD","zswap32","InflateState","inflateResetKeep","inflateReset","inflateReset2","inflateInit2","lenfix","distfix","virgin","fixedtables","updatewindow","src","copy","inflate_1$2","put","last_bits","last_op","last_val","hbuf","order","inf_leave","dictid","gzheader","Inflate$1","inflate$1","inflator","last_avail_out","next_out_utf8","tail","utf8str","inflate_1$1","deflate_1"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js b/public/npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js new file mode 100644 index 000000000..4fae1ad57 --- /dev/null +++ b/public/npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[630],{1915:t=>{self,t.exports=(()=>{var t={192:(t,e)=>{var r,n,o=function(){var t=function(t,e){var r=t,n=a[e],o=null,i=0,u=null,v=[],w={},_=function(t,e){o=function(t){for(var e=new Array(t),r=0;r=7&&M(t),null==u&&(u=P(r,n,v)),C(u,e)},m=function(t,e){for(var r=-1;r<=7;r+=1)if(!(t+r<=-1||i<=t+r))for(var n=-1;n<=7;n+=1)e+n<=-1||i<=e+n||(o[t+r][e+n]=0<=r&&r<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=n&&n<=4)},b=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(e>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,e){for(var r=n<<3|e,a=s.getBCHTypeInfo(r),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},C=function(t,e){for(var r=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(e),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var d=0;d<2;d+=1)if(null==o[n][h-d]){var l=!1;u>>a&1)),c(n,h-d)&&(l=!l),o[n][h-d]=l,-1==(a-=1)&&(u+=1,a=7)}if((n+=r)<0||i<=n){n-=r,r=-r;break}}},P=function(t,e,r){for(var n=h.getRSBlocks(t,e),o=d(),i=0;i8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,e){for(var r=0,n=0,o=0,i=new Array(e.length),a=new Array(e.length),u=0;u=0?p.getAt(g):0}}var v=0;for(l=0;ln)&&(t=n,e=r)}return e}())},w.createTableTag=function(t,e){t=t||2;var r="";r+='',r+="";for(var n=0;n";for(var o=0;o';r+=""}return(r+="")+"
"},w.createSvgTag=function(t,e,r,n){var o={};"object"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,e=o.margin,r=o.alt,n=o.title),t=t||2,e=void 0===e?4*t:e,(r="string"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||"qrcode-description":null,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-title":null;var i,a,s,u,c=w.getModuleCount()*t+2*e,h="";for(u="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",h+=''+O(n.text)+"":"",h+=r.text?''+O(r.text)+"":"",h+='',h+='"},w.createDataURL=function(t,e){t=t||2,e=void 0===e?4*t:e;var r=w.getModuleCount()*t+2*e,n=e,o=r-e;return y(r,r,(function(e,r){if(n<=e&&e"};var O=function(t){for(var e="",r=0;r":e+=">";break;case"&":e+="&";break;case'"':e+=""";break;default:e+=n}}return e};return w.createASCII=function(t,e){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var e,r,n,o,i,a=1*w.getModuleCount()+2*t,s=t,u=a-t,c={"██":"█","█ ":"▀"," █":"▄"," ":" "},h={"██":"▀","█ ":"▀"," █":" "," ":" "},d="";for(e=0;e=u?h[i]:c[i];d+="\n"}return a%2&&t>0?d.substring(0,d.length-a-1)+Array(a+1).join("▀"):d.substring(0,d.length-1)}(e);t-=1,e=void 0===e?2*t:e;var r,n,o,i,a=w.getModuleCount()*t+2*e,s=e,u=a-e,c=Array(t+1).join("██"),h=Array(t+1).join(" "),d="",l="";for(r=0;r>>8),e.push(255&a)):e.push(n)}}return e}};var e,r,n,o,i,a={L:1,M:0,Q:3,H:2},s=(e=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,n=7973,i=function(t){for(var e=0;0!=t;)e+=1,t>>>=1;return e},(o={}).getBCHTypeInfo=function(t){for(var e=t<<10;i(e)-i(r)>=0;)e^=r<=0;)e^=n<5&&(r+=3+i-5)}for(n=0;n=256;)e-=255;return t[e]}}}();function c(t,e){if(void 0===t.length)throw t.length+"/"+e;var r=function(){for(var r=0;r>>7-e%8&1)},put:function(t,e){for(var n=0;n>>e-n-1&1))},getLengthInBits:function(){return e},putBit:function(r){var n=Math.floor(e/8);t.length<=n&&t.push(0),r&&(t[n]|=128>>>e%8),e+=1}};return r},l=function(t){var e=t,r={getMode:function(){return 1},getLength:function(t){return e.length},write:function(t){for(var r=e,o=0;o+2>>8&255)+(255&o),t.put(o,13),r+=2}if(r>>8)},writeBytes:function(t,r,n){r=r||0,n=n||t.length;for(var o=0;o0&&(e+=","),e+=t[r];return e+"]"}};return e},w=function(t){var e=t,r=0,n=0,o=0,i={read:function(){for(;o<8;){if(r>=e.length){if(0==o)return-1;throw"unexpected end of file./"+o}var t=e.charAt(r);if(r+=1,"="==t)return o=0,-1;t.match(/^\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return i},y=function(t,e,r){for(var n=function(t,e){var r=t,n=e,o=new Array(t*e),i={setPixel:function(t,e,n){o[e*r+t]=n},write:function(t){t.writeString("GIF87a"),t.writeShort(r),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(r),t.writeShort(n),t.writeByte(0);var e=a(2);t.writeByte(2);for(var o=0;e.length-o>255;)t.writeByte(255),t.writeBytes(e,o,255),o+=255;t.writeByte(e.length-o),t.writeBytes(e,o,e.length-o),t.writeByte(0),t.writeString(";")}},a=function(t){for(var e=1<>>e!=0)throw"length over";for(;c+e>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});l.write(e,n);var f=0,p=String.fromCharCode(o[f]);for(f+=1;f=6;)i(t>>>e-6),e-=6},o.flush=function(){if(e>0&&(i(t<<6-e),t=0,e=0),r%3!=0)for(var o=3-r%3,a=0;a>6,128|63&n):n<55296||n>=57344?e.push(224|n>>12,128|n>>6&63,128|63&n):(r++,n=65536+((1023&n)<<10|1023&t.charCodeAt(r)),e.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return e}(t)},void 0===(n="function"==typeof(r=function(){return o})?r.apply(e,[]):r)||(t.exports=n)},796:(t,e,r)=>{"use strict";r.d(e,{default:()=>$});var n=function(){return(n=Object.assign||function(t){for(var e,r=1,n=arguments.length;rn||o&&o2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0,h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t}(),w="square",y="extra-rounded";var _=function(){return(_=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=C[t])||void 0===n?void 0:n[r])||(null===(i=C[t-e+7])||void 0===i?void 0:i[r])||(null===(a=C[t])||void 0===a?void 0:a[r-e+7])||(null===(s=P[t])||void 0===s?void 0:s[r])||(null===(u=P[t-e+7])||void 0===u?void 0:u[r])||(null===(c=P[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((r=void 0)||(r=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(e){var n;e.done?t(e.value):(n=e.value,n instanceof r?n:new r((function(t){t(n)}))).then(i,a)}s((n=n.apply(e,[])).next())}));var e,r,n},t.prototype.drawBackground=function(){var t=this.context,e=this._options;if(t){if(e.backgroundOptions.gradient){var r=e.backgroundOptions.gradient,n=this._createGradient({context:t,options:r,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});r.colorStops.forEach((function(t){var e=t.offset,r=t.color;n.addColorStop(e,r)})),t.fillStyle=n}else e.backgroundOptions.color&&(t.fillStyle=e.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var e=this;if(!this._qr)throw"QR code is not defined";var r=this.context;if(!r)throw"QR code is not defined";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw"The canvas is too small.";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),c=new v({context:r,type:n.dotsOptions.type});r.beginPath();for(var h=function(r){for(var n=function(n){return t&&!t(r,n)?"continue":d._qr.isDark(r,n)?void c.draw(s+r*a,u+n*a,a,(function(i,a){return!(r+i<0||n+a<0||r+i>=o||n+a>=o)&&!(t&&!t(r+i,n+a))&&!!e._qr&&e._qr.isDark(r+i,n+a)})):"continue"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,d-=s/2*Math.tan(u),l+=s/2,f+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(d-=s/2,h-=s/2/Math.tan(u),f+=s/2,l+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,d+=s/2*Math.tan(u),l-=s/2,f-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(d+=s/2,h+=s/2/Math.tan(u),f-=s/2,l-=s/2/Math.tan(u)),e=r.createLinearGradient(Math.round(h),Math.round(d),Math.round(l),Math.round(f))}return e},t}();var z=function(){return(z=Object.assign||function(t){for(var e,r=1,n=arguments.length;r2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0,c=i+a+s+u;if(0!==c)if(c>2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t}();var I=function(){return(I=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=R[t])||void 0===n?void 0:n[r])||(null===(i=R[t-e+7])||void 0===i?void 0:i[r])||(null===(a=R[t])||void 0===a?void 0:a[r-e+7])||(null===(s=B[t])||void 0===s?void 0:s[r])||(null===(u=B[t-e+7])||void 0===u?void 0:u[r])||(null===(c=B[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((r=void 0)||(r=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(e){var n;e.done?t(e.value):(n=e.value,n instanceof r?n:new r((function(t){t(n)}))).then(i,a)}s((n=n.apply(e,[])).next())}));var e,r,n},t.prototype.drawBackground=function(){var t,e,r=this._element,n=this._options;if(r){var o=null===(t=n.backgroundOptions)||void 0===t?void 0:t.gradient,i=null===(e=n.backgroundOptions)||void 0===e?void 0:e.color;(o||i)&&this._createColor({options:o,color:i,additionalRotation:0,x:0,y:0,height:n.height,width:n.width,name:"background-color"})}},t.prototype.drawDots=function(t){var e,r,n=this;if(!this._qr)throw"QR code is not defined";var o=this._options,i=this._qr.getModuleCount();if(i>o.width||i>o.height)throw"The canvas is too small.";var a=Math.min(o.width,o.height)-2*o.margin,s=Math.floor(a/i),u=Math.floor((o.width-i*s)/2),c=Math.floor((o.height-i*s)/2),h=new D({svg:this._element,type:o.dotsOptions.type});this._dotsClipPath=document.createElementNS("http://www.w3.org/2000/svg","clipPath"),this._dotsClipPath.setAttribute("id","clip-path-dot-color"),this._defs.appendChild(this._dotsClipPath),this._createColor({options:null===(e=o.dotsOptions)||void 0===e?void 0:e.gradient,color:o.dotsOptions.color,additionalRotation:0,x:u,y:c,height:i*s,width:i*s,name:"dot-color"});for(var d=function(e){for(var o=function(o){return t&&!t(e,o)?"continue":(null===(r=l._qr)||void 0===r?void 0:r.isDark(e,o))?(h.draw(u+e*s,c+o*s,s,(function(r,a){return!(e+r<0||o+a<0||e+r>=i||o+a>=i)&&!(t&&!t(e+r,o+a))&&!!n._qr&&n._qr.isDark(e+r,o+a)})),void(h._element&&l._dotsClipPath&&l._dotsClipPath.appendChild(h._element))):"continue"},a=0;aa?s:a,h=document.createElementNS("http://www.w3.org/2000/svg","rect");if(h.setAttribute("x",String(o)),h.setAttribute("y",String(i)),h.setAttribute("height",String(a)),h.setAttribute("width",String(s)),h.setAttribute("clip-path","url('#clip-path-"+u+"')"),e){var d;if(e.type===S)(d=document.createElementNS("http://www.w3.org/2000/svg","radialGradient")).setAttribute("id",u),d.setAttribute("gradientUnits","userSpaceOnUse"),d.setAttribute("fx",String(o+s/2)),d.setAttribute("fy",String(i+a/2)),d.setAttribute("cx",String(o+s/2)),d.setAttribute("cy",String(i+a/2)),d.setAttribute("r",String(c/2));else{var l=((e.rotation||0)+n)%(2*Math.PI),f=(l+2*Math.PI)%(2*Math.PI),p=o+s/2,g=i+a/2,v=o+s/2,w=i+a/2;f>=0&&f<=.25*Math.PI||f>1.75*Math.PI&&f<=2*Math.PI?(p-=s/2,g-=a/2*Math.tan(l),v+=s/2,w+=a/2*Math.tan(l)):f>.25*Math.PI&&f<=.75*Math.PI?(g-=a/2,p-=s/2/Math.tan(l),w+=a/2,v+=s/2/Math.tan(l)):f>.75*Math.PI&&f<=1.25*Math.PI?(p+=s/2,g+=a/2*Math.tan(l),v-=s/2,w-=a/2*Math.tan(l)):f>1.25*Math.PI&&f<=1.75*Math.PI&&(g+=a/2,p+=s/2/Math.tan(l),w-=a/2,v-=s/2/Math.tan(l)),(d=document.createElementNS("http://www.w3.org/2000/svg","linearGradient")).setAttribute("id",u),d.setAttribute("gradientUnits","userSpaceOnUse"),d.setAttribute("x1",String(Math.round(p))),d.setAttribute("y1",String(Math.round(g))),d.setAttribute("x2",String(Math.round(v))),d.setAttribute("y2",String(Math.round(w)))}e.colorStops.forEach((function(t){var e=t.offset,r=t.color,n=document.createElementNS("http://www.w3.org/2000/svg","stop");n.setAttribute("offset",100*e+"%"),n.setAttribute("stop-color",r),d.appendChild(n)})),h.setAttribute("fill","url('#"+u+"')"),this._defs.appendChild(d)}else r&&h.setAttribute("fill",r);this._element.appendChild(h)},t}(),L="canvas";for(var N={},T=0;T<=40;T++)N[T]=T;const F={type:L,width:300,height:300,data:"",margin:0,qrOptions:{typeNumber:N[0],mode:void 0,errorCorrectionLevel:"Q"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:"square",color:"#000"},backgroundOptions:{color:"#fff"}};var j=function(){return(j=Object.assign||function(t){for(var e,r=1,n=arguments.length;rMath.min(e.width,e.height)&&(e.margin=Math.min(e.width,e.height)),e.dotsOptions=j({},e.dotsOptions),e.dotsOptions.gradient&&(e.dotsOptions.gradient=Q(e.dotsOptions.gradient)),e.cornersSquareOptions&&(e.cornersSquareOptions=j({},e.cornersSquareOptions),e.cornersSquareOptions.gradient&&(e.cornersSquareOptions.gradient=Q(e.cornersSquareOptions.gradient))),e.cornersDotOptions&&(e.cornersDotOptions=j({},e.cornersDotOptions),e.cornersDotOptions.gradient&&(e.cornersDotOptions.gradient=Q(e.cornersDotOptions.gradient))),e.backgroundOptions&&(e.backgroundOptions=j({},e.backgroundOptions),e.backgroundOptions.gradient&&(e.backgroundOptions.gradient=Q(e.backgroundOptions.gradient))),e}var G=r(192),X=r.n(G),U=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function a(t){try{u(n.next(t))}catch(t){i(t)}}function s(t){try{u(n.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,s)}u((n=n.apply(t,e||[])).next())}))},Y=function(t,e){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]\r\n'+n],{type:"image/svg+xml"})]):[2,new Promise((function(r){return e.getCanvas().toBlob(r,"image/"+t,1)}))]}}))}))},t.prototype.download=function(t){return U(this,void 0,void 0,(function(){var e,r,n,o,i;return Y(this,(function(a){switch(a.label){case 0:if(!this._qr)throw"QR code is empty";return e="png",r="qr","string"==typeof t?(e=t,console.warn("Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument")):"object"==typeof t&&null!==t&&(t.name&&(r=t.name),t.extension&&(e=t.extension)),[4,this._getQRStylingElement(e)];case 1:return n=a.sent(),"svg"===e.toLowerCase()?(o=new XMLSerializer,i='\r\n'+(i=o.serializeToString(n.getElement())),s("data:image/svg+xml;charset=utf-8,"+encodeURIComponent(i),r+".svg")):s(n.getCanvas().toDataURL("image/"+e),r+"."+e),[2]}}))}))},t}()}},e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{}};return t[n](o,o.exports,r),o.exports}return r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r(796)})().default}}]); +//# sourceMappingURL=npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js.map \ No newline at end of file diff --git a/public/npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js.map b/public/npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js.map new file mode 100644 index 000000000..643b5ba45 --- /dev/null +++ b/public/npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"npm.qr-code-styling.5c8af6e9c411419a66e1.chunk.js","mappings":"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G,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAA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","sources":["webpack://tweb/./node_modules/qr-code-styling/lib/qr-code-styling.js"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.QRCodeStyling=e():t.QRCodeStyling=e()}(self,(function(){return(()=>{var t={192:(t,e)=>{var r,n,o=function(){var t=function(t,e){var r=t,n=a[e],o=null,i=0,u=null,v=[],y={},_=function(t,e){o=function(t){for(var e=new Array(t),r=0;r=7&&M(t),null==u&&(u=P(r,n,v)),C(u,e)},m=function(t,e){for(var r=-1;r<=7;r+=1)if(!(t+r<=-1||i<=t+r))for(var n=-1;n<=7;n+=1)e+n<=-1||i<=e+n||(o[t+r][e+n]=0<=r&&r<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=n&&n<=4)},b=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(e>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,e){for(var r=n<<3|e,a=s.getBCHTypeInfo(r),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},C=function(t,e){for(var r=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(e),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var d=0;d<2;d+=1)if(null==o[n][h-d]){var l=!1;u>>a&1)),c(n,h-d)&&(l=!l),o[n][h-d]=l,-1==(a-=1)&&(u+=1,a=7)}if((n+=r)<0||i<=n){n-=r,r=-r;break}}},P=function(t,e,r){for(var n=h.getRSBlocks(t,e),o=d(),i=0;i8*u)throw\"code length overflow. (\"+o.getLengthInBits()+\">\"+8*u+\")\";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,e){for(var r=0,n=0,o=0,i=new Array(e.length),a=new Array(e.length),u=0;u=0?p.getAt(g):0}}var v=0;for(l=0;ln)&&(t=n,e=r)}return e}())},y.createTableTag=function(t,e){t=t||2;var r=\"\";r+='',r+=\"\";for(var n=0;n\";for(var o=0;o';r+=\"\"}return(r+=\"\")+\"
\"},y.createSvgTag=function(t,e,r,n){var o={};\"object\"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,e=o.margin,r=o.alt,n=o.title),t=t||2,e=void 0===e?4*t:e,(r=\"string\"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||\"qrcode-description\":null,(n=\"string\"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||\"qrcode-title\":null;var i,a,s,u,c=y.getModuleCount()*t+2*e,h=\"\";for(u=\"l\"+t+\",0 0,\"+t+\" -\"+t+\",0 0,-\"+t+\"z \",h+='\",h+=n.text?''+O(n.text)+\"\":\"\",h+=r.text?''+O(r.text)+\"\":\"\",h+='',h+='')+\"\"},y.createDataURL=function(t,e){t=t||2,e=void 0===e?4*t:e;var r=y.getModuleCount()*t+2*e,n=e,o=r-e;return w(r,r,(function(e,r){if(n<=e&&e\"};var O=function(t){for(var e=\"\",r=0;r\":e+=\">\";break;case\"&\":e+=\"&\";break;case'\"':e+=\""\";break;default:e+=n}}return e};return y.createASCII=function(t,e){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var e,r,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={\"██\":\"█\",\"█ \":\"▀\",\" █\":\"▄\",\" \":\" \"},h={\"██\":\"▀\",\"█ \":\"▀\",\" █\":\" \",\" \":\" \"},d=\"\";for(e=0;e=u?h[i]:c[i];d+=\"\\n\"}return a%2&&t>0?d.substring(0,d.length-a-1)+Array(a+1).join(\"▀\"):d.substring(0,d.length-1)}(e);t-=1,e=void 0===e?2*t:e;var r,n,o,i,a=y.getModuleCount()*t+2*e,s=e,u=a-e,c=Array(t+1).join(\"██\"),h=Array(t+1).join(\" \"),d=\"\",l=\"\";for(r=0;r>>8),e.push(255&a)):e.push(n)}}return e}};var e,r,n,o,i,a={L:1,M:0,Q:3,H:2},s=(e=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,n=7973,i=function(t){for(var e=0;0!=t;)e+=1,t>>>=1;return e},(o={}).getBCHTypeInfo=function(t){for(var e=t<<10;i(e)-i(r)>=0;)e^=r<=0;)e^=n<5&&(r+=3+i-5)}for(n=0;n=256;)e-=255;return t[e]}}}();function c(t,e){if(void 0===t.length)throw t.length+\"/\"+e;var r=function(){for(var r=0;r>>7-e%8&1)},put:function(t,e){for(var n=0;n>>e-n-1&1))},getLengthInBits:function(){return e},putBit:function(r){var n=Math.floor(e/8);t.length<=n&&t.push(0),r&&(t[n]|=128>>>e%8),e+=1}};return r},l=function(t){var e=t,r={getMode:function(){return 1},getLength:function(t){return e.length},write:function(t){for(var r=e,o=0;o+2>>8&255)+(255&o),t.put(o,13),r+=2}if(r>>8)},writeBytes:function(t,r,n){r=r||0,n=n||t.length;for(var o=0;o0&&(e+=\",\"),e+=t[r];return e+\"]\"}};return e},y=function(t){var e=t,r=0,n=0,o=0,i={read:function(){for(;o<8;){if(r>=e.length){if(0==o)return-1;throw\"unexpected end of file./\"+o}var t=e.charAt(r);if(r+=1,\"=\"==t)return o=0,-1;t.match(/^\\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw\"c:\"+t};return i},w=function(t,e,r){for(var n=function(t,e){var r=t,n=e,o=new Array(t*e),i={setPixel:function(t,e,n){o[e*r+t]=n},write:function(t){t.writeString(\"GIF87a\"),t.writeShort(r),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(\",\"),t.writeShort(0),t.writeShort(0),t.writeShort(r),t.writeShort(n),t.writeByte(0);var e=a(2);t.writeByte(2);for(var o=0;e.length-o>255;)t.writeByte(255),t.writeBytes(e,o,255),o+=255;t.writeByte(e.length-o),t.writeBytes(e,o,e.length-o),t.writeByte(0),t.writeString(\";\")}},a=function(t){for(var e=1<>>e!=0)throw\"length over\";for(;c+e>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});l.write(e,n);var f=0,p=String.fromCharCode(o[f]);for(f+=1;f=6;)i(t>>>e-6),e-=6},o.flush=function(){if(e>0&&(i(t<<6-e),t=0,e=0),r%3!=0)for(var o=3-r%3,a=0;a>6,128|63&n):n<55296||n>=57344?e.push(224|n>>12,128|n>>6&63,128|63&n):(r++,n=65536+((1023&n)<<10|1023&t.charCodeAt(r)),e.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return e}(t)},void 0===(n=\"function\"==typeof(r=function(){return o})?r.apply(e,[]):r)||(t.exports=n)},796:(t,e,r)=>{\"use strict\";r.d(e,{default:()=>W});var n=function(){return(n=Object.assign||function(t){for(var e,r=1,n=arguments.length;rn||o&&o2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0,h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:e,y:r,size:n,context:o,rotation:0});else{if(2===h){var d=0;return a&&u?d=Math.PI/2:u&&s?d=Math.PI:s&&c&&(d=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:d})}if(1===h)return d=0,u?d=Math.PI/2:s?d=Math.PI:c&&(d=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,context:o,rotation:d})}else this._basicDot({x:e,y:r,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=i?+i(-1,0):0,s=i?+i(1,0):0,u=i?+i(0,-1):0,c=i?+i(0,1):0;0!==a+s+u+c?a||u?s||c?this._basicSquare({x:e,y:r,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,context:o,rotation:Math.PI/2})},t}(),w=\"square\",_=\"extra-rounded\";var m=function(){return(m=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=P[t])||void 0===n?void 0:n[r])||(null===(i=P[t-e+7])||void 0===i?void 0:i[r])||(null===(a=P[t])||void 0===a?void 0:a[r-e+7])||(null===(s=O[t])||void 0===s?void 0:s[r])||(null===(u=O[t-e+7])||void 0===u?void 0:u[r])||(null===(c=O[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(e){var r;e.done?t(e.value):(r=e.value,r instanceof n?r:new n((function(t){t(r)}))).then(a,s)}u((o=o.apply(e,r||[])).next())}));var e,r,n,o},t.prototype.drawBackground=function(){var t=this.context,e=this._options;if(t){if(e.backgroundOptions.gradient){var r=e.backgroundOptions.gradient,n=this._createGradient({context:t,options:r,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});r.colorStops.forEach((function(t){var e=t.offset,r=t.color;n.addColorStop(e,r)})),t.fillStyle=n}else e.backgroundOptions.color&&(t.fillStyle=e.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var e=this;if(!this._qr)throw\"QR code is not defined\";var r=this.context;if(!r)throw\"QR code is not defined\";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw\"The canvas is too small.\";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),c=new y({context:r,type:n.dotsOptions.type});r.beginPath();for(var h=function(r){for(var n=function(n){return t&&!t(r,n)?\"continue\":d._qr.isDark(r,n)?void c.draw(s+r*a,u+n*a,a,(function(i,a){return!(r+i<0||n+a<0||r+i>=o||n+a>=o)&&!(t&&!t(r+i,n+a))&&!!e._qr&&e._qr.isDark(r+i,n+a)})):\"continue\"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,d-=s/2*Math.tan(u),l+=s/2,f+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(d-=s/2,h-=s/2/Math.tan(u),f+=s/2,l+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,d+=s/2*Math.tan(u),l-=s/2,f-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(d+=s/2,h+=s/2/Math.tan(u),f-=s/2,l-=s/2/Math.tan(u)),e=r.createLinearGradient(Math.round(h),Math.round(d),Math.round(l),Math.round(f))}return e},t}();var D=function(){return(D=Object.assign||function(t){for(var e,r=1,n=arguments.length;r2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawExtraRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0,c=i+a+s+u;if(0!==c)if(c>2||i&&a||s&&u)this._basicSquare({x:e,y:r,size:n,rotation:0});else{if(2===c){var h=0;return i&&s?h=Math.PI/2:s&&a?h=Math.PI:a&&u&&(h=-Math.PI/2),void this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:h})}if(1===c)return h=0,s?h=Math.PI/2:a?h=Math.PI:u&&(h=-Math.PI/2),void this._basicSideRounded({x:e,y:r,size:n,rotation:h})}else this._basicDot({x:e,y:r,size:n,rotation:0})},t.prototype._drawClassy=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var e=t.x,r=t.y,n=t.size,o=t.getNeighbor,i=o?+o(-1,0):0,a=o?+o(1,0):0,s=o?+o(0,-1):0,u=o?+o(0,1):0;0!==i+a+s+u?i||s?a||u?this._basicSquare({x:e,y:r,size:n,rotation:0}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:e,y:r,size:n,rotation:-Math.PI/2}):this._basicCornersRounded({x:e,y:r,size:n,rotation:Math.PI/2})},t}();var A=function(){return(A=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(n=B[t])||void 0===n?void 0:n[r])||(null===(i=B[t-e+7])||void 0===i?void 0:i[r])||(null===(a=B[t])||void 0===a?void 0:a[r-e+7])||(null===(s=E[t])||void 0===s?void 0:s[r])||(null===(u=E[t-e+7])||void 0===u?void 0:u[r])||(null===(c=E[t])||void 0===c?void 0:c[r-e+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(e){var r;e.done?t(e.value):(r=e.value,r instanceof n?r:new n((function(t){t(r)}))).then(a,s)}u((o=o.apply(e,r||[])).next())}));var e,r,n,o},t.prototype.drawBackground=function(){var t,e,r=this._element,n=this._options;if(r){var o=null===(t=n.backgroundOptions)||void 0===t?void 0:t.gradient,i=null===(e=n.backgroundOptions)||void 0===e?void 0:e.color;(o||i)&&this._createColor({options:o,color:i,additionalRotation:0,x:0,y:0,height:n.height,width:n.width,name:\"background-color\"})}},t.prototype.drawDots=function(t){var e,r,n=this;if(!this._qr)throw\"QR code is not defined\";var o=this._options,i=this._qr.getModuleCount();if(i>o.width||i>o.height)throw\"The canvas is too small.\";var a=Math.min(o.width,o.height)-2*o.margin,s=Math.floor(a/i),u=Math.floor((o.width-i*s)/2),c=Math.floor((o.height-i*s)/2),h=new I({svg:this._element,type:o.dotsOptions.type});this._dotsClipPath=document.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\"),this._dotsClipPath.setAttribute(\"id\",\"clip-path-dot-color\"),this._defs.appendChild(this._dotsClipPath),this._createColor({options:null===(e=o.dotsOptions)||void 0===e?void 0:e.gradient,color:o.dotsOptions.color,additionalRotation:0,x:u,y:c,height:i*s,width:i*s,name:\"dot-color\"});for(var d=function(e){for(var o=function(o){return t&&!t(e,o)?\"continue\":(null===(r=l._qr)||void 0===r?void 0:r.isDark(e,o))?(h.draw(u+e*s,c+o*s,s,(function(r,a){return!(e+r<0||o+a<0||e+r>=i||o+a>=i)&&!(t&&!t(e+r,o+a))&&!!n._qr&&n._qr.isDark(e+r,o+a)})),void(h._element&&l._dotsClipPath&&l._dotsClipPath.appendChild(h._element))):\"continue\"},a=0;aa?s:a,h=document.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\");if(h.setAttribute(\"x\",String(o)),h.setAttribute(\"y\",String(i)),h.setAttribute(\"height\",String(a)),h.setAttribute(\"width\",String(s)),h.setAttribute(\"clip-path\",\"url('#clip-path-\"+u+\"')\"),e){var d;if(e.type===C)(d=document.createElementNS(\"http://www.w3.org/2000/svg\",\"radialGradient\")).setAttribute(\"id\",u),d.setAttribute(\"gradientUnits\",\"userSpaceOnUse\"),d.setAttribute(\"fx\",String(o+s/2)),d.setAttribute(\"fy\",String(i+a/2)),d.setAttribute(\"cx\",String(o+s/2)),d.setAttribute(\"cy\",String(i+a/2)),d.setAttribute(\"r\",String(c/2));else{var l=((e.rotation||0)+n)%(2*Math.PI),f=(l+2*Math.PI)%(2*Math.PI),p=o+s/2,g=i+a/2,v=o+s/2,y=i+a/2;f>=0&&f<=.25*Math.PI||f>1.75*Math.PI&&f<=2*Math.PI?(p-=s/2,g-=a/2*Math.tan(l),v+=s/2,y+=a/2*Math.tan(l)):f>.25*Math.PI&&f<=.75*Math.PI?(g-=a/2,p-=s/2/Math.tan(l),y+=a/2,v+=s/2/Math.tan(l)):f>.75*Math.PI&&f<=1.25*Math.PI?(p+=s/2,g+=a/2*Math.tan(l),v-=s/2,y-=a/2*Math.tan(l)):f>1.25*Math.PI&&f<=1.75*Math.PI&&(g+=a/2,p+=s/2/Math.tan(l),y-=a/2,v-=s/2/Math.tan(l)),(d=document.createElementNS(\"http://www.w3.org/2000/svg\",\"linearGradient\")).setAttribute(\"id\",u),d.setAttribute(\"gradientUnits\",\"userSpaceOnUse\"),d.setAttribute(\"x1\",String(Math.round(p))),d.setAttribute(\"y1\",String(Math.round(g))),d.setAttribute(\"x2\",String(Math.round(v))),d.setAttribute(\"y2\",String(Math.round(y)))}e.colorStops.forEach((function(t){var e=t.offset,r=t.color,n=document.createElementNS(\"http://www.w3.org/2000/svg\",\"stop\");n.setAttribute(\"offset\",100*e+\"%\"),n.setAttribute(\"stop-color\",r),d.appendChild(n)})),h.setAttribute(\"fill\",\"url('#\"+u+\"')\"),this._defs.appendChild(d)}else r&&h.setAttribute(\"fill\",r);this._element.appendChild(h)},t}(),N=\"canvas\";for(var T={},j=0;j<=40;j++)T[j]=j;const F={type:N,width:300,height:300,data:\"\",margin:0,qrOptions:{typeNumber:T[0],mode:void 0,errorCorrectionLevel:\"Q\"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:\"square\",color:\"#000\"},backgroundOptions:{color:\"#fff\"}};var Q=function(){return(Q=Object.assign||function(t){for(var e,r=1,n=arguments.length;rMath.min(e.width,e.height)&&(e.margin=Math.min(e.width,e.height)),e.dotsOptions=Q({},e.dotsOptions),e.dotsOptions.gradient&&(e.dotsOptions.gradient=H(e.dotsOptions.gradient)),e.cornersSquareOptions&&(e.cornersSquareOptions=Q({},e.cornersSquareOptions),e.cornersSquareOptions.gradient&&(e.cornersSquareOptions.gradient=H(e.cornersSquareOptions.gradient))),e.cornersDotOptions&&(e.cornersDotOptions=Q({},e.cornersDotOptions),e.cornersDotOptions.gradient&&(e.cornersDotOptions.gradient=H(e.cornersDotOptions.gradient))),e.backgroundOptions&&(e.backgroundOptions=Q({},e.backgroundOptions),e.backgroundOptions.gradient&&(e.backgroundOptions.gradient=H(e.backgroundOptions.gradient))),e}var X=r(192),U=r.n(X),Y=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function a(t){try{u(n.next(t))}catch(t){i(t)}}function s(t){try{u(n.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,s)}u((n=n.apply(t,e||[])).next())}))},$=function(t,e){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError(\"Generator is already executing.\");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]\\r\\n'+n],{type:\"image/svg+xml\"})]):[2,new Promise((function(r){return e.getCanvas().toBlob(r,\"image/\"+t,1)}))]}}))}))},t.prototype.download=function(t){return Y(this,void 0,void 0,(function(){var e,r,n,o,i;return $(this,(function(a){switch(a.label){case 0:if(!this._qr)throw\"QR code is empty\";return e=\"png\",r=\"qr\",\"string\"==typeof t?(e=t,console.warn(\"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\")):\"object\"==typeof t&&null!==t&&(t.name&&(r=t.name),t.extension&&(e=t.extension)),[4,this._getQRStylingElement(e)];case 1:return n=a.sent(),\"svg\"===e.toLowerCase()?(o=new XMLSerializer,i='\\r\\n'+(i=o.serializeToString(n.getElement())),s(\"data:image/svg+xml;charset=utf-8,\"+encodeURIComponent(i),r+\".svg\")):s(n.getCanvas().toDataURL(\"image/\"+e),r+\".\"+e),[2]}}))}))},t}()}},e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{}};return t[n](o,o.exports,r),o.exports}return r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r(796)})().default}));\n//# sourceMappingURL=qr-code-styling.js.map"],"names":["self","module","exports","t","e","r","n","o","a","i","u","v","y","_","Array","m","x","b","S","M","P","C","s","getPatternPosition","length","c","getBCHTypeNumber","Math","floor","getBCHTypeInfo","getMaskFunction","h","d","l","getRSBlocks","put","getMode","getLength","getLengthInBits","write","dataCount","putBit","totalCount","max","getBuffer","f","getErrorCorrectPolynomial","p","mod","g","getAt","w","addData","push","isDark","getModuleCount","make","getLostPoint","createTableTag","createSvgTag","arguments","cellSize","margin","alt","title","text","id","scalable","O","join","trim","createDataURL","createImgTag","charAt","createASCII","substring","renderTo2dContext","fillStyle","fillRect","stringToBytes","stringToBytesFuncs","default","charCodeAt","createStringToBytes","read","String","fromCharCode","L","Q","H","multiply","gexp","abs","glog","SJIS","writeByte","writeShort","writeBytes","writeString","toByteArray","toString","match","setPixel","add","flush","contains","indexOf","size","apply","W","Object","assign","prototype","hasOwnProperty","call","this","isArray","shift","keys","forEach","document","createElement","download","href","body","appendChild","click","removeChild","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dotSize","height","width","hideYDots","hideXDots","sqrt","ceil","round","context","type","_context","_type","draw","_drawDot","_drawClassy","_drawClassyRounded","_drawRounded","_drawExtraRounded","_drawSquare","getNeighbor","_rotateFigure","rotation","translate","rotate","closePath","_basicDot","arc","PI","_basicSquare","rect","_basicSideRounded","lineTo","_basicCornerRounded","_basicCornerExtraRounded","_basicCornersRounded","_basicCornersExtraRounded","_basicExtraRounded","z","_canvas","_options","defineProperty","get","getContext","enumerable","configurable","getCanvas","clear","clearRect","drawQR","label","sent","trys","ops","next","throw","return","Symbol","iterator","TypeError","done","value","pop","min","_qr","image","loadImage","_image","imageOptions","qrOptions","imageSize","errorCorrectionLevel","drawBackground","drawDots","hideBackgroundDots","drawCorners","drawImage","count","Promise","then","backgroundOptions","gradient","_createGradient","options","additionalRotation","colorStops","offset","color","addColorStop","dotsOptions","beginPath","strokeStyle","fill","D","I","cornersSquareOptions","A","k","q","R","B","E","cornersDotOptions","N","T","Image","crossOrigin","onload","src","createRadialGradient","tan","createLinearGradient","svg","_svg","_element","setAttribute","createElementNS","_defs","getElement","cloneNode","parentNode","replaceChild","_createColor","name","_dotsClipPath","_cornersSquareClipPath","_cornersDotClipPath","j","F","data","typeNumber","mode","Number","map","G","Boolean","X","U","Y","$","update","_clearContainer","innerHTML","_getQRStylingElement","toLowerCase","_svgDrawingPromise","_canvasDrawingPromise","_container","test","append","getRawData","XMLSerializer","serializeToString","Blob","toBlob","console","warn","extension","encodeURIComponent","toDataURL","__esModule"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js b/public/npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js deleted file mode 100644 index 8b8563965..000000000 --- a/public/npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[10],{199:function(t,r,e){self,t.exports=(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&m(t),null==u&&(u=k(e,n,v)),S(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},O=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},S=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},k=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e="";e+='',e+="";for(var n=0;n";for(var o=0;o';e+=""}return(e+="")+"
"},y.createSvgTag=function(t,r,e,n){var o={};"object"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e="string"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||"qrcode-description":null,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-title":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h="";for(u="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",h+=''+C(n.text)+"":"",h+=e.text?''+C(e.text)+"":"",h+='',h+='"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r"};var C=function(t){for(var r="",e=0;e":r+=">";break;case"&":r+="&";break;case'"':r+=""";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={"██":"█","█ ":"▀"," █":"▄"," ":" "},h={"██":"▀","█ ":"▀"," █":" "," ":" "},f="";for(r=0;r=u?h[i]:c[i];f+="\n"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join("▀"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join("██"),h=Array(t+1).join(" "),f="",d="";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+"/"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=","),r+=t[e];return r+"]"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw"unexpected end of file./"+o}var t=r.charAt(e);if(e+=1,"="==t)return o=0,-1;t.match(/^\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString("GIF87a"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(";")}},a=function(t){for(var r=1<>>r!=0)throw"length over";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n="function"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{"use strict";e.d(r,{default:()=>S});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((e=void 0)||(e=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(r){var n;r.done?t(r.value):(n=r.value,n instanceof e?n:new e((function(t){t(n)}))).then(i,a)}s((n=n.apply(r,[])).next())}));var r,e,n},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw"QR code is not defined";var e=this.context;if(!e)throw"QR code is not defined";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw"The canvas is too small.";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?"continue":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):"continue"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:"",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:"Q"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:"square",color:"#000"},backgroundOptions:{color:"#fff"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var m=e(192),O=e.n(m);const S=function(){function t(t){this._options=t?M(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML="")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?M(a(this._options,r)):this._options,this._options.data&&(this._qr=O()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return"Numeric";case/^[0-9A-Z $%*+\-./:]*$/.test(t):return"Alphanumeric";default:return"Byte"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if("function"!=typeof t.appendChild)throw"Container should be a single DOM node";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e="png",n="qr";"string"==typeof t?(e=t,console.warn("Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument")):"object"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement("a");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL("image/"+e),n+"."+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}}]); -//# sourceMappingURL=npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js.map \ No newline at end of file diff --git a/public/npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js.map b/public/npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js.map deleted file mode 100644 index 6b8591783..000000000 --- a/public/npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./node_modules/qr-code-styling/lib/qr-code-styling.js"],"names":["self","module","exports","t","192","r","e","n","o","a","i","u","v","y","x","Array","b","m","_","S","M","C","O","s","getPatternPosition","length","c","getBCHTypeNumber","Math","floor","getBCHTypeInfo","getMaskFunction","h","f","d","getRSBlocks","put","getMode","getLength","getLengthInBits","write","dataCount","putBit","totalCount","max","getBuffer","l","getErrorCorrectPolynomial","g","mod","p","getAt","w","addData","push","isDark","getModuleCount","make","getLostPoint","createTableTag","createSvgTag","arguments","cellSize","margin","alt","title","text","id","scalable","k","join","trim","createDataURL","createImgTag","charAt","createASCII","substring","renderTo2dContext","fillStyle","fillRect","stringToBytes","stringToBytesFuncs","default","charCodeAt","createStringToBytes","read","String","fromCharCode","L","Q","H","multiply","gexp","abs","glog","SJIS","writeByte","writeShort","writeBytes","writeString","toByteArray","toString","match","setPixel","add","flush","contains","indexOf","size","apply","151","Object","assign","prototype","hasOwnProperty","call","this","isArray","shift","keys","forEach","context","type","_context","_type","draw","_drawDot","_drawClassy","_drawClassyRounded","_drawRounded","_drawExtraRounded","_drawSquare","getNeighbor","_rotateFigure","rotation","translate","rotate","closePath","_basicDot","arc","PI","_basicSquare","rect","_basicSideRounded","lineTo","_basicCornerRounded","_basicCornerExtraRounded","_basicCornersRounded","_basicCornersExtraRounded","_basicExtraRounded","_canvas","document","createElement","width","height","_options","defineProperty","get","getContext","enumerable","configurable","getCanvas","clear","clearRect","drawQR","label","sent","trys","ops","next","throw","return","Symbol","iterator","TypeError","done","value","pop","min","hideXDots","hideYDots","_qr","image","loadImage","_image","imageOptions","qrOptions","imageSize","errorCorrectionLevel","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dotSize","sqrt","ceil","round","drawBackground","drawDots","hideBackgroundDots","drawCorners","drawImage","count","Promise","then","backgroundOptions","gradient","_createGradient","options","additionalRotation","colorStops","offset","color","addColorStop","dotsOptions","beginPath","strokeStyle","fill","P","D","I","cornersSquareOptions","z","B","A","q","R","cornersDotOptions","T","j","E","Image","crossOrigin","onload","src","createRadialGradient","tan","createLinearGradient","data","typeNumber","mode","Number","map","Boolean","update","_clearContainer","innerHTML","_container","test","_drawingPromise","append","appendChild","download","console","warn","name","extension","href","body","click","removeChild","toDataURL","__esModule"],"mappings":"0EAA+MA,KAA9IC,EAAOC,QAA8J,MAAM,IAAIC,EAAE,CAACC,IAAI,CAACD,EAAEE,KAAK,IAAIC,EAAEC,EAAEC,EAAE,WAAW,IAAIL,EAAE,SAASA,EAAEE,GAAG,IAAIC,EAAEH,EAAEI,EAAEE,EAAEJ,GAAGG,EAAE,KAAKE,EAAE,EAAEC,EAAE,KAAKC,EAAE,GAAGC,EAAE,GAAGC,EAAE,SAASX,EAAEE,GAAGG,EAAE,SAASL,GAAG,IAAI,IAAIE,EAAE,IAAIU,MAAMZ,GAAGG,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,CAACD,EAAEC,GAAG,IAAIS,MAAMZ,GAAG,IAAI,IAAII,EAAE,EAAEA,EAAEJ,EAAEI,GAAG,EAAEF,EAAEC,GAAGC,GAAG,KAAK,OAAOF,EAA5G,CAA+GK,EAAE,EAAEJ,EAAE,IAAIU,EAAE,EAAE,GAAGA,EAAEN,EAAE,EAAE,GAAGM,EAAE,EAAEN,EAAE,GAAGO,IAAIC,IAAIC,EAAEhB,EAAEE,GAAGC,GAAG,GAAGc,EAAEjB,GAAG,MAAMQ,IAAIA,EAAEU,EAAEf,EAAEC,EAAEK,IAAIU,EAAEX,EAAEN,IAAIW,EAAE,SAASb,EAAEE,GAAG,IAAI,IAAIC,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAE,KAAKH,EAAEG,IAAI,GAAGI,GAAGP,EAAEG,GAAG,IAAI,IAAIC,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAEF,EAAEE,IAAI,GAAGG,GAAGL,EAAEE,IAAIC,EAAEL,EAAEG,GAAGD,EAAEE,GAAG,GAAGD,GAAGA,GAAG,IAAI,GAAGC,GAAG,GAAGA,IAAI,GAAGA,GAAGA,GAAG,IAAI,GAAGD,GAAG,GAAGA,IAAI,GAAGA,GAAGA,GAAG,GAAG,GAAGC,GAAGA,GAAG,IAAIW,EAAE,WAAW,IAAI,IAAIf,EAAE,EAAEA,EAAEO,EAAE,EAAEP,GAAG,EAAE,MAAMK,EAAEL,GAAG,KAAKK,EAAEL,GAAG,GAAGA,EAAE,GAAG,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAEK,EAAE,EAAEL,GAAG,EAAE,MAAMG,EAAE,GAAGH,KAAKG,EAAE,GAAGH,GAAGA,EAAE,GAAG,IAAIY,EAAE,WAAW,IAAI,IAAId,EAAEoB,EAAEC,mBAAmBlB,GAAGD,EAAE,EAAEA,EAAEF,EAAEsB,OAAOpB,GAAG,EAAE,IAAI,IAAIE,EAAE,EAAEA,EAAEJ,EAAEsB,OAAOlB,GAAG,EAAE,CAAC,IAAIG,EAAEP,EAAEE,GAAGI,EAAEN,EAAEI,GAAG,GAAG,MAAMC,EAAEE,GAAGD,GAAG,IAAI,IAAIE,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAE,IAAI,IAAIe,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAElB,EAAEE,EAAEC,GAAGF,EAAEiB,IAAI,GAAGf,GAAG,GAAGA,IAAI,GAAGe,GAAG,GAAGA,GAAG,GAAGf,GAAG,GAAGe,IAAIN,EAAE,SAASjB,GAAG,IAAI,IAAIE,EAAEkB,EAAEI,iBAAiBrB,GAAGC,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAE,CAAC,IAAIE,GAAGN,GAAG,IAAIE,GAAGE,EAAE,GAAGC,EAAEoB,KAAKC,MAAMtB,EAAE,IAAIA,EAAE,EAAEG,EAAE,EAAE,GAAGD,EAAE,IAAIF,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAEE,GAAGN,GAAG,IAAIE,GAAGE,EAAE,GAAGC,EAAED,EAAE,EAAEG,EAAE,EAAE,GAAGkB,KAAKC,MAAMtB,EAAE,IAAIE,GAAGU,EAAE,SAAShB,EAAEE,GAAG,IAAI,IAAIC,EAAEC,GAAG,EAAEF,EAAEI,EAAEc,EAAEO,eAAexB,GAAGK,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAE,CAAC,IAAIe,GAAGvB,GAAG,IAAIM,GAAGE,EAAE,GAAGA,EAAE,EAAEH,EAAEG,GAAG,GAAGe,EAAEf,EAAE,EAAEH,EAAEG,EAAE,GAAG,GAAGe,EAAElB,EAAEE,EAAE,GAAGC,GAAG,GAAGe,EAAE,IAAIf,EAAE,EAAEA,EAAE,GAAGA,GAAG,EAAEe,GAAGvB,GAAG,IAAIM,GAAGE,EAAE,GAAGA,EAAE,EAAEH,EAAE,GAAGE,EAAEC,EAAE,GAAGe,EAAEf,EAAE,EAAEH,EAAE,GAAG,GAAGG,EAAE,EAAE,GAAGe,EAAElB,EAAE,GAAG,GAAGG,EAAE,GAAGe,EAAElB,EAAEE,EAAE,GAAG,IAAIP,GAAGmB,EAAE,SAASnB,EAAEE,GAAG,IAAI,IAAIC,GAAG,EAAEC,EAAEG,EAAE,EAAED,EAAE,EAAEE,EAAE,EAAEe,EAAEH,EAAEQ,gBAAgB1B,GAAG2B,EAAEtB,EAAE,EAAEsB,EAAE,EAAEA,GAAG,EAAE,IAAI,GAAGA,IAAIA,GAAG,KAAK,CAAC,IAAI,IAAIC,EAAE,EAAEA,EAAE,EAAEA,GAAG,EAAE,GAAG,MAAMzB,EAAED,GAAGyB,EAAEC,GAAG,CAAC,IAAIC,GAAE,EAAGvB,EAAER,EAAEsB,SAASS,EAAE,IAAI/B,EAAEQ,KAAKF,EAAE,IAAIiB,EAAEnB,EAAEyB,EAAEC,KAAKC,GAAGA,GAAG1B,EAAED,GAAGyB,EAAEC,GAAGC,GAAG,IAAIzB,GAAG,KAAKE,GAAG,EAAEF,EAAE,GAAG,IAAIF,GAAGD,GAAG,GAAGI,GAAGH,EAAE,CAACA,GAAGD,EAAEA,GAAGA,EAAE,SAASe,EAAE,SAASlB,EAAEE,EAAEC,GAAG,IAAI,IAAIC,EAAEyB,EAAEG,YAAYhC,EAAEE,GAAGG,EAAEyB,IAAIvB,EAAE,EAAEA,EAAEJ,EAAEmB,OAAOf,GAAG,EAAE,CAAC,IAAID,EAAEH,EAAEI,GAAGF,EAAE4B,IAAI3B,EAAE4B,UAAU,GAAG7B,EAAE4B,IAAI3B,EAAE6B,YAAYf,EAAEgB,gBAAgB9B,EAAE4B,UAAUlC,IAAIM,EAAE+B,MAAMhC,GAAG,IAAIG,EAAE,EAAE,IAAID,EAAE,EAAEA,EAAEH,EAAEkB,OAAOf,GAAG,EAAEC,GAAGJ,EAAEG,GAAG+B,UAAU,GAAGjC,EAAE+B,kBAAkB,EAAE5B,EAAE,KAAK,0BAA0BH,EAAE+B,kBAAkB,IAAI,EAAE5B,EAAE,IAAI,IAAIH,EAAE+B,kBAAkB,GAAG,EAAE5B,GAAGH,EAAE4B,IAAI,EAAE,GAAG5B,EAAE+B,kBAAkB,GAAG,GAAG/B,EAAEkC,QAAO,GAAI,OAAOlC,EAAE+B,mBAAmB,EAAE5B,IAAIH,EAAE4B,IAAI,IAAI,GAAG5B,EAAE+B,mBAAmB,EAAE5B,KAAKH,EAAE4B,IAAI,GAAG,GAAG,OAAO,SAASjC,EAAEE,GAAG,IAAI,IAAIC,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEE,EAAE,IAAIK,MAAMV,EAAEoB,QAAQhB,EAAE,IAAIM,MAAMV,EAAEoB,QAAQd,EAAE,EAAEA,EAAEN,EAAEoB,OAAOd,GAAG,EAAE,CAAC,IAAIqB,EAAE3B,EAAEM,GAAG8B,UAAUR,EAAE5B,EAAEM,GAAGgC,WAAWX,EAAEzB,EAAEqB,KAAKgB,IAAIrC,EAAEyB,GAAGxB,EAAEoB,KAAKgB,IAAIpC,EAAEyB,GAAGvB,EAAEC,GAAG,IAAII,MAAMiB,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAExB,EAAEC,GAAGc,OAAOS,GAAG,EAAExB,EAAEC,GAAGuB,GAAG,IAAI/B,EAAE0C,YAAYX,EAAE5B,GAAGA,GAAG0B,EAAE,IAAIc,EAAEvB,EAAEwB,0BAA0Bd,GAAGe,EAAEtB,EAAEhB,EAAEC,GAAGmC,EAAER,YAAY,GAAGW,IAAIH,GAAG,IAAIrC,EAAEE,GAAG,IAAII,MAAM+B,EAAER,YAAY,GAAGJ,EAAE,EAAEA,EAAEzB,EAAEE,GAAGc,OAAOS,GAAG,EAAE,CAAC,IAAIgB,EAAEhB,EAAEc,EAAEV,YAAY7B,EAAEE,GAAGc,OAAOhB,EAAEE,GAAGuB,GAAGgB,GAAG,EAAEF,EAAEG,MAAMD,GAAG,GAAG,IAAItC,EAAE,EAAE,IAAIsB,EAAE,EAAEA,EAAE7B,EAAEoB,OAAOS,GAAG,EAAEtB,GAAGP,EAAE6B,GAAGS,WAAW,IAAI9B,EAAE,IAAIE,MAAMH,GAAGwC,EAAE,EAAE,IAAIlB,EAAE,EAAEA,EAAE3B,EAAE2B,GAAG,EAAE,IAAIvB,EAAE,EAAEA,EAAEN,EAAEoB,OAAOd,GAAG,EAAEuB,EAAExB,EAAEC,GAAGc,SAASZ,EAAEuC,GAAG1C,EAAEC,GAAGuB,GAAGkB,GAAG,GAAG,IAAIlB,EAAE,EAAEA,EAAE1B,EAAE0B,GAAG,EAAE,IAAIvB,EAAE,EAAEA,EAAEN,EAAEoB,OAAOd,GAAG,EAAEuB,EAAEzB,EAAEE,GAAGc,SAASZ,EAAEuC,GAAG3C,EAAEE,GAAGuB,GAAGkB,GAAG,GAAG,OAAOvC,EAAzqB,CAA4qBL,EAAED,IAAIM,EAAEwC,QAAQ,SAASlD,EAAEE,GAAG,IAAIC,EAAE,KAAK,OAAOD,EAAEA,GAAG,QAAQ,IAAI,UAAUC,EAAE4B,EAAE/B,GAAG,MAAM,IAAI,eAAeG,EAAEwC,EAAE3C,GAAG,MAAM,IAAI,OAAOG,EAAE0C,EAAE7C,GAAG,MAAM,IAAI,QAAQG,EAAE4C,EAAE/C,GAAG,MAAM,QAAQ,KAAK,QAAQE,EAAEO,EAAE0C,KAAKhD,GAAGK,EAAE,MAAME,EAAE0C,OAAO,SAASpD,EAAEE,GAAG,GAAGF,EAAE,GAAGO,GAAGP,GAAGE,EAAE,GAAGK,GAAGL,EAAE,MAAMF,EAAE,IAAIE,EAAE,OAAOG,EAAEL,GAAGE,IAAIQ,EAAE2C,eAAe,WAAW,OAAO9C,GAAGG,EAAE4C,KAAK,WAAW,GAAGnD,EAAE,EAAE,CAAC,IAAI,IAAIH,EAAE,EAAEA,EAAE,GAAGA,IAAI,CAAC,IAAI,IAAIE,EAAE2B,EAAEG,YAAYhC,EAAEI,GAAGC,EAAEyB,IAAIvB,EAAE,EAAEA,EAAEE,EAAEa,OAAOf,IAAI,CAAC,IAAID,EAAEG,EAAEF,GAAGF,EAAE4B,IAAI3B,EAAE4B,UAAU,GAAG7B,EAAE4B,IAAI3B,EAAE6B,YAAYf,EAAEgB,gBAAgB9B,EAAE4B,UAAUlC,IAAIM,EAAE+B,MAAMhC,GAAG,IAAIG,EAAE,EAAE,IAAID,EAAE,EAAEA,EAAEL,EAAEoB,OAAOf,IAAIC,GAAGN,EAAEK,GAAG+B,UAAU,GAAGjC,EAAE+B,mBAAmB,EAAE5B,EAAE,MAAML,EAAEH,EAAEW,GAAE,EAAG,WAAW,IAAI,IAAIX,EAAE,EAAEE,EAAE,EAAEC,EAAE,EAAEA,EAAE,EAAEA,GAAG,EAAE,CAACQ,GAAE,EAAGR,GAAG,IAAIC,EAAEgB,EAAEmC,aAAa7C,IAAI,GAAGP,GAAGH,EAAEI,KAAKJ,EAAEI,EAAEF,EAAEC,GAAG,OAAOD,EAAvG,KAA8GQ,EAAE8C,eAAe,SAASxD,EAAEE,GAAGF,EAAEA,GAAG,EAAE,IAAIG,EAAE,GAAGA,GAAG,iBAAiBA,GAAG,0CAA0CA,GAAG,8BAA8BA,GAAG,2BAA2BD,OAAE,IAASA,EAAE,EAAEF,EAAEE,GAAG,MAAMC,GAAG,KAAKA,GAAG,UAAU,IAAI,IAAIC,EAAE,EAAEA,EAAEM,EAAE2C,iBAAiBjD,GAAG,EAAE,CAACD,GAAG,OAAO,IAAI,IAAIE,EAAE,EAAEA,EAAEK,EAAE2C,iBAAiBhD,GAAG,EAAEF,GAAG,cAAcA,GAAG,0CAA0CA,GAAG,8BAA8BA,GAAG,8BAA8BA,GAAG,WAAWH,EAAE,MAAMG,GAAG,YAAYH,EAAE,MAAMG,GAAG,sBAAsBA,GAAGO,EAAE0C,OAAOhD,EAAEC,GAAG,UAAU,UAAUF,GAAG,IAAIA,GAAG,MAAMA,GAAG,QAAQ,OAAOA,GAAG,YAAY,YAAYO,EAAE+C,aAAa,SAASzD,EAAEE,EAAEC,EAAEC,GAAG,IAAIC,EAAE,GAAG,iBAAiBqD,UAAU,KAAK1D,GAAGK,EAAEqD,UAAU,IAAIC,SAASzD,EAAEG,EAAEuD,OAAOzD,EAAEE,EAAEwD,IAAIzD,EAAEC,EAAEyD,OAAO9D,EAAEA,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,GAAGC,EAAE,iBAAiBA,EAAE,CAAC4D,KAAK5D,GAAGA,GAAG,IAAI4D,KAAK5D,EAAE4D,MAAM,KAAK5D,EAAE6D,GAAG7D,EAAE4D,KAAK5D,EAAE6D,IAAI,qBAAqB,MAAM5D,EAAE,iBAAiBA,EAAE,CAAC2D,KAAK3D,GAAGA,GAAG,IAAI2D,KAAK3D,EAAE2D,MAAM,KAAK3D,EAAE4D,GAAG5D,EAAE2D,KAAK3D,EAAE4D,IAAI,eAAe,KAAK,IAAIzD,EAAED,EAAEc,EAAEZ,EAAEe,EAAEb,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAE2B,EAAE,GAAG,IAAIrB,EAAE,IAAIR,EAAE,QAAQA,EAAE,KAAKA,EAAE,SAASA,EAAE,KAAK6B,GAAG,wDAAwDA,GAAGxB,EAAE4D,SAAS,GAAG,WAAW1C,EAAE,eAAeA,EAAE,MAAMM,GAAG,iBAAiBN,EAAE,IAAIA,EAAE,KAAKM,GAAG,uCAAuCA,GAAGzB,EAAE2D,MAAM5D,EAAE4D,KAAK,gCAAgCG,EAAE,CAAC9D,EAAE4D,GAAG7D,EAAE6D,IAAIG,KAAK,KAAKC,QAAQ,IAAI,GAAGvC,GAAG,IAAIA,GAAGzB,EAAE2D,KAAK,cAAcG,EAAE9D,EAAE4D,IAAI,KAAKE,EAAE9D,EAAE2D,MAAM,WAAW,GAAGlC,GAAG1B,EAAE4D,KAAK,oBAAoBG,EAAE/D,EAAE6D,IAAI,KAAKE,EAAE/D,EAAE4D,MAAM,iBAAiB,GAAGlC,GAAG,gEAAgEA,GAAG,YAAYvB,EAAE,EAAEA,EAAEI,EAAE2C,iBAAiB/C,GAAG,EAAE,IAAIc,EAAEd,EAAEN,EAAEE,EAAEK,EAAE,EAAEA,EAAEG,EAAE2C,iBAAiB9C,GAAG,EAAEG,EAAE0C,OAAO9C,EAAEC,KAAKsB,GAAG,KAAKtB,EAAEP,EAAEE,GAAG,IAAIkB,EAAEZ,GAAG,OAAOqB,GAAG,yCAAyC,UAAUnB,EAAE2D,cAAc,SAASrE,EAAEE,GAAGF,EAAEA,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,EAAE,IAAIC,EAAEO,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAEE,EAAEF,EAAEG,EAAEF,EAAED,EAAE,OAAO+C,EAAE9C,EAAEA,GAAE,SAAUD,EAAEC,GAAG,GAAGC,GAAGF,GAAGA,EAAEG,GAAGD,GAAGD,GAAGA,EAAEE,EAAE,CAAC,IAAIE,EAAEkB,KAAKC,OAAOxB,EAAEE,GAAGJ,GAAGM,EAAEmB,KAAKC,OAAOvB,EAAEC,GAAGJ,GAAG,OAAOU,EAAE0C,OAAO9C,EAAEC,GAAG,EAAE,EAAE,OAAO,MAAMG,EAAE4D,aAAa,SAAStE,EAAEE,EAAEC,GAAGH,EAAEA,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,EAAE,IAAIE,EAAEM,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAEG,EAAE,GAAG,OAAOA,GAAG,OAAOA,GAAG,SAASA,GAAGK,EAAE2D,cAAcrE,EAAEE,GAAGG,GAAG,IAAIA,GAAG,WAAWA,GAAGD,EAAEC,GAAG,IAAIA,GAAG,YAAYA,GAAGD,EAAEC,GAAG,IAAIF,IAAIE,GAAG,SAASA,GAAG6D,EAAE/D,GAAGE,GAAG,KAAKA,EAAE,MAAM,IAAI6D,EAAE,SAASlE,GAAG,IAAI,IAAIE,EAAE,GAAGC,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,GAAG,EAAE,CAAC,IAAIC,EAAEJ,EAAEuE,OAAOpE,GAAG,OAAOC,GAAG,IAAI,IAAIF,GAAG,OAAO,MAAM,IAAI,IAAIA,GAAG,OAAO,MAAM,IAAI,IAAIA,GAAG,QAAQ,MAAM,IAAI,IAAIA,GAAG,SAAS,MAAM,QAAQA,GAAGE,GAAG,OAAOF,GAAG,OAAOQ,EAAE8D,YAAY,SAASxE,EAAEE,GAAG,IAAIF,EAAEA,GAAG,GAAG,EAAE,OAAO,SAASA,GAAGA,OAAE,IAASA,EAAE,EAAEA,EAAE,IAAIE,EAAEC,EAAEC,EAAEC,EAAEE,EAAED,EAAE,EAAEI,EAAE2C,iBAAiB,EAAErD,EAAEoB,EAAEpB,EAAEQ,EAAEF,EAAEN,EAAEuB,EAAE,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAKM,EAAE,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAKC,EAAE,GAAG,IAAI5B,EAAE,EAAEA,EAAEI,EAAEJ,GAAG,EAAE,CAAC,IAAIE,EAAEqB,KAAKC,OAAOxB,EAAEkB,GAAG,GAAGf,EAAEoB,KAAKC,OAAOxB,EAAE,EAAEkB,GAAG,GAAGjB,EAAE,EAAEA,EAAEG,EAAEH,GAAG,EAAEI,EAAE,IAAIa,GAAGjB,GAAGA,EAAEK,GAAGY,GAAGlB,GAAGA,EAAEM,GAAGE,EAAE0C,OAAOhD,EAAEqB,KAAKC,OAAOvB,EAAEiB,GAAG,MAAMb,EAAE,KAAKa,GAAGjB,GAAGA,EAAEK,GAAGY,GAAGlB,EAAE,GAAGA,EAAE,EAAEM,GAAGE,EAAE0C,OAAO/C,EAAEoB,KAAKC,OAAOvB,EAAEiB,GAAG,IAAIb,GAAG,IAAIA,GAAG,IAAIuB,GAAG9B,EAAE,GAAGE,EAAE,GAAGM,EAAEqB,EAAEtB,GAAGgB,EAAEhB,GAAGuB,GAAG,KAAK,OAAOxB,EAAE,GAAGN,EAAE,EAAE8B,EAAE2C,UAAU,EAAE3C,EAAER,OAAOhB,EAAE,GAAGM,MAAMN,EAAE,GAAG6D,KAAK,KAAKrC,EAAE2C,UAAU,EAAE3C,EAAER,OAAO,GAA5f,CAAggBpB,GAAGF,GAAG,EAAEE,OAAE,IAASA,EAAE,EAAEF,EAAEE,EAAE,IAAIC,EAAEC,EAAEC,EAAEE,EAAED,EAAEI,EAAE2C,iBAAiBrD,EAAE,EAAEE,EAAEkB,EAAElB,EAAEM,EAAEF,EAAEJ,EAAEqB,EAAEX,MAAMZ,EAAE,GAAGmE,KAAK,MAAMtC,EAAEjB,MAAMZ,EAAE,GAAGmE,KAAK,MAAMrC,EAAE,GAAGC,EAAE,GAAG,IAAI5B,EAAE,EAAEA,EAAEG,EAAEH,GAAG,EAAE,CAAC,IAAIE,EAAEoB,KAAKC,OAAOvB,EAAEiB,GAAGpB,GAAG+B,EAAE,GAAG3B,EAAE,EAAEA,EAAEE,EAAEF,GAAG,EAAEG,EAAE,EAAEa,GAAGhB,GAAGA,EAAEI,GAAGY,GAAGjB,GAAGA,EAAEK,GAAGE,EAAE0C,OAAO/C,EAAEoB,KAAKC,OAAOtB,EAAEgB,GAAGpB,MAAMO,EAAE,GAAGwB,GAAGxB,EAAEgB,EAAEM,EAAE,IAAIxB,EAAE,EAAEA,EAAEL,EAAEK,GAAG,EAAEyB,GAAGC,EAAE,KAAK,OAAOD,EAAE2C,UAAU,EAAE3C,EAAER,OAAO,IAAIZ,EAAEgE,kBAAkB,SAAS1E,EAAEE,GAAGA,EAAEA,GAAG,EAAE,IAAI,IAAIC,EAAEO,EAAE2C,iBAAiBjD,EAAE,EAAEA,EAAED,EAAEC,IAAI,IAAI,IAAIC,EAAE,EAAEA,EAAEF,EAAEE,IAAIL,EAAE2E,UAAUjE,EAAE0C,OAAOhD,EAAEC,GAAG,QAAQ,QAAQL,EAAE4E,SAASxE,EAAEF,EAAEG,EAAEH,EAAEA,EAAEA,IAAIQ,GAAGV,EAAE6E,eAAe7E,EAAE8E,mBAAmB,CAACC,QAAQ,SAAS/E,GAAG,IAAI,IAAIE,EAAE,GAAGC,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,GAAG,EAAE,CAAC,IAAIC,EAAEJ,EAAEgF,WAAW7E,GAAGD,EAAEiD,KAAK,IAAI/C,GAAG,OAAOF,KAAK6E,QAAQ/E,EAAEiF,oBAAoB,SAASjF,EAAEE,GAAG,IAAIC,EAAE,WAAW,IAAI,IAAIA,EAAEO,EAAEV,GAAGI,EAAE,WAAW,IAAIJ,EAAEG,EAAE+E,OAAO,IAAI,GAAGlF,EAAE,KAAK,MAAM,OAAOA,GAAGK,EAAE,EAAEE,EAAE,KAAK,CAAC,IAAID,EAAEH,EAAE+E,OAAO,IAAI,GAAG5E,EAAE,MAAM,IAAIc,EAAEhB,IAAII,EAAEJ,KAAK,EAAEA,IAAIG,EAAE4E,OAAOC,aAAa9E,GAAG,EAAEc,IAAIZ,EAAEH,GAAG,EAAE,GAAGA,GAAGH,EAAE,MAAMG,EAAE,OAAOH,EAAE,OAAOK,EAA3N,GAAgOH,EAAE,IAAI4E,WAAW,GAAG,OAAO,SAAShF,GAAG,IAAI,IAAIE,EAAE,GAAGG,EAAE,EAAEA,EAAEL,EAAEsB,OAAOjB,GAAG,EAAE,CAAC,IAAIE,EAAEP,EAAEgF,WAAW3E,GAAG,GAAGE,EAAE,IAAIL,EAAEiD,KAAK5C,OAAO,CAAC,IAAID,EAAEH,EAAEH,EAAEuE,OAAOlE,IAAI,iBAAiBC,GAAG,IAAIA,IAAIA,EAAEJ,EAAEiD,KAAK7C,IAAIJ,EAAEiD,KAAK7C,IAAI,GAAGJ,EAAEiD,KAAK,IAAI7C,IAAIJ,EAAEiD,KAAK/C,IAAI,OAAOF,IAAI,IAAIA,EAAEC,EAAEC,EAAEC,EAAEE,EAAED,EAAE,CAAC+E,EAAE,EAAEpE,EAAE,EAAEqE,EAAE,EAAEC,EAAE,GAAGnE,GAAGlB,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,MAAMC,EAAE,KAAKC,EAAE,KAAKG,EAAE,SAASP,GAAG,IAAI,IAAIE,EAAE,EAAE,GAAGF,GAAGE,GAAG,EAAEF,KAAK,EAAE,OAAOE,IAAIG,EAAE,IAAIsB,eAAe,SAAS3B,GAAG,IAAI,IAAIE,EAAEF,GAAG,GAAGO,EAAEL,GAAGK,EAAEJ,IAAI,GAAGD,GAAGC,GAAGI,EAAEL,GAAGK,EAAEJ,GAAG,OAAO,OAAOH,GAAG,GAAGE,IAAIG,EAAEmB,iBAAiB,SAASxB,GAAG,IAAI,IAAIE,EAAEF,GAAG,GAAGO,EAAEL,GAAGK,EAAEH,IAAI,GAAGF,GAAGE,GAAGG,EAAEL,GAAGK,EAAEH,GAAG,OAAOJ,GAAG,GAAGE,GAAGG,EAAEgB,mBAAmB,SAASrB,GAAG,OAAOE,EAAEF,EAAE,IAAIK,EAAEuB,gBAAgB,SAAS5B,GAAG,OAAOA,GAAG,KAAK,EAAE,OAAO,SAASA,EAAEE,GAAG,OAAOF,EAAEE,GAAG,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASA,EAAEE,GAAG,OAAOA,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,GAAG,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOuB,KAAKC,MAAM1B,EAAE,GAAGyB,KAAKC,MAAMxB,EAAE,IAAI,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,EAAE,EAAEF,EAAEE,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,EAAE,EAAEF,EAAEE,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,OAAO,SAASF,EAAEE,GAAG,OAAOF,EAAEE,EAAE,GAAGF,EAAEE,GAAG,GAAG,GAAG,GAAG,QAAQ,KAAK,mBAAmBF,IAAIK,EAAEuC,0BAA0B,SAAS5C,GAAG,IAAI,IAAIE,EAAEqB,EAAE,CAAC,GAAG,GAAGpB,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAED,EAAEA,EAAEsF,SAASjE,EAAE,CAAC,EAAEf,EAAEiF,KAAKtF,IAAI,IAAI,OAAOD,GAAGG,EAAE+B,gBAAgB,SAASpC,EAAEE,GAAG,GAAG,GAAGA,GAAGA,EAAE,GAAG,OAAOF,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQA,OAAO,GAAGE,EAAE,GAAG,OAAOF,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,QAAQ,KAAK,QAAQA,MAAM,CAAC,KAAKE,EAAE,IAAI,KAAK,QAAQA,EAAE,OAAOF,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,QAAQ,KAAK,QAAQA,KAAKK,EAAEkD,aAAa,SAASvD,GAAG,IAAI,IAAIE,EAAEF,EAAEqD,iBAAiBlD,EAAE,EAAEC,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAE,IAAI,IAAIC,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,CAAC,IAAI,IAAIE,EAAE,EAAED,EAAEN,EAAEoD,OAAOhD,EAAEC,GAAGe,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAE,KAAKhB,EAAEgB,EAAE,GAAGlB,GAAGE,EAAEgB,GAAG,IAAI,IAAIZ,GAAG,EAAEA,GAAG,EAAEA,GAAG,EAAEH,EAAEG,EAAE,GAAGN,GAAGG,EAAEG,GAAG,GAAGY,GAAG,GAAGZ,GAAGF,GAAGN,EAAEoD,OAAOhD,EAAEgB,EAAEf,EAAEG,KAAKD,GAAG,GAAGA,EAAE,IAAIJ,GAAG,EAAEI,EAAE,GAAG,IAAIH,EAAE,EAAEA,EAAEF,EAAE,EAAEE,GAAG,EAAE,IAAIC,EAAE,EAAEA,EAAEH,EAAE,EAAEG,GAAG,EAAE,CAAC,IAAIkB,EAAE,EAAEvB,EAAEoD,OAAOhD,EAAEC,KAAKkB,GAAG,GAAGvB,EAAEoD,OAAOhD,EAAE,EAAEC,KAAKkB,GAAG,GAAGvB,EAAEoD,OAAOhD,EAAEC,EAAE,KAAKkB,GAAG,GAAGvB,EAAEoD,OAAOhD,EAAE,EAAEC,EAAE,KAAKkB,GAAG,GAAG,GAAGA,GAAG,GAAGA,IAAIpB,GAAG,GAAG,IAAIC,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAE,IAAIC,EAAE,EAAEA,EAAEH,EAAE,EAAEG,GAAG,EAAEL,EAAEoD,OAAOhD,EAAEC,KAAKL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,KAAKL,EAAEoD,OAAOhD,EAAEC,EAAE,IAAIL,EAAEoD,OAAOhD,EAAEC,EAAE,KAAKF,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEF,EAAE,EAAEE,GAAG,EAAEJ,EAAEoD,OAAOhD,EAAEC,KAAKL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,KAAKL,EAAEoD,OAAOhD,EAAE,EAAEC,IAAIL,EAAEoD,OAAOhD,EAAE,EAAEC,KAAKF,GAAG,IAAI,IAAI0B,EAAE,EAAE,IAAIxB,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,IAAID,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAEJ,EAAEoD,OAAOhD,EAAEC,KAAKwB,GAAG,GAAG,OAAO1B,EAAEsB,KAAKiE,IAAI,IAAI7D,EAAE3B,EAAEA,EAAE,IAAI,EAAE,IAAIG,GAAGG,EAAE,WAAW,IAAI,IAAIR,EAAE,IAAIY,MAAM,KAAKV,EAAE,IAAIU,MAAM,KAAKT,EAAE,EAAEA,EAAE,EAAEA,GAAG,EAAEH,EAAEG,GAAG,GAAGA,EAAE,IAAIA,EAAE,EAAEA,EAAE,IAAIA,GAAG,EAAEH,EAAEG,GAAGH,EAAEG,EAAE,GAAGH,EAAEG,EAAE,GAAGH,EAAEG,EAAE,GAAGH,EAAEG,EAAE,GAAG,IAAIA,EAAE,EAAEA,EAAE,IAAIA,GAAG,EAAED,EAAEF,EAAEG,IAAIA,EAAE,MAAM,CAACwF,KAAK,SAAS3F,GAAG,GAAGA,EAAE,EAAE,KAAK,QAAQA,EAAE,IAAI,OAAOE,EAAEF,IAAIyF,KAAK,SAASvF,GAAG,KAAKA,EAAE,GAAGA,GAAG,IAAI,KAAKA,GAAG,KAAKA,GAAG,IAAI,OAAOF,EAAEE,KAA3R,GAAmS,SAASqB,EAAEvB,EAAEE,GAAG,QAAG,IAASF,EAAEsB,OAAO,MAAMtB,EAAEsB,OAAO,IAAIpB,EAAE,IAAIC,EAAE,WAAW,IAAI,IAAIA,EAAE,EAAEA,EAAEH,EAAEsB,QAAQ,GAAGtB,EAAEG,IAAIA,GAAG,EAAE,IAAI,IAAIC,EAAE,IAAIQ,MAAMZ,EAAEsB,OAAOnB,EAAED,GAAGG,EAAE,EAAEA,EAAEL,EAAEsB,OAAOnB,EAAEE,GAAG,EAAED,EAAEC,GAAGL,EAAEK,EAAEF,GAAG,OAAOC,EAA5H,GAAiIA,EAAE,CAAC4C,MAAM,SAAShD,GAAG,OAAOG,EAAEH,IAAImC,UAAU,WAAW,OAAOhC,EAAEmB,QAAQkE,SAAS,SAASxF,GAAG,IAAI,IAAIE,EAAE,IAAIU,MAAMR,EAAE+B,YAAYnC,EAAEmC,YAAY,GAAGhC,EAAE,EAAEA,EAAEC,EAAE+B,YAAYhC,GAAG,EAAE,IAAI,IAAIE,EAAE,EAAEA,EAAEL,EAAEmC,YAAY9B,GAAG,EAAEH,EAAEC,EAAEE,IAAIG,EAAEiF,KAAKjF,EAAEmF,KAAKvF,EAAE4C,MAAM7C,IAAIK,EAAEmF,KAAK3F,EAAEgD,MAAM3C,KAAK,OAAOkB,EAAErB,EAAE,IAAI4C,IAAI,SAAS9C,GAAG,GAAGI,EAAE+B,YAAYnC,EAAEmC,YAAY,EAAE,OAAO/B,EAAE,IAAI,IAAIF,EAAEM,EAAEmF,KAAKvF,EAAE4C,MAAM,IAAIxC,EAAEmF,KAAK3F,EAAEgD,MAAM,IAAI7C,EAAE,IAAIS,MAAMR,EAAE+B,aAAa9B,EAAE,EAAEA,EAAED,EAAE+B,YAAY9B,GAAG,EAAEF,EAAEE,GAAGD,EAAE4C,MAAM3C,GAAG,IAAIA,EAAE,EAAEA,EAAEL,EAAEmC,YAAY9B,GAAG,EAAEF,EAAEE,IAAIG,EAAEiF,KAAKjF,EAAEmF,KAAK3F,EAAEgD,MAAM3C,IAAIH,GAAG,OAAOqB,EAAEpB,EAAE,GAAG2C,IAAI9C,KAAK,OAAOI,EAAE,IAAIyB,EAAE,WAAW,IAAI7B,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,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","file":"npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js","sourcesContent":["!function(t,r){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=r():\"function\"==typeof define&&define.amd?define([],r):\"object\"==typeof exports?exports.QRCodeStyling=r():t.QRCodeStyling=r()}(self,(function(){return(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&M(t),null==u&&(u=C(e,n,v)),O(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},O=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},C=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw\"code length overflow. (\"+o.getLengthInBits()+\">\"+8*u+\")\";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e=\"\";e+='',e+=\"\";for(var n=0;n\";for(var o=0;o';e+=\"\"}return(e+=\"\")+\"
\"},y.createSvgTag=function(t,r,e,n){var o={};\"object\"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e=\"string\"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||\"qrcode-description\":null,(n=\"string\"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||\"qrcode-title\":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h=\"\";for(u=\"l\"+t+\",0 0,\"+t+\" -\"+t+\",0 0,-\"+t+\"z \",h+='\",h+=n.text?''+k(n.text)+\"\":\"\",h+=e.text?''+k(e.text)+\"\":\"\",h+='',h+='')+\"\"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r\"};var k=function(t){for(var r=\"\",e=0;e\":r+=\">\";break;case\"&\":r+=\"&\";break;case'\"':r+=\""\";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={\"██\":\"█\",\"█ \":\"▀\",\" █\":\"▄\",\" \":\" \"},h={\"██\":\"▀\",\"█ \":\"▀\",\" █\":\" \",\" \":\" \"},f=\"\";for(r=0;r=u?h[i]:c[i];f+=\"\\n\"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join(\"▀\"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join(\"██\"),h=Array(t+1).join(\" \"),f=\"\",d=\"\";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+\"/\"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=\",\"),r+=t[e];return r+\"]\"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw\"unexpected end of file./\"+o}var t=r.charAt(e);if(e+=1,\"=\"==t)return o=0,-1;t.match(/^\\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw\"c:\"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString(\"GIF87a\"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(\",\"),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(\";\")}},a=function(t){for(var r=1<>>r!=0)throw\"length over\";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n=\"function\"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{\"use strict\";e.d(r,{default:()=>O});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(r){var e;r.done?t(r.value):(e=r.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}u((o=o.apply(r,e||[])).next())}));var r,e,n,o},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw\"QR code is not defined\";var e=this.context;if(!e)throw\"QR code is not defined\";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw\"The canvas is too small.\";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?\"continue\":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):\"continue\"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:\"\",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:\"Q\"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:\"square\",color:\"#000\"},backgroundOptions:{color:\"#fff\"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var M=e(192),S=e.n(M);const O=function(){function t(t){this._options=t?m(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML=\"\")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?m(a(this._options,r)):this._options,this._options.data&&(this._qr=S()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return\"Numeric\";case/^[0-9A-Z $%*+\\-./:]*$/.test(t):return\"Alphanumeric\";default:return\"Byte\"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if(\"function\"!=typeof t.appendChild)throw\"Container should be a single DOM node\";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e=\"png\",n=\"qr\";\"string\"==typeof t?(e=t,console.warn(\"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\")):\"object\"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement(\"a\");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL(\"image/\"+e),n+\".\"+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}));\n//# sourceMappingURL=qr-code-styling.js.map"],"sourceRoot":""} \ No newline at end of file diff --git a/public/report.html b/public/report.html index a5bf0b6c5..dc9ec4a71 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [8 Jun 2022 at 16:06] + tweb [24 Jun 2022 at 21:17] diff --git a/public/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js b/public/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js deleted file mode 100644 index a24b69412..000000000 --- a/public/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t),r.d(t,"RLottieItem",(function(){return l}));var n="undefined"!=typeof window?window:self;const i=navigator?navigator.userAgent:null,o=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&n.MSStream,!!("safari"in n)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))));navigator.userAgent.toLowerCase().indexOf("firefox"),navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i);let a;if(o)try{a=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){a=!1}else a=!0;var s=a;function d(e){return function(e,t){return new Promise(r=>{const n=new FileReader;n.addEventListener("loadend",e=>{r(e.target.result)}),n[t](e)})}(e,"readAsText")}const u=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]];let c=e=>Math.round(255*Math.min(Math.max(e,0),1));function f(e,t){const r=u[Math.max(t-1,0)],n=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,n=c(t[2])|c(t[1])<<8|c(t[0])<<16,i=r.find(e=>e[0]===n);i&&(t[0]=(i[1]>>16&255)/255,t[1]=(i[1]>>8&255)/255,t[2]=(255&i[1])/255)})(e)}e.hasOwnProperty("it")&&i(e.it)},i=e=>{for(const t of e)n(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?i(e.it):n(e)}catch(r){console.warn("cant apply replacements",r,e,t)}}importScripts("rlottie-wasm.js");const h=self.Module;class l{constructor(e,t,r){this.reqId=e,this.width=t,this.height=r}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=m.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=m.Api.loadFromData(this.handle,this.stringOnWasmHeap),m.Api.resize(this.handle,this.width,this.height),g("loaded",this.reqId,this.frameCount,this.fps)}catch(e){console.error("init RLottieItem error:",e),g("error",this.reqId,e)}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{try{if("number"==typeof i&&i>=1&&i<=5){const e=JSON.parse(t);f(e,i),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),r=+(null==e?void 0:e[1])||60;o.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),g("error",e,r)}})},destroy:function(e){const t=p[e];t&&(t.destroy(),delete p[e])},renderFrame:function(e,t,r){p[e].render(t,r)}};function g(...e){if(arguments.length<1)throw new TypeError("reply - not enough arguments");if(e=Array.prototype.slice.call(arguments,1),s){const t=[];for(let r=0;r 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337],\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f],\n ]\n];\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\r\nimport readBlobAsText from \"../../helpers/blob/readBlobAsText\";\r\nimport applyReplacements from \"./applyReplacements\";\r\n\r\nimportScripts('rlottie-wasm.js');\r\n//import Module, { allocate, intArrayFromString } from './rlottie-wasm';\r\n\r\nconst _Module = (self as any).Module as any;\r\n\r\nconst DEFAULT_FPS = 60;\r\n\r\ntype LottieHandlePointer = number;\r\n\r\n// throw new Error('test');\r\n\r\nexport class RLottieItem {\r\n private stringOnWasmHeap: number;\r\n private handle: LottieHandlePointer;\r\n private frameCount: number;\r\n private fps: number;\r\n\r\n private dead: boolean;\r\n //private context: OffscreenCanvasRenderingContext2D;\r\n\r\n constructor(\r\n private reqId: number, \r\n private width: number, \r\n private height: number/* , \r\n private canvas: OffscreenCanvas */\r\n ) {\r\n\r\n }\r\n\r\n public init(json: string, fps: number) {\r\n if(this.dead) {\r\n return;\r\n }\r\n\r\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\r\n\r\n //this.context = canvas.getContext('2d');\r\n /* let frame = 0;\r\n setInterval(() => {\r\n if(frame >= this.frameCount) frame = 0;\r\n let _frame = frame++;\r\n this.render(_frame, null);\r\n }, 1000 / this.fps); */\r\n\r\n try {\r\n this.handle = worker.Api.init();\r\n \r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\r\n \r\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\r\n \r\n worker.Api.resize(this.handle, this.width, this.height);\r\n\r\n reply('loaded', this.reqId, this.frameCount, this.fps);\r\n } catch(e) {\r\n console.error('init RLottieItem error:', e);\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\r\n if(this.dead || this.handle === undefined) return;\r\n //return;\r\n \r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n \r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n \r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n \r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n \r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n //this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n \r\n reply('frame', this.reqId, frameNo, clamped);\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n if(this.handle !== undefined) {\r\n worker.Api.destroy(this.handle);\r\n }\r\n }\r\n}\r\n\r\nclass RLottieWorker {\r\n public Api: {\r\n init: () => LottieHandlePointer,\r\n destroy: (handle: LottieHandlePointer) => void,\r\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\r\n buffer: (handle: LottieHandlePointer) => number,\r\n render: (handle: LottieHandlePointer, frameNo: number) => void,\r\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\r\n } = {} as any;\r\n\r\n public initApi() {\r\n this.Api = {\r\n init: _Module.cwrap('lottie_init', '', []),\r\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\r\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\r\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\r\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\r\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\r\n };\r\n }\r\n\r\n public init() {\r\n this.initApi();\r\n reply('ready');\r\n }\r\n}\r\n\r\nconst worker = new RLottieWorker();\r\n\r\n_Module.onRuntimeInitialized = function() {\r\n worker.init();\r\n};\r\n\r\nconst items: {[reqId: string]: RLottieItem} = {};\r\nconst queryableFunctions = {\r\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number/* , canvas: OffscreenCanvas */) {\r\n const item = items[reqId] = new RLottieItem(reqId, width, height/* , canvas */);\r\n readBlobAsText(blob).then((json) => {\r\n try {\r\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(json);\r\n applyReplacements(newAnimationData, toneIndex);\r\n json = JSON.stringify(newAnimationData);\r\n }\r\n\r\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\r\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\r\n throw new Error('Invalid file');\r\n } */\r\n\r\n /* let perf = performance.now();\r\n let json = JSON.parse(jsString);\r\n console.log('sticker decode:', performance.now() - perf); */\r\n\r\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\r\n const frameRate = +match?.[1] || DEFAULT_FPS;\r\n\r\n //console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\r\n\r\n item.init(json, frameRate);\r\n } catch(err) {\r\n console.error('Invalid file for sticker:', json);\r\n reply('error', reqId, err);\r\n }\r\n });\r\n },\r\n destroy: function(reqId: number) {\r\n const item = items[reqId];\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.destroy();\r\n delete items[reqId];\r\n },\r\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\r\n //console.log('worker renderFrame', reqId, frameNo, clamped);\r\n items[reqId].render(frameNo, clamped);\r\n }\r\n};\r\n\r\nfunction reply(...args: any[]) {\r\n if(arguments.length < 1) { \r\n throw new TypeError('reply - not enough arguments'); \r\n }\r\n\r\n //if(arguments[0] === 'frame') return;\r\n\r\n args = Array.prototype.slice.call(arguments, 1);\r\n\r\n if(!CAN_USE_TRANSFERABLES) {\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args});\r\n } else {\r\n const transfer: ArrayBuffer[] = [];\r\n for(let i = 0; i < args.length; ++i) {\r\n if(args[i] instanceof ArrayBuffer) {\r\n transfer.push(args[i]);\r\n }\r\n \r\n if(args[i].buffer && args[i].buffer instanceof ArrayBuffer) {\r\n transfer.push(args[i].buffer);\r\n }\r\n }\r\n\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args}, transfer);\r\n }\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\r\n};\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/style-desktop.9d7b485ed526720a3aad.css b/public/style-desktop.9d7b485ed526720a3aad.css deleted file mode 100644 index def9d3e0d..000000000 --- a/public/style-desktop.9d7b485ed526720a3aad.css +++ /dev/null @@ -1,2 +0,0 @@ -@media only screen and (min-width: 721px){#auth-pages .tabs-container:before,#auth-pages .tabs-container:after{content:" ";position:absolute;width:100%;left:-100%;top:0;right:0;bottom:0;background:#fff;background:var(--surface-color);z-index:1}#auth-pages .tabs-container:after{left:100%}} -/*# sourceMappingURL=style-desktop.9d7b485ed526720a3aad.css.map*/ \ No newline at end of file diff --git a/public/style-desktop.9d7b485ed526720a3aad.css.map b/public/style-desktop.9d7b485ed526720a3aad.css.map deleted file mode 100644 index 440268692..000000000 --- a/public/style-desktop.9d7b485ed526720a3aad.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///style-desktop.9d7b485ed526720a3aad.css"],"names":[],"mappings":"AAAA,0CAA0C,qEAAqE,YAAY,kBAAkB,WAAW,WAAW,MAAM,QAAQ,SAAS,gBAAgB,gCAAgC,UAAU,kCAAkC","file":"style-desktop.9d7b485ed526720a3aad.css","sourcesContent":["@media only screen and (min-width: 721px){#auth-pages .tabs-container:before,#auth-pages .tabs-container:after{content:\" \";position:absolute;width:100%;left:-100%;top:0;right:0;bottom:0;background:#fff;background:var(--surface-color);z-index:1}#auth-pages .tabs-container:after{left:100%}}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/style-desktop.de205d0ae0e0c2493363.css b/public/style-desktop.de205d0ae0e0c2493363.css new file mode 100644 index 000000000..355df163f --- /dev/null +++ b/public/style-desktop.de205d0ae0e0c2493363.css @@ -0,0 +1,2 @@ +@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:#fff;background:var(--surface-color);bottom:0;content:" ";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}} +/*# sourceMappingURL=style-desktop.de205d0ae0e0c2493363.css.map*/ \ No newline at end of file diff --git a/public/style-desktop.de205d0ae0e0c2493363.css.map b/public/style-desktop.de205d0ae0e0c2493363.css.map new file mode 100644 index 000000000..ed3e0cc68 --- /dev/null +++ b/public/style-desktop.de205d0ae0e0c2493363.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://tweb/style-desktop.de205d0ae0e0c2493363.css"],"names":[],"mappings":"AAAA,yCAAyC,qEAAqE,gBAAgB,gCAAgC,SAAS,YAAY,WAAW,kBAAkB,QAAQ,MAAM,WAAW,UAAU,kCAAkC","file":"style-desktop.de205d0ae0e0c2493363.css","sourcesContent":["@media only screen and (min-width:721px){#auth-pages .tabs-container:after,#auth-pages .tabs-container:before{background:#fff;background:var(--surface-color);bottom:0;content:\" \";left:-100%;position:absolute;right:0;top:0;width:100%;z-index:1}#auth-pages .tabs-container:after{left:100%}}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.ed0dbbea2d9f6f96af2b.chunk.js b/public/sw.ed0dbbea2d9f6f96af2b.chunk.js new file mode 100644 index 000000000..b202ec416 --- /dev/null +++ b/public/sw.ed0dbbea2d9f6f96af2b.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};(()=>{if(void 0!==e){var t=e.u,n=e.e,o=new Map,r=new Map;e.u=function(e){return t(e)+(o.has(e)?"?"+o.get(e):"")},e.e=function(i){return n(i).catch((function(n){var s=r.has(i)?r.get(i):999999;if(s<1){var a=t(i);throw n.message="Loading chunk "+i+" failed after 999999 retries.\n("+a+")",n.request=a,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();o.set(i,n),r.set(i,s-1),t(e.e(i))}),3e3)}))}))}}})(),e.d({},{T:()=>Q,c:()=>H});const t={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};t.http=location.search.indexOf("http=1")>0,t.http&&(t.transport="https");const n=t,o=n.debug,r=("undefined"!=typeof window?window:self,o),i="undefined"!=typeof window?window:self,s=navigator?navigator.userAgent:null,a=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&i.MSStream,!!("safari"in i)||!(!s||!(/\b(iPad|iPhone|iPod)\b/.test(s)||s.match("Safari")&&!s.match("Chrome")))),c=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=(navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),"undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope),u="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!l,h=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),d=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},f=(e,...t)=>{h().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{d(e,...t)}))}))},g=(l&&f.bind(null,!1),l&&f.bind(null,!0),Date.now());function p(){return"["+((Date.now()-g)/1e3).toFixed(3)+"]"}var m;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(m||(m={}));const v=[m.None,m.Error,m.Warn,m.Log,m.Debug],w=!(a||c),y="",b="",P=[["debug",m.Debug],["info",m.Log],["warn",m.Warn],["error",m.Error],["assert",m.Error],["trace",m.Log],["group",m.Log],["groupCollapsed",m.Log],["groupEnd",m.Log]];function S(e,t=m.Log|m.Warn|m.Error,n=!1,o=""){let i;r||n||(t=m.Error),w?o||(l?o=y:u&&(o=b)):o="";let s=o;o=o?`%s ${o}%s`:"%s";const a=function(...n){return t&m.Log&&console.log(o,p(),e,...n)};return P.forEach((([n,r])=>{a[n]=function(...i){return t&r&&console[n](o,p(),e,...i)}})),a.setPrefix=function(t){i=t,e="["+t+"]"},a.setPrefix(e),a.setLevel=function(e){t=v.slice(0,e+1).reduce(((e,t)=>e|t),0)},a.bindPrefix=function(e){return S(`${i}] [${e}`,t,n,s)},a}const A=self,O="cachedAssets";function T(e){return e.ok&&200===e.status}function E(e){return Promise.race([e,(1e4,new Promise((e=>{setTimeout(e,1e4)}))).then((()=>Promise.reject()))])}function x(){}function C(e,t=""){let n;Array.isArray(e)||(e=[e]);const o=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{n=new Blob(e,{type:o})}catch(t){let r=new BlobBuilder;e.forEach((e=>{r.append(e)})),n=r.getBlob(o)}return n}const _=new class{constructor(){this.blobSupported=!0;try{C([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}getFakeFileWriter(e,t,n){let o=new Uint8Array(t);const r={write:(e,t)=>{return n=this,r=void 0,s=function*(){if(!this.blobSupported)throw!1;o.set(e,t)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,a)}c((s=s.apply(n,r||[])).next())}));var n,r,i,s},truncate:()=>{o=new Uint8Array},trim:e=>{o=o.slice(0,e)},finalize:(t=!0)=>{const r=C(o,e);return t&&n&&n(r),r},getParts:()=>o,replaceParts:e=>{o=e}};return r}};class j{constructor(e){this.dbName=e,this.useStorage=!0,n.test&&(this.dbName+="_test"),j.STORAGES.length&&(this.useStorage=j.STORAGES[0].useStorage),this.openDatabase(),j.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation((t=>t.delete("/"+e)))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation((t=>t.match("/"+e)))}save(e,t){return this.timeoutOperation((n=>n.put("/"+e,t)))}getFile(e,t="blob"){return this.get(e).then((e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=C(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,n)=>{return o=this,r=void 0,s=function*(){let o=!1;const r=setTimeout((()=>{n(),o=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t,n){const o=_.getFakeFileWriter(n,t,(t=>this.saveFile(e,t).catch((()=>t))));return Promise.resolve(o)}static toggleStorage(e,t){return Promise.all(this.STORAGES.map((n=>{if(n.useStorage=e,t)return e?void 0:n.deleteAll()})))}}j.STORAGES=[];const k=new j("cachedStreamChunks"),N="Time-Cached";setInterval((()=>k.timeoutOperation((e=>e.keys().then((t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,i]of n){const n=e.match(i).then((n=>{if(+n.headers.get(N)+86400<=o)return H("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{h().then((e=>{for(const[t,n]of Q)if(!e.find((e=>e.id===t))){for(const e in n)n[e].reject();Q.delete(t)}}))}),12e4);const D=new Map;class I{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{D.delete(this.id)},this.id=I.getId(e),D.set(this.id,this),this.limitPart=e.size>78643200?L:F,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,s,a,c,l=!1;const u=t=>{const n=a,o=c;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),o(e)}},h=(...e)=>{s||(s=new Promise(((e,t)=>(a=e,c=t)))),r?(clearTimeout(r),l=!0,c(),s=new Promise(((e,t)=>(a=e,c=t)))):n&&(u(e),l=!1);const h=i.setTimeout((()=>{!o||n&&!l||u(e),r===h&&(r=s=a=c=void 0,l=!1)}),t);return r=h,s.catch(x),s};return h.clearTimeout=()=>{r&&(i.clearTimeout(r),c(),r=s=a=c=void 0,l=!1)},h}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,s=function*(){const o={type:"requestFilePart",payload:{docId:this.id,dcId:this.info.dcId,offset:e,limit:t}},r=JSON.stringify(o);o.id=r;const i=yield h().then((e=>{if(e.length)return e.find((e=>Q.has(e.id)))||e[0]}));if(!i)throw new Error("no window");let s=Q.get(i.id);s||Q.set(i.id,s={});let a=s[r];if(a)return a.then((e=>e.bytes));i.postMessage(o),this.loadedOffsets.add(e),a=s[r]=function(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}}));return t.catch(x).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=x)})),Object.assign(t,e),t}();const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return k.getFile(o).then((e=>n?new Uint8Array:function(e){return function(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsArrayBuffer(e)}))}(e)}(e).then((e=>new Uint8Array(e)))}(e)),(e=>{}))}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then((o=>o||this.requestFilePartFromWorker(e,t,n)))}saveChunkToCache(e,t,n){return e.then((e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream",[N]:""+(Date.now()/1e3|0)}});return k.save(o,r)}))}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":`${e.byteLength}`};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})}))}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=D.get(this.getId(e)))&&void 0!==t?t:new I(e)}static getId(e){return e.location.id}}const F=524288,L=1048576;function R(e,t=2048){return e-e%t}function W(e,t){const n=Object.keys,o=typeof e;return e&&t&&"object"===o&&o===typeof t?n(e).length===n(t).length&&n(e).every((n=>W(e[n],t[n]))):e===t}class q{constructor(e){!function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),n.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=S(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),q.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const o=Array.from(e.indexNames);for(const t of o)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let o=!1;return setTimeout((()=>{o||n.onerror({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,r)=>{n.onsuccess=t=>{o=!0;const i=n.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},n.onerror=e=>{o=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},n.onupgradeneeded=e=>{o=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,r=n.result;this.stores.forEach((e=>{if(r.objectStoreNames.contains(e.name)){const o=n.transaction.objectStore(e.name);t(o,e)}else((e,n)=>{const o=e.createObjectStore(n.name);t(o,n)})(r,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new q(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}q.INSTANCES=[];class M{constructor(e,t){this.storeName=t,this.log=S(["IDB",e.name,t].join("-")),this.idb=q.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,o)=>n.put(t[o],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((i=>new Promise(((s,a)=>{const c=i.transaction([o],e),l=()=>{clearTimeout(d),a(c.error)},u=()=>{clearTimeout(d),n&&this.log(n+": end",performance.now()-r);const e=p.map((e=>e.result));s(g?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>u());const d=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),f=t(c.objectStore(o)),g=Array.isArray(f),p=g?f:[].concat(f);if(h)return;const m=p.length;let v=m;const w=()=>{c.error||--v||u()};for(let e=0;ee.getAll()),"",e)}}var B=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const U=self,$=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/",G=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new M(e,t)}get(e){return B(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){var n;return B(this,void 0,void 0,(function*(){if(!W(null!==(n=this.cache[e])&&void 0!==n?n:this.defaults[e],t)){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",{push_mute_until:0,push_lang:{push_message_nopreview:"You have a new message",push_action_mute1d:"Mute for 24H",push_action_settings:"Settings"},push_settings:{}});U.addEventListener("push",(e=>{const t=e.data.json();H("push",t);let n=!1;const o=Promise.all([G.get("push_mute_until"),U.clients.matchAll({type:"window"})]).then((e=>{const[o,r]=e;if(H("matched clients",r),n=r.length>0,n)throw"Supress notification because some instance is alive";const i=Date.now();if(Y()&&o&&i{H(e)}));const r=o.then((()=>Promise.all([G.get("push_settings"),G.get("push_lang")]))).then((e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||""),e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview,a="unknown_peer"),H("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d}];return U.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then((e=>{var t;e&&e.notification&&(t=e.notification,V.has(t)||(V.add(t),t.onclose=J))})).catch((e=>{H.error("Show notification promise",e)}))}(t,e[0],e[1]))),i=r.catch((()=>(H("Closing all notifications on push",n),Y()||n?K():U.registration.showNotification("Telegram",{tag:"unknown_peer"}).then((()=>{if(n)return K();setTimeout((()=>K()),n?0:100)})).catch((e=>{H.error("Show notification error",e)})))));e.waitUntil(i)})),U.addEventListener("notificationclick",(e=>{const t=e.notification;H("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&Y())return H("[SW] mute for 1d"),void G.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=U.clients.matchAll({type:"window"}).then((e=>{o.action=n,z={type:"push_click",payload:o};for(let t=0;tU.clients.openWindow(e.baseUrl||$)))})).catch((e=>{H.error("Clients.matchAll error",e)}));e.waitUntil(r)})),U.addEventListener("notificationclose",J);let z,V=new Set;function J(e){var t;t=e.notification,V.delete(t)}function K(){for(const e of V)try{e.close()}catch(e){}let e;return e="getNotifications"in U.registration?U.registration.getNotifications({}).then((e=>{for(let t=0,n=e.length;t{H.error("Offline register SW error",e)})):Promise.resolve(),V.clear(),e}function Y(){return c}const H=S("SW",m.Error|m.Debug|m.Log|m.Warn),X=self,Q=new Map,Z={notifications_clear:()=>{K()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,o=e.payload;z&&n&&"postMessage"in n&&(n.postMessage(z,[]),z=void 0),o.lang&&G.set("push_lang",o.lang),o.settings&&G.set("push_settings",o.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,o=Q.get(n.id);if(!o)return;const r=o[e.id];r&&(e.error?r.reject(e.error):r.resolve(e.payload),delete o[e.id])},toggleStorages:e=>{const{enabled:t,clearWrite:n}=e.payload;j.toggleStorage(t,n)}};X.addEventListener("message",(e=>{const t=e.data,n=Z[t.type];n&&n(t,e)}));const ee=e=>{if(!a&&0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return t=this,n=void 0,r=function*(){try{const t=yield E(A.caches.open(O)),n=yield E(t.match(e.request,{ignoreVary:!0}));if(n&&T(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(T(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),T(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[,t,n,o]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];"stream"===n&&function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=I.get(o);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),r.requestRange(n)]))}(e,o)}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},te=()=>{X.onfetch=ee};X.addEventListener("install",(e=>{H("installing"),e.waitUntil(X.skipWaiting())})),X.addEventListener("activate",(e=>{H("activating",X),e.waitUntil(X.caches.delete(O)),e.waitUntil(X.clients.claim())})),X.onerror=e=>{H.error("error:",e)},X.onunhandledrejection=e=>{H.error("onunhandledrejection:",e)},X.onoffline=X.ononline=te,te()})(); +//# sourceMappingURL=sw.ed0dbbea2d9f6f96af2b.chunk.js.map \ No newline at end of file diff --git a/public/sw.ed0dbbea2d9f6f96af2b.chunk.js.map b/public/sw.ed0dbbea2d9f6f96af2b.chunk.js.map new file mode 100644 index 000000000..67edf8e73 --- /dev/null +++ b/public/sw.ed0dbbea2d9f6f96af2b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.ed0dbbea2d9f6f96af2b.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/dT.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/fileManager.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = (process.env.NODE_ENV !== 'production' || Modes.debug)/* && false */;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\r\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({includeUncontrolled: false, type: 'window'});\r\n};\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","const _logTimer = Date.now();\r\nexport default function dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\nimport dT from \"../helpers/dT\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n [\"group\", LogTypes.Log],\n [\"groupCollapsed\", LogTypes.Log],\n [\"groupEnd\", LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"../../helpers/schedulers/pause\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n \r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n \r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n \r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export default function pause(ms: number) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","export default function noop() {}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport readBlobAsUint8Array from \"../../helpers/blob/readBlobAsUint8Array\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { getWindowClients } from \"../../helpers/context\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { InputFileLocation, UploadFile } from \"../../layer\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport { RequestFilePartTask, deferredPromises, log } from \"./index.service\";\r\nimport timeout from \"./timeout\";\r\n\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then((requests) => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n getWindowClients().then((clients) => {\r\n for(const [clientId, promises] of deferredPromises) {\r\n if(!clients.find((client) => client.id === clientId)) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(clientId);\r\n }\r\n }\r\n });\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const task: Omit = {\r\n type: 'requestFilePart',\r\n payload: {\r\n docId: this.id,\r\n dcId: this.info.dcId,\r\n offset: alignedOffset,\r\n limit\r\n }\r\n };\r\n\r\n const taskId = JSON.stringify(task);\r\n (task as RequestFilePartTask).id = taskId;\r\n\r\n const windowClient = await getWindowClients().then((clients) => {\r\n if(!clients.length) {\r\n return;\r\n }\r\n\r\n return clients.find((client) => deferredPromises.has(client.id)) || clients[0];\r\n });\r\n\r\n if(!windowClient) {\r\n throw new Error('no window');\r\n }\r\n\r\n let promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n deferredPromises.set(windowClient.id, promises = {});\r\n }\r\n \r\n let deferred = promises[taskId] as CancellablePromise;\r\n if(deferred) {\r\n return deferred.then((uploadFile) => uploadFile.bytes);\r\n }\r\n \r\n windowClient.postMessage(task);\r\n this.loadedOffsets.add(alignedOffset);\r\n \r\n deferred = promises[taskId] = deferredPromise();\r\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\r\n\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error) => {\r\n if(error === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then((bytes) => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\r\n //log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n \r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n });\r\n //}, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n //log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from \"../../environment/ctx\";\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\nimport noop from \"../noop\";\r\n\r\nexport type DebounceReturnType = { \r\n (...args: Parameters): Promise>>; \r\n clearTimeout(): void; \r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n \r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode, \r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], \r\n log?: string, \r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../../config/databases\";\r\nimport DATABASE_STATE from \"../../config/databases/state\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport IDBStorage from \"../idb\";\r\nimport { log, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"./index.service\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n //user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T, \r\n storeName: typeof db['stores'][number]['name'], \r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n const cached = this.cache[key] ?? this.defaults[key];\r\n if(deepEqual(cached, value)) {\r\n return;\r\n }\r\n\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_lang: {\r\n push_message_nopreview: 'You have a new message',\r\n push_action_mute1d: 'Mute for 24H',\r\n push_action_settings: 'Settings'\r\n },\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'), \r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, clientList] = result;\r\n \r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n \r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch((reason) => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = {type: 'push_click', payload: data};\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n client.postMessage(pendingNotification);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nlet notifications: Set = new Set();\r\nlet pendingNotification: ServiceWorkerPushClickTask;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview;\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event && event.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(task: ServiceWorkerPingTask, event: ExtendableMessageEvent) {\r\n const client = event.ports && event.ports[0] || event.source;\r\n const payload = task.payload;\r\n\r\n if(pendingNotification &&\r\n client &&\r\n 'postMessage' in client) {\r\n client.postMessage(pendingNotification, []);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Database } from '.';\r\nimport type { IDBIndex } from '../../lib/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs',\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport type { Modify, WorkerTaskTemplate, WorkerTaskVoidTemplate } from '../../types';\nimport type { WebPushApiManager } from '../mtproto/webPushApiManager';\nimport type { PushNotificationObject } from './push';\nimport type { ToggleStorageTask } from '../mtproto/mtprotoworker';\nimport type { MyUploadFile } from '../mtproto/apiFileManager';\nimport { logger, LogTypes } from '../logger';\nimport { CancellablePromise } from '../../helpers/cancellablePromise';\nimport { CACHE_ASSETS_NAME, requestCache } from './cache';\nimport onStreamFetch from './stream';\nimport { closeAllNotifications, onPing } from './push';\nimport CacheStorageController from '../cacheStorage';\nimport { IS_SAFARI } from '../../environment/userAgent';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const deferredPromises: Map}> = new Map();\n\nexport interface RequestFilePartTask extends Modify {\n type: 'requestFilePart',\n payload: {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n }\n};\n\nexport interface RequestFilePartTaskResponse extends Modify {\n type: 'requestFilePart',\n payload?: MyUploadFile,\n originalPayload?: RequestFilePartTask['payload']\n};\n\nexport interface ServiceWorkerPingTask extends WorkerTaskVoidTemplate {\n type: 'ping',\n payload: {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n }\n};\n\nexport interface ServiceWorkerNotificationsClearTask extends WorkerTaskVoidTemplate {\n type: 'notifications_clear'\n};\n\nexport interface ServiceWorkerPushClickTask extends WorkerTaskVoidTemplate {\n type: 'push_click',\n payload: PushNotificationObject\n};\n\nexport type ServiceWorkerTask = RequestFilePartTaskResponse | ServiceWorkerPingTask | ServiceWorkerNotificationsClearTask | ToggleStorageTask;\n\n \nconst taskListeners: {\n [type in ServiceWorkerTask['type']]: (task: any, event: ExtendableMessageEvent) => void\n} = {\n notifications_clear: () => {\n closeAllNotifications();\n },\n ping: (task: ServiceWorkerPingTask, event) => {\n onPing(task, event);\n },\n requestFilePart: (task: RequestFilePartTaskResponse, e: ExtendableMessageEvent) => {\n const windowClient = e.source as WindowClient;\n const promises = deferredPromises.get(windowClient.id);\n if(!promises) {\n return;\n }\n\n const promise = promises[task.id];\n if(promise) {\n if(task.error) {\n promise.reject(task.error);\n } else {\n promise.resolve(task.payload);\n }\n \n delete promises[task.id];\n }\n },\n toggleStorages: (task: ToggleStorageTask) => {\n const {enabled, clearWrite} = task.payload;\n CacheStorageController.toggleStorage(enabled, clearWrite);\n }\n};\nctx.addEventListener('message', (e) => {\n const task = e.data as ServiceWorkerTask;\n const callback = taskListeners[task.type];\n if(callback) {\n callback(task, e);\n }\n});\n \n\n//const cacheStorage = new CacheStorageController('cachedAssets');\n/* let taskId = 0;\n\nexport function getTaskId() {\n return taskId;\n}\n\nexport function incrementTaskId() {\n return taskId++;\n} */\n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI && \n event.request.url.indexOf(location.origin + '/') === 0 && \n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n\n //log.debug('[fetch]:', event);\n \n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n }\n } catch(err) {\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME));\n event.waitUntil(ctx.clients.claim());\n});\n\nctx.onerror = (error) => {\n log.error('error:', error);\n};\n\nctx.onunhandledrejection = (error) => {\n log.error('onunhandledrejection:', error);\n};\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","oldGetScript","u","oldLoadScript","e","queryMap","Map","countMap","chunkId","has","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","toLowerCase","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","notifyServiceWorker","all","then","listeners","length","slice","forEach","_logTimer","bind","dT","toFixed","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","blobConstruct","blobParts","mimeType","blob","Array","isArray","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","constructor","blobSupported","this","isAvailable","getFakeFileWriter","size","saveFileCallback","bytes","Uint8Array","fakeFileWriter","write","part","offset","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","push","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","save","put","getFile","fileName","saveFile","Response","headers","callback","rejected","timeout","undefined","res","clearTimeout","getFileWriter","fileSize","fakeWriter","static","enabled","clearWrite","map","storage","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","url","promises","id","ignoreSearch","ignoreVary","clientId","deferredPromises","find","client","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","requestFilePartFromWorker","alignedOffset","limit","fromPreload","task","payload","docId","dcId","JSON","stringify","windowClient","deferred","uploadFile","add","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","value","finally","cancel","assign","deferredPromise","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","getChunkKey","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","byteLength","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","getter","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","data","json","hasActiveWindows","checksPromise","muteUntil","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","focus","openWindow","baseUrl","getNotifications","len","taskListeners","notifications_clear","ping","ports","source","onPing","toggleStorages","toggleStorage","onFetch","origin","respondWith","file","fetch","clone","replace","random","requestCache","scope","params","exec","header","chunks","ranges","parseRange","parse","decodeURIComponent","stream","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onunhandledrejection","onoffline","ononline"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.js b/public/sw.js deleted file mode 100644 index 7dd481e47..000000000 --- a/public/sw.js +++ /dev/null @@ -1,4 +0,0 @@ -var serviceWorkerOption = {"assets":["/0.61ba1feb637ecd90f834.chunk.js","/1.7e25e358e50296502415.chunk.js","/11.b9f918fab02af4357c63.chunk.js","/12.b4eb3274ce5b3c321958.chunk.js","/13.f5538912196e125de757.chunk.js","/14.45fb90c7c021f37182ff.chunk.js","/15.198a32297d624a4ee6ed.chunk.js","/16.f1dde01b3fecd34c349b.chunk.js","/17.72126c110cfedf3298a9.chunk.js","/18.19abbab9479978924d76.chunk.js","/19.1037e823e8c755fdccf9.chunk.js","/2.68e2ce68d7ded3346526.chunk.js","/20.96e8eeb627066b5094ac.chunk.js","/21.01da4c39b75c80344eb7.chunk.js","/22.0a628e2d4248ba9d2bc6.chunk.js","/23.6be0d0c4a28ca0d0952b.chunk.js","/24.3dbb6c36f540f3e15be0.chunk.js","/3.fd4a457d3edbe045f3c5.chunk.js","/4.f9a995960e4699c2de34.chunk.js","/5.eeac423212e8b7acbb73.chunk.js","/6.3fcd156db2ca66c7e6d0.chunk.js","/7.5f548bb1b833747ed1cb.chunk.js","/8.f44261a125fd436f2604.chunk.js","/main.18d052b0bbd55d76b776.css","/main.8fe17e02354fa08e65e4.bundle.js","/mtproto.worker.02f307d76034f3156ff7.bundle.worker.js","/npm.qr-code-styling.8a5c1af00a34aad13da9.chunk.js","/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js","/style-desktop.9d7b485ed526720a3aad.css","/webp.worker.c0cc94110cda650246b2.bundle.worker.js"]}; - - !function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return oe})),n.d(t,"deferredPromises",(function(){return se}));const r={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};r.http=location.search.indexOf("http=1")>0,r.http&&(r.transport="https");var o=r;const i=o.debug;"undefined"!=typeof window?window:self;var s=i;var a="undefined"!=typeof window?window:self;const c=navigator?navigator.userAgent:null,l=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&a.MSStream,!!("safari"in a)||!(!c||!(/\b(iPad|iPhone|iPod)\b/.test(c)||c.match("Safari")&&!c.match("Chrome")))),u=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,h=(navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),"undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope),d="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!h,f=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),g=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(n=>{n.length&&n.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},p=(...e)=>{self.postMessage(...e)},m=()=>{};h&&g.bind(null,!1),h&&g.bind(null,!0);var v;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(v||(v={}));const y=[v.None,v.Error,v.Warn,v.Log,v.Debug],w=Date.now();function b(){return"["+((Date.now()-w)/1e3).toFixed(3)+"]"}let P;const S=l||u;P=S?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const A=!S,O=S?2:3;function T(){const e=(new Error).stack.split("\n"),t=e[O]||e[e.length-1];return"["+(P(t)||"")+"]"}const _={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},x=[["debug",v.Debug],["info",v.Log],["warn",v.Warn],["error",v.Error],["assert",v.Error],["trace",v.Log]];function E(e,t=v.Log|v.Warn|v.Error,n=!1,r=""){let o;s||n||(t=v.Error),A?r||(h?r=_.yellow:d&&(r=_.cyan)):r="";let i=r;r=r?`%s ${r}%s`:"%s";const a=function(...n){return t&v.Log&&console.log(r,b(),e,T(),...n)};return x.forEach(([n,o])=>{a[n]=function(...i){return t&o&&console[n](r,b(),e,T(),...i)}}),a.setPrefix=function(t){o=t,e="["+t+"]"},a.setPrefix(e),a.setLevel=function(e){t=y.slice(0,e+1).reduce((e,t)=>e|t,0)},a.bindPrefix=function(e){return E(`${o}] [${e}`,t,n,i)},a}var j=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))};const k=self;function C(e){return e.ok&&200===e.status}function D(e){return Promise.race([e,(t=1e4,new Promise(e=>{setTimeout(e,t)})).then(()=>Promise.reject())]);var t}function F(e){return function(e,t){return new Promise(n=>{const r=new FileReader;r.addEventListener("loadend",e=>{n(e.target.result)}),r[t](e)})}(e,"readAsArrayBuffer")}function R(){}function N(e,t=""){let n;Array.isArray(e)||(e=[e]);const r=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);try{n=new Blob(e,{type:r})}catch(t){let o=new BlobBuilder;e.forEach(e=>{o.append(e)}),n=o.getBlob(r)}return n}var L=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))};var M=new class{constructor(){this.blobSupported=!0;try{N([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}getFakeFileWriter(e,t,n){let r=new Uint8Array(t);return{write:(e,t)=>L(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;r.set(e,t)})),truncate:()=>{r=new Uint8Array},trim:e=>{r=r.slice(0,e)},finalize:(t=!0)=>{const o=N(r,e);return t&&n&&n(o),o},getParts:()=>r,replaceParts:e=>{r=e}}}},W=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))};class I{constructor(e){this.dbName=e,this.useStorage=!0,o.test&&(this.dbName+="_test"),I.STORAGES.length&&(this.useStorage=I.STORAGES[0].useStorage),this.openDatabase(),I.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=N(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,n)=>W(this,void 0,void 0,(function*(){let r=!1;const o=setTimeout(()=>{n(),r=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const o=yield e(n);if(r)return;t(o)}catch(e){n(e)}clearTimeout(o)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t,n){const r=M.getFakeFileWriter(n,t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(r)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}I.STORAGES=[];var q=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))};const B=new I("cachedStreamChunks");setInterval(()=>B.timeoutOperation(e=>e.keys().then(t=>{const n=new Map,r=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const o=[];for(const[t,i]of n){const n=e.match(i).then(n=>{if(+n.headers.get("Time-Cached")+86400<=r)return oe("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})});o.push(n)}return Promise.all(o)})),18e5),setInterval(()=>{f().then(e=>{for(const[t,n]of se)if(!e.find(e=>e.id===t)){for(const e in n){n[e].reject()}se.delete(t)}})},12e4);const U=new Map;class G{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{U.delete(this.id)},this.id=G.getId(e),U.set(this.id,this),this.limitPart=e.size>78643200?z:$,this.destroyDebounced=function(e,t,n=!0,r=!0){let o,i,s,c,l=!1;const u=t=>{const n=s,r=c;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),r(e)}},h=(...e)=>{i||(i=new Promise((e,t)=>(s=e,c=t))),o?(clearTimeout(o),l=!0,c(),i=new Promise((e,t)=>(s=e,c=t))):n&&(u(e),l=!1);const h=a.setTimeout(()=>{!r||n&&!l||u(e),o===h&&(o=i=s=c=void 0,l=!1)},t);return o=h,i.catch(R),i};return h.clearTimeout=()=>{o&&(a.clearTimeout(o),c(),o=i=s=c=void 0,l=!1)},h}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return q(this,void 0,void 0,(function*(){const r={type:"requestFilePart",payload:[this.info.dcId,this.info.location,e,t]},o=JSON.stringify(r);r.id=o;const i=yield f().then(e=>{if(e.length)return e.find(e=>se.has(e.id))||e[0]});if(!i)throw new Error("no window");let s=se.get(i.id);s||se.set(i.id,s={});let a=s[o];if(a)return a.then(e=>e.bytes);i.postMessage(r),this.loadedOffsets.add(e),a=s[o]=function(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((n,r)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,r(...e))}});return t.catch(R).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}();const c=a.then(e=>e.bytes);return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c}))}requestFilePartFromCache(e,t,n){const r=this.getChunkKey(e,t);return B.getFile(r).then(e=>n?new Uint8Array:function(e){return F(e).then(e=>new Uint8Array(e))}(e),e=>{})}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then(r=>r||this.requestFilePartFromWorker(e,t,n))}saveChunkToCache(e,t,n){return e.then(e=>{const r=this.getChunkKey(t,n),o=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream","Time-Cached":""+(Date.now()/1e3|0)}});return B.save(r,o)})}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&r===i+o||(e=e.slice(n-i,r-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":""+e.byteLength};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})})}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=U.get(this.getId(e)))&&void 0!==t?t:new G(e)}static getId(e){return e.location.id}}const $=524288,z=1048576;function V(e,t=2048){return e-e%t}var J={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]};class K{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),o.test&&(this.name+="_test"),this.storeName=t,this.log=E("IDB-"+this.storeName),this.openDatabase(!0),K.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let n=!1;return setTimeout(()=>{n||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,r)=>{t.onsuccess=o=>{n=!0;const i=t.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{n=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},t.onupgradeneeded=e=>{n=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var n;const r=e.createObjectStore(t.name);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const e of t.indexes)r.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",n=>e.map((e,r)=>n.put(t[r],e)),"")}saveFile(e,t){return t instanceof Blob||(t=N(t)),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,n,r=this.storeName){let o;return n&&(o=performance.now(),this.log(n+": start")),this.openDatabase().then(i=>new Promise((s,a)=>{const c=i.transaction([r],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),n&&this.log(n+": end",performance.now()-o);const t=d.map(e=>e.result);s(h?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",c)},1e4),u=t(c.objectStore(r)),h=Array.isArray(u),d=h?u:[].concat(u)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}K.STORAGES=[];var Y=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))};const H=self,X=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/";const Q=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new K(e,t)}get(e){return Y(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){return Y(this,void 0,void 0,(function*(){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}))}}(J,"session",{push_mute_until:0,push_last_alive:0,push_lang:{},push_settings:{}});H.addEventListener("push",e=>{const t=e.data.json();oe("push",t);let n=!1;const r=Promise.all([Q.get("push_mute_until"),Q.get("push_last_alive"),H.clients.matchAll({type:"window"})]).then(e=>{const[r,o,i]=e;if(oe("matched clients",i),n=i.length>0,n)throw"Supress notification because some instance is alive";const s=Date.now();if(re()&&r&&s{oe(e)});const o=r.then(()=>Promise.all([Q.get("push_settings"),Q.get("push_lang")])).then(e=>function(e,t,n){const r="assets/img/logo_filled_rounded.png";let o,i=e.title||"Telegram",s=e.description||"";e.custom&&(o=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||"");e.custom.peerId=""+o;let a="peer"+o;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview||"You have a new message",a="unknown_peer");oe("show notify",i,s,r,e);const c=[{action:"mute1d",title:n.push_action_mute1d||"Mute for 24H"}];return H.registration.showNotification(i,{body:s,icon:r,tag:a,data:e,actions:c}).then(e=>{var t;e&&e.notification&&(t=e.notification,ee.has(t)||(ee.add(t),t.onclose=te))}).catch(e=>{oe.error("Show notification promise",e)})}(t,e[0],e[1])).catch(()=>(oe("Closing all notifications on push",n),re()||n?ne():H.registration.showNotification("Telegram",{tag:"unknown_peer"}).then(()=>{if(n)return ne();setTimeout(()=>ne(),n?0:100)}).catch(e=>{oe.error("Show notification error",e)})));e.waitUntil(o)}),H.addEventListener("notificationclick",e=>{const t=e.notification;oe("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&re())return oe("[SW] mute for 1d"),void Q.set("push_mute_until",Date.now()+864e5);const r=t.data;if(!r)return;const o=H.clients.matchAll({type:"window"}).then(e=>{r.action=n,Z={type:"push_click",payload:r};for(let t=0;tH.clients.openWindow(e.baseUrl||X))}).catch(e=>{oe.error("Clients.matchAll error",e)});e.waitUntil(o)}),H.addEventListener("notificationclose",te);let Z,ee=new Set;function te(e){var t;t=e.notification,ee.delete(t)}function ne(){for(const e of ee)try{e.close()}catch(e){}let e;return e="getNotifications"in H.registration?H.registration.getNotifications({}).then(e=>{for(let t=0,n=e.length;t{oe.error("Offline register SW error",e)}):Promise.resolve(),ee.clear(),e}function re(){return u}const oe=E("SW",v.Error|v.Debug|v.Log|v.Warn),ie=self,se=new Map,ae={notifications_clear:()=>{ne()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,r=e.payload;r.localNotifications&&Q.set("push_last_alive",Date.now()),Z&&n&&"postMessage"in n&&(n.postMessage(Z,[]),Z=void 0),r.lang&&Q.set("push_lang",r.lang),r.settings&&Q.set("push_settings",r.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,r=se.get(n.id);if(!r)return;const o=r[e.id];o&&(e.error?o.reject(e.error):o.resolve(e.payload),delete r[e.id])},toggleStorage:e=>{I.toggleStorage(e.payload)}};ie.addEventListener("message",e=>{const t=e.data,n=ae[t.type];n&&n(t,e)});const ce=e=>{if(0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/)&&!l)return e.respondWith(function(e){return j(this,void 0,void 0,(function*(){try{const t=yield D(k.caches.open("cachedAssets")),n=yield D(t.match(e.request,{ignoreVary:!0}));if(n&&C(n))return n;const r={Vary:"*"};let o=yield fetch(e.request,{headers:r});if(C(o))t.put(e.request,o.clone());else if(304===o.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);o=yield fetch(n,{headers:r}),C(o)&&t.put(e.request,o.clone())}return o}catch(t){return fetch(e.request)}}))}(e));try{const[,t,n,r]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];switch(n){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[r,o]=n[0].split("-");return[+r,+o||0]}(e.request.headers.get("Range")),r=JSON.parse(decodeURIComponent(t)),o=G.get(r);var i;e.respondWith(Promise.race([(i=45e3,new Promise(e=>{setTimeout(()=>{e(new Response("",{status:408,statusText:"Request timed out."}))},i)})),o.requestRange(n)]))}(e,r)}}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},le=()=>{ie.onfetch=ce};ie.addEventListener("install",e=>{oe("installing"),e.waitUntil(ie.skipWaiting())}),ie.addEventListener("activate",e=>{oe("activating",ie),e.waitUntil(ie.caches.delete("cachedAssets")),e.waitUntil(ie.clients.claim())}),ie.onerror=e=>{oe.error("error:",e)},ie.onunhandledrejection=e=>{oe.error("onunhandledrejection:",e)},ie.onoffline=ie.ononline=le,le()}]); -//# sourceMappingURL=sw.js.map \ No newline at end of file diff --git a/public/sw.js.map b/public/sw.js.map deleted file mode 100644 index d7f0ab738..000000000 --- a/public/sw.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/serviceWorker/cache.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack:///./src/helpers/blob/readBlobAs.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/blob/blobConstruct.ts","webpack:///./src/helpers/blob/blobSafeMimeType.ts","webpack:///./src/lib/fileManager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/serviceWorker/stream.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/blob/readBlobAsUint8Array.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object/safeAssign.ts","webpack:///./src/lib/serviceWorker/push.ts","webpack:///./src/lib/serviceWorker/index.service.ts","webpack:///./src/lib/serviceWorker/timeout.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","toLowerCase","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","getWindowClients","clients","matchAll","includeUncontrolled","type","notifyServiceWorker","all","args","then","listeners","length","slice","forEach","listener","postMessage","notifyWorker","noop","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","console","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","isCorrectResponse","response","ok","status","timeoutRace","promise","Promise","race","ms","resolve","setTimeout","reject","readBlobAsArrayBuffer","blob","reader","FileReader","addEventListener","e","target","result","readBlobAs","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","blobSupported","this","size","saveFileCallback","bytes","Uint8Array","write","part","offset","set","truncate","finalize","saveToStorage","getParts","replaceParts","parts","dbName","useStorage","STORAGES","openDatabase","push","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","put","fileName","Response","headers","save","callback","rejected","timeout","undefined","res","err","clearTimeout","fileSize","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","map","storage","deleteAll","cacheStorage","setInterval","keys","requests","filtered","Map","timestamp","request","url","has","promises","id","ignoreSearch","ignoreVary","clientId","deferredPromises","find","client","taskId","streams","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","error","debounce","_waitingTimeout","alignedOffset","limit","fromPreload","task","payload","dcId","JSON","stringify","windowClient","deferred","uploadFile","add","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","finally","cancel","assign","deferredPromise","bytesPromise","saveChunkToCache","preloadChunks","getChunkKey","getFile","buffer","readBlobAsUint8Array","requestFilePartFromCache","requestFilePartFromWorker","requestFilePart","end","preloadChunk","alignOffset","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","byteLength","base","version","stores","db","storeName","storageIsAvailable","fromObject","safeAssign","preserve","onclose","close","createNew","indexedDB","message","finished","onerror","onsuccess","event","calledNew","onabort","transaction","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","concat","getObjectStore","objectStore","clear","idx","perf","performance","oncomplete","results","getAll","defaultBaseUrl","protocol","hostname","pathname","join","defaults","push_mute_until","push_last_alive","push_lang","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","lastAliveTime","clientList","nowTime","userInvisibleIsSupported","badge","reason","closePromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","push_message_nopreview","actions","action","push_action_mute1d","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closeAllNotifications","waitUntil","pendingNotification","focus","openWindow","baseUrl","getNotifications","len","taskListeners","notifications_clear","ping","ports","source","localNotifications","onPing","toggleStorage","onFetch","origin","respondWith","file","fetch","clone","replace","random","requestCache","scope","params","exec","header","chunks","ranges","parseRange","parse","decodeURIComponent","stream","delay","requestRange","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onunhandledrejection","onoffline","ononline"],"mappings":"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","file":"sw.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"../../helpers/schedulers/pause\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n \r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n \r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n \r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export default function pause(ms: number) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from \"./readBlobAs\";\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function noop() {}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from \"./blobSafeMimeType\";\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport readBlobAsUint8Array from \"../../helpers/blob/readBlobAsUint8Array\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { getWindowClients } from \"../../helpers/context\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { InputFileLocation, UploadFile } from \"../../layer\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport { RequestFilePartTask, deferredPromises, log } from \"./index.service\";\r\nimport timeout from \"./timeout\";\r\n\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then(requests => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n getWindowClients().then((clients) => {\r\n for(const [clientId, promises] of deferredPromises) {\r\n if(!clients.find(client => client.id === clientId)) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(clientId);\r\n }\r\n }\r\n });\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const task: Omit = {\r\n type: 'requestFilePart',\r\n payload: [this.info.dcId, this.info.location, alignedOffset, limit]\r\n };\r\n\r\n const taskId = JSON.stringify(task);\r\n (task as RequestFilePartTask).id = taskId;\r\n\r\n const windowClient = await getWindowClients().then((clients) => {\r\n if(!clients.length) {\r\n return;\r\n }\r\n\r\n return clients.find(client => deferredPromises.has(client.id)) || clients[0];\r\n });\r\n\r\n if(!windowClient) {\r\n throw new Error('no window');\r\n }\r\n\r\n let promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n deferredPromises.set(windowClient.id, promises = {});\r\n }\r\n \r\n let deferred = promises[taskId] as CancellablePromise;\r\n if(deferred) {\r\n return deferred.then(uploadFile => uploadFile.bytes);\r\n }\r\n \r\n windowClient.postMessage(task);\r\n this.loadedOffsets.add(alignedOffset);\r\n \r\n deferred = promises[taskId] = deferredPromise();\r\n const bytesPromise = deferred.then(uploadFile => uploadFile.bytes);\r\n\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error) => {\r\n if(error === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then(bytes => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then(bytes => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then(ab => {\r\n //log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n \r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n });\r\n //}, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n //log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from \"../../environment/ctx\";\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\nimport noop from \"../noop\";\r\n\r\nexport type DebounceReturnType = { \r\n (...args: Parameters): Promise>>; \r\n clearTimeout(): void; \r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n \r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from \"./readBlobAsArrayBuffer\";\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../../config/databases\";\r\nimport DATABASE_STATE from \"../../config/databases/state\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport IDBStorage from \"../idb\";\r\nimport { log, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"./index.service\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n //user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T, \r\n storeName: typeof db['stores'][number]['name'], \r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_last_alive: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_last_alive: 0,\r\n push_lang: {},\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'), \r\n getter.get('push_last_alive'), \r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, lastAliveTime, clientList] = result;\r\n \r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n \r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch(reason => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = {type: 'push_click', payload: data};\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n client.postMessage(pendingNotification);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nlet notifications: Set = new Set();\r\nlet pendingNotification: ServiceWorkerPushClickTask;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview || 'You have a new message';\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d || 'Mute for 24H'\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event && event.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(task: ServiceWorkerPingTask, event: ExtendableMessageEvent) {\r\n const client = event.ports && event.ports[0] || event.source;\r\n const payload = task.payload;\r\n\r\n if(payload.localNotifications) {\r\n getter.set('push_last_alive', Date.now());\r\n }\r\n\r\n if(pendingNotification &&\r\n client &&\r\n 'postMessage' in client) {\r\n client.postMessage(pendingNotification, []);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n \r\n \r\n \r\n//import CacheStorageController from '../cacheStorage';\r\nimport type { Modify, WorkerTaskTemplate, WorkerTaskVoidTemplate } from '../../types';\r\nimport type { InputFileLocation, InputWebFileLocation, UploadFile } from '../../layer';\r\nimport type { WebPushApiManager } from '../mtproto/webPushApiManager';\r\nimport type { PushNotificationObject } from './push';\r\nimport type { ToggleStorageTask } from '../mtproto/mtprotoworker';\r\nimport type { MyUploadFile } from '../mtproto/apiFileManager';\r\nimport { logger, LogTypes } from '../logger';\r\nimport { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport { CACHE_ASSETS_NAME, requestCache } from './cache';\r\nimport onStreamFetch from './stream';\r\nimport { closeAllNotifications, onPing } from './push';\r\nimport CacheStorageController from '../cacheStorage';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\n\r\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const deferredPromises: Map}> = new Map();\r\n\r\nexport interface RequestFilePartTask extends Modify {\r\n type: 'requestFilePart',\r\n payload: [number, InputFileLocation | InputWebFileLocation, number, number]\r\n};\r\n\r\nexport interface RequestFilePartTaskResponse extends Modify {\r\n type: 'requestFilePart',\r\n payload?: MyUploadFile,\r\n originalPayload?: RequestFilePartTask['payload']\r\n};\r\n\r\nexport interface ServiceWorkerPingTask extends WorkerTaskVoidTemplate {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: boolean,\r\n lang: {\r\n push_action_mute1d: string\r\n push_action_settings: string\r\n push_message_nopreview: string\r\n },\r\n settings: WebPushApiManager['settings']\r\n }\r\n};\r\n\r\nexport interface ServiceWorkerNotificationsClearTask extends WorkerTaskVoidTemplate {\r\n type: 'notifications_clear'\r\n};\r\n\r\nexport interface ServiceWorkerPushClickTask extends WorkerTaskVoidTemplate {\r\n type: 'push_click',\r\n payload: PushNotificationObject\r\n};\r\n\r\nexport type ServiceWorkerTask = RequestFilePartTaskResponse | ServiceWorkerPingTask | ServiceWorkerNotificationsClearTask | ToggleStorageTask;\r\n\r\n \r\nconst taskListeners: {\r\n [type in ServiceWorkerTask['type']]: (task: any, event: ExtendableMessageEvent) => void\r\n} = {\r\n notifications_clear: () => {\r\n closeAllNotifications();\r\n },\r\n ping: (task: ServiceWorkerPingTask, event) => {\r\n onPing(task, event);\r\n },\r\n requestFilePart: (task: RequestFilePartTaskResponse, e: ExtendableMessageEvent) => {\r\n const windowClient = e.source as WindowClient;\r\n const promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n return;\r\n }\r\n\r\n const promise = promises[task.id];\r\n if(promise) {\r\n if(task.error) {\r\n promise.reject(task.error);\r\n } else {\r\n promise.resolve(task.payload);\r\n }\r\n \r\n delete promises[task.id];\r\n }\r\n },\r\n toggleStorage: (task: ToggleStorageTask) => {\r\n CacheStorageController.toggleStorage(task.payload);\r\n }\r\n};\r\nctx.addEventListener('message', (e) => {\r\n const task = e.data as ServiceWorkerTask;\r\n const callback = taskListeners[task.type];\r\n if(callback) {\r\n callback(task, e);\r\n }\r\n});\r\n \r\n\r\n//const cacheStorage = new CacheStorageController('cachedAssets');\r\n/* let taskId = 0;\r\n\r\nexport function getTaskId() {\r\n return taskId;\r\n}\r\n\r\nexport function incrementTaskId() {\r\n return taskId++;\r\n} */\r\n\r\nconst onFetch = (event: FetchEvent): void => {\r\n if(event.request.url.indexOf(location.origin + '/') === 0 \r\n && event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\r\n && !IS_SAFARI) {\r\n return event.respondWith(requestCache(event));\r\n }\r\n\r\n try {\r\n const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\r\n\r\n //log.debug('[fetch]:', event);\r\n \r\n switch(scope) {\r\n case 'stream': {\r\n onStreamFetch(event, params);\r\n break;\r\n }\r\n }\r\n } catch(err) {\r\n event.respondWith(new Response('', {\r\n status: 500,\r\n statusText: 'Internal Server Error',\r\n }));\r\n }\r\n};\r\n\r\nconst onChangeState = () => {\r\n ctx.onfetch = onFetch;\r\n};\r\n\r\nctx.addEventListener('install', (event) => {\r\n log('installing');\r\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\r\n});\r\n\r\nctx.addEventListener('activate', (event) => {\r\n log('activating', ctx);\r\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME));\r\n event.waitUntil(ctx.clients.claim());\r\n});\r\n\r\nctx.onerror = (error) => {\r\n log.error('error:', error);\r\n};\r\n\r\nctx.onunhandledrejection = (error) => {\r\n log.error('onunhandledrejection:', error);\r\n};\r\n\r\nctx.onoffline = ctx.ononline = onChangeState;\r\n\r\nonChangeState();\r\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/version b/public/version index b0dba6036..1180eb792 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.4.3 (177) \ No newline at end of file +1.5.0 (178) \ No newline at end of file diff --git a/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js b/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js deleted file mode 100644 index 79ffdece6..000000000 --- a/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(t){var e={};function a(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.m=t,a.c=e,a.d=function(t,e,n){a.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},a.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.t=function(t,e){if(1&e&&(t=a(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)a.d(n,r,function(e){return t[e]}.bind(null,r));return n},a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,"a",e),e},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},a.p="",a(a.s=1)}([function(t,e,a){"use strict";!function(t){if(t.TextEncoder&&t.TextDecoder)return!1;function e(t="utf-8"){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${t}') is invalid.`)}function a(t="utf-8",e={fatal:!1}){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${t}') is invalid.`);if(e.fatal)throw new Error("Failed to construct 'TextDecoder': the 'fatal' option is unsupported.")}Object.defineProperty(e.prototype,"encoding",{value:"utf-8"}),e.prototype.encode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to encode: the 'stream' option is unsupported.");let a=0;const n=t.length;let r=0,i=Math.max(32,n+(n>>1)+7),s=new Uint8Array(i>>3<<3);for(;a=55296&&e<=56319){if(a=55296&&e<=56319)continue}if(r+4>s.length){i+=8,i*=1+a/t.length*2,i=i>>3<<3;const e=new Uint8Array(i);e.set(s),s=e}if(0!=(4294967168&e)){if(0==(4294965248&e))s[r++]=e>>6&31|192;else if(0==(4294901760&e))s[r++]=e>>12&15|224,s[r++]=e>>6&63|128;else{if(0!=(4292870144&e))continue;s[r++]=e>>18&7|240,s[r++]=e>>12&63|128,s[r++]=e>>6&63|128}s[r++]=63&e|128}else s[r++]=e}return s.slice(0,r)},Object.defineProperty(a.prototype,"encoding",{value:"utf-8"}),Object.defineProperty(a.prototype,"fatal",{value:!1}),Object.defineProperty(a.prototype,"ignoreBOM",{value:!1}),a.prototype.decode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to decode: the 'stream' option is unsupported.");const a=new Uint8Array(t);let n=0;const r=a.length,i=[];for(;n65535&&(e-=65536,i.push(e>>>10&1023|55296),e=56320|1023&e),i.push(e)}}return String.fromCharCode.apply(null,i)},t.TextEncoder=e,t.TextDecoder=a}("undefined"!=typeof window?window:"undefined"!=typeof self?self:this)},function(t,e,a){"use strict";let n,r;a.r(e);const i=null;function s(t){return JSON.parse(JSON.stringify(t))}function o(t,e,a,r,i){for(n=0;n=0;--a)e=s(_(t[a],e));return e}function p(t){if(!t)throw Error("assert :P")}const g=function(){function t(t){return t==Be||t==Le||t==Ce||t==Fe}function e(t){return m(t,1)}function a(t,e){const a=1+((t.la-1)*e>>8),n=a<<8;let r=0;for(t.Z>=n?(r=1,t.la-=a,t.Z-=n):(r=0,t.la=a);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return r}function g(t,e,a,n){(n-=a)>=2?(t.Z=e[a+0]<<8|e[a+1],t.qa=e,t.Ia=a+2,t.bc=n-2):(t.Z=0,t.qa=i,t.bc=0),t.la=255,t.gc=0}function m(t,e){var n=0,r=0;for(r=e-1;r>=0;r--)n|=a(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function A(t){t.g>=8&&y(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function E(t,e){let a=0;if(p(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return a;a=t.T>>t.g&sa[e],t.g+=e,t.g>=8&&t.g>=8&&y(t)}else t.fa=1;return a}function R(t){return t.Pa==t.gb}function U(t,e){return p(t!=i),0==e?0:(t.gb=2*e-1,t.Y=b(t.gb,Pa),t.Y==i?0:(t.Y[0].s=-1,t.Pa=1))}function x(t){t!=i&&(t.Y=i,t.Y=i,t.gb=0,t.Pa=0)}function T(t,e,a,n){for(var r=t.Y,i=0,s=+t.gb;n-- >0;){if(i>=s)return 0;if(r[i].s<0){if(R(t))return 0;const e=t,a=e.Y,n=+e.Pa;r[i].s=n-i,e.Pa+=2,a[n+0].s=-1,a[n+1].s=-1}else if(0==r[i].s)return 0;i+=r[i].s+(a>>n&1)}if(r[i].s<0)r[i].s=0;else if(0!=r[i].s)return 0;return r[i].kc=e,1}function S(t,e,a){var n=0;let r=0,s=0;for(p(t!=i),p(e!=i),n=0;n0&&(++r,s=n);if(!U(t,r))return 0;if(1==r)return s<0||s>=a?(x(t),0):T(t,s,0,0);if(r=0,s=_(a,0),s==i)return(r=r&&R(t))||x(t),r;var o=0;o=0,n=_(wa+1,0);let l=0;const f=_(wa+1,0);let h=0;for(p(e!=i),p(a>0),p(s!=i),o=0;oh&&(h=e[o]);if(h>wa)n=0;else{for(o=0;o0?f[e[o]]++:La;n=1}if(!n)return(r=r&&R(t))||x(t),r;for(n=0;n0&&!T(t,n,s[n],e[n]))return(r=r&&R(t))||x(t),r;return(r=R(t))||x(t),r}function z(t,e,a,n,r,i,s){var o=0;for(o=0;ot.P.v)&&(a=0==e)){t:{let e=t.Ga;var r=t.G,l=t.ub;a=t.P.l;let u=t.P.v;const b=t.Xb;var f=[i];let w=i,g=u*a;var h=i,c=i;c="WEBP_FILTER_TYPE";let m=0;f=0;var d=0;let v=0;if(p(a>0&&u>0&&n>=a),p(e!=i&&b!=i),l<=Ea)a=0;else if(v=e[r+0]>>0&3,c=e[r+0]>>2&3,m=e[r+0]>>4&3,f=e[r+0]>>6&3,vUa||c>=Un||m>xa||0!=f)a=0;else{if(v==Ra)d=l>=g,f=e,w=r+Ea;else{if(f=_(g,0),w=0,f==i){a=0;break t}d=r+Ea,l=l-Ea,r=f,h=s(ta);let t=0;const n=jt();n==i?d=0:(n.l=a,n.v=u,n.N=h,ct(Te),h.put=ge,h.Mb=pe,h.Pb=me,h.ka=i,h.ka=r,h.fd=0,h.width=a,h.height=u,n.a=He,k(n.o,e,d,l),n.Wa=vn,Kt(a,u,1,n,i)&&Yt(n,a)&&(n.Wa=mn,t=Vt(n,n.V,n.Ha,n.l,n.v,qt)),n!=i&&Gt(n),d=t)}if(d){for(e=xn[c],e!=i?((h=_(g,0))==i&&(d=0,v!=Ra&&(w=f=i)),e(f,w,a,u,1,a,h,c=0),g=h,v=c):(g=f,v=w),e=0;u-- >0;)o(b,e,g,v,a),v+=a,e+=n;m==xa&&(d=f==i||w<=0||a<=0?0:1)}a=d}}a=!a}return a?i:0==e?t.Xb:+e*n}function D(t,e,a,n){if(n==i||t<=0||e<=0)return Ge;if(a!=i){if(a.Ua){const n=a.wc,r=a.vc,i=-2&a.t,s=-2&a.k;if(i<0||s<0||n<=0||r<=0||i+n>t||s+r>e)return Ge;t=n,e=r}if(a.I){if(a.Ba<=0||a.Aa<=0)return Ge;t=a.Ba,e=a.Aa}}return n.width=t,n.height=e,function(t){let e=t.width;const a=t.height;let n=t.J;if(e<=0||a<=0||!(n>=Se&&n=Se&&s=o*Tn[s],n&=t.ma!=i):(f=(t=t.c.Va).nb*parseInt((l+1)/2,10),h=t.rb*parseInt((l+1)/2,10),c=t.Fa*l,n&=t.F*l<=t.Wc,n&=f<=t.Rc,n&=h<=t.Uc,n&=c<=t.Wb,n&=t.F>=o,n&=t.nb>=parseInt((o+1)/2,10),n&=t.rb>=parseInt((o+1)/2,10),n&=t.y!=i,n&=t.c!=i,n&=t.S!=i,s==Me&&(n&=t.Fa>=o,n&=c<=t.Wb,n&=t.p!=i)):n=0,n?He:Ge}(n)}function I(t){return-256&t?t<0?0:255:t}function N(t,e,a,n){const r=_(16,0);let i,s;for(i=0,s=0;s<4;++s){var o=t[e+0]+t[e+8],l=t[e+0]-t[e+8],f=(t[e+4]*Bn>>16)-(t[e+12]*Pn>>16),h=(t[e+4]*Pn>>16)+(t[e+12]*Bn>>16);r[i+0]=o+h,r[i+1]=l+f,r[i+2]=l-f,r[i+3]=o-h,i+=4,e++}for(s=i=0;s<4;++s)o=(t=r[i+0]+4)+r[i+8],l=t-r[i+8],f=(r[i+4]*Bn>>16)-(r[i+12]*Pn>>16),h=(r[i+4]*Pn>>16)+(r[i+12]*Bn>>16),a[n+0+0*an]=I(a[n+0+0*an]+(o+h>>3)),a[n+1+0*an]=I(a[n+1+0*an]+(l+f>>3)),a[n+2+0*an]=I(a[n+2+0*an]+(l-f>>3)),a[n+3+0*an]=I(a[n+3+0*an]+(o-h>>3)),i++,n+=an}function P(t,e,a,n,r){N(t,e,a,n),r&&N(t,e+16,a,n+4)}function B(t,e,a,n){Zn(t,e+0,a,n+0,1),Zn(t,e+32,a,n+4*an,1)}function L(t,e,a,n){let r;for(t=t[e+0]+4,r=0;r<4;++r)for(e=0;e<4;++e)a[n+e+r*an]=I(a[n+e+r*an]+(t>>3))}function C(t,e,a,n){t[e+0]&&L(t,e+0,a,n+0),t[e+16]&&L(t,e+16,a,n+4),t[e+32]&&L(t,e+32,a,n+4*an),t[e+48]&&L(t,e+48,a,n+4*an+4)}function F(t,e,a){const n=e-an,r=In,i=255-t[n-1];let s;for(s=0;s>2}function W(t,e,a){let n,r;for(n=0;n<8;++n)for(r=0;r<8;++r)e[a+r+n*an]=t}function V(t,e,a){const n=t[e-a],r=t[e+0],i=3*(r-n)+On[1020+t[e-2*a]-t[e+a]],s=Dn[112+(i+4>>3)];t[e-a]=In[255+n+Dn[112+(i+3>>3)]],t[e+0]=In[255+r-s]}function H(t,e,a,n){const r=t[e+0],i=t[e+a];return Sn[255+t[e-2*a]-t[e-a]]>n||Sn[255+i-r]>n}function G(t,e,a,n,r){const i=t[e-3*a],s=t[e-2*a],o=t[e-a],l=t[e+0],f=t[e+a],h=t[e+2*a],c=t[e+3*a];return 2*Sn[255+o-l]+zn[255+s-f]>n?0:Sn[255+t[e-4*a]-i]<=r&&Sn[255+i-s]<=r&&Sn[255+s-o]<=r&&Sn[255+c-h]<=r&&Sn[255+h-f]<=r&&Sn[255+f-l]<=r}function K(t,e,a,n){let r;for(r=0;r<16;++r)2*Sn[255+t[e+r-a]-t[e+r+0]]+zn[255+t[e+r-2*a]-t[e+r+a]]<=n&&V(t,e+r,a)}function Y(t,e,a,n){let r;for(r=0;r<16;++r)2*Sn[255+t[e+r*a-1]-t[e+r*a+0]]+zn[255+t[e+r*a-2]-t[e+r*a+1]]<=n&&V(t,e+r*a,1)}function q(t,e,a,n){let r;for(r=3;r>0;--r)K(t,(e+=4*a)+0,a,n)}function J(t,e,a,n){let r;for(r=3;r>0;--r)Y(t,(e+=4)+0,a,n)}function X(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-2*i],o=n[r-i],f=n[r+0],h=n[r+i],c=n[r+2*i];const d=27*(l=On[1020+3*(f-o)+On[1020+s-h]])+63>>7,u=18*l+63>>7;var l=9*l+63>>7;n[r-3*i]=In[255+n[r-3*i]+l],n[r-2*i]=In[255+s+u],n[r-i]=In[255+o+d],n[r+0]=In[255+f-d],n[r+i]=In[255+h-u],n[r+2*i]=In[255+c-l]}e+=n}}function $(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-i],o=n[r+0],f=n[r+i];const h=Dn[112+((l=3*(o-s))+4>>3)];var l=Dn[112+(l+3>>3)];const c=h+1>>1;n[r-2*i]=In[255+n[r-2*i]+c],n[r-i]=In[255+s+l],n[r+0]=In[255+o-h],n[r+i]=In[255+f-c]}e+=n}}function Q(t,e,a,n,r,i){X(t,e+0,a,1,16,n,r,i)}function tt(t,e,a,n,r,i){X(t,e+0,1,a,16,n,r,i)}function et(t,e,a,n,r,i){let s;for(s=3;s>0;--s)$(t,(e+=4*a)+0,a,1,16,n,r,i)}function at(t,e,a,n,r,i){let s;for(s=3;s>0;--s)$(t,(e+=4)+0,1,a,16,n,r,i)}function nt(t,e,a,n,r,i,s,o){X(t,e,r,1,8,i,s,o),X(a,n,r,1,8,i,s,o)}function rt(t,e,a,n,r,i,s,o){X(t,e,1,r,8,i,s,o),X(a,n,1,r,8,i,s,o)}function it(t,e,a,n,r,i,s,o){$(t,e+4*r,r,1,8,i,s,o),$(a,n+4*r,r,1,8,i,s,o)}function st(t,e,a,n,r,i,s,o){$(t,e+4,1,r,8,i,s,o),$(a,n+4,1,r,8,i,s,o)}function ot(t,e){return e==Za?0==t.i?0==t.d?Ka:Ga:0==t.d?ja:Za:e}function lt(t,e,a,r){for(n=0;n<4;++n)t[e+n]=a[r+n]}function ft(t,e){return t<0?0:t>e?e:t}function ht(t){t.a="VP8_STATUS_OK",t.xc="OK"}function ct(t){t>>>8!=Te>>>8&&alert("mismatch error")}function dt(t,e,a){return t.a==He&&(t.a=e,t.xc=a,t.za=0),0}function ut(t,r){let o=[0],l=0;var f=[0],h=s(ln),c=s(fn);let d=s(na);f="VP8StatusCode",h=s(aa);if(t==i)return alert("(dec == null)"),0;if(ht(t),r==i)return dt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(h.data=r.data,h.b=r.b,h.e=r.e,h.b=[h.b],h.e=[h.e],(f=Ae(h=[h]))!=He)return dt(t,f,"Incorrect/incomplete header.");if((h=h[0]).b=h.b[0],h.e=h.e[0],h.ia)return dt(t,Ke,"Unexpected lossless format encountered.");if(t.Ga==i&&(p(0==t.ub),t.Ga=h.$,t.G=h.G,t.ub=h.pa),l=h.data,o=h.b+h.offset,f=h.e-h.offset,p(h.e>=h.offset),f[0]<4)return dt(t,Xe,"Truncated header.");if(d=l[o+0]|l[o+1]<<8|l[o+2]<<16,(h=t.Ac).fb=!(1&d)+0,h.Jc=d>>1&7,h.Nc=d>>4&1,h.Ra=d>>5,h.Jc>3)return dt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!h.Nc)return dt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(o+=3,f-=3,c=t.P,h.fb){if(f<7)return dt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(f>=3&&157==l[o+0]&&1==l[o+1]&&42==l[o+2]))return dt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(c.l=16383&(l[o+4]<<8|l[o+3]),c.gd=l[o+4]>>6,c.v=16383&(l[o+6]<<8|l[o+5]),c.hd=l[o+6]>>6,o+=7,f-=7,t.Ma=c.l+15>>4,t.hb=c.v+15>>4,r.width=c.l,r.height=c.v,r.I=0,r.Ua=0,r.k=0,r.t=0,r.Ka=r.width,r.K=r.height,r.m=r.width,r.h=r.height,d=t.R,n=0;nf)return dt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");d=t.o,g(d,l,o,o+h.Ra),o+=h.Ra,f-=h.Ra,h.fb&&(c.uc=e(d),c.$c=e(d));c=d;var u=t.Ca;let _=t.R;if(p(c!=i),p(u!=i),u.pb=e(c),u.pb){if(u.ob=e(c),e(c)){var b;for(u.tb=e(c),b=0;b0)if(t.Ca.pb)for(_=0;_f&&(y=c),g(t.ic[+k],_,b,A),_=y,b=A,u+=3}g(t.ic[+w],_,b,f),f=b0){t.yb[y]=t.yb[0];continue}A=f}const e=t.yb[y];e.sc[0]=or[ft(A+c,127)],e.sc[1]=lr[ft(A+0,127)],e.sb[0]=2*or[ft(A+u,127)],e.sb[1]=101581*lr[ft(A+_,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=or[ft(A+b,117)],e.qc[1]=lr[ft(A+w,127)]}if(!h.fb)return dt(t,Ye,"Not a key frame.");for(t.Zc=259,e(d),f=t.R,c=0;c<$a;++c)for(u=0;u0)+0],16==i||!a(t,o[0]))return i}else o=e[ur[i]][0];if(16==i)return 16}}function bt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*gr&4278190080)>>e}function wt(t,e){let r,s=0;if(t==i)return 0;if(e==i)return dt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ut(t,e))return 0;if(p(t.za),e.Mb&&!e.Mb(e))dt(t,Je,"Frame setup failed"),r=t.a;else{e.Za&&(t.A=0);const a=nr[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-a>>4,t.mb=e.k-a>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+a>>4,t.wb=e.Ka+15+a>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),r=He}if(s=r==He){if(s){let a,n;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){a=dt(t,je,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?rr:rr-1}else t.jb=ir;a=1}if(!(n=!a)){let e;t:{const a=t.jb,n=t.Ma,r=4*n,s=32*n,o=n+1,l=t.A>0?n*(t.qb?2:1):0,c=nn,d=s*(16*a+parseInt(3*nr[t.A]/2,10)),u=t.Ga!=i?t.P.l*t.P.v:0,b=r+s+o+l+c+384+d+u+ar;if(b!=b)e=0;else{if(b>t.Gb){if(t.ib=0,t.Gb=0,t.ib==i){e=dt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=b}t.dc=205,t.Xc=h(205,16*n),t.Sc=h(205,8*n),t.Vc=h(205,8*n),t.M=l?f(un,l):i,t.Sd=l?0:i,t.oa.ha=0,t.oa.M=t.M,p(0==(c&ar)),t.Ea=h(205,1*c),t.z=-12851,t.H=16*n,t.r=8*n;const s=nr[t.A],w=s*t.H,g=s/2*t.r;t.ca=_(d,205),t.da=+w,t.aa=t.ca,t.ba=t.da+16*a*t.H+g,t.ra=t.aa,t.sa=t.ba+8*a*t.r+g,t.Xb=u?_(u,0):i,t.La=f(_n,o),t.dc=h(Za,r),e=1}}n=!e}if(n)s=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=i,e.q=i,!Nn){let t;for(t=-255;t<=255;++t)Sn[255+t]=t<0?-t:t,zn[255+t]=Sn[255+t]>>1;for(t=-1020;t<=1020;++t)On[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)Dn[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)In[255+t]=t<0?0:t>255?255:t;Nn=1}Zn=P,Mn=B,Wn=L,Vn=C,Hn=Q,jn=tt,Gn=nt,Kn=rt,Yn=et,qn=at,Jn=it,Xn=st,$n=K,Qn=Y,tr=q,er=J,s=1}}if(s)t:{for(t.d=0;t.d0&&f.d>=f.mb&&f.d<=f.Ya)+0,t.i=0;t.i0);m=-v,O[O[O.length-1]+g]=m,u[b]=m,b++}P[w]=m}}else{m=a(f,156)?a(f,128)?Ha:Va:a(f,163)?Wa:Ma;for(e.Eb[0]=m,v=0;v<4;++v)O[v+O[O.length-1]]=m;for(v=0;v<4;++v)P[v]=m}if(e.Tc=a(f,142)?a(f,114)?a(f,183)?Ha:Va:Wa:Ma,f.Ab)c=0;else{if(p.Nb)d.X=p.X=0,e.wa||(d.ua=p.ua=0),e.ja=0,e.Oa=0;else{let t=0,a=0;var k=0,y=wr;const n=e.yb[e.Lb];var A=e.z;const r=e.La[0],s=_(4,0),o=_(4,0);let f=_(4,0),c=_(4,0),d=0,u=0;var E=0;let b=0,w=0;A=h(0,384);if(e.wa)k=0,y=e.R.z[3];else{const t=_(16,0);var R=p.ua+r.ua;p.ua=r.ua=(_t(i,e.R.z[1],R,n.sb,0,t)>0)+0;k=1,y=e.R.z[0];var U=t,x=A,T=_(16,0),S=0;for(S=0;S<4;++S){var z=U[0+S]+U[12+S],D=U[4+S]+U[8+S],I=U[4+S]-U[8+S],N=U[0+S]-U[12+S];T[0+S]=z+D,T[8+S]=z-D,T[4+S]=N+I,T[12+S]=N-I}for(S=0;S<4;++S){const t=x[x.length-1],e=T[0+4*S]+3;z=e+T[3+4*S],D=T[1+4*S]+T[2+4*S],I=T[1+4*S]-T[2+4*S],N=e-T[3+4*S];x[t+0]=z+D>>3,x[t+16]=N+I>>3,x[t+32]=z-D>>3,x[t+48]=N-I>>3,x[x.length-1]+=64}A[A.length-1]=0}for(f=l(pr[15&p.X]),c=l(pr[15&r.X]),b=0;b<4;++b){var F=c[b];for(E=0;E<4;++E){var Z=_t(i,y,R=F+f[E],n.sc,k,A);f[E]=F=(Z>0)+0,o[E]=(0!=A[A[A.length-1]+0])+0,s[E]=(Z>1)+0,A[A.length-1]+=16}c[b]=F,u|=bt(o,24-4*b),d|=bt(s,24-4*b)}for(t=bt(f,24),a=bt(c,24),f=l(pr[p.X>>4]),c=l(pr[r.X>>4]),w=0;w<4;w+=2){for(b=0;b<2;++b){for(F=c[w+b],E=0;E<2;++E)R=F+f[w+E],Z=_t(i,e.R.z[2],R,n.qc,0,A),f[w+E]=F=(Z>0)+0,o[2*b+E]=(0!=A[A[A.length-1]+0])+0,s[2*b+E]=(Z>1)+0,A[A.length-1]+=16;c[w+b]=F}u|=bt(o,8-2*w),d|=bt(s,8-2*w)}t|=bt(f,20),a|=bt(c,20),p.X=t,r.X=a,e.z=A,e.Oa=d+0,e.ja=d|u,p.Nb=!e.ja+0}c=!i.Ab}if(!c){s=dt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const B=t,L=B.Ea,C=rn,K=B.Ea,Y=sn,q=B.Ea,J=on;if(B.i>0){var M=0;for(M=-1;M<16;++M)lt(L,C+M*an-4,L,C+M*an+12);for(M=-1;M<8;++M)lt(K,Y+M*an-4,K,Y+M*an+4),lt(q,J+M*an-4,q,J+M*an+4)}else{for(M=0;M<16;++M)L[C+M*an-1]=129;for(M=0;M<8;++M)K[Y+M*an-1]=129,q[J+M*an-1]=129;B.d>0&&(L[C-1-an]=K[Y-1-an]=q[J-1-an]=129)}const Q=B.Xc,tt=16*+B.i,et=B.Sc,at=8*+B.i,nt=B.Vc,rt=8*+B.i,it=B.z;let st=0;if(B.d>0)o(L,C-an,Q,tt,16),o(K,Y-an,et,at,8),o(q,J-an,nt,rt,8);else if(0==B.i){for(n=0;n<21;++n)L[C-an-1+n]=127;for(n=0;n<9;++n)K[Y-an-1+n]=127;for(n=0;n<9;++n)q[J-an-1+n]=127}if(B.wa){const t=C-an+16;B.d>0&&(B.i>=B.Ma-1?L[t+0]=L[t+1]=L[t+2]=L[t+3]=Q[tt+15]:o(L,t+0,Q,tt+16,4));for(let e=0;e<4;++e)L[e+t+4*an]=L[e+t+4*an]=L[e+t+8*an]=L[e+t+12*an]=L[e+t+0];for(st=0;st<16;st++){var W=L,V=C+sr[st];Ln[B.Eb[st]](W,V),B.Oa&1<0){const t=ut.M[1+ut.i],e=ut.La[1+ut.i].Nb;let a=ut.Zb[ut.Lb];ut.ga.oc&&(a+=ut.ga.Lc[0],ut.wa&&(a+=ut.ga.Gc[0])),a=a<0?0:a>63?63:a,t.zc=a,ut.ga.kb>0&&(a=ut.ga.kb>4?a>>2:a>>1,a>9-ut.ga.kb&&(a=9-ut.ga.kb)),t.yc=a<1?1:a,t.ab=(!e||ut.wa)+0}var G=0,X=8*ut.Ja*ut.r,$=ut.ca,ft=ut.da+16*ut.i+16*ut.Ja*ut.H,ht=ut.aa,ct=ut.ba+8*ut.i+X,wt=ut.ra,gt=ut.sa+8*ut.i+X;for(G=0;G<16;++G)o($,ft+G*ut.H,ut.Ea,+rn+G*an,16);for(G=0;G<8;++G)o(ht,ct+G*ut.r,ut.Ea,+sn+G*an,8),o(wt,gt+G*ut.r,ut.Ea,+on+G*an,8)}const B=t,L=e;var mt=1;const C=B.oa;if(B.qb){const t=B.rc;mt=mt&WebPWorkerSync(t);if(p(t.a==OK),mt){if(C.N=L,C.ha=B.Ja,C.d=B.d,C.W=B.W,C.W){const t=C.M;C.M=B.M,B.M=t}WebPWorkerLaunch(t),++B.Ja==B.jb&&(B.Ja=0)}}else{C.d=B.d,C.W=B.W;e:{let t=1;const e=B.oa,a=nr[B.A],n=a*B.H,r=parseInt(a/2)*B.r,s=16*e.ha*B.H,l=8*e.ha*B.r,f=B.ca,h=B.da-n+s,c=B.aa,d=B.ba-r+l,u=B.ra,_=B.sa-r+l,b=0==e.d,w=(e.d>=B.hb-1)+0;var vt=16*e.d;let g=16*(e.d+1);if(e.W){const t=B;let e=0;const a=t.oa.d;for(p(t.oa.W),e=t.lb;e0&&Qn(f,h,o,u+4),l.ab&&er(f,h,o,u),i>0&&$n(f,h,o,u+4),l.ab&&tr(f,h,o,u);else{const t=n.r,e=n.aa,a=n.ba+8*s.ha*t+8*r,_=n.ra,b=n.sa+8*s.ha*t+8*r,w=n.Ac.fb?c>=40?2:c>=15?1:0:c>=40?3:c>=20?2:c>=15?1:0;r>0&&(jn(f,h,o,u+4,d,w),Kn(e,a,_,b,t,u+4,d,w)),l.ab&&(qn(f,h,o,u,d,w),Xn(e,a,_,b,t,u,d,w)),i>0&&(Hn(f,h,o,u+4,d,w),Gn(e,a,_,b,t,u+4,d,w)),l.ab&&(Yn(f,h,o,u,d,w),Jn(e,a,_,b,t,u,d,w))}}}if(L.put){if(b?(L.y=B.ca,L.D=B.da+s,L.c=B.aa,L.B=B.ba+l,L.S=B.ra,L.C=B.sa+l):(vt-=a,L.y=f,L.D=h,L.c=c,L.B=d,L.S=u,L.C=_),w||(g-=a),g>L.K&&(g=L.K),B.Ga!=i&&vt>1),L.C+=B.r*(t>>1),L.p!=i&&(L.q+=L.width*t)}vt>1,L.C+=L.t>>1,L.p!=i&&(L.q+=L.t),L.w=vt-L.k,L.m=L.Ka-L.t,L.h=g-vt,t=L.put(L))}e.ha+1==B.jb&&!w&&(o(B.ca,B.da-n,f,h+16*B.H,n),o(B.aa,B.ba-r,c,d+8*B.r,r),o(B.ra,B.sa-r,u,_+8*B.r,r)),mt=t}}if(!mt){s=dt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let r;if(!(r=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(p(t),p(t.fc>0),e=!1),r=e}s=r?0:1}const r=s;e.Pb&&e.Pb(e),s=1&r}return s?(t.za=0,s):(pt(t),0)}function pt(t){t!=i&&(t.ib&&(t.ib=0),t.ib=i,t.Gb=0,t.za=0)}function gt(t,e){return t+(1<>e}function mt(t,e,a,n,r){const i=Wr[a]+Vr[e]>>mr;e=Mr[e],n[r+0]=Hr[t+Zr[a]-vr],n[r+1]=Hr[t+i-vr],n[r+2]=Hr[t+e-vr]}function vt(t,e,a,n,r){const i=Wr[a]+Vr[e]>>mr;e=Mr[e],n[r+0]=248&Hr[t+Zr[a]-vr]|Hr[t+i-vr]>>5,n[r+1]=Hr[t+i-vr]<<3&224|Hr[t+e-vr]>>3}function kt(t,e,a,n,r){n[r+0]=255,mt(t,e,a,n,r+1)}function yt(t,e,a,n,r){const i=Mr[e];n[r+0]=jr[t+Zr[a]-vr]<<4|jr[t+(Wr[a]+Vr[e]>>mr)-vr],n[r+1]=15|jr[t+i-vr]<<4}function At(t,e,a,n,r){const i=Zr[a];a=Wr[a]+Vr[e]>>mr,n[r+0]=Hr[t+Mr[e]-vr],n[r+1]=Hr[t+a-vr],n[r+2]=Hr[t+i-vr]}function Et(t,e,a,n,r){At(t,e,a,n,r),n[r+3]=255}function Rt(t,e,a,n,r){mt(t,e,a,n,r),n[r+3]=255}function Ut(t,e,a){t[e]=((((4278255360&t[e])>>>0)+((4278255360&a)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&a)&16711935)>>>0}function xt(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Tt(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function St(t,e){return Tt(t+parseInt((t-e)/2,10))}function zt(){return _a}function Ot(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Dt(t,e,a,n,r,i,s){var o=0;const l=8>>t.n,f=t.U,h=t.u;if(l<8){t=(1<>8&255),i[s++]=h[e&c],e>>=l}}else for(o=e;o>8&255]}function It(t,e,a,n,r){for(a=e+a;e>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255,n[r++]=a>>24&255}}function Nt(t,e,a,n,r){for(a=e+a;e>16&240|a>>12&15,n[r++]=a>>0&240|a>>28&15}}function Pt(t,e,a,n,r){for(a=e+a;e>24&255,n[r++]=a>>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255}}function Bt(t,e,a,n){return E(t,8)!=la?0:(e[0]=E(t,fa)+1,a[0]=E(t,fa)+1,n[0]=E(t,1),E(t,ha),1)}function Lt(t,e){let a=0;return t<4?t+1:(a=t-2>>1,(2+(1&t)<e.ya){var a=t.Y,n=0;for(p(a!=i);0!=a[n].s;){var r=a,s=e;const t=s.T>>s.g&1;s.L?s.fa=1:(++s.g,s.g>=8&&y(s),s.Q==s.ya&&32==s.g&&(s.L=1)),n=n+r[n].s+t}return a[n].kc}for(n=0,p((a=t.Y)!=i);0!=a[n].s;)r=a,s=e.T>>e.g&1,++e.g,n=n+r[n].s+s;return a[n].kc}function Ft(t,e){if(t!=i){var a=0,n=0;for(a=0;a>t.eb)+(e>>t.eb)])0;){e=t.nc[r];let x=l;var u=h,_=d;d=n,h=a;switch(p(x<(b=f)),p(b<=e.Vb),e.Qc){case ya:for(u=0,e=h+(b-x)*e.U;h>8&255,g=16711935&(g=(g=(16711935&b[_])>>>0)+(w<<16|w));d[h++]=((4278255360&b[_])>>>0|g)>>>0,32==x&&u++}break;case va:var m=x;u=b,_=d,w=h,g=(E=e).U;if(0==m){var v=0;for(Ut(_,w,_a),v=1;v>E.n)*y;m>8&15],v=1;v>8&15]),e=t(_[w+v-1],_,w+v-g),Ut(_,w+v,e)}w+=g,0==(++m&k)&&(E+=y)}b!=e.Vb&&o(d,h-(e=e.U),d,h+(b-x-1)*e,e);break;case ka:for(u=e.U,_=(1<>e.n)*w;x>0&255,E.Bc=A>>8&255,E.Kc=A>>16&255),E=(A=d[h+y])>>>8,R=A>>>16,U=A,R+=Ot(k.Cc,E),R&=255,U+=Ot(k.Bc,E),U+=Ot(k.Kc,R),U&=255,d[h+y]=(4278255360&A|R<<16|U)>>>0;h+=u,++x,0==(x&_)&&(e+=w)}break;case Aa:u==d&&e.n>0?(u=(b-x)*gt(e.U,e.n),c(d,_=h+(b-x)*e.U-u,d,h,u),Dt(e,x,b,d,_,d,h)):Dt(e,x,b,u,_,d,h)}h=n,d=a}}function Wt(t,e){var a=t.V,n=t.Ha+t.l*t.O;if(!((i=e-t.O)<=0)){Mt(t,i,a,n);var r=t.N;a=t.Xa;let d=[t.vb];n=t.O;var i=e,s=d,o=r.width;if(p(nr.K&&(i=r.K),n=i?n=0:(s[0]+=r.t,r.w=n-r.k,r.m=r.Ka-r.t,r.h=i-n,n=1),n){if(d=d[0],n=t.Ib,i=r.width,n.J0;){const t=a;let n=d,r=l;const h=s;let u=e;switch(o){case Se:for(r=n+r;n>16&255,h[u++]=c>>8&255,h[u++]=c>>0&255}break;case ze:It(t,n,r,h,u);break;case Be:It(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case Oe:for(r=n+r;n>0&255,h[u++]=c>>8&255,h[u++]=c>>16&255;break;case De:Pt(t,n,r,h,u);break;case Le:Pt(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case Ie:Pt(t,n,r,h,u);break;case Ce:Pt(t,n,r,h,u),WebPApplyAlphaMultiply(h,1,r,1,0);break;case Ne:Nt(t,n,r,h,u);break;case Fe:Nt(t,n,r,h,u),WebPApplyAlphaMultiply4444(h,r,1,0);break;case Pe:for(r=n+r;n>16&248|c>>13&7,h[u++]=c>>5&224|c>>3&31;break;default:p(0)}d+=i,e+=f}a=r}t.xa+=a}else t.xa=r.I?EmitRescaledRowsYUVA(t,a,d,i,r.h):EmitRowsYUVA(t,a,d,i,r.m,r.h);p(t.xa<=n.height)}t.O=e,p(t.O<=t.v)}}function Vt(t,e,a,n,r,s){let o=1,l=0,f=0;const h=t.o,c=t.cb;let d=c.Db,u=a,_=a;a+=n*r;const b=(r=pa+ga)+c.xb,w=c.xb>0?c.Yb:i,g=c.Dc;let m=!1;for(p(d!=i);!h.L&&u>>0)+(m<<16)+(o<<8)+v}if(m=!1,++u,++l,l>=n&&(l=0,++f,s!=i&&f%Er==0&&s(t,f),w!=i))for(;_>>w.bb]=o}else if(yLr?v-=Lr:(y=Cr[v-1],y=(y>>4)*n+(8-(15&y)),v=y>=1?y:1),y=0,y=0;y=n;)l-=n,++f,s!=i&&f%Er==0&&s(t,f);if(u>>w.bb]=o}else if(y>>w.bb]=y;y=e,v=u,p(m<=-1>>>(k=w).bb),y[v]=k.ea[m],m=!0;continue}(o=!h.fa)||End}return s!=i&&s(t,f),h.fa||!o||h.L&&u16?0:u>4?1:u>2?2:3,d[0]=gt(o.U,w),o.n=w,d=w=Kt(u,1,0,z,o.u))if(d=u,w=0,u=1<<(8>>>(z=o).n)>>>0,(g=Array(u))==i)d=0;else{m=z.u[0];var v=z.b;for(g[0]=z.u[0][z.b+0],w=1;w>>0)+((4278255360&g[w-1])>>>0)&4278255360)>>>0|(16711935&m[v+w])+(16711935&g[w-1])&16711935)>>>0;for(;w=1&&c<=da)){n.a=Ke;break}if(o)t:{o=n;var k=t[0],y=e[0],z=(d=c,v=m=0,v=o.o,o.cb);w=[i],u=i,g=1;if(a&&E(v,1)){y=(k=gt(k,m=E(v,3)+2))*(O=gt(y,m));if(!Kt(k,O,0,o,w)){o.a=Ke,Ft(u,g),o=0;break t}for(w=w[0],z.eb=m,m=0;m>>8&65535,w[m]=k,k>=g&&(g=k+1)}if(v.fa)Ft(u,g),o=0;else if(p(g<=65536),(u=b(g,An))==i)o.a=je,Ft(u,g),o=0;else{for(m=0;m0&&(k+=1<=t){(B=B&&R(e))||x(e),D=B;break a}if(!T(e,I[L],N[L],P[L])){(B=B&&R(e))||x(e),D=B;break a}}(B=(B=1)&&R(e))||x(e),D=B}else D=0}}else{if(D=0,N=[],(I=E(O,4)+4)>Pr){k.a=Ke,k=0;break e}if((P=Array(t))==i){k.a=je,k=0;break e}for(D=0;DN){D.a=Ke,x(r),D=B;break a}}else a=N;for(e=0;eN){D.a=Ke,x(r),D=B;break a}for(C=C?n:0;F-- >0;)I[e++]=C}}B=1,x(r),D=B}else D.a=Ke,D=0}D&&(D=S(e,P,t))}(D=D&&!O.fa)?k=1:(k.a=Ke,k=0)}if(!k){Ft(u,g),o=0;break t}}z.ac=w,z.hc=g,z.Db=u,o=1}}if(!o){n.a=Ke;break}if(c>0){if(f.xb=1<0),d.ea=_(z,0),d.ea==i?c=0:(d.bb=32-c,c=1),!c){n.a=je,o=0;break}}else f.xb=0;if(c=n,d=t[0],z=e[0],u=(w=c.cb).eb,c.l=d,c.v=z,w.Ec=gt(d,u),w.Dc=0==u?-1:(1<>>8&255;t.O=t.xa=e}}function ft(t,e){return t<0?0:t>e?e:t}function Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g){let m;const v=w-1>>1;let k=r[i+0]|s[o+0]<<16,y=l[f+0]|h[c+0]<<16;if(t){var A=3*k+y+131074>>2;p(t[e+0],255&A,A>>16,d,u)}for(a&&(A=3*y+k+131074>>2,p(a[n+0],255&A,A>>16,_,b)),m=1;m<=v;++m){const w=r[i+m]|s[o+m]<<16,v=l[f+m]|h[c+m]<<16;const E=(A=k+w+y+v+524296)+2*(w+y)>>3,R=A+2*(k+v)>>3;t&&(A=E+k>>1,k=R+w>>1,p(t[e+2*m-1],255&A,A>>16,d,u+(2*m-1)*g),p(t[e+2*m-0],255&k,k>>16,d,u+(2*m-0)*g)),a&&(A=R+y>>1,k=E+v>>1,p(a[n+2*m-1],255&A,A>>16,_,b+(2*m-1)*g),p(a[n+2*m+0],255&k,k>>16,_,b+(2*m+0)*g)),k=w,y=v}1&w||(t&&(A=3*k+y+131074>>2,p(t[e+w-1],255&A,A>>16,d,u+(w-1)*g)),a&&(A=3*y+k+131074>>2,p(a[n+w-1],255&A,A>>16,_,b+(w-1)*g)))}function Xt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,mt,3)}function $t(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,At,3)}function Qt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Rt,4)}function te(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Et,4)}function ee(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,kt,4)}function ae(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,yt,2)}function ne(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,vt,2)}function re(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_){let b;for(b=0;b0;){var s=t,o=e+(a?1:0),l=t,f=e+(a?0:3),h=0;for(h=0;h>1)*a.nb,l=a.S,f=a.C+(t.w>>1)*a.rb,h=t.m,c=t.h,d=parseInt((h+1)/2,10),u=parseInt((c+1)/2,10);let _;for(_=0;_>4;h[c+2*u]=240&h[c+2*u]|t,d&=t}r+=e.width,c+=l.f}15!=d&&t(o)&&WebPApplyAlphaMultiply4444(h,s,i,f,l.f)}return 0}function pe(e){let a=e.ka;const n=a.j.J,r=n>1,n=e.m+2*t;let r;const s=[];for(r=0;r>mr,Vr[e]=-22014*(e-128)+Fr,Wr[e]=-45773*(e-128),Mr[e]=113618*(e-128)+Fr>>mr;for(e=vr;e>mr,Hr[e-vr]=ft(a,255),jr[e-vr]=ft(a+8>>4,15);Gr=1}return 1}function ge(t){const e=t.ka;let a=t.m;const n=t.h;return p(!(1&t.w)),a<=0||n<=0?0:(a=e.$a(t,e),e.ec+=a,e.zb&&e.zb(t,e),1)}function me(t){(t=t.ka).memory="",t.memory=i}function ve(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function ke(t,e){return(ve(t,e)|t[e+3]<<24)>>>0}function ye(t,e,a,n,r,o,l){var f=0,h=[0],c="VP8StatusCode";const d=s(aa);if(t==i||a[0]=za&&!u(t,e[0],"RIFF",Ta)){if(u(t,e[0]+8,"WEBP",Ta)){c=Ke;break t}if((g=ke(t,e[0]+Ta))0,g=[0];t:if(c=Sa+Oa,p(t!=i),p(a!=i),p(h!=i),h[0]=0,a[0]=Ia){c=Ke;break t}g!=i&&(g[0]=w),n!=i&&(n[0]=_),r!=i&&(r[0]=b),e[0]+=c,a[0]-=c,h[0]=1}c=He}if(c!=He)return c;if(!f&&h[0])return Ke;if(o!=i&&(o[0]=!!(g[0]&Da)),h&&l==i)return He;if(a0&&n>h){c=Ke;break t}if(w=_&&b>h-_){c=Ke;break t}f[0]=b,e[0]+=Sa,a[0]-=Sa,g[0]=c}else g[0]=a>=1&&t[e+0]==la,f[0]=a[0];c=He}if(d.ta=d.ta[0],d.ia=d.ia[0],c!=He)return c;if(d.ta>Na)return Ke;if(d.ia){if(a[0]=3&&157==t[h+3+0]&&1==t[h+3+1]&&42==t[h+3+2]?(f=t[h+0]|t[h+1]<<8|t[h+2]<<16,g=16383&(t[h+7]<<8|t[h+6]),t=16383&(t[h+9]<<8|t[h+8]),!(!(1&f)+0)||(f>>1&7)>3||!(f>>4&1)||f>>5>=d.ta?t=0:(n&&(n[0]=g),r&&(r[0]=t),t=1)):t=0}return t?(o!=i&&(o[0]|=d.$!=i),l!=i&&(l[0]=d,l[0].offset=e[0]-l[0].b,p(e[0]-l[0].b0,e.Ua&&(l=t.wc,f=t.vc,s=t.t,o=t.k,an||o+f>r))return 0;if(e.t=s,e.k=o,e.Ka=s+l,e.K=o+f,e.m=l,e.h=f,e.I=t!=i&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==i||!t.ed,e.I&&(e.Za=e.Ba<3*n/4&&e.Aa<3*r/4,e.Bb=0),1}var Te=512,Se=0,ze=1,Oe=2,De=3,Ie=4,Ne=5,Pe=6,Be=7,Le=8,Ce=9,Fe=10,Ze=11,Me=12,We=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var Ve={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:_(4,0),Jb:i,jc:0},He=0,je=1,Ge=2,Ke=3,Ye=4,qe=5,Je=6,Xe=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var $e={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:_(3,0)};this.WebPGetFeatures=this.Md=function(t,e,a){let n="VP8StatusCode";return Te>>>8!=Te>>>8||a==i?t=Ge:(n=Ue(t,[0],e=[e],a),t=n==Xe?Ke:n),t};const Qe={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:_(6,0)};this.WebPDecoderConfig=this.Kd={input:s($e),j:s(Ve),options:s(Qe)},this.WebPInitDecoderConfig=this.Nd=function(t){return Te>>>8!=Te>>>8||t==i?t=0:(p((t=t.input)!=i),t.tc=0,t=1),t};var ta={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},ea={j:s(Ve),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:s(Qe),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},aa={data:0,b:0,e:0,offset:0,$:i,G:0,pa:0,ta:0,na:0,ia:0},na={qa:0,Ia:i,Pd:0,Ab:0,la:0,Z:0,gc:0},ra={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},ia=25,sa=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],oa=10,la=47,fa=14,ha=3,ca=5,da=11,ua=5,_a=4278190080,ba=8,wa=15,pa=256,ga=24,ma=4,va=0,ka=1,ya=2,Aa=3,Ea=1,Ra=0,Ua=1,xa=1,Ta=4,Sa=8,za=12,Oa=10,Da=16,Ia=1*Math.pow(2,32),Na=-1-Sa-1>>>0,Pa={kc:0,s:0},Ba={Y:"HuffmanTreeNode*",gb:0,Pa:0},La=-1;const Ca={ea:0,bb:0};var Fa=506832829,Za=0,Ma=Za,Wa=2,Va=3,Ha=1,ja=4,Ga=5,Ka=6,Ya=3,qa=4,Ja=4,Xa=4,$a=4,Qa=8,tn=3,en=11,an=32,nn=17*an+9*an,rn=1*an+8,sn=rn+16*an+an,on=sn+16,ln={fb:0,Jc:0,Nc:0,Ra:0},fn={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const hn={pb:0,ob:0,tb:0,Kb:_(qa,0),Cb:_(qa,0)},cn={Ta:_(Ya,0),z:w([$a,Qa,tn,en],0)},dn={Oc:0,Fb:0,kb:0,oc:0,Lc:_(Ja,0),Gc:_(Ja,0)};var un={zc:0,yc:0,ab:0},_n={X:0,ua:0,Nb:0};const bn=_(2,0),wn={sc:s(bn),sb:s(bn),qc:s(bn)},pn={ha:0,d:0,W:0,M:un,N:ta};var gn={a:"VP8StatusCode",za:0,xc:0,o:s(na),Ac:s(ln),P:s(fn),ga:s(dn),Ca:s(hn),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:pn,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:b(8,na),Zc:0,yb:b(qa,wn),R:s(cn),pc:0,Pc:0,dc:0,cc:_(4,0),Xc:0,Sc:0,Vc:0,La:s(_n),M:s(un),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:_(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:_(qa,0),Ga:i,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},mn=0,vn=1,kn=2;const yn={Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0};var An={va:b(ua,Ba)};const En={xb:0,Yb:s(Ca),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var Rn={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:s(ra),l:0,v:0,O:0,xa:0,cb:s(En),Na:0,nc:b(ma,yn),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Un=4,xn=[i,function(t,e,a,n,r,s,l,f){let h=0,c=f;for(p(t!=i),p(l!=i),p(a>0),p(n>0),p(r>0),p(s>=a*r),h=0;h0),p(n>0),p(r>0),p(s>=a*r),o(l,f,t,e,r),z(t,e+r,l,c,l,f+r,r*(a-1)),h=1;h0),p(n>0),p(r>0),p(s>=a*r),o(l,f,t,e,r),z(t,e+r,l,h,l,f+r,r*(a-1)),c=1;c255?255:a)&255}}}],Tn=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=i&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=i)},r=this;var Sn=_(511,0),zn=_(511,0),On=_(2041,0),Dn=_(225,0),In=_(766,0),Nn=0,Pn=85627,Bn=35468,Ln=[function(t,e){let a,n=4;for(a=0;a<4;++a)n+=t[e+a-an]+t[e-1+a*an];for(n>>=3,a=0;a<4;++a)d(t,e+a*an,n,4)},function(t,e){F(t,e,4)},function(t,e){let a=e-an;const n=[];for(n.push(M(t[a-1],t[a+0],t[a+1])),n.push(M(t[a+0],t[a+1],t[a+2])),n.push(M(t[a+1],t[a+2],t[a+3])),n.push(M(t[a+2],t[a+3],t[a+4])),a=0;a<4;++a)o(t,e+a*an,n,0,4)},function(t,e){const a=t[e-1],n=t[e-1+an],r=t[e-1+2*an],i=t[e-1+3*an];t[e+0+0*an]=t[e+1+0*an]=t[e+2+0*an]=t[e+3+0*an]=M(t[e-1-an],a,n),t[e+0+1*an]=t[e+1+1*an]=t[e+2+1*an]=t[e+3+1*an]=M(a,n,r),t[e+0+2*an]=t[e+1+2*an]=t[e+2+2*an]=t[e+3+2*an]=M(n,r,i),t[e+0+3*an]=t[e+1+3*an]=t[e+2+3*an]=t[e+3+3*an]=M(r,i,i)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1-an],s=t[e+0-an],o=t[e+1-an],l=t[e+2-an],f=t[e+3-an];t[e+0+3*an]=M(n,r,t[e-1+3*an]),t[e+0+2*an]=t[e+1+3*an]=M(a,n,r),t[e+0+1*an]=t[e+1+2*an]=t[e+2+3*an]=M(i,a,n),t[e+0+0*an]=t[e+1+1*an]=t[e+2+2*an]=t[e+3+3*an]=M(s,i,a),t[e+1+0*an]=t[e+2+1*an]=t[e+3+2*an]=M(o,s,i),t[e+2+0*an]=t[e+3+1*an]=M(l,o,s),t[e+3+0*an]=M(f,l,o)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1-an],s=t[e+0-an],o=t[e+1-an],l=t[e+2-an],f=t[e+3-an];t[e+0+0*an]=t[e+1+2*an]=i+s+1>>1,t[e+1+0*an]=t[e+2+2*an]=s+o+1>>1,t[e+2+0*an]=t[e+3+2*an]=o+l+1>>1,t[e+3+0*an]=l+f+1>>1,t[e+0+3*an]=M(r,n,a),t[e+0+2*an]=M(n,a,i),t[e+0+1*an]=t[e+1+3*an]=M(a,i,s),t[e+1+1*an]=t[e+2+3*an]=M(i,s,o),t[e+2+1*an]=t[e+3+3*an]=M(s,o,l),t[e+3+1*an]=M(o,l,f)},function(t,e){const a=t[e+1-an],n=t[e+2-an],r=t[e+3-an],i=t[e+4-an],s=t[e+5-an],o=t[e+6-an],l=t[e+7-an];t[e+0+0*an]=M(t[e+0-an],a,n),t[e+1+0*an]=t[e+0+1*an]=M(a,n,r),t[e+2+0*an]=t[e+1+1*an]=t[e+0+2*an]=M(n,r,i),t[e+3+0*an]=t[e+2+1*an]=t[e+1+2*an]=t[e+0+3*an]=M(r,i,s),t[e+3+1*an]=t[e+2+2*an]=t[e+1+3*an]=M(i,s,o),t[e+3+2*an]=t[e+2+3*an]=M(s,o,l),t[e+3+3*an]=M(o,l,l)},function(t,e){const a=t[e+0-an],n=t[e+1-an],r=t[e+2-an],i=t[e+3-an],s=t[e+4-an],o=t[e+5-an],l=t[e+6-an],f=t[e+7-an];t[e+0+0*an]=a+n+1>>1,t[e+1+0*an]=t[e+0+2*an]=n+r+1>>1,t[e+2+0*an]=t[e+1+2*an]=r+i+1>>1,t[e+3+0*an]=t[e+2+2*an]=i+s+1>>1,t[e+0+1*an]=M(a,n,r),t[e+1+1*an]=t[e+0+3*an]=M(n,r,i),t[e+2+1*an]=t[e+1+3*an]=M(r,i,s),t[e+3+1*an]=t[e+2+3*an]=M(i,s,o),t[e+3+2*an]=M(s,o,l),t[e+3+3*an]=M(o,l,f)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1+3*an],s=t[e-1-an],o=t[e+0-an],l=t[e+1-an],f=t[e+2-an];t[e+0+0*an]=t[e+2+1*an]=a+s+1>>1,t[e+0+1*an]=t[e+2+2*an]=n+a+1>>1,t[e+0+2*an]=t[e+2+3*an]=r+n+1>>1,t[e+0+3*an]=i+r+1>>1,t[e+3+0*an]=M(o,l,f),t[e+2+0*an]=M(s,o,l),t[e+1+0*an]=t[e+3+1*an]=M(a,s,o),t[e+1+1*an]=t[e+3+2*an]=M(n,a,s),t[e+1+2*an]=t[e+3+3*an]=M(r,n,a),t[e+1+3*an]=M(i,r,n)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1+3*an];t[e+0+0*an]=a+n+1>>1,t[e+2+0*an]=t[e+0+1*an]=n+r+1>>1,t[e+2+1*an]=t[e+0+2*an]=r+i+1>>1,t[e+1+0*an]=M(a,n,r),t[e+3+0*an]=t[e+1+1*an]=M(n,r,i),t[e+3+1*an]=t[e+1+2*an]=M(r,i,i),t[e+3+2*an]=t[e+2+2*an]=t[e+0+3*an]=t[e+1+3*an]=t[e+2+3*an]=t[e+3+3*an]=i}],Cn=[function(t,e){let a,n=16;for(a=0;a<16;++a)n+=t[e-1+a*an]+t[e+a-an];Z(n>>5,t,e)},function(t,e){F(t,e,16)},function(t,e){let a;for(a=0;a<16;++a)o(t,e+a*an,t,e-an,16)},function(t,e){let a;for(a=16;a>0;--a)d(t,e+0,t[e-1],16),e+=an},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e-1+a*an];Z(n>>4,t,e)},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e+a-an];Z(n>>4,t,e)},function(t,e){Z(128,t,e)}],Fn=[function(t,e){let a,n=8;for(a=0;a<8;++a)n+=t[e+a-an]+t[e-1+a*an];W(1*(n>>4),t,e)},function(t,e){F(t,e,8)},function(t,e){let a;for(a=0;a<8;++a)o(t,e+a*an,t,e-an,8)},function(t,e){let a;for(a=0;a<8;++a)d(t,e+0,t[e-1],8),e+=an},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e-1+a*an];W(1*(n>>3),t,e)},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e+a-an];W(1*(n>>3),t,e)},function(t,e){W(128,t,e)}];let Zn,Mn,Wn,Vn,Hn,jn,Gn,Kn,Yn,qn,Jn,Xn,$n,Qn,tr,er;var ar=31,nr=[0,2,8],rr=3,ir=1,sr=[0+0*an,4+0*an,8+0*an,12+0*an,0+4*an,4+4*an,8+4*an,12+4*an,0+8*an,4+8*an,8+8*an,12+8*an,0+12*an,4+12*an,8+12*an,12+12*an],or=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],lr=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],fr=[-Za,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],hr=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],cr=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],dr=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var ur=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],_r=[[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]],br=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],wr=w([tn,en],"");_(4,0);var pr=[[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]],gr=134480385,mr=16,vr=-227,kr=482,yr=[zt,function(t){return t},function(t,e,a){return e[a+0]},function(t,e,a){return e[a+1]},function(t,e,a){return e[a-1]},function(t,e,a){return xt(xt(t,e[a+1]),e[a+0])},function(t,e,a){return xt(t,e[a-1])},function(t,e,a){return xt(t,e[a+0])},function(t,e,a){return xt(e[a-1],e[a+0])},function(t,e,a){return xt(e[a+0],e[a+1])},function(t,e,a){return xt(xt(t,e[a-1]),xt(e[a+0],e[a+1]))},function(t,e,a){return Math.abs((t>>24&255)-(e[a-1]>>24&255))-Math.abs((e[a+0]>>24&255)-(e[a-1]>>24&255))+(Math.abs((t>>16&255)-(e[a-1]>>16&255))-Math.abs((e[a+0]>>16&255)-(e[a-1]>>16&255)))+(Math.abs((t>>8&255)-(e[a-1]>>8&255))-Math.abs((e[a+0]>>8&255)-(e[a-1]>>8&255)))+(Math.abs((255&t)-(255&e[a-1]))-Math.abs((255&e[a+0])-(255&e[a-1])))<=0?e[a+0]:t},function(t,e,a){return(Tt((t>>24&255)+(e[a+0]>>24&255)-(e[a-1]>>24&255))<<24|Tt((t>>16&255)+(e[a+0]>>16&255)-(e[a-1]>>16&255))<<16|Tt((t>>8&255)+(e[a+0]>>8&255)-(e[a-1]>>8&255))<<8|Tt((255&t)+(255&e[a+0])-(255&e[a-1])))>>>0},function(t,e,a){const n=e[a-1];return(St((t=xt(t,e[a+0]))>>24&255,n>>24&255)<<24|St(t>>16&255,n>>16&255)<<16|St(t>>8&255,n>>8&255)<<8|St(t>>0&255,n>>0&255))>>>0},zt,zt],Ar={Cc:0,Bc:0,Kc:0},Er=16,Rr=16,Ur=16,xr=[2,3,7],Tr=[3,3,11],Sr=0,zr=1,Or=2,Dr=3,Ir=4,Nr=[pa+ga,pa,pa,pa,40],Pr=19,Br=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Lr=120,Cr=[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],Fr=1<>>0:0,r=t.byteLength-n;let i=n;(ArrayBuffer.isView(t)||t instanceof k)&&(t.byteLength!==t.buffer.byteLength&&(i=t.byteOffset+n),t=t.buffer),this.lastWrittenByte=a?r:0,this.buffer=t,this.length=r,this.byteLength=r,this.byteOffset=i,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,i,r),this._mark=0,this._marks=[]}available(t=1){return this.offset+t<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(t=1){return this.offset+=t,this}seek(t){return this.offset=t,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){const t=this._marks.pop();if(void 0===t)throw new Error("Mark stack empty");return this.seek(t),this}rewind(){return this.offset=0,this}ensureAvailable(t=1){if(!this.available(t)){const e=2*(this.offset+t),a=new Uint8Array(e);a.set(new Uint8Array(this.buffer)),this.buffer=a.buffer,this.length=this.byteLength=e,this._data=new DataView(this.buffer)}return this}readBoolean(){return 0!==this.readUint8()}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(t=1){const e=new Uint8Array(t);for(let a=0;athis.lastWrittenByte&&(this.lastWrittenByte=this.offset)}} -/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */function y(t){let e=t.length;for(;--e>=0;)t[e]=0}const A=new Uint8Array([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]),E=new Uint8Array([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]),R=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),U=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),x=new Array(576);y(x);const T=new Array(60);y(T);const S=new Array(512);y(S);const z=new Array(256);y(z);const O=new Array(29);y(O);const D=new Array(30);function I(t,e,a,n,r){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=n,this.max_length=r,this.has_stree=t&&t.length}let N,P,B;function L(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}y(D);const C=t=>t<256?S[t]:S[256+(t>>>7)],F=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},Z=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{Z(t,a[2*e],a[2*e+1])},W=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},V=(t,e,a)=>{const n=new Array(16);let r,i,s=0;for(r=1;r<=15;r++)n[r]=s=s+a[r-1]<<1;for(i=0;i<=e;i++){let e=t[2*i+1];0!==e&&(t[2*i]=W(n[e]++,e))}},H=t=>{let e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0},G=t=>{t.bi_valid>8?F(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},K=(t,e,a,n)=>{const r=2*e,i=2*a;return t[r]{const n=t.heap[a];let r=a<<1;for(;r<=t.heap_len&&(r{let n,r,i,s,o=0;if(0!==t.last_lit)do{n=t.pending_buf[t.d_buf+2*o]<<8|t.pending_buf[t.d_buf+2*o+1],r=t.pending_buf[t.l_buf+o],o++,0===n?M(t,r,e):(i=z[r],M(t,i+256+1,e),s=A[i],0!==s&&(r-=O[i],Z(t,r,s)),n--,i=C(n),M(t,i,a),s=E[i],0!==s&&(n-=D[i],Z(t,n,s)))}while(o{const a=e.dyn_tree,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,i=e.stat_desc.elems;let s,o,l,f=-1;for(t.heap_len=0,t.heap_max=573,s=0;s>1;s>=1;s--)Y(t,a,s);l=i;do{s=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Y(t,a,1),o=t.heap[1],t.heap[--t.heap_max]=s,t.heap[--t.heap_max]=o,a[2*l]=a[2*s]+a[2*o],t.depth[l]=(t.depth[s]>=t.depth[o]?t.depth[s]:t.depth[o])+1,a[2*s+1]=a[2*o+1]=l,t.heap[1]=l++,Y(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,n=e.max_code,r=e.stat_desc.static_tree,i=e.stat_desc.has_stree,s=e.stat_desc.extra_bits,o=e.stat_desc.extra_base,l=e.stat_desc.max_length;let f,h,c,d,u,_,b=0;for(d=0;d<=15;d++)t.bl_count[d]=0;for(a[2*t.heap[t.heap_max]+1]=0,f=t.heap_max+1;f<573;f++)h=t.heap[f],d=a[2*a[2*h+1]+1]+1,d>l&&(d=l,b++),a[2*h+1]=d,h>n||(t.bl_count[d]++,u=0,h>=o&&(u=s[h-o]),_=a[2*h],t.opt_len+=_*(d+u),i&&(t.static_len+=_*(r[2*h+1]+u)));if(0!==b){do{for(d=l-1;0===t.bl_count[d];)d--;t.bl_count[d]--,t.bl_count[d+1]+=2,t.bl_count[l]--,b-=2}while(b>0);for(d=l;0!==d;d--)for(h=t.bl_count[d];0!==h;)c=t.heap[--f],c>n||(a[2*c+1]!==d&&(t.opt_len+=(d-a[2*c+1])*a[2*c],a[2*c+1]=d),h--)}})(t,e),V(a,f,t.bl_count)},X=(t,e,a)=>{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),e[2*(a+1)+1]=65535,n=0;n<=a;n++)r=s,s=e[2*(n+1)+1],++o{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),n=0;n<=a;n++)if(r=s,s=e[2*(n+1)+1],!(++o{Z(t,0+(n?1:0),3),((t,e,a,n)=>{G(t),n&&(F(t,a),F(t,~a)),t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a})(t,e,a,!0)};var et={_tr_init:t=>{Q||((()=>{let t,e,a,n,r;const i=new Array(16);for(a=0,n=0;n<28;n++)for(O[n]=a,t=0;t<1<>=7;n<30;n++)for(D[n]=r<<7,t=0;t<1<{let r,i,s=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),J(t,t.l_desc),J(t,t.d_desc),s=(t=>{let e;for(X(t,t.dyn_ltree,t.l_desc.max_code),X(t,t.dyn_dtree,t.d_desc.max_code),J(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*U[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,i=t.static_len+3+7>>>3,i<=r&&(r=i)):r=i=a+5,a+4<=r&&-1!==e?tt(t,e,a,n):4===t.strategy||i===r?(Z(t,2+(n?1:0),3),q(t,x,T)):(Z(t,4+(n?1:0),3),((t,e,a,n)=>{let r;for(Z(t,e-257,5),Z(t,a-1,5),Z(t,n-4,4),r=0;r(t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(z[a]+256+1)]++,t.dyn_dtree[2*C(e)]++),t.last_lit===t.lit_bufsize-1),_tr_align:t=>{Z(t,2,3),M(t,256,x),(t=>{16===t.bi_valid?(F(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var at=(t,e,a,n)=>{let r=65535&t|0,i=t>>>16&65535|0,s=0;for(;0!==a;){s=a>2e3?2e3:a,a-=s;do{r=r+e[n++]|0,i=i+r|0}while(--s);r%=65521,i%=65521}return r|i<<16|0};const nt=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var rt=(t,e,a,n)=>{const r=nt,i=n+a;t^=-1;for(let a=n;a>>8^r[255&(t^e[a])];return-1^t},it={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},st={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:ot,_tr_stored_block:lt,_tr_flush_block:ft,_tr_tally:ht,_tr_align:ct}=et,{Z_NO_FLUSH:dt,Z_PARTIAL_FLUSH:ut,Z_FULL_FLUSH:_t,Z_FINISH:bt,Z_BLOCK:wt,Z_OK:pt,Z_STREAM_END:gt,Z_STREAM_ERROR:mt,Z_DATA_ERROR:vt,Z_BUF_ERROR:kt,Z_DEFAULT_COMPRESSION:yt,Z_FILTERED:At,Z_HUFFMAN_ONLY:Et,Z_RLE:Rt,Z_FIXED:Ut,Z_DEFAULT_STRATEGY:xt,Z_UNKNOWN:Tt,Z_DEFLATED:St}=st,zt=(t,e)=>(t.msg=it[e],e),Ot=t=>(t<<1)-(t>4?9:0),Dt=t=>{let e=t.length;for(;--e>=0;)t[e]=0};let It=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},Pt=(t,e)=>{ft(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Nt(t.strm)},Bt=(t,e)=>{t.pending_buf[t.pending++]=e},Lt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Ct=(t,e,a,n)=>{let r=t.avail_in;return r>n&&(r=n),0===r?0:(t.avail_in-=r,e.set(t.input.subarray(t.next_in,t.next_in+r),a),1===t.state.wrap?t.adler=at(t.adler,e,r,a):2===t.state.wrap&&(t.adler=rt(t.adler,e,r,a)),t.next_in+=r,t.total_in+=r,r)},Ft=(t,e)=>{let a,n,r=t.max_chain_length,i=t.strstart,s=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-262?t.strstart-(t.w_size-262):0,f=t.window,h=t.w_mask,c=t.prev,d=t.strstart+258;let u=f[i+s-1],_=f[i+s];t.prev_length>=t.good_match&&(r>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,f[a+s]===_&&f[a+s-1]===u&&f[a]===f[i]&&f[++a]===f[i+1]){i+=2,a++;do{}while(f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&is){if(t.match_start=e,s=n,n>=o)break;u=f[i+s-1],_=f[i+s]}}}while((e=c[e&h])>l&&0!=--r);return s<=t.lookahead?s:t.lookahead},Zt=t=>{const e=t.w_size;let a,n,r,i,s;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-262)){t.window.set(t.window.subarray(e,e+e),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,n=t.hash_size,a=n;do{r=t.head[--a],t.head[a]=r>=e?r-e:0}while(--n);n=e,a=n;do{r=t.prev[--a],t.prev[a]=r>=e?r-e:0}while(--n);i+=e}if(0===t.strm.avail_in)break;if(n=Ct(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=It(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=It(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<262&&0!==t.strm.avail_in)},Mt=(t,e)=>{let a,n;for(;;){if(t.lookahead<262){if(Zt(t),t.lookahead<262&&e===dt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-262&&(t.match_length=Ft(t,a)),t.match_length>=3)if(n=ht(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=It(t,t.ins_h,t.window[t.strstart+1]);else n=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(n&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2},Wt=(t,e)=>{let a,n,r;for(;;){if(t.lookahead<262){if(Zt(t),t.lookahead<262&&e===dt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-3,n=ht(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,n&&(Pt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(n=ht(t,0,t.window[t.strstart-1]),n&&Pt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(n=ht(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2};function Vt(t,e,a,n,r){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=n,this.func=r}const Ht=[new Vt(0,0,0,0,(t,e)=>{let a=65535;for(a>t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(Zt(t),0===t.lookahead&&e===dt)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;const n=t.block_start+a;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,Pt(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-262&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(Pt(t,!1),t.strm.avail_out),1)}),new Vt(4,4,8,4,Mt),new Vt(4,5,16,8,Mt),new Vt(4,6,32,32,Mt),new Vt(4,4,16,16,Wt),new Vt(8,16,32,32,Wt),new Vt(8,16,128,128,Wt),new Vt(8,32,128,256,Wt),new Vt(32,128,258,1024,Wt),new Vt(32,258,258,4096,Wt)];function jt(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=St,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Dt(this.dyn_ltree),Dt(this.dyn_dtree),Dt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Dt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Dt(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Gt=t=>{if(!t||!t.state)return zt(t,mt);t.total_in=t.total_out=0,t.data_type=Tt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?42:113,t.adler=2===e.wrap?0:1,e.last_flush=dt,ot(e),pt},Kt=t=>{const e=Gt(t);return e===pt&&(t=>{t.window_size=2*t.w_size,Dt(t.head),t.max_lazy_match=Ht[t.level].max_lazy,t.good_match=Ht[t.level].good_length,t.nice_match=Ht[t.level].nice_length,t.max_chain_length=Ht[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=2,t.match_available=0,t.ins_h=0})(t.state),e},Yt=(t,e,a,n,r,i)=>{if(!t)return mt;let s=1;if(e===yt&&(e=6),n<0?(s=0,n=-n):n>15&&(s=2,n-=16),r<1||r>9||a!==St||n<8||n>15||e<0||e>9||i<0||i>Ut)return zt(t,mt);8===n&&(n=9);const o=new jt;return t.state=o,o.strm=t,o.wrap=s,o.gzhead=null,o.w_bits=n,o.w_size=1<Yt(t,e,St,15,8,xt),deflateInit2:Yt,deflateReset:Kt,deflateResetKeep:Gt,deflateSetHeader:(t,e)=>t&&t.state?2!==t.state.wrap?mt:(t.state.gzhead=e,pt):mt,deflate:(t,e)=>{let a,n;if(!t||!t.state||e>wt||e<0)return t?zt(t,mt):mt;const r=t.state;if(!t.output||!t.input&&0!==t.avail_in||666===r.status&&e!==bt)return zt(t,0===t.avail_out?kt:mt);r.strm=t;const i=r.last_flush;if(r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,Bt(r,31),Bt(r,139),Bt(r,8),r.gzhead?(Bt(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),Bt(r,255&r.gzhead.time),Bt(r,r.gzhead.time>>8&255),Bt(r,r.gzhead.time>>16&255),Bt(r,r.gzhead.time>>24&255),Bt(r,9===r.level?2:r.strategy>=Et||r.level<2?4:0),Bt(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(Bt(r,255&r.gzhead.extra.length),Bt(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=rt(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,9===r.level?2:r.strategy>=Et||r.level<2?4:0),Bt(r,3),r.status=113);else{let e=St+(r.w_bits-8<<4)<<8,a=-1;a=r.strategy>=Et||r.level<2?0:r.level<6?1:6===r.level?2:3,e|=a<<6,0!==r.strstart&&(e|=32),e+=31-e%31,r.status=113,Lt(r,e),0!==r.strstart&&(Lt(r,t.adler>>>16),Lt(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(a=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending!==r.pending_buf_size));)Bt(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.status=103)}else r.status=103;if(103===r.status&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&Nt(t),r.pending+2<=r.pending_buf_size&&(Bt(r,255&t.adler),Bt(r,t.adler>>8&255),t.adler=0,r.status=113)):r.status=113),0!==r.pending){if(Nt(t),0===t.avail_out)return r.last_flush=-1,pt}else if(0===t.avail_in&&Ot(e)<=Ot(i)&&e!==bt)return zt(t,kt);if(666===r.status&&0!==t.avail_in)return zt(t,kt);if(0!==t.avail_in||0!==r.lookahead||e!==dt&&666!==r.status){let a=r.strategy===Et?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Zt(t),0===t.lookahead)){if(e===dt)return 1;break}if(t.match_length=0,a=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2})(r,e):r.strategy===Rt?((t,e)=>{let a,n,r,i;const s=t.window;for(;;){if(t.lookahead<=258){if(Zt(t),t.lookahead<=258&&e===dt)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=t.strstart-1,n=s[r],n===s[++r]&&n===s[++r]&&n===s[++r])){i=t.strstart+258;do{}while(n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&rt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=ht(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2})(r,e):Ht[r.level].func(r,e);if(3!==a&&4!==a||(r.status=666),1===a||3===a)return 0===t.avail_out&&(r.last_flush=-1),pt;if(2===a&&(e===ut?ct(r):e!==wt&&(lt(r,0,0,!1),e===_t&&(Dt(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),Nt(t),0===t.avail_out))return r.last_flush=-1,pt}return e!==bt?pt:r.wrap<=0?gt:(2===r.wrap?(Bt(r,255&t.adler),Bt(r,t.adler>>8&255),Bt(r,t.adler>>16&255),Bt(r,t.adler>>24&255),Bt(r,255&t.total_in),Bt(r,t.total_in>>8&255),Bt(r,t.total_in>>16&255),Bt(r,t.total_in>>24&255)):(Lt(r,t.adler>>>16),Lt(r,65535&t.adler)),Nt(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?pt:gt)},deflateEnd:t=>{if(!t||!t.state)return mt;const e=t.state.status;return 42!==e&&69!==e&&73!==e&&91!==e&&103!==e&&113!==e&&666!==e?zt(t,mt):(t.state=null,113===e?zt(t,vt):pt)},deflateSetDictionary:(t,e)=>{let a=e.length;if(!t||!t.state)return mt;const n=t.state,r=n.wrap;if(2===r||1===r&&42!==n.status||n.lookahead)return mt;if(1===r&&(t.adler=at(t.adler,e,a,0)),n.wrap=0,a>=n.w_size){0===r&&(Dt(n.head),n.strstart=0,n.block_start=0,n.insert=0);let t=new Uint8Array(n.w_size);t.set(e.subarray(a-n.w_size,a),0),e=t,a=n.w_size}const i=t.avail_in,s=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Zt(n);n.lookahead>=3;){let t=n.strstart,e=n.lookahead-2;do{n.ins_h=It(n,n.ins_h,n.window[t+3-1]),n.prev[t&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=t,t++}while(--e);n.strstart=t,n.lookahead=2,Zt(n)}return n.strstart+=n.lookahead,n.block_start=n.strstart,n.insert=n.lookahead,n.lookahead=0,n.match_length=n.prev_length=2,n.match_available=0,t.next_in=s,t.input=o,t.avail_in=i,n.wrap=r,pt},deflateInfo:"pako deflate (from Nodeca project)"};const Jt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Xt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Jt(a,e)&&(t[e]=a[e])}}return t},$t=t=>{let e=0;for(let a=0,n=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;te[254]=te[254]=1;var ee=t=>{let e,a,n,r,i,s=t.length,o=0;for(r=0;r>>6,e[i++]=128|63&a):a<65536?(e[i++]=224|a>>>12,e[i++]=128|a>>>6&63,e[i++]=128|63&a):(e[i++]=240|a>>>18,e[i++]=128|a>>>12&63,e[i++]=128|a>>>6&63,e[i++]=128|63&a);return e},ae=(t,e)=>{let a,n;const r=e||t.length,i=new Array(2*r);for(n=0,a=0;a4)i[n++]=65533,a+=s-1;else{for(e&=2===s?31:3===s?15:7;s>1&&a1?i[n++]=65533:e<65536?i[n++]=e:(e-=65536,i[n++]=55296|e>>10&1023,i[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&Qt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let n=0;n{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+te[t[a]]>e?a:e};var re=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const ie=Object.prototype.toString,{Z_NO_FLUSH:se,Z_SYNC_FLUSH:oe,Z_FULL_FLUSH:le,Z_FINISH:fe,Z_OK:he,Z_STREAM_END:ce,Z_DEFAULT_COMPRESSION:de,Z_DEFAULT_STRATEGY:ue,Z_DEFLATED:_e}=st;function be(t){this.options=Xt({level:de,method:_e,chunkSize:16384,windowBits:15,memLevel:8,strategy:ue},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new re,this.strm.avail_out=0;let a=qt.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==he)throw new Error(it[a]);if(e.header&&qt.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?ee(e.dictionary):"[object ArrayBuffer]"===ie.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=qt.deflateSetDictionary(this.strm,t),a!==he)throw new Error(it[a]);this._dict_set=!0}}function we(t,e){const a=new be(e);if(a.push(t,!0),a.err)throw a.msg||it[a.err];return a.result}be.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize;let r,i;if(this.ended)return!1;for(i=e===~~e?e:!0===e?fe:se,"string"==typeof t?a.input=ee(t):"[object ArrayBuffer]"===ie.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),(i===oe||i===le)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(r=qt.deflate(a,i),r===ce)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),r=qt.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===he;if(0!==a.avail_out){if(i>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},be.prototype.onData=function(t){this.chunks.push(t)},be.prototype.onEnd=function(t){t===he&&(this.result=$t(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var pe={Deflate:be,deflate:we,deflateRaw:function(t,e){return(e=e||{}).raw=!0,we(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,we(t,e)},constants:st};var ge=function(t,e){let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E,R;const U=t.state;a=t.next_in,E=t.input,n=a+(t.avail_in-5),r=t.next_out,R=t.output,i=r-(e-t.avail_out),s=r+(t.avail_out-257),o=U.dmax,l=U.wsize,f=U.whave,h=U.wnext,c=U.window,d=U.hold,u=U.bits,_=U.lencode,b=U.distcode,w=(1<>>24,d>>>=m,u-=m,m=g>>>16&255,0===m)R[r++]=65535&g;else{if(!(16&m)){if(0==(64&m)){g=_[(65535&g)+(d&(1<>>=m,u-=m),u<15&&(d+=E[a++]<>>24,d>>>=m,u-=m,m=g>>>16&255,!(16&m)){if(0==(64&m)){g=b[(65535&g)+(d&(1<o){t.msg="invalid distance too far back",U.mode=30;break t}if(d>>>=m,u-=m,m=r-i,k>m){if(m=k-m,m>f&&U.sane){t.msg="invalid distance too far back",U.mode=30;break t}if(y=0,A=c,0===h){if(y+=l-m,m2;)R[r++]=A[y++],R[r++]=A[y++],R[r++]=A[y++],v-=3;v&&(R[r++]=A[y++],v>1&&(R[r++]=A[y++]))}else{y=r-k;do{R[r++]=R[y++],R[r++]=R[y++],R[r++]=R[y++],v-=3}while(v>2);v&&(R[r++]=R[y++],v>1&&(R[r++]=R[y++]))}break}}break}}while(a>3,a-=v,u-=v<<3,d&=(1<{const l=o.bits;let f,h,c,d,u,_,b=0,w=0,p=0,g=0,m=0,v=0,k=0,y=0,A=0,E=0,R=null,U=0;const x=new Uint16Array(16),T=new Uint16Array(16);let S,z,O,D=null,I=0;for(b=0;b<=15;b++)x[b]=0;for(w=0;w=1&&0===x[g];g--);if(m>g&&(m=g),0===g)return r[i++]=20971520,r[i++]=20971520,o.bits=1,0;for(p=1;p0&&(0===t||1!==g))return-1;for(T[1]=0,b=1;b<15;b++)T[b+1]=T[b]+x[b];for(w=0;w852||2===t&&A>592)return 1;for(;;){S=b-k,s[w]<_?(z=0,O=s[w]):s[w]>_?(z=D[I+s[w]],O=R[U+s[w]]):(z=96,O=0),f=1<>k)+h]=S<<24|z<<16|O|0}while(0!==h);for(f=1<>=1;if(0!==f?(E&=f-1,E+=f):E=0,w++,0==--x[b]){if(b===g)break;b=e[a+s[w]]}if(b>m&&(E&d)!==c){for(0===k&&(k=m),u+=p,v=b-k,y=1<852||2===t&&A>592)return 1;c=E&d,r[c]=m<<24|v<<16|u-i|0}}return 0!==E&&(r[u+E]=b-k<<24|64<<16|0),o.bits=m,0};const{Z_FINISH:Ee,Z_BLOCK:Re,Z_TREES:Ue,Z_OK:xe,Z_STREAM_END:Te,Z_NEED_DICT:Se,Z_STREAM_ERROR:ze,Z_DATA_ERROR:Oe,Z_MEM_ERROR:De,Z_BUF_ERROR:Ie,Z_DEFLATED:Ne}=st,Pe=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Be(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Le=t=>{if(!t||!t.state)return ze;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,xe},Ce=t=>{if(!t||!t.state)return ze;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Le(t)},Fe=(t,e)=>{let a;if(!t||!t.state)return ze;const n=t.state;return e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?ze:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=a,n.wbits=e,Ce(t))},Ze=(t,e)=>{if(!t)return ze;const a=new Be;t.state=a,a.window=null;const n=Fe(t,e);return n!==xe&&(t.state=null),n};let Me,We,Ve=!0;const He=t=>{if(Ve){Me=new Int32Array(512),We=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(Ae(1,t.lens,0,288,Me,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;Ae(2,t.lens,0,32,We,0,t.work,{bits:5}),Ve=!1}t.lencode=Me,t.lenbits=9,t.distcode=We,t.distbits=5},je=(t,e,a,n)=>{let r;const i=t.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(e.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(r=i.wsize-i.wnext,r>n&&(r=n),i.window.set(e.subarray(a-n,a-n+r),i.wnext),(n-=r)?(i.window.set(e.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=r,i.wnext===i.wsize&&(i.wnext=0),i.whaveZe(t,15),inflateInit2:Ze,inflate:(t,e)=>{let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E=0;const R=new Uint8Array(4);let U,x;const T=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return ze;a=t.state,12===a.mode&&(a.mode=13),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,c=o,d=l,A=xe;t:for(;;)switch(a.mode){case 1:if(0===a.wrap){a.mode=13;break}for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=rt(a.check,R,2,0),f=0,h=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&f)<<8)+(f>>8))%31){t.msg="incorrect header check",a.mode=30;break}if((15&f)!==Ne){t.msg="unknown compression method",a.mode=30;break}if(f>>>=4,h-=4,y=8+(15&f),0===a.wbits)a.wbits=y;else if(y>a.wbits){t.msg="invalid window size",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(R[0]=255&f,R[1]=f>>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0,a.mode=3;case 3:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>8&255,R[2]=f>>>16&255,R[3]=f>>>24&255,a.check=rt(a.check,R,4,0)),f=0,h=0,a.mode=4;case 4:for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>8),512&a.flags&&(R[0]=255&f,R[1]=f>>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0,a.mode=5;case 5:if(1024&a.flags){for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(u=a.length,u>o&&(u=o),u&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(n.subarray(i,i+u),y)),512&a.flags&&(a.check=rt(a.check,n,u,i)),o-=u,i+=u,a.length-=u),a.length))break t;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===o)break t;u=0;do{y=n[i+u++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&u>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=12;break;case 10:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>=7&h,h-=7&h,a.mode=27;break}for(;h<3;){if(0===o)break t;o--,f+=n[i++]<>>=1,h-=1,3&f){case 0:a.mode=14;break;case 1:if(He(a),a.mode=20,e===Ue){f>>>=2,h-=2;break t}break;case 2:a.mode=17;break;case 3:t.msg="invalid block type",a.mode=30}f>>>=2,h-=2;break;case 14:for(f>>>=7&h,h-=7&h;h<32;){if(0===o)break t;o--,f+=n[i++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=30;break}if(a.length=65535&f,f=0,h=0,a.mode=15,e===Ue)break t;case 15:a.mode=16;case 16:if(u=a.length,u){if(u>o&&(u=o),u>l&&(u=l),0===u)break t;r.set(n.subarray(i,i+u),s),o-=u,i+=u,l-=u,s+=u,a.length-=u;break}a.mode=12;break;case 17:for(;h<14;){if(0===o)break t;o--,f+=n[i++]<>>=5,h-=5,a.ndist=1+(31&f),f>>>=5,h-=5,a.ncode=4+(15&f),f>>>=4,h-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=30;break}a.have=0,a.mode=18;case 18:for(;a.have>>=3,h-=3}for(;a.have<19;)a.lens[T[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,U={bits:a.lenbits},A=Ae(0,a.lens,0,19,a.lencode,0,a.work,U),a.lenbits=U.bits,A){t.msg="invalid code lengths set",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=w,h-=w,a.lens[a.have++]=g;else{if(16===g){for(x=w+2;h>>=w,h-=w,0===a.have){t.msg="invalid bit length repeat",a.mode=30;break}y=a.lens[a.have-1],u=3+(3&f),f>>>=2,h-=2}else if(17===g){for(x=w+3;h>>=w,h-=w,y=0,u=3+(7&f),f>>>=3,h-=3}else{for(x=w+7;h>>=w,h-=w,y=0,u=11+(127&f),f>>>=7,h-=7}if(a.have+u>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=30;break}for(;u--;)a.lens[a.have++]=y}}if(30===a.mode)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=30;break}if(a.lenbits=9,U={bits:a.lenbits},A=Ae(1,a.lens,0,a.nlen,a.lencode,0,a.work,U),a.lenbits=U.bits,A){t.msg="invalid literal/lengths set",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,U={bits:a.distbits},A=Ae(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,U),a.distbits=U.bits,A){t.msg="invalid distances set",a.mode=30;break}if(a.mode=20,e===Ue)break t;case 20:a.mode=21;case 21:if(o>=6&&l>=258){t.next_out=s,t.avail_out=l,t.next_in=i,t.avail_in=o,a.hold=f,a.bits=h,ge(t,d),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;E=a.lencode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,a.length=g,0===p){a.mode=26;break}if(32&p){a.back=-1,a.mode=12;break}if(64&p){t.msg="invalid literal/length code",a.mode=30;break}a.extra=15&p,a.mode=22;case 22:if(a.extra){for(x=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;E=a.distcode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,64&p){t.msg="invalid distance code",a.mode=30;break}a.offset=g,a.extra=15&p,a.mode=24;case 24:if(a.extra){for(x=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=30;break}a.mode=25;case 25:if(0===l)break t;if(u=d-l,a.offset>u){if(u=a.offset-u,u>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=30;break}u>a.wnext?(u-=a.wnext,_=a.wsize-u):_=a.wnext-u,u>a.length&&(u=a.length),b=a.window}else b=r,_=s-a.offset,u=a.length;u>l&&(u=l),l-=u,a.length-=u;do{r[s++]=b[_++]}while(--u);0===a.length&&(a.mode=21);break;case 26:if(0===l)break t;r[s++]=a.length,l--,a.mode=21;break;case 27:if(a.wrap){for(;h<32;){if(0===o)break t;o--,f|=n[i++]<{if(!t||!t.state)return ze;let e=t.state;return e.window&&(e.window=null),t.state=null,xe},inflateGetHeader:(t,e)=>{if(!t||!t.state)return ze;const a=t.state;return 0==(2&a.wrap)?ze:(a.head=e,e.done=!1,xe)},inflateSetDictionary:(t,e)=>{const a=e.length;let n,r,i;return t&&t.state?(n=t.state,0!==n.wrap&&11!==n.mode?ze:11===n.mode&&(r=1,r=at(r,e,a,0),r!==n.check)?Oe:(i=je(t,e,a,a),i?(n.mode=31,De):(n.havedict=1,xe))):ze},inflateInfo:"pako inflate (from Nodeca project)"};var Ke=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Ye=Object.prototype.toString,{Z_NO_FLUSH:qe,Z_FINISH:Je,Z_OK:Xe,Z_STREAM_END:$e,Z_NEED_DICT:Qe,Z_STREAM_ERROR:ta,Z_DATA_ERROR:ea,Z_MEM_ERROR:aa}=st;function na(t){this.options=Xt({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new re,this.strm.avail_out=0;let a=Ge.inflateInit2(this.strm,e.windowBits);if(a!==Xe)throw new Error(it[a]);if(this.header=new Ke,Ge.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=ee(e.dictionary):"[object ArrayBuffer]"===Ye.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=Ge.inflateSetDictionary(this.strm,e.dictionary),a!==Xe)))throw new Error(it[a])}function ra(t,e){const a=new na(e);if(a.push(t),a.err)throw a.msg||it[a.err];return a.result}na.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize,r=this.options.dictionary;let i,s,o;if(this.ended)return!1;for(s=e===~~e?e:!0===e?Je:qe,"[object ArrayBuffer]"===Ye.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=Ge.inflate(a,s),i===Qe&&r&&(i=Ge.inflateSetDictionary(a,r),i===Xe?i=Ge.inflate(a,s):i===ea&&(i=Qe));a.avail_in>0&&i===$e&&a.state.wrap>0&&0!==t[a.next_in];)Ge.inflateReset(a),i=Ge.inflate(a,s);switch(i){case ta:case ea:case Qe:case aa:return this.onEnd(i),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||i===$e))if("string"===this.options.to){let t=ne(a.output,a.next_out),e=a.next_out-t,r=ae(a.output,t);a.next_out=e,a.avail_out=n-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(r)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==Xe||0!==o){if(i===$e)return i=Ge.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},na.prototype.onData=function(t){this.chunks.push(t)},na.prototype.onEnd=function(t){t===Xe&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=$t(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ia={Inflate:na,inflate:ra,inflateRaw:function(t,e){return(e=e||{}).raw=!0,ra(t,e)},ungzip:ra,constants:st};const{Deflate:sa,deflate:oa,deflateRaw:la,gzip:fa}=pe,{Inflate:ha,inflate:ca,inflateRaw:da,ungzip:ua}=ia;var _a=oa;const ba=[137,80,78,71,13,10,26,10],wa=[];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)1&e?e=3988292384^e>>>1:e>>>=1;wa[t]=e}function pa(t,e){return(4294967295^function(t,e,a){let n=t;for(let t=0;t>>8;return n}(4294967295,t,e))>>>0}var ga,ma,va,ka;!function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.GREYSCALE=0]="GREYSCALE",t[t.TRUECOLOUR=2]="TRUECOLOUR",t[t.INDEXED_COLOUR=3]="INDEXED_COLOUR",t[t.GREYSCALE_ALPHA=4]="GREYSCALE_ALPHA",t[t.TRUECOLOUR_ALPHA=6]="TRUECOLOUR_ALPHA"}(ga||(ga={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.DEFLATE=0]="DEFLATE"}(ma||(ma={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.ADAPTIVE=0]="ADAPTIVE"}(va||(va={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.NO_INTERLACE=0]="NO_INTERLACE",t[t.ADAM7=1]="ADAM7"}(ka||(ka={}));new Uint8Array(0);const ya=new Uint16Array([255]);new Uint8Array(ya.buffer)[0];const Aa={level:3};class Ea extends k{constructor(t,e={}){super(),this._colorType=ga.UNKNOWN,this._zlibOptions=Object.assign({},Aa,e.zlib),this._png=this._checkData(t),this.setBigEndian()}encode(){return this.encodeSignature(),this.encodeIHDR(),this.encodeData(),this.encodeIEND(),this.toArray()}encodeSignature(){this.writeBytes(ba)}encodeIHDR(){this.writeUint32(13),this.writeChars("IHDR"),this.writeUint32(this._png.width),this.writeUint32(this._png.height),this.writeByte(this._png.depth),this.writeByte(this._colorType),this.writeByte(ma.DEFLATE),this.writeByte(va.ADAPTIVE),this.writeByte(ka.NO_INTERLACE),this.writeCrc(17)}encodeIEND(){this.writeUint32(0),this.writeChars("IEND"),this.writeCrc(4)}encodeIDAT(t){this.writeUint32(t.length),this.writeChars("IDAT"),this.writeBytes(t),this.writeCrc(t.length+4)}encodeData(){const{width:t,height:e,channels:a,depth:n,data:r}=this._png,i=a*t,s=(new k).setBigEndian();let o=0;for(let t=0;t0)return t;throw new TypeError(e+" must be a positive integer")}function Ua(t,e,a,n){for(let r=0;r{var e;e=t.data,Oa.push(e),Ia()})}]); -//# sourceMappingURL=webp.worker.c0cc94110cda650246b2.bundle.worker.js.map \ No newline at end of file diff --git a/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js.map b/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js.map deleted file mode 100644 index 87cdddc97..000000000 --- a/public/webp.worker.c0cc94110cda650246b2.bundle.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/iobuffer/lib-esm/text-encoding-polyfill.js","webpack:///./src/vendor/libwebp-0.2.0.js","webpack:///./node_modules/iobuffer/lib-esm/utf8.browser.js","webpack:///./node_modules/iobuffer/lib-esm/IOBuffer.js","webpack:///./node_modules/fast-png/node_modules/pako/dist/pako.esm.mjs","webpack:///./node_modules/fast-png/lib-esm/common.js","webpack:///./node_modules/fast-png/lib-esm/internalTypes.js","webpack:///./node_modules/fast-png/lib-esm/PNGDecoder.js","webpack:///./node_modules/fast-png/lib-esm/PNGEncoder.js","webpack:///./node_modules/fast-png/lib-esm/types.js","webpack:///./src/lib/webp/webp.ts","webpack:///./node_modules/fast-png/lib-esm/index.js","webpack:///./src/lib/webp/webp.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","scope","FastTextEncoder","utfLabel","RangeError","FastTextDecoder","options","fatal","Error","encode","string","stream","pos","len","length","at","tlen","Math","max","target","Uint8Array","charCodeAt","extra","update","set","slice","decode","buffer","bytes","out","byte1","push","byte2","byte3","codepoint","String","fromCharCode","apply","window","self","this","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","U","ld","md","$","WebPDecoder","a","Ob","Pb","Bb","Qb","b","la","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","ja","jc","k","h","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","f","q","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","WebPInitDecoderConfig","pow","Dg","Eg","Fg","Gg","id","Hg","Ig","Jg","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","TextDecoder","TextEncoder","dataIsGiven","ArrayBuffer","lastWrittenByte","byteLength","dvOffset","isView","byteOffset","littleEndian","_data","DataView","_mark","_marks","pop","undefined","seek","available","newLength","newArray","readUint8","getInt8","getUint8","readByte","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","readInt8","result","readChar","readBytes","writeUint8","ensureAvailable","setInt8","_updateLastWrittenByte","setUint8","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","str","writeBytes","zero","buf","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES","_dist_code","_length_code","MAX_MATCH","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","pending_buf","pending","send_bits","bi_valid","bi_buf","send_code","tree","bi_reverse","code","res","gen_codes","bl_count","next_code","MAX_BITS","bits","init_block","LITERALS","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","last_lit","matches","bi_windup","smaller","depth","_n2","_m2","pqdownheap","heap","heap_len","compress_block","ltree","dtree","lx","d_buf","l_buf","build_tree","desc","stree","node","heap_max","base","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","count","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block","stored_len","last","header","subarray","copy_block","trees","_tr_init","LENGTH_CODES","L_CODES","tr_static_init","l_desc","d_desc","bl_desc","_tr_flush_block","opt_lenb","static_lenb","max_blindex","level","strm","data_type","black_mask","detect_data_type","BL_CODES","build_bl_tree","strategy","lcodes","dcodes","blcodes","rank","send_all_trees","_tr_tally","lit_bufsize","_tr_align","STATIC_TREES","bi_flush","adler32_1","adler","s1","s2","crcTable","Uint32Array","table","makeTable","crc32_1","crc","end","messages","2","1","0","constants","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","_tr_init$1","_tr_stored_block$1","_tr_flush_block$1","_tr_tally$1","_tr_align$1","Z_FIXED$1","Z_UNKNOWN$1","err","errorCode","msg","zero$1","HASH","prev","hash_shift","hash_mask","flush_pending","state","avail_out","output","pending_out","next_out","total_out","flush_block_only","block_start","strstart","put_byte","putShortMSB","read_buf","start","avail_in","next_in","wrap","total_in","longest_match","cur_match","match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","window_size","hash_size","head","insert","ins_h","deflate_fast","flush","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH$1","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","max_block_size","pending_buf_size","max_start","DeflateState","status","gzhead","gzindex","method","last_flush","w_bits","hash_bits","Uint16Array","HEAP_SIZE$1","MAX_BITS$1","deflateResetKeep","deflateReset","ret","lm_init","deflateInit2","windowBits","memLevel","deflate_1","deflateInit","deflateSetHeader","deflate","beg","val","old_flush","text","hcrc","comment","time","os","level_flags","bstate","deflate_huff","deflate_rle","deflateEnd","deflateSetDictionary","dictionary","dictLength","tmpDict","avail","next","deflateInfo","_has","obj","common","sources","arguments","source","shift","TypeError","chunks","chunk","STR_APPLY_UIA_OK","__","_utf8len","strings","c2","m_pos","str_len","buf_len","utf16buf","c_len","buf2binstring","zstream","toString","Z_NO_FLUSH$1","Z_FULL_FLUSH$1","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$1","Deflate","chunkSize","opt","raw","gzip","ended","dict","_dict_set","deflate$1","deflator","flush_mode","_flush_mode","onData","onEnd","deflate_1$1","deflateRaw","inffast","_in","_out","dmax","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","from","from_source","lencode","distcode","lenbits","distbits","top","dolen","dodist","sane","lbase","lext","dbase","dext","inftrees","type","lens","lens_index","codes","table_index","work","opts","incr","fill","low","mask","sym","min","root","curr","drop","left","used","huff","base_index","MAXBITS","offs","here_bits","here_op","here_val","extra_index","Z_FINISH$2","Z_BLOCK$1","Z_OK$2","Z_STREAM_END$2","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_BUF_ERROR$1","Z_DEFLATED$2","zswap32","InflateState","havedict","flags","check","total","wbits","ncode","nlen","ndist","have","lendyn","distdyn","back","was","inflateResetKeep","Int32Array","inflateReset","inflateReset2","inflateInit2","lenfix","distfix","virgin","fixedtables","updatewindow","src","copy","inflate_1","inflateInit","inflate","last_bits","last_op","last_val","hbuf","order","inf_leave","done","xflags","extra_len","inflateEnd","inflateGetHeader","inflateSetDictionary","dictid","inflateInfo","gzheader","toString$1","Z_NO_FLUSH$2","Z_FINISH$3","Z_OK$3","Z_STREAM_END$3","Z_NEED_DICT$1","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_MEM_ERROR$1","Inflate","to","inflate$1","inflator","last_avail_out","next_out_utf8","tail","utf8str","join","inflate_1$1","inflateRaw","ungzip","Deflate$1","deflate$2","deflateRaw$1","gzip$1","Inflate$1","inflate$2","inflateRaw$1","ungzip$1","deflate_1$2","pngSignature","currentCrc","updateCrc","ColorType","CompressionMethod","FilterMethod","InterlaceMethod","uint16","defaultZlibOptions","super","_colorType","UNKNOWN","_zlibOptions","assign","zlib","_png","_checkData","setBigEndian","encodeSignature","encodeIHDR","encodeData","encodeIEND","toArray","writeUint32","writeChars","writeByte","DEFLATE","ADAPTIVE","NO_INTERLACE","writeCrc","channels","slotsPerLine","newData","writeDataBytes","writeDataUint16","compressed","encodeIDAT","colorType","returnValue","TRUECOLOUR_ALPHA","TRUECOLOUR","GREYSCALE","GREYSCALE_ALPHA","getColorType","png","checkInteger","expectedSize","Number","isInteger","writeUint16","ResolutionUnitSpecifier","webp2png","decoder","config","bitstream","rgbaData","ctx","tasks","finishTask","processTasks","task","fileName","payload","convertedBytes","console","error","postMessage","addEventListener","event"],"mappings":"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CnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAA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","file":"webp.worker.c0cc94110cda650246b2.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","\"use strict\";\n/*\n * Copyright 2017 Sam Thorogood. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n(function (scope) {\n 'use strict';\n // fail early\n if (scope['TextEncoder'] && scope['TextDecoder']) {\n return false;\n }\n /**\n * @constructor\n * @param {string=} utfLabel\n */\n function FastTextEncoder(utfLabel = 'utf-8') {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n }\n Object.defineProperty(FastTextEncoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n /**\n * @param {string} string\n * @param {{stream: boolean}=} options\n * @return {!Uint8Array}\n */\n FastTextEncoder.prototype.encode = function (string, options = { stream: false }) {\n if (options.stream) {\n throw new Error(`Failed to encode: the 'stream' option is unsupported.`);\n }\n let pos = 0;\n const len = string.length;\n const out = [];\n let at = 0; // output position\n let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size\n let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset\n while (pos < len) {\n let value = string.charCodeAt(pos++);\n if (value >= 0xd800 && value <= 0xdbff) {\n // high surrogate\n if (pos < len) {\n const extra = string.charCodeAt(pos);\n if ((extra & 0xfc00) === 0xdc00) {\n ++pos;\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n }\n if (value >= 0xd800 && value <= 0xdbff) {\n continue; // drop lone surrogate\n }\n }\n // expand the buffer if we couldn't write 4 bytes\n if (at + 4 > target.length) {\n tlen += 8; // minimum extra\n tlen *= 1.0 + (pos / string.length) * 2; // take 2x the remaining\n tlen = (tlen >> 3) << 3; // 8 byte offset\n const update = new Uint8Array(tlen);\n update.set(target);\n target = update;\n }\n if ((value & 0xffffff80) === 0) {\n // 1-byte\n target[at++] = value; // ASCII\n continue;\n }\n else if ((value & 0xfffff800) === 0) {\n // 2-byte\n target[at++] = ((value >> 6) & 0x1f) | 0xc0;\n }\n else if ((value & 0xffff0000) === 0) {\n // 3-byte\n target[at++] = ((value >> 12) & 0x0f) | 0xe0;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else if ((value & 0xffe00000) === 0) {\n // 4-byte\n target[at++] = ((value >> 18) & 0x07) | 0xf0;\n target[at++] = ((value >> 12) & 0x3f) | 0x80;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else {\n // FIXME: do we care\n continue;\n }\n target[at++] = (value & 0x3f) | 0x80;\n }\n return target.slice(0, at);\n };\n /**\n * @constructor\n * @param {string=} utfLabel\n * @param {{fatal: boolean}=} options\n */\n function FastTextDecoder(utfLabel = 'utf-8', options = { fatal: false }) {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n if (options.fatal) {\n throw new Error(`Failed to construct 'TextDecoder': the 'fatal' option is unsupported.`);\n }\n }\n Object.defineProperty(FastTextDecoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n Object.defineProperty(FastTextDecoder.prototype, 'fatal', { value: false });\n Object.defineProperty(FastTextDecoder.prototype, 'ignoreBOM', {\n value: false,\n });\n /**\n * @param {(!ArrayBuffer|!ArrayBufferView)} buffer\n * @param {{stream: boolean}=} options\n */\n FastTextDecoder.prototype.decode = function (buffer, options = { stream: false }) {\n if (options['stream']) {\n throw new Error(`Failed to decode: the 'stream' option is unsupported.`);\n }\n const bytes = new Uint8Array(buffer);\n let pos = 0;\n const len = bytes.length;\n const out = [];\n while (pos < len) {\n const byte1 = bytes[pos++];\n if (byte1 === 0) {\n break; // NULL\n }\n if ((byte1 & 0x80) === 0) {\n // 1-byte\n out.push(byte1);\n }\n else if ((byte1 & 0xe0) === 0xc0) {\n // 2-byte\n const byte2 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 6) | byte2);\n }\n else if ((byte1 & 0xf0) === 0xe0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3);\n }\n else if ((byte1 & 0xf8) === 0xf0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n const byte4 = bytes[pos++] & 0x3f;\n // this can be > 0xffff, so possibly generate surrogates\n let codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\n if (codepoint > 0xffff) {\n // codepoint &= ~0x10000;\n codepoint -= 0x10000;\n out.push(((codepoint >>> 10) & 0x3ff) | 0xd800);\n codepoint = 0xdc00 | (codepoint & 0x3ff);\n }\n out.push(codepoint);\n }\n else {\n // FIXME: we're ignoring this\n }\n }\n return String.fromCharCode.apply(null, out);\n };\n scope['TextEncoder'] = FastTextEncoder;\n scope['TextDecoder'] = FastTextDecoder;\n})(typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : this);\n//# sourceMappingURL=text-encoding-polyfill.js.map","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [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];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","// eslint-disable-next-line import/no-unassigned-import\nimport './text-encoding-polyfill';\nconst decoder = new TextDecoder('utf-8');\nexport function decode(bytes) {\n return decoder.decode(bytes);\n}\nconst encoder = new TextEncoder();\nexport function encode(str) {\n return encoder.encode(str);\n}\n//# sourceMappingURL=utf8.browser.js.map","import { decode, encode } from './utf8';\nconst defaultByteLength = 1024 * 8;\nexport class IOBuffer {\n /**\n * @param data - The data to construct the IOBuffer with.\n * If data is a number, it will be the new buffer's length
\n * If data is `undefined`, the buffer will be initialized with a default length of 8Kb
\n * If data is an ArrayBuffer, SharedArrayBuffer, an ArrayBufferView (Typed Array), an IOBuffer instance,\n * or a Node.js Buffer, a view will be created over the underlying ArrayBuffer.\n * @param options\n */\n constructor(data = defaultByteLength, options = {}) {\n let dataIsGiven = false;\n if (typeof data === 'number') {\n data = new ArrayBuffer(data);\n }\n else {\n dataIsGiven = true;\n this.lastWrittenByte = data.byteLength;\n }\n const offset = options.offset ? options.offset >>> 0 : 0;\n const byteLength = data.byteLength - offset;\n let dvOffset = offset;\n if (ArrayBuffer.isView(data) || data instanceof IOBuffer) {\n if (data.byteLength !== data.buffer.byteLength) {\n dvOffset = data.byteOffset + offset;\n }\n data = data.buffer;\n }\n if (dataIsGiven) {\n this.lastWrittenByte = byteLength;\n }\n else {\n this.lastWrittenByte = 0;\n }\n this.buffer = data;\n this.length = byteLength;\n this.byteLength = byteLength;\n this.byteOffset = dvOffset;\n this.offset = 0;\n this.littleEndian = true;\n this._data = new DataView(this.buffer, dvOffset, byteLength);\n this._mark = 0;\n this._marks = [];\n }\n /**\n * Checks if the memory allocated to the buffer is sufficient to store more\n * bytes after the offset.\n * @param byteLength - The needed memory in bytes.\n * @returns `true` if there is sufficient space and `false` otherwise.\n */\n available(byteLength = 1) {\n return this.offset + byteLength <= this.length;\n }\n /**\n * Check if little-endian mode is used for reading and writing multi-byte\n * values.\n * @returns `true` if little-endian mode is used, `false` otherwise.\n */\n isLittleEndian() {\n return this.littleEndian;\n }\n /**\n * Set little-endian mode for reading and writing multi-byte values.\n */\n setLittleEndian() {\n this.littleEndian = true;\n return this;\n }\n /**\n * Check if big-endian mode is used for reading and writing multi-byte values.\n * @returns `true` if big-endian mode is used, `false` otherwise.\n */\n isBigEndian() {\n return !this.littleEndian;\n }\n /**\n * Switches to big-endian mode for reading and writing multi-byte values.\n */\n setBigEndian() {\n this.littleEndian = false;\n return this;\n }\n /**\n * Move the pointer n bytes forward.\n * @param n - Number of bytes to skip.\n */\n skip(n = 1) {\n this.offset += n;\n return this;\n }\n /**\n * Move the pointer to the given offset.\n * @param offset\n */\n seek(offset) {\n this.offset = offset;\n return this;\n }\n /**\n * Store the current pointer offset.\n * @see {@link IOBuffer#reset}\n */\n mark() {\n this._mark = this.offset;\n return this;\n }\n /**\n * Move the pointer back to the last pointer offset set by mark.\n * @see {@link IOBuffer#mark}\n */\n reset() {\n this.offset = this._mark;\n return this;\n }\n /**\n * Push the current pointer offset to the mark stack.\n * @see {@link IOBuffer#popMark}\n */\n pushMark() {\n this._marks.push(this.offset);\n return this;\n }\n /**\n * Pop the last pointer offset from the mark stack, and set the current\n * pointer offset to the popped value.\n * @see {@link IOBuffer#pushMark}\n */\n popMark() {\n const offset = this._marks.pop();\n if (offset === undefined) {\n throw new Error('Mark stack empty');\n }\n this.seek(offset);\n return this;\n }\n /**\n * Move the pointer offset back to 0.\n */\n rewind() {\n this.offset = 0;\n return this;\n }\n /**\n * Make sure the buffer has sufficient memory to write a given byteLength at\n * the current pointer offset.\n * If the buffer's memory is insufficient, this method will create a new\n * buffer (a copy) with a length that is twice (byteLength + current offset).\n * @param byteLength\n */\n ensureAvailable(byteLength = 1) {\n if (!this.available(byteLength)) {\n const lengthNeeded = this.offset + byteLength;\n const newLength = lengthNeeded * 2;\n const newArray = new Uint8Array(newLength);\n newArray.set(new Uint8Array(this.buffer));\n this.buffer = newArray.buffer;\n this.length = this.byteLength = newLength;\n this._data = new DataView(this.buffer);\n }\n return this;\n }\n /**\n * Read a byte and return false if the byte's value is 0, or true otherwise.\n * Moves pointer forward by one byte.\n */\n readBoolean() {\n return this.readUint8() !== 0;\n }\n /**\n * Read a signed 8-bit integer and move pointer forward by 1 byte.\n */\n readInt8() {\n return this._data.getInt8(this.offset++);\n }\n /**\n * Read an unsigned 8-bit integer and move pointer forward by 1 byte.\n */\n readUint8() {\n return this._data.getUint8(this.offset++);\n }\n /**\n * Alias for {@link IOBuffer#readUint8}.\n */\n readByte() {\n return this.readUint8();\n }\n /**\n * Read `n` bytes and move pointer forward by `n` bytes.\n */\n readBytes(n = 1) {\n const bytes = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n bytes[i] = this.readByte();\n }\n return bytes;\n }\n /**\n * Read a 16-bit signed integer and move pointer forward by 2 bytes.\n */\n readInt16() {\n const value = this._data.getInt16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 16-bit unsigned integer and move pointer forward by 2 bytes.\n */\n readUint16() {\n const value = this._data.getUint16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 32-bit signed integer and move pointer forward by 4 bytes.\n */\n readInt32() {\n const value = this._data.getInt32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit unsigned integer and move pointer forward by 4 bytes.\n */\n readUint32() {\n const value = this._data.getUint32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit floating number and move pointer forward by 4 bytes.\n */\n readFloat32() {\n const value = this._data.getFloat32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 64-bit floating number and move pointer forward by 8 bytes.\n */\n readFloat64() {\n const value = this._data.getFloat64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 1-byte ASCII character and move pointer forward by 1 byte.\n */\n readChar() {\n return String.fromCharCode(this.readInt8());\n }\n /**\n * Read `n` 1-byte ASCII characters and move pointer forward by `n` bytes.\n */\n readChars(n = 1) {\n let result = '';\n for (let i = 0; i < n; i++) {\n result += this.readChar();\n }\n return result;\n }\n /**\n * Read the next `n` bytes, return a UTF-8 decoded string and move pointer\n * forward by `n` bytes.\n */\n readUtf8(n = 1) {\n return decode(this.readBytes(n));\n }\n /**\n * Write 0xff if the passed value is truthy, 0x00 otherwise and move pointer\n * forward by 1 byte.\n */\n writeBoolean(value) {\n this.writeUint8(value ? 0xff : 0x00);\n return this;\n }\n /**\n * Write `value` as an 8-bit signed integer and move pointer forward by 1 byte.\n */\n writeInt8(value) {\n this.ensureAvailable(1);\n this._data.setInt8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as an 8-bit unsigned integer and move pointer forward by 1\n * byte.\n */\n writeUint8(value) {\n this.ensureAvailable(1);\n this._data.setUint8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * An alias for {@link IOBuffer#writeUint8}.\n */\n writeByte(value) {\n return this.writeUint8(value);\n }\n /**\n * Write all elements of `bytes` as uint8 values and move pointer forward by\n * `bytes.length` bytes.\n */\n writeBytes(bytes) {\n this.ensureAvailable(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n this._data.setUint8(this.offset++, bytes[i]);\n }\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit signed integer and move pointer forward by 2\n * bytes.\n */\n writeInt16(value) {\n this.ensureAvailable(2);\n this._data.setInt16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit unsigned integer and move pointer forward by 2\n * bytes.\n */\n writeUint16(value) {\n this.ensureAvailable(2);\n this._data.setUint16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit signed integer and move pointer forward by 4\n * bytes.\n */\n writeInt32(value) {\n this.ensureAvailable(4);\n this._data.setInt32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit unsigned integer and move pointer forward by 4\n * bytes.\n */\n writeUint32(value) {\n this.ensureAvailable(4);\n this._data.setUint32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit floating number and move pointer forward by 4\n * bytes.\n */\n writeFloat32(value) {\n this.ensureAvailable(4);\n this._data.setFloat32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit floating number and move pointer forward by 8\n * bytes.\n */\n writeFloat64(value) {\n this.ensureAvailable(8);\n this._data.setFloat64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write the charCode of `str`'s first character as an 8-bit unsigned integer\n * and move pointer forward by 1 byte.\n */\n writeChar(str) {\n return this.writeUint8(str.charCodeAt(0));\n }\n /**\n * Write the charCodes of all `str`'s characters as 8-bit unsigned integers\n * and move pointer forward by `str.length` bytes.\n */\n writeChars(str) {\n for (let i = 0; i < str.length; i++) {\n this.writeUint8(str.charCodeAt(i));\n }\n return this;\n }\n /**\n * UTF-8 encode and write `str` to the current pointer offset and move pointer\n * forward according to the encoded length.\n */\n writeUtf8(str) {\n return this.writeBytes(encode(str));\n }\n /**\n * Export a Uint8Array view of the internal buffer.\n * The view starts at the byte offset and its length\n * is calculated to stop at the last written byte or the original length.\n */\n toArray() {\n return new Uint8Array(this.buffer, this.byteOffset, this.lastWrittenByte);\n }\n /**\n * Update the last written byte offset\n * @private\n */\n _updateLastWrittenByte() {\n if (this.offset > this.lastWrittenByte) {\n this.lastWrittenByte = this.offset;\n }\n }\n}\n//# sourceMappingURL=IOBuffer.js.map","\n/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES = 30;\n/* number of distance codes */\n\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\n\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([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]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([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\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) =>\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n const next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nconst copy_block = (s, buf, len, header) =>\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n s.pending_buf.set(s.window.subarray(buf, buf + len), s.pending);\n s.pending += len;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) =>\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let lx = 0; /* running index in l_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) =>\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let black_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nconst _tr_flush_block = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally = (s, dist, lc) =>\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //let out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n};\n\nvar _tr_init_1 = _tr_init;\nvar _tr_stored_block_1 = _tr_stored_block;\nvar _tr_flush_block_1 = _tr_flush_block;\nvar _tr_tally_1 = _tr_tally;\nvar _tr_align_1 = _tr_align;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init: _tr_init$1, _tr_stored_block: _tr_stored_block$1, _tr_flush_block: _tr_flush_block$1, _tr_tally: _tr_tally$1, _tr_align: _tr_align$1 } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_PARTIAL_FLUSH, Z_FULL_FLUSH, Z_FINISH, Z_BLOCK,\n Z_OK, Z_STREAM_END, Z_STREAM_ERROR, Z_DATA_ERROR, Z_BUF_ERROR,\n Z_DEFAULT_COMPRESSION,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED: Z_FIXED$1, Z_DEFAULT_STRATEGY,\n Z_UNKNOWN: Z_UNKNOWN$1,\n Z_DEFLATED\n} = constants;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES$1 = 30;\n/* number of distance codes */\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH$1 + MIN_MATCH$1 + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42;\nconst EXTRA_STATE = 69;\nconst NAME_STATE = 73;\nconst COMMENT_STATE = 91;\nconst HCRC_STATE = 103;\nconst BUSY_STATE = 113;\nconst FINISH_STATE = 666;\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero$1 = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block$1(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH$1;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH$1 - (strend - scan);\n scan = strend - MAX_MATCH$1;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH$1) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH$1 - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH$1) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n let max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n const max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n};\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH$1) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH$1) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally$1(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$1);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$1) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH$1 - 1)) ? s.strstart : MIN_MATCH$1 - 1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH$1) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH$1 - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH$1 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH$1 - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH$1 && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH$1;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally$1(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$1);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH$1 - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH$1 - 1 ? s.strstart : MIN_MATCH$1 - 1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH$1) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH$1 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH$1 && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH$1;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH$1 - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH$1) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally$1(s, 1, s.match_length - MIN_MATCH$1);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero$1(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH$1 - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE$1 * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES$1 + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES$1 + 1) * 2);\n zero$1(this.dyn_ltree);\n zero$1(this.dyn_dtree);\n zero$1(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES$1 + 1); /* heap used to build the Huffman trees */\n zero$1(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES$1 + 1); //uch depth[2*L_CODES+1];\n zero$1(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nconst deflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN$1;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n _tr_init$1(s);\n return Z_OK;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED$1) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH$1 - 1) / MIN_MATCH$1);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n};\n\n\nconst deflate = (strm, flush) => {\n\n let beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n let header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n let bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align$1(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block$1(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero$1(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n const status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero$1(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH$1) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH$1 - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH$1 - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH$1 - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH$1 - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2 = deflate;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n let i, out;\n const len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$1,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION$1,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY$1\n }, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK$1) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$1) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$1 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH$1) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$1) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$1;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$1) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1 = Deflate;\nvar deflate_2$1 = deflate$1;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar constants$1 = constants;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_2$1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD = 30; /* got a data error -- remain here until reset */\nconst TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n// let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$2, Z_BLOCK: Z_BLOCK$1, Z_TREES,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2, Z_NEED_DICT, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 1; /* i: waiting for magic header */\nconst FLAGS = 2; /* i: waiting for method and flags (gzip) */\nconst TIME = 3; /* i: waiting for modification time (gzip) */\nconst OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 5; /* i: waiting for extra length (gzip) */\nconst EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nconst NAME = 7; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 8; /* i: waiting for end of comment (gzip) */\nconst HCRC = 9; /* i: waiting for header crc (gzip) */\nconst DICTID = 10; /* i: waiting for dictionary check value */\nconst DICT = 11; /* waiting for inflateSetDictionary() call */\nconst TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 14; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 17; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 18; /* i: waiting for code length code lengths */\nconst CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 20; /* i: same as LEN below, but only first time in */\nconst LEN = 21; /* i: waiting for length/lit/eob code */\nconst LENEXT = 22; /* i: waiting for length extra bits */\nconst DIST = 23; /* i: waiting for distance code */\nconst DISTEXT = 24; /* i: waiting for distance extra bits */\nconst MATCH = 25; /* o: waiting for output space to copy string */\nconst LIT = 26; /* o: waiting for output space to write literal */\nconst CHECK = 27; /* i: waiting for 32-bit check value */\nconst LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 29; /* finished check, done -- remain here until reset */\nconst BAD$1 = 30; /* got a data error -- remain here until reset */\nconst MEM = 31; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS$1;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS$1);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS$1);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$2;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$2) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS$1, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS$1, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE$1) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$2;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD$1;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$2) {\n strm.msg = 'unknown compression method';\n state.mode = BAD$1;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD$1;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE$1;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED$2) {\n strm.msg = 'unknown compression method';\n state.mode = BAD$1;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD$1;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE$1;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE$1;\n /* falls through */\n case TYPE$1:\n if (flush === Z_BLOCK$1 || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD$1;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD$1;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE$1;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD$1;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES$1, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD$1;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD$1;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD$1;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD$1) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD$1;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS$1, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD$1;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS$1, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD$1;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE$1) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE$1;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$2;\n break inf_leave;\n case BAD$1:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$1 &&\n (state.mode < CHECK || flush !== Z_FINISH$2))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE$1 ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$2) && ret === Z_OK$2) {\n ret = Z_BUF_ERROR$1;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$2;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$2;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$2;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2 = inflate;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\n*/\n\nvar inflate_1 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_FINISH: Z_FINISH$3,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_MEM_ERROR: Z_MEM_ERROR$1\n} = constants;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK$3) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK$3) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$3 : Z_NO_FLUSH$2;\n\n // Convert data if needed\n if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT$1 && dictionary) {\n status = inflate_1.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK$3) {\n status = inflate_1.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR$2) {\n // Replace code with more verbose\n status = Z_NEED_DICT$1;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END$3 &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1.inflateReset(strm);\n status = inflate_1.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR$2:\n case Z_DATA_ERROR$2:\n case Z_NEED_DICT$1:\n case Z_MEM_ERROR$1:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END$3) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK$3 && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END$3) {\n status = inflate_1.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$3) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1 = Inflate;\nvar inflate_2$1 = inflate$1;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip = inflate$1;\nvar constants$2 = constants;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1,\n\tinflate: inflate_2$1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip,\n\tconstants: constants$2\n};\n\nconst { Deflate: Deflate$1, deflate: deflate$2, deflateRaw: deflateRaw$1, gzip: gzip$1 } = deflate_1$1;\n\nconst { Inflate: Inflate$1, inflate: inflate$2, inflateRaw: inflateRaw$1, ungzip: ungzip$1 } = inflate_1$1;\n\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_1$2 = deflate$2;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar Inflate_1$1 = Inflate$1;\nvar inflate_1$2 = inflate$2;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip_1 = ungzip$1;\nvar constants_1 = constants;\n\nvar pako = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_1$2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tInflate: Inflate_1$1,\n\tinflate: inflate_1$2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport default pako;\nexport { Deflate_1$1 as Deflate, Inflate_1$1 as Inflate, constants_1 as constants, deflate_1$2 as deflate, deflateRaw_1$1 as deflateRaw, gzip_1$1 as gzip, inflate_1$2 as inflate, inflateRaw_1$1 as inflateRaw, ungzip_1 as ungzip };\n","export const pngSignature = [137, 80, 78, 71, 13, 10, 26, 10];\nconst crcTable = [];\nfor (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n if (c & 1) {\n c = 0xedb88320 ^ (c >>> 1);\n }\n else {\n c = c >>> 1;\n }\n }\n crcTable[n] = c;\n}\nconst initialCrc = 0xffffffff;\nfunction updateCrc(currentCrc, data, length) {\n let c = currentCrc;\n for (let n = 0; n < length; n++) {\n c = crcTable[(c ^ data[n]) & 0xff] ^ (c >>> 8);\n }\n return c;\n}\nexport function crc(data, length) {\n return (updateCrc(initialCrc, data, length) ^ initialCrc) >>> 0;\n}\n//# sourceMappingURL=common.js.map","export var ColorType;\n(function (ColorType) {\n ColorType[ColorType[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n ColorType[ColorType[\"GREYSCALE\"] = 0] = \"GREYSCALE\";\n ColorType[ColorType[\"TRUECOLOUR\"] = 2] = \"TRUECOLOUR\";\n ColorType[ColorType[\"INDEXED_COLOUR\"] = 3] = \"INDEXED_COLOUR\";\n ColorType[ColorType[\"GREYSCALE_ALPHA\"] = 4] = \"GREYSCALE_ALPHA\";\n ColorType[ColorType[\"TRUECOLOUR_ALPHA\"] = 6] = \"TRUECOLOUR_ALPHA\";\n})(ColorType || (ColorType = {}));\nexport var CompressionMethod;\n(function (CompressionMethod) {\n CompressionMethod[CompressionMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n CompressionMethod[CompressionMethod[\"DEFLATE\"] = 0] = \"DEFLATE\";\n})(CompressionMethod || (CompressionMethod = {}));\nexport var FilterMethod;\n(function (FilterMethod) {\n FilterMethod[FilterMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n FilterMethod[FilterMethod[\"ADAPTIVE\"] = 0] = \"ADAPTIVE\";\n})(FilterMethod || (FilterMethod = {}));\nexport var InterlaceMethod;\n(function (InterlaceMethod) {\n InterlaceMethod[InterlaceMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n InterlaceMethod[InterlaceMethod[\"NO_INTERLACE\"] = 0] = \"NO_INTERLACE\";\n InterlaceMethod[InterlaceMethod[\"ADAM7\"] = 1] = \"ADAM7\";\n})(InterlaceMethod || (InterlaceMethod = {}));\n//# sourceMappingURL=internalTypes.js.map","import { IOBuffer } from 'iobuffer';\nimport { Inflate as Inflator } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst empty = new Uint8Array(0);\nconst NULL = '\\0';\nconst uint16 = new Uint16Array([0x00ff]);\nconst uint8 = new Uint8Array(uint16.buffer);\nconst osIsLittleEndian = uint8[0] === 0xff;\nexport default class PNGDecoder extends IOBuffer {\n constructor(data, options = {}) {\n super(data);\n const { checkCrc = false } = options;\n this._checkCrc = checkCrc;\n this._inflator = new Inflator();\n this._png = {\n width: -1,\n height: -1,\n channels: -1,\n data: new Uint8Array(0),\n depth: 1,\n text: {},\n };\n this._end = false;\n this._hasPalette = false;\n this._palette = [];\n this._compressionMethod = CompressionMethod.UNKNOWN;\n this._filterMethod = FilterMethod.UNKNOWN;\n this._interlaceMethod = InterlaceMethod.UNKNOWN;\n this._colorType = -1;\n // PNG is always big endian\n // https://www.w3.org/TR/PNG/#7Integers-and-byte-order\n this.setBigEndian();\n }\n decode() {\n this.decodeSignature();\n while (!this._end) {\n this.decodeChunk();\n }\n this.decodeImage();\n return this._png;\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n decodeSignature() {\n for (let i = 0; i < pngSignature.length; i++) {\n if (this.readUint8() !== pngSignature[i]) {\n throw new Error(`wrong PNG signature. Byte at ${i} should be ${pngSignature[i]}.`);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#5Chunk-layout\n decodeChunk() {\n const length = this.readUint32();\n const type = this.readChars(4);\n const offset = this.offset;\n switch (type) {\n // 11.2 Critical chunks\n case 'IHDR': // 11.2.2 IHDR Image header\n this.decodeIHDR();\n break;\n case 'PLTE': // 11.2.3 PLTE Palette\n this.decodePLTE(length);\n break;\n case 'IDAT': // 11.2.4 IDAT Image data\n this.decodeIDAT(length);\n break;\n case 'IEND': // 11.2.5 IEND Image trailer\n this._end = true;\n break;\n // 11.3 Ancillary chunks\n case 'tRNS': // 11.3.2.1 tRNS Transparency\n this.decodetRNS(length);\n break;\n case 'tEXt': // 11.3.4.3 tEXt Textual data\n this.decodetEXt(length);\n break;\n case 'pHYs': // 11.3.5.3 pHYs Physical pixel dimensions\n this.decodepHYs();\n break;\n default:\n this.skip(length);\n break;\n }\n if (this.offset - offset !== length) {\n throw new Error(`Length mismatch while decoding chunk ${type}`);\n }\n if (this._checkCrc) {\n const expectedCrc = this.readUint32();\n const crcLength = length + 4; // includes type\n const actualCrc = crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - crcLength - 4, crcLength), crcLength); // \"- 4\" because we already advanced by reading the CRC\n if (actualCrc !== expectedCrc) {\n throw new Error(`CRC mismatch for chunk ${type}. Expected ${expectedCrc}, found ${actualCrc}`);\n }\n }\n else {\n this.skip(4);\n }\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n decodeIHDR() {\n const image = this._png;\n image.width = this.readUint32();\n image.height = this.readUint32();\n image.depth = checkBitDepth(this.readUint8());\n const colorType = this.readUint8();\n this._colorType = colorType;\n let channels;\n switch (colorType) {\n case ColorType.GREYSCALE:\n channels = 1;\n break;\n case ColorType.TRUECOLOUR:\n channels = 3;\n break;\n case ColorType.INDEXED_COLOUR:\n channels = 1;\n break;\n case ColorType.GREYSCALE_ALPHA:\n channels = 2;\n break;\n case ColorType.TRUECOLOUR_ALPHA:\n channels = 4;\n break;\n default:\n throw new Error(`Unknown color type: ${colorType}`);\n }\n this._png.channels = channels;\n this._compressionMethod = this.readUint8();\n if (this._compressionMethod !== CompressionMethod.DEFLATE) {\n throw new Error(`Unsupported compression method: ${this._compressionMethod}`);\n }\n this._filterMethod = this.readUint8();\n this._interlaceMethod = this.readUint8();\n }\n // https://www.w3.org/TR/PNG/#11PLTE\n decodePLTE(length) {\n if (length % 3 !== 0) {\n throw new RangeError(`PLTE field length must be a multiple of 3. Got ${length}`);\n }\n const l = length / 3;\n this._hasPalette = true;\n const palette = [];\n this._palette = palette;\n for (let i = 0; i < l; i++) {\n palette.push([this.readUint8(), this.readUint8(), this.readUint8()]);\n }\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n decodeIDAT(length) {\n this._inflator.push(new Uint8Array(this.buffer, this.offset + this.byteOffset, length));\n this.skip(length);\n }\n // https://www.w3.org/TR/PNG/#11tRNS\n decodetRNS(length) {\n // TODO: support other color types.\n if (this._colorType === 3) {\n if (length > this._palette.length) {\n throw new Error(`tRNS chunk contains more alpha values than there are palette colors (${length} vs ${this._palette.length})`);\n }\n let i = 0;\n for (; i < length; i++) {\n const alpha = this.readByte();\n this._palette[i].push(alpha);\n }\n for (; i < this._palette.length; i++) {\n this._palette[i].push(255);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#11tEXt\n decodetEXt(length) {\n let keyword = '';\n let char;\n while ((char = this.readChar()) !== NULL) {\n keyword += char;\n }\n this._png.text[keyword] = this.readChars(length - keyword.length - 1);\n }\n // https://www.w3.org/TR/PNG/#11pHYs\n decodepHYs() {\n const ppuX = this.readUint32();\n const ppuY = this.readUint32();\n const unitSpecifier = this.readByte();\n this._png.resolution = { x: ppuX, y: ppuY, unit: unitSpecifier };\n }\n decodeImage() {\n if (this._inflator.err) {\n throw new Error(`Error while decompressing the data: ${this._inflator.err}`);\n }\n const data = this._inflator.result;\n if (this._filterMethod !== FilterMethod.ADAPTIVE) {\n throw new Error(`Filter method ${this._filterMethod} not supported`);\n }\n if (this._interlaceMethod === InterlaceMethod.NO_INTERLACE) {\n this.decodeInterlaceNull(data);\n }\n else {\n throw new Error(`Interlace method ${this._interlaceMethod} not supported`);\n }\n }\n decodeInterlaceNull(data) {\n const height = this._png.height;\n const bytesPerPixel = (this._png.channels * this._png.depth) / 8;\n const bytesPerLine = this._png.width * bytesPerPixel;\n const newData = new Uint8Array(this._png.height * bytesPerLine);\n let prevLine = empty;\n let offset = 0;\n let currentLine;\n let newLine;\n for (let i = 0; i < height; i++) {\n currentLine = data.subarray(offset + 1, offset + 1 + bytesPerLine);\n newLine = newData.subarray(i * bytesPerLine, (i + 1) * bytesPerLine);\n switch (data[offset]) {\n case 0:\n unfilterNone(currentLine, newLine, bytesPerLine);\n break;\n case 1:\n unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel);\n break;\n case 2:\n unfilterUp(currentLine, newLine, prevLine, bytesPerLine);\n break;\n case 3:\n unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n case 4:\n unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n default:\n throw new Error(`Unsupported filter: ${data[offset]}`);\n }\n prevLine = newLine;\n offset += bytesPerLine + 1;\n }\n if (this._hasPalette) {\n this._png.palette = this._palette;\n }\n if (this._png.depth === 16) {\n const uint16Data = new Uint16Array(newData.buffer);\n if (osIsLittleEndian) {\n for (let k = 0; k < uint16Data.length; k++) {\n // PNG is always big endian. Swap the bytes.\n uint16Data[k] = swap16(uint16Data[k]);\n }\n }\n this._png.data = uint16Data;\n }\n else {\n this._png.data = newData;\n }\n }\n}\nfunction unfilterNone(currentLine, newLine, bytesPerLine) {\n for (let i = 0; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n}\nfunction unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n for (; i < bytesPerPixel; i++) {\n // just copy first bytes\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n}\nfunction unfilterUp(currentLine, newLine, prevLine, bytesPerLine) {\n let i = 0;\n if (prevLine.length === 0) {\n // just copy bytes for first line\n for (; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n }\n else {\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n }\n}\nfunction unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + (newLine[i - bytesPerPixel] >> 1)) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + (prevLine[i] >> 1)) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] + ((newLine[i - bytesPerPixel] + prevLine[i]) >> 1)) &\n 0xff;\n }\n }\n}\nfunction unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] +\n paethPredictor(newLine[i - bytesPerPixel], prevLine[i], prevLine[i - bytesPerPixel])) &\n 0xff;\n }\n }\n}\nfunction paethPredictor(a, b, c) {\n const p = a + b - c;\n const pa = Math.abs(p - a);\n const pb = Math.abs(p - b);\n const pc = Math.abs(p - c);\n if (pa <= pb && pa <= pc)\n return a;\n else if (pb <= pc)\n return b;\n else\n return c;\n}\nfunction swap16(val) {\n return ((val & 0xff) << 8) | ((val >> 8) & 0xff);\n}\nfunction checkBitDepth(value) {\n if (value !== 1 &&\n value !== 2 &&\n value !== 4 &&\n value !== 8 &&\n value !== 16) {\n throw new Error(`invalid bit depth: ${value}`);\n }\n return value;\n}\n//# sourceMappingURL=PNGDecoder.js.map","import { IOBuffer } from 'iobuffer';\nimport { deflate } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst defaultZlibOptions = {\n level: 3,\n};\nexport default class PNGEncoder extends IOBuffer {\n constructor(data, options = {}) {\n super();\n this._colorType = ColorType.UNKNOWN;\n this._zlibOptions = Object.assign({}, defaultZlibOptions, options.zlib);\n this._png = this._checkData(data);\n this.setBigEndian();\n }\n encode() {\n this.encodeSignature();\n this.encodeIHDR();\n this.encodeData();\n this.encodeIEND();\n return this.toArray();\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n encodeSignature() {\n this.writeBytes(pngSignature);\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n encodeIHDR() {\n this.writeUint32(13);\n this.writeChars('IHDR');\n this.writeUint32(this._png.width);\n this.writeUint32(this._png.height);\n this.writeByte(this._png.depth);\n this.writeByte(this._colorType);\n this.writeByte(CompressionMethod.DEFLATE);\n this.writeByte(FilterMethod.ADAPTIVE);\n this.writeByte(InterlaceMethod.NO_INTERLACE);\n this.writeCrc(17);\n }\n // https://www.w3.org/TR/PNG/#11IEND\n encodeIEND() {\n this.writeUint32(0);\n this.writeChars('IEND');\n this.writeCrc(4);\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n encodeIDAT(data) {\n this.writeUint32(data.length);\n this.writeChars('IDAT');\n this.writeBytes(data);\n this.writeCrc(data.length + 4);\n }\n encodeData() {\n const { width, height, channels, depth, data } = this._png;\n const slotsPerLine = channels * width;\n const newData = new IOBuffer().setBigEndian();\n let offset = 0;\n for (let i = 0; i < height; i++) {\n newData.writeByte(0); // no filter\n /* istanbul ignore else */\n if (depth === 8) {\n offset = writeDataBytes(data, newData, slotsPerLine, offset);\n }\n else if (depth === 16) {\n offset = writeDataUint16(data, newData, slotsPerLine, offset);\n }\n else {\n throw new Error('unreachable');\n }\n }\n const buffer = newData.toArray();\n const compressed = deflate(buffer, this._zlibOptions);\n this.encodeIDAT(compressed);\n }\n _checkData(data) {\n const { colorType, channels, depth } = getColorType(data);\n const png = {\n width: checkInteger(data.width, 'width'),\n height: checkInteger(data.height, 'height'),\n channels: channels,\n data: data.data,\n depth: depth,\n text: {},\n };\n this._colorType = colorType;\n const expectedSize = png.width * png.height * channels;\n if (png.data.length !== expectedSize) {\n throw new RangeError(`wrong data size. Found ${png.data.length}, expected ${expectedSize}`);\n }\n return png;\n }\n writeCrc(length) {\n this.writeUint32(crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - length, length), length));\n }\n}\nfunction checkInteger(value, name) {\n if (Number.isInteger(value) && value > 0) {\n return value;\n }\n throw new TypeError(`${name} must be a positive integer`);\n}\nfunction getColorType(data) {\n const { channels = 4, depth = 8 } = data;\n if (channels !== 4 && channels !== 3 && channels !== 2 && channels !== 1) {\n throw new RangeError(`unsupported number of channels: ${channels}`);\n }\n if (depth !== 8 && depth !== 16) {\n throw new RangeError(`unsupported bit depth: ${depth}`);\n }\n const returnValue = { channels, depth, colorType: ColorType.UNKNOWN };\n switch (channels) {\n case 4:\n returnValue.colorType = ColorType.TRUECOLOUR_ALPHA;\n break;\n case 3:\n returnValue.colorType = ColorType.TRUECOLOUR;\n break;\n case 1:\n returnValue.colorType = ColorType.GREYSCALE;\n break;\n case 2:\n returnValue.colorType = ColorType.GREYSCALE_ALPHA;\n break;\n default:\n throw new Error('unsupported number of channels');\n }\n return returnValue;\n}\nfunction writeDataBytes(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeByte(data[offset++]);\n }\n return offset;\n}\nfunction writeDataUint16(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeUint16(data[offset++]);\n }\n return offset;\n}\n//# sourceMappingURL=PNGEncoder.js.map","export var ResolutionUnitSpecifier;\n(function (ResolutionUnitSpecifier) {\n /**\n * Unit is unknown\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n /**\n * Unit is the metre\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"METRE\"] = 1] = \"METRE\";\n})(ResolutionUnitSpecifier || (ResolutionUnitSpecifier = {}));\n//# sourceMappingURL=types.js.map","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { WebPDecoder } from '../../vendor/libwebp-0.2.0';\r\nimport { encode } from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8,\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\n","import PNGDecoder from './PNGDecoder';\nimport PNGEncoder from './PNGEncoder';\nexport * from './types';\nfunction decodePNG(data, options) {\n const decoder = new PNGDecoder(data, options);\n return decoder.decode();\n}\nfunction encodePNG(png, options) {\n const encoder = new PNGEncoder(png, options);\n return encoder.encode();\n}\nexport { decodePNG as decode, encodePNG as encode };\n//# sourceMappingURL=index.js.map","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { webp2png } from './webp';\r\nimport type { WebpConvertTask } from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: WebpConvertTask[] = [];\r\n//let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n //isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n //if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n //isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n \r\n ctx.postMessage({\r\n type: 'convertWebp', \r\n payload: {\r\n fileName, \r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: WebpConvertTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n \r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\r\n});\r\n"],"sourceRoot":""} \ No newline at end of file